xonar_pcm179x.c 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250
  1. /*
  2. * card driver for models with PCM1796 DACs (Xonar D2/D2X/HDAV1.3/ST/STX)
  3. *
  4. * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
  5. *
  6. *
  7. * This driver is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License, version 2.
  9. *
  10. * This driver is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this driver; if not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /*
  19. * Xonar D2/D2X
  20. * ------------
  21. *
  22. * CMI8788:
  23. *
  24. * SPI 0 -> 1st PCM1796 (front)
  25. * SPI 1 -> 2nd PCM1796 (surround)
  26. * SPI 2 -> 3rd PCM1796 (center/LFE)
  27. * SPI 4 -> 4th PCM1796 (back)
  28. *
  29. * GPIO 2 -> M0 of CS5381
  30. * GPIO 3 -> M1 of CS5381
  31. * GPIO 5 <- external power present (D2X only)
  32. * GPIO 7 -> ALT
  33. * GPIO 8 -> enable output to speakers
  34. *
  35. * CM9780:
  36. *
  37. * LINE_OUT -> input of ADC
  38. *
  39. * AUX_IN <- aux
  40. * VIDEO_IN <- CD
  41. * FMIC_IN <- mic
  42. *
  43. * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
  44. */
  45. /*
  46. * Xonar HDAV1.3 (Deluxe)
  47. * ----------------------
  48. *
  49. * CMI8788:
  50. *
  51. * I²C <-> PCM1796 (addr 1001100) (front)
  52. *
  53. * GPI 0 <- external power present
  54. *
  55. * GPIO 0 -> enable HDMI (0) or speaker (1) output
  56. * GPIO 2 -> M0 of CS5381
  57. * GPIO 3 -> M1 of CS5381
  58. * GPIO 4 <- daughterboard detection
  59. * GPIO 5 <- daughterboard detection
  60. * GPIO 6 -> ?
  61. * GPIO 7 -> ?
  62. * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
  63. *
  64. * UART <-> HDMI controller
  65. *
  66. * CM9780:
  67. *
  68. * LINE_OUT -> input of ADC
  69. *
  70. * AUX_IN <- aux
  71. * CD_IN <- CD
  72. * MIC_IN <- mic
  73. *
  74. * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
  75. *
  76. * no daughterboard
  77. * ----------------
  78. *
  79. * GPIO 4 <- 1
  80. *
  81. * H6 daughterboard
  82. * ----------------
  83. *
  84. * GPIO 4 <- 0
  85. * GPIO 5 <- 0
  86. *
  87. * I²C <-> PCM1796 (addr 1001101) (surround)
  88. * <-> PCM1796 (addr 1001110) (center/LFE)
  89. * <-> PCM1796 (addr 1001111) (back)
  90. *
  91. * unknown daughterboard
  92. * ---------------------
  93. *
  94. * GPIO 4 <- 0
  95. * GPIO 5 <- 1
  96. *
  97. * I²C <-> CS4362A (addr 0011000) (surround, center/LFE, back)
  98. */
  99. /*
  100. * Xonar Essence ST (Deluxe)/STX
  101. * -----------------------------
  102. *
  103. * CMI8788:
  104. *
  105. * I²C <-> PCM1792A (addr 1001100)
  106. * <-> CS2000 (addr 1001110) (ST only)
  107. *
  108. * ADC1 MCLK -> REF_CLK of CS2000 (ST only)
  109. *
  110. * GPI 0 <- external power present (STX only)
  111. *
  112. * GPIO 0 -> enable output to speakers
  113. * GPIO 1 -> route HP to front panel (0) or rear jack (1)
  114. * GPIO 2 -> M0 of CS5381
  115. * GPIO 3 -> M1 of CS5381
  116. * GPIO 4 <- daughterboard detection
  117. * GPIO 5 <- daughterboard detection
  118. * GPIO 6 -> ?
  119. * GPIO 7 -> route output to speaker jacks (0) or HP (1)
  120. * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
  121. *
  122. * PCM1792A:
  123. *
  124. * SCK <- CLK_OUT of CS2000 (ST only)
  125. *
  126. * CM9780:
  127. *
  128. * LINE_OUT -> input of ADC
  129. *
  130. * AUX_IN <- aux
  131. * MIC_IN <- mic
  132. *
  133. * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
  134. *
  135. * H6 daughterboard
  136. * ----------------
  137. *
  138. * GPIO 4 <- 0
  139. * GPIO 5 <- 0
  140. */
  141. /*
  142. * Xonar Xense
  143. * -----------
  144. *
  145. * CMI8788:
  146. *
  147. * I²C <-> PCM1796 (addr 1001100) (front)
  148. * <-> CS4362A (addr 0011000) (surround, center/LFE, back)
  149. * <-> CS2000 (addr 1001110)
  150. *
  151. * ADC1 MCLK -> REF_CLK of CS2000
  152. *
  153. * GPI 0 <- external power present
  154. *
  155. * GPIO 0 -> enable output
  156. * GPIO 1 -> route HP to front panel (0) or rear jack (1)
  157. * GPIO 2 -> M0 of CS5381
  158. * GPIO 3 -> M1 of CS5381
  159. * GPIO 4 -> enable output
  160. * GPIO 5 -> enable output
  161. * GPIO 6 -> ?
  162. * GPIO 7 -> route output to HP (0) or speaker (1)
  163. * GPIO 8 -> route input jack to mic-in (0) or line-in (1)
  164. *
  165. * CM9780:
  166. *
  167. * LINE_OUT -> input of ADC
  168. *
  169. * AUX_IN <- aux
  170. * VIDEO_IN <- ?
  171. * FMIC_IN <- mic
  172. *
  173. * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
  174. * GPO 1 -> route mic-in from input jack (0) or front panel header (1)
  175. */
  176. #include <linux/pci.h>
  177. #include <linux/delay.h>
  178. #include <linux/mutex.h>
  179. #include <sound/ac97_codec.h>
  180. #include <sound/control.h>
  181. #include <sound/core.h>
  182. #include <sound/info.h>
  183. #include <sound/pcm.h>
  184. #include <sound/pcm_params.h>
  185. #include <sound/tlv.h>
  186. #include "xonar.h"
  187. #include "cm9780.h"
  188. #include "pcm1796.h"
  189. #include "cs2000.h"
  190. #define GPIO_D2X_EXT_POWER 0x0020
  191. #define GPIO_D2_ALT 0x0080
  192. #define GPIO_D2_OUTPUT_ENABLE 0x0100
  193. #define GPI_EXT_POWER 0x01
  194. #define GPIO_INPUT_ROUTE 0x0100
  195. #define GPIO_HDAV_OUTPUT_ENABLE 0x0001
  196. #define GPIO_HDAV_MAGIC 0x00c0
  197. #define GPIO_DB_MASK 0x0030
  198. #define GPIO_DB_H6 0x0000
  199. #define GPIO_ST_OUTPUT_ENABLE 0x0001
  200. #define GPIO_ST_HP_REAR 0x0002
  201. #define GPIO_ST_MAGIC 0x0040
  202. #define GPIO_ST_HP 0x0080
  203. #define I2C_DEVICE_PCM1796(i) (0x98 + ((i) << 1)) /* 10011, ii, /W=0 */
  204. #define I2C_DEVICE_CS2000 0x9c /* 100111, 0, /W=0 */
  205. #define PCM1796_REG_BASE 16
  206. struct xonar_pcm179x {
  207. struct xonar_generic generic;
  208. unsigned int dacs;
  209. u8 pcm1796_regs[4][5];
  210. unsigned int current_rate;
  211. bool os_128;
  212. bool h6;
  213. bool hp_active;
  214. s8 hp_gain_offset;
  215. bool has_cs2000;
  216. u8 cs2000_regs[0x1f];
  217. bool broken_i2c;
  218. };
  219. struct xonar_hdav {
  220. struct xonar_pcm179x pcm179x;
  221. struct xonar_hdmi hdmi;
  222. };
  223. static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec,
  224. u8 reg, u8 value)
  225. {
  226. /* maps ALSA channel pair number to SPI output */
  227. static const u8 codec_map[4] = {
  228. 0, 1, 2, 4
  229. };
  230. oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER |
  231. OXYGEN_SPI_DATA_LENGTH_2 |
  232. OXYGEN_SPI_CLOCK_160 |
  233. (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
  234. OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
  235. (reg << 8) | value);
  236. }
  237. static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec,
  238. u8 reg, u8 value)
  239. {
  240. oxygen_write_i2c(chip, I2C_DEVICE_PCM1796(codec), reg, value);
  241. }
  242. static void pcm1796_write(struct oxygen *chip, unsigned int codec,
  243. u8 reg, u8 value)
  244. {
  245. struct xonar_pcm179x *data = chip->model_data;
  246. if ((chip->model.function_flags & OXYGEN_FUNCTION_2WIRE_SPI_MASK) ==
  247. OXYGEN_FUNCTION_SPI)
  248. pcm1796_write_spi(chip, codec, reg, value);
  249. else
  250. pcm1796_write_i2c(chip, codec, reg, value);
  251. if ((unsigned int)(reg - PCM1796_REG_BASE)
  252. < ARRAY_SIZE(data->pcm1796_regs[codec]))
  253. data->pcm1796_regs[codec][reg - PCM1796_REG_BASE] = value;
  254. }
  255. static void pcm1796_write_cached(struct oxygen *chip, unsigned int codec,
  256. u8 reg, u8 value)
  257. {
  258. struct xonar_pcm179x *data = chip->model_data;
  259. if (value != data->pcm1796_regs[codec][reg - PCM1796_REG_BASE])
  260. pcm1796_write(chip, codec, reg, value);
  261. }
  262. static void cs2000_write(struct oxygen *chip, u8 reg, u8 value)
  263. {
  264. struct xonar_pcm179x *data = chip->model_data;
  265. oxygen_write_i2c(chip, I2C_DEVICE_CS2000, reg, value);
  266. data->cs2000_regs[reg] = value;
  267. }
  268. static void cs2000_write_cached(struct oxygen *chip, u8 reg, u8 value)
  269. {
  270. struct xonar_pcm179x *data = chip->model_data;
  271. if (value != data->cs2000_regs[reg])
  272. cs2000_write(chip, reg, value);
  273. }
  274. static void pcm1796_registers_init(struct oxygen *chip)
  275. {
  276. struct xonar_pcm179x *data = chip->model_data;
  277. unsigned int i;
  278. s8 gain_offset;
  279. msleep(1);
  280. gain_offset = data->hp_active ? data->hp_gain_offset : 0;
  281. for (i = 0; i < data->dacs; ++i) {
  282. /* set ATLD before ATL/ATR */
  283. pcm1796_write(chip, i, 18,
  284. data->pcm1796_regs[0][18 - PCM1796_REG_BASE]);
  285. pcm1796_write(chip, i, 16, chip->dac_volume[i * 2]
  286. + gain_offset);
  287. pcm1796_write(chip, i, 17, chip->dac_volume[i * 2 + 1]
  288. + gain_offset);
  289. pcm1796_write(chip, i, 19,
  290. data->pcm1796_regs[0][19 - PCM1796_REG_BASE]);
  291. pcm1796_write(chip, i, 20,
  292. data->pcm1796_regs[0][20 - PCM1796_REG_BASE]);
  293. pcm1796_write(chip, i, 21, 0);
  294. }
  295. }
  296. static void pcm1796_init(struct oxygen *chip)
  297. {
  298. struct xonar_pcm179x *data = chip->model_data;
  299. data->pcm1796_regs[0][18 - PCM1796_REG_BASE] = PCM1796_MUTE |
  300. PCM1796_DMF_DISABLED | PCM1796_FMT_24_I2S | PCM1796_ATLD;
  301. data->pcm1796_regs[0][19 - PCM1796_REG_BASE] =
  302. PCM1796_FLT_SHARP | PCM1796_ATS_1;
  303. data->pcm1796_regs[0][20 - PCM1796_REG_BASE] = PCM1796_OS_64;
  304. pcm1796_registers_init(chip);
  305. data->current_rate = 48000;
  306. }
  307. static void xonar_d2_init(struct oxygen *chip)
  308. {
  309. struct xonar_pcm179x *data = chip->model_data;
  310. data->generic.anti_pop_delay = 300;
  311. data->generic.output_enable_bit = GPIO_D2_OUTPUT_ENABLE;
  312. data->dacs = 4;
  313. pcm1796_init(chip);
  314. oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT);
  315. oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT);
  316. oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC);
  317. xonar_init_cs53x1(chip);
  318. xonar_enable_output(chip);
  319. snd_component_add(chip->card, "PCM1796");
  320. snd_component_add(chip->card, "CS5381");
  321. }
  322. static void xonar_d2x_init(struct oxygen *chip)
  323. {
  324. struct xonar_pcm179x *data = chip->model_data;
  325. data->generic.ext_power_reg = OXYGEN_GPIO_DATA;
  326. data->generic.ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK;
  327. data->generic.ext_power_bit = GPIO_D2X_EXT_POWER;
  328. oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2X_EXT_POWER);
  329. xonar_init_ext_power(chip);
  330. xonar_d2_init(chip);
  331. }
  332. static void xonar_hdav_init(struct oxygen *chip)
  333. {
  334. struct xonar_hdav *data = chip->model_data;
  335. oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS,
  336. OXYGEN_2WIRE_LENGTH_8 |
  337. OXYGEN_2WIRE_INTERRUPT_MASK |
  338. OXYGEN_2WIRE_SPEED_STANDARD);
  339. data->pcm179x.generic.anti_pop_delay = 100;
  340. data->pcm179x.generic.output_enable_bit = GPIO_HDAV_OUTPUT_ENABLE;
  341. data->pcm179x.generic.ext_power_reg = OXYGEN_GPI_DATA;
  342. data->pcm179x.generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
  343. data->pcm179x.generic.ext_power_bit = GPI_EXT_POWER;
  344. data->pcm179x.dacs = chip->model.dac_channels_mixer / 2;
  345. data->pcm179x.h6 = chip->model.dac_channels_mixer > 2;
  346. pcm1796_init(chip);
  347. oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL,
  348. GPIO_HDAV_MAGIC | GPIO_INPUT_ROUTE);
  349. oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_INPUT_ROUTE);
  350. xonar_init_cs53x1(chip);
  351. xonar_init_ext_power(chip);
  352. xonar_hdmi_init(chip, &data->hdmi);
  353. xonar_enable_output(chip);
  354. snd_component_add(chip->card, "PCM1796");
  355. snd_component_add(chip->card, "CS5381");
  356. }
  357. static void xonar_st_init_i2c(struct oxygen *chip)
  358. {
  359. oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS,
  360. OXYGEN_2WIRE_LENGTH_8 |
  361. OXYGEN_2WIRE_INTERRUPT_MASK |
  362. OXYGEN_2WIRE_SPEED_STANDARD);
  363. }
  364. static void xonar_st_init_common(struct oxygen *chip)
  365. {
  366. struct xonar_pcm179x *data = chip->model_data;
  367. data->generic.output_enable_bit = GPIO_ST_OUTPUT_ENABLE;
  368. data->dacs = chip->model.dac_channels_mixer / 2;
  369. data->hp_gain_offset = 2*-18;
  370. pcm1796_init(chip);
  371. oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL,
  372. GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR |
  373. GPIO_ST_MAGIC | GPIO_ST_HP);
  374. oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA,
  375. GPIO_INPUT_ROUTE | GPIO_ST_HP_REAR | GPIO_ST_HP);
  376. xonar_init_cs53x1(chip);
  377. xonar_enable_output(chip);
  378. snd_component_add(chip->card, "PCM1792A");
  379. snd_component_add(chip->card, "CS5381");
  380. }
  381. static void cs2000_registers_init(struct oxygen *chip)
  382. {
  383. struct xonar_pcm179x *data = chip->model_data;
  384. cs2000_write(chip, CS2000_GLOBAL_CFG, CS2000_FREEZE);
  385. cs2000_write(chip, CS2000_DEV_CTRL, 0);
  386. cs2000_write(chip, CS2000_DEV_CFG_1,
  387. CS2000_R_MOD_SEL_1 |
  388. (0 << CS2000_R_SEL_SHIFT) |
  389. CS2000_AUX_OUT_SRC_REF_CLK |
  390. CS2000_EN_DEV_CFG_1);
  391. cs2000_write(chip, CS2000_DEV_CFG_2,
  392. (0 << CS2000_LOCK_CLK_SHIFT) |
  393. CS2000_FRAC_N_SRC_STATIC);
  394. cs2000_write(chip, CS2000_RATIO_0 + 0, 0x00); /* 1.0 */
  395. cs2000_write(chip, CS2000_RATIO_0 + 1, 0x10);
  396. cs2000_write(chip, CS2000_RATIO_0 + 2, 0x00);
  397. cs2000_write(chip, CS2000_RATIO_0 + 3, 0x00);
  398. cs2000_write(chip, CS2000_FUN_CFG_1,
  399. data->cs2000_regs[CS2000_FUN_CFG_1]);
  400. cs2000_write(chip, CS2000_FUN_CFG_2, 0);
  401. cs2000_write(chip, CS2000_GLOBAL_CFG, CS2000_EN_DEV_CFG_2);
  402. msleep(3); /* PLL lock delay */
  403. }
  404. static void xonar_st_init(struct oxygen *chip)
  405. {
  406. struct xonar_pcm179x *data = chip->model_data;
  407. data->generic.anti_pop_delay = 100;
  408. data->h6 = chip->model.dac_channels_mixer > 2;
  409. data->has_cs2000 = 1;
  410. data->cs2000_regs[CS2000_FUN_CFG_1] = CS2000_REF_CLK_DIV_1;
  411. data->broken_i2c = true;
  412. oxygen_write16(chip, OXYGEN_I2S_A_FORMAT,
  413. OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_I2S |
  414. OXYGEN_I2S_MCLK_256 | OXYGEN_I2S_BITS_16 |
  415. OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64);
  416. xonar_st_init_i2c(chip);
  417. cs2000_registers_init(chip);
  418. xonar_st_init_common(chip);
  419. snd_component_add(chip->card, "CS2000");
  420. }
  421. static void xonar_stx_init(struct oxygen *chip)
  422. {
  423. struct xonar_pcm179x *data = chip->model_data;
  424. xonar_st_init_i2c(chip);
  425. data->generic.anti_pop_delay = 800;
  426. data->generic.ext_power_reg = OXYGEN_GPI_DATA;
  427. data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
  428. data->generic.ext_power_bit = GPI_EXT_POWER;
  429. xonar_init_ext_power(chip);
  430. xonar_st_init_common(chip);
  431. }
  432. static void xonar_d2_cleanup(struct oxygen *chip)
  433. {
  434. xonar_disable_output(chip);
  435. }
  436. static void xonar_hdav_cleanup(struct oxygen *chip)
  437. {
  438. xonar_hdmi_cleanup(chip);
  439. xonar_disable_output(chip);
  440. msleep(2);
  441. }
  442. static void xonar_st_cleanup(struct oxygen *chip)
  443. {
  444. xonar_disable_output(chip);
  445. }
  446. static void xonar_d2_suspend(struct oxygen *chip)
  447. {
  448. xonar_d2_cleanup(chip);
  449. }
  450. static void xonar_hdav_suspend(struct oxygen *chip)
  451. {
  452. xonar_hdav_cleanup(chip);
  453. }
  454. static void xonar_st_suspend(struct oxygen *chip)
  455. {
  456. xonar_st_cleanup(chip);
  457. }
  458. static void xonar_d2_resume(struct oxygen *chip)
  459. {
  460. pcm1796_registers_init(chip);
  461. xonar_enable_output(chip);
  462. }
  463. static void xonar_hdav_resume(struct oxygen *chip)
  464. {
  465. struct xonar_hdav *data = chip->model_data;
  466. pcm1796_registers_init(chip);
  467. xonar_hdmi_resume(chip, &data->hdmi);
  468. xonar_enable_output(chip);
  469. }
  470. static void xonar_stx_resume(struct oxygen *chip)
  471. {
  472. pcm1796_registers_init(chip);
  473. xonar_enable_output(chip);
  474. }
  475. static void xonar_st_resume(struct oxygen *chip)
  476. {
  477. cs2000_registers_init(chip);
  478. xonar_stx_resume(chip);
  479. }
  480. static unsigned int mclk_from_rate(struct oxygen *chip, unsigned int rate)
  481. {
  482. struct xonar_pcm179x *data = chip->model_data;
  483. if (rate <= 32000)
  484. return data->h6 ? OXYGEN_I2S_MCLK_256 : OXYGEN_I2S_MCLK_512;
  485. else if (rate <= 48000)
  486. return data->os_128 && !data->h6
  487. ? OXYGEN_I2S_MCLK_512 : OXYGEN_I2S_MCLK_256;
  488. else
  489. return OXYGEN_I2S_MCLK_128;
  490. }
  491. static unsigned int get_pcm1796_i2s_mclk(struct oxygen *chip,
  492. unsigned int channel,
  493. struct snd_pcm_hw_params *params)
  494. {
  495. if (channel == PCM_MULTICH)
  496. return mclk_from_rate(chip, params_rate(params));
  497. else
  498. return oxygen_default_i2s_mclk(chip, channel, params);
  499. }
  500. static void update_pcm1796_oversampling(struct oxygen *chip)
  501. {
  502. struct xonar_pcm179x *data = chip->model_data;
  503. unsigned int i;
  504. u8 reg;
  505. if (data->current_rate <= 32000 && !data->h6)
  506. reg = PCM1796_OS_128;
  507. else if (data->current_rate <= 48000 && data->os_128 && !data->h6)
  508. reg = PCM1796_OS_128;
  509. else if (data->current_rate <= 96000 || data->os_128)
  510. reg = PCM1796_OS_64;
  511. else
  512. reg = PCM1796_OS_32;
  513. for (i = 0; i < data->dacs; ++i)
  514. pcm1796_write_cached(chip, i, 20, reg);
  515. }
  516. static void set_pcm1796_params(struct oxygen *chip,
  517. struct snd_pcm_hw_params *params)
  518. {
  519. struct xonar_pcm179x *data = chip->model_data;
  520. msleep(1);
  521. data->current_rate = params_rate(params);
  522. update_pcm1796_oversampling(chip);
  523. }
  524. static void update_pcm1796_volume(struct oxygen *chip)
  525. {
  526. struct xonar_pcm179x *data = chip->model_data;
  527. unsigned int i;
  528. s8 gain_offset;
  529. gain_offset = data->hp_active ? data->hp_gain_offset : 0;
  530. for (i = 0; i < data->dacs; ++i) {
  531. pcm1796_write_cached(chip, i, 16, chip->dac_volume[i * 2]
  532. + gain_offset);
  533. pcm1796_write_cached(chip, i, 17, chip->dac_volume[i * 2 + 1]
  534. + gain_offset);
  535. }
  536. }
  537. static void update_pcm1796_mute(struct oxygen *chip)
  538. {
  539. struct xonar_pcm179x *data = chip->model_data;
  540. unsigned int i;
  541. u8 value;
  542. value = PCM1796_DMF_DISABLED | PCM1796_FMT_24_I2S | PCM1796_ATLD;
  543. if (chip->dac_mute)
  544. value |= PCM1796_MUTE;
  545. for (i = 0; i < data->dacs; ++i)
  546. pcm1796_write_cached(chip, i, 18, value);
  547. }
  548. static void update_cs2000_rate(struct oxygen *chip, unsigned int rate)
  549. {
  550. struct xonar_pcm179x *data = chip->model_data;
  551. u8 rate_mclk, reg;
  552. switch (rate) {
  553. case 32000:
  554. if (data->h6)
  555. rate_mclk = OXYGEN_RATE_32000 | OXYGEN_I2S_MCLK_256;
  556. else
  557. rate_mclk = OXYGEN_RATE_32000 | OXYGEN_I2S_MCLK_512;
  558. break;
  559. case 44100:
  560. if (data->os_128 && !data->h6)
  561. rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_512;
  562. else
  563. rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256;
  564. break;
  565. default: /* 48000 */
  566. if (data->os_128 && !data->h6)
  567. rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_512;
  568. else
  569. rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256;
  570. break;
  571. case 64000:
  572. rate_mclk = OXYGEN_RATE_32000 | OXYGEN_I2S_MCLK_256;
  573. break;
  574. case 88200:
  575. rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_256;
  576. break;
  577. case 96000:
  578. rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_256;
  579. break;
  580. case 176400:
  581. rate_mclk = OXYGEN_RATE_44100 | OXYGEN_I2S_MCLK_512;
  582. break;
  583. case 192000:
  584. rate_mclk = OXYGEN_RATE_48000 | OXYGEN_I2S_MCLK_512;
  585. break;
  586. }
  587. oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT, rate_mclk,
  588. OXYGEN_I2S_RATE_MASK | OXYGEN_I2S_MCLK_MASK);
  589. if ((rate_mclk & OXYGEN_I2S_MCLK_MASK) <= OXYGEN_I2S_MCLK_256)
  590. reg = CS2000_REF_CLK_DIV_1;
  591. else
  592. reg = CS2000_REF_CLK_DIV_2;
  593. cs2000_write_cached(chip, CS2000_FUN_CFG_1, reg);
  594. msleep(3); /* PLL lock delay */
  595. }
  596. static void set_st_params(struct oxygen *chip,
  597. struct snd_pcm_hw_params *params)
  598. {
  599. update_cs2000_rate(chip, params_rate(params));
  600. set_pcm1796_params(chip, params);
  601. }
  602. static void set_hdav_params(struct oxygen *chip,
  603. struct snd_pcm_hw_params *params)
  604. {
  605. struct xonar_hdav *data = chip->model_data;
  606. set_pcm1796_params(chip, params);
  607. xonar_set_hdmi_params(chip, &data->hdmi, params);
  608. }
  609. static const struct snd_kcontrol_new alt_switch = {
  610. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  611. .name = "Analog Loopback Switch",
  612. .info = snd_ctl_boolean_mono_info,
  613. .get = xonar_gpio_bit_switch_get,
  614. .put = xonar_gpio_bit_switch_put,
  615. .private_value = GPIO_D2_ALT,
  616. };
  617. static int rolloff_info(struct snd_kcontrol *ctl,
  618. struct snd_ctl_elem_info *info)
  619. {
  620. static const char *const names[2] = {
  621. "Sharp Roll-off", "Slow Roll-off"
  622. };
  623. info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  624. info->count = 1;
  625. info->value.enumerated.items = 2;
  626. if (info->value.enumerated.item >= 2)
  627. info->value.enumerated.item = 1;
  628. strcpy(info->value.enumerated.name, names[info->value.enumerated.item]);
  629. return 0;
  630. }
  631. static int rolloff_get(struct snd_kcontrol *ctl,
  632. struct snd_ctl_elem_value *value)
  633. {
  634. struct oxygen *chip = ctl->private_data;
  635. struct xonar_pcm179x *data = chip->model_data;
  636. value->value.enumerated.item[0] =
  637. (data->pcm1796_regs[0][19 - PCM1796_REG_BASE] &
  638. PCM1796_FLT_MASK) != PCM1796_FLT_SHARP;
  639. return 0;
  640. }
  641. static int rolloff_put(struct snd_kcontrol *ctl,
  642. struct snd_ctl_elem_value *value)
  643. {
  644. struct oxygen *chip = ctl->private_data;
  645. struct xonar_pcm179x *data = chip->model_data;
  646. unsigned int i;
  647. int changed;
  648. u8 reg;
  649. mutex_lock(&chip->mutex);
  650. reg = data->pcm1796_regs[0][19 - PCM1796_REG_BASE];
  651. reg &= ~PCM1796_FLT_MASK;
  652. if (!value->value.enumerated.item[0])
  653. reg |= PCM1796_FLT_SHARP;
  654. else
  655. reg |= PCM1796_FLT_SLOW;
  656. changed = reg != data->pcm1796_regs[0][19 - PCM1796_REG_BASE];
  657. if (changed) {
  658. for (i = 0; i < data->dacs; ++i)
  659. pcm1796_write(chip, i, 19, reg);
  660. }
  661. mutex_unlock(&chip->mutex);
  662. return changed;
  663. }
  664. static const struct snd_kcontrol_new rolloff_control = {
  665. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  666. .name = "DAC Filter Playback Enum",
  667. .info = rolloff_info,
  668. .get = rolloff_get,
  669. .put = rolloff_put,
  670. };
  671. static int os_128_info(struct snd_kcontrol *ctl, struct snd_ctl_elem_info *info)
  672. {
  673. static const char *const names[2] = { "64x", "128x" };
  674. info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  675. info->count = 1;
  676. info->value.enumerated.items = 2;
  677. if (info->value.enumerated.item >= 2)
  678. info->value.enumerated.item = 1;
  679. strcpy(info->value.enumerated.name, names[info->value.enumerated.item]);
  680. return 0;
  681. }
  682. static int os_128_get(struct snd_kcontrol *ctl,
  683. struct snd_ctl_elem_value *value)
  684. {
  685. struct oxygen *chip = ctl->private_data;
  686. struct xonar_pcm179x *data = chip->model_data;
  687. value->value.enumerated.item[0] = data->os_128;
  688. return 0;
  689. }
  690. static int os_128_put(struct snd_kcontrol *ctl,
  691. struct snd_ctl_elem_value *value)
  692. {
  693. struct oxygen *chip = ctl->private_data;
  694. struct xonar_pcm179x *data = chip->model_data;
  695. int changed;
  696. mutex_lock(&chip->mutex);
  697. changed = value->value.enumerated.item[0] != data->os_128;
  698. if (changed) {
  699. data->os_128 = value->value.enumerated.item[0];
  700. if (data->has_cs2000)
  701. update_cs2000_rate(chip, data->current_rate);
  702. oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT,
  703. mclk_from_rate(chip, data->current_rate),
  704. OXYGEN_I2S_MCLK_MASK);
  705. msleep(1);
  706. update_pcm1796_oversampling(chip);
  707. }
  708. mutex_unlock(&chip->mutex);
  709. return changed;
  710. }
  711. static const struct snd_kcontrol_new os_128_control = {
  712. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  713. .name = "DAC Oversampling Playback Enum",
  714. .info = os_128_info,
  715. .get = os_128_get,
  716. .put = os_128_put,
  717. };
  718. static const struct snd_kcontrol_new hdav_hdmi_control = {
  719. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  720. .name = "HDMI Playback Switch",
  721. .info = snd_ctl_boolean_mono_info,
  722. .get = xonar_gpio_bit_switch_get,
  723. .put = xonar_gpio_bit_switch_put,
  724. .private_value = GPIO_HDAV_OUTPUT_ENABLE | XONAR_GPIO_BIT_INVERT,
  725. };
  726. static int st_output_switch_info(struct snd_kcontrol *ctl,
  727. struct snd_ctl_elem_info *info)
  728. {
  729. static const char *const names[3] = {
  730. "Speakers", "Headphones", "FP Headphones"
  731. };
  732. info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  733. info->count = 1;
  734. info->value.enumerated.items = 3;
  735. if (info->value.enumerated.item >= 3)
  736. info->value.enumerated.item = 2;
  737. strcpy(info->value.enumerated.name, names[info->value.enumerated.item]);
  738. return 0;
  739. }
  740. static int st_output_switch_get(struct snd_kcontrol *ctl,
  741. struct snd_ctl_elem_value *value)
  742. {
  743. struct oxygen *chip = ctl->private_data;
  744. u16 gpio;
  745. gpio = oxygen_read16(chip, OXYGEN_GPIO_DATA);
  746. if (!(gpio & GPIO_ST_HP))
  747. value->value.enumerated.item[0] = 0;
  748. else if (gpio & GPIO_ST_HP_REAR)
  749. value->value.enumerated.item[0] = 1;
  750. else
  751. value->value.enumerated.item[0] = 2;
  752. return 0;
  753. }
  754. static int st_output_switch_put(struct snd_kcontrol *ctl,
  755. struct snd_ctl_elem_value *value)
  756. {
  757. struct oxygen *chip = ctl->private_data;
  758. struct xonar_pcm179x *data = chip->model_data;
  759. u16 gpio_old, gpio;
  760. mutex_lock(&chip->mutex);
  761. gpio_old = oxygen_read16(chip, OXYGEN_GPIO_DATA);
  762. gpio = gpio_old;
  763. switch (value->value.enumerated.item[0]) {
  764. case 0:
  765. gpio &= ~(GPIO_ST_HP | GPIO_ST_HP_REAR);
  766. break;
  767. case 1:
  768. gpio |= GPIO_ST_HP | GPIO_ST_HP_REAR;
  769. break;
  770. case 2:
  771. gpio = (gpio | GPIO_ST_HP) & ~GPIO_ST_HP_REAR;
  772. break;
  773. }
  774. oxygen_write16(chip, OXYGEN_GPIO_DATA, gpio);
  775. data->hp_active = gpio & GPIO_ST_HP;
  776. update_pcm1796_volume(chip);
  777. mutex_unlock(&chip->mutex);
  778. return gpio != gpio_old;
  779. }
  780. static int st_hp_volume_offset_info(struct snd_kcontrol *ctl,
  781. struct snd_ctl_elem_info *info)
  782. {
  783. static const char *const names[3] = {
  784. "< 64 ohms", "64-300 ohms", "300-600 ohms"
  785. };
  786. info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
  787. info->count = 1;
  788. info->value.enumerated.items = 3;
  789. if (info->value.enumerated.item > 2)
  790. info->value.enumerated.item = 2;
  791. strcpy(info->value.enumerated.name, names[info->value.enumerated.item]);
  792. return 0;
  793. }
  794. static int st_hp_volume_offset_get(struct snd_kcontrol *ctl,
  795. struct snd_ctl_elem_value *value)
  796. {
  797. struct oxygen *chip = ctl->private_data;
  798. struct xonar_pcm179x *data = chip->model_data;
  799. mutex_lock(&chip->mutex);
  800. if (data->hp_gain_offset < 2*-6)
  801. value->value.enumerated.item[0] = 0;
  802. else if (data->hp_gain_offset < 0)
  803. value->value.enumerated.item[0] = 1;
  804. else
  805. value->value.enumerated.item[0] = 2;
  806. mutex_unlock(&chip->mutex);
  807. return 0;
  808. }
  809. static int st_hp_volume_offset_put(struct snd_kcontrol *ctl,
  810. struct snd_ctl_elem_value *value)
  811. {
  812. static const s8 offsets[] = { 2*-18, 2*-6, 0 };
  813. struct oxygen *chip = ctl->private_data;
  814. struct xonar_pcm179x *data = chip->model_data;
  815. s8 offset;
  816. int changed;
  817. if (value->value.enumerated.item[0] > 2)
  818. return -EINVAL;
  819. offset = offsets[value->value.enumerated.item[0]];
  820. mutex_lock(&chip->mutex);
  821. changed = offset != data->hp_gain_offset;
  822. if (changed) {
  823. data->hp_gain_offset = offset;
  824. update_pcm1796_volume(chip);
  825. }
  826. mutex_unlock(&chip->mutex);
  827. return changed;
  828. }
  829. static const struct snd_kcontrol_new st_controls[] = {
  830. {
  831. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  832. .name = "Analog Output",
  833. .info = st_output_switch_info,
  834. .get = st_output_switch_get,
  835. .put = st_output_switch_put,
  836. },
  837. {
  838. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  839. .name = "Headphones Impedance Playback Enum",
  840. .info = st_hp_volume_offset_info,
  841. .get = st_hp_volume_offset_get,
  842. .put = st_hp_volume_offset_put,
  843. },
  844. };
  845. static void xonar_line_mic_ac97_switch(struct oxygen *chip,
  846. unsigned int reg, unsigned int mute)
  847. {
  848. if (reg == AC97_LINE) {
  849. spin_lock_irq(&chip->reg_lock);
  850. oxygen_write16_masked(chip, OXYGEN_GPIO_DATA,
  851. mute ? GPIO_INPUT_ROUTE : 0,
  852. GPIO_INPUT_ROUTE);
  853. spin_unlock_irq(&chip->reg_lock);
  854. }
  855. }
  856. static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -6000, 50, 0);
  857. static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
  858. {
  859. if (!strncmp(template->name, "CD Capture ", 11))
  860. /* CD in is actually connected to the video in pin */
  861. template->private_value ^= AC97_CD ^ AC97_VIDEO;
  862. return 0;
  863. }
  864. static int xonar_st_h6_control_filter(struct snd_kcontrol_new *template)
  865. {
  866. if (!strncmp(template->name, "Master Playback ", 16))
  867. /* no volume/mute, as I²C to the third DAC does not work */
  868. return 1;
  869. return 0;
  870. }
  871. static int add_pcm1796_controls(struct oxygen *chip)
  872. {
  873. struct xonar_pcm179x *data = chip->model_data;
  874. int err;
  875. if (!data->broken_i2c) {
  876. err = snd_ctl_add(chip->card,
  877. snd_ctl_new1(&rolloff_control, chip));
  878. if (err < 0)
  879. return err;
  880. err = snd_ctl_add(chip->card,
  881. snd_ctl_new1(&os_128_control, chip));
  882. if (err < 0)
  883. return err;
  884. }
  885. return 0;
  886. }
  887. static int xonar_d2_mixer_init(struct oxygen *chip)
  888. {
  889. int err;
  890. err = snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip));
  891. if (err < 0)
  892. return err;
  893. err = add_pcm1796_controls(chip);
  894. if (err < 0)
  895. return err;
  896. return 0;
  897. }
  898. static int xonar_hdav_mixer_init(struct oxygen *chip)
  899. {
  900. int err;
  901. err = snd_ctl_add(chip->card, snd_ctl_new1(&hdav_hdmi_control, chip));
  902. if (err < 0)
  903. return err;
  904. err = add_pcm1796_controls(chip);
  905. if (err < 0)
  906. return err;
  907. return 0;
  908. }
  909. static int xonar_st_mixer_init(struct oxygen *chip)
  910. {
  911. unsigned int i;
  912. int err;
  913. for (i = 0; i < ARRAY_SIZE(st_controls); ++i) {
  914. err = snd_ctl_add(chip->card,
  915. snd_ctl_new1(&st_controls[i], chip));
  916. if (err < 0)
  917. return err;
  918. }
  919. err = add_pcm1796_controls(chip);
  920. if (err < 0)
  921. return err;
  922. return 0;
  923. }
  924. static void dump_pcm1796_registers(struct oxygen *chip,
  925. struct snd_info_buffer *buffer)
  926. {
  927. struct xonar_pcm179x *data = chip->model_data;
  928. unsigned int dac, i;
  929. for (dac = 0; dac < data->dacs; ++dac) {
  930. snd_iprintf(buffer, "\nPCM1796 %u:", dac + 1);
  931. for (i = 0; i < 5; ++i)
  932. snd_iprintf(buffer, " %02x",
  933. data->pcm1796_regs[dac][i]);
  934. }
  935. snd_iprintf(buffer, "\n");
  936. }
  937. static void dump_cs2000_registers(struct oxygen *chip,
  938. struct snd_info_buffer *buffer)
  939. {
  940. struct xonar_pcm179x *data = chip->model_data;
  941. unsigned int i;
  942. if (data->has_cs2000) {
  943. snd_iprintf(buffer, "\nCS2000:\n00: ");
  944. for (i = 1; i < 0x10; ++i)
  945. snd_iprintf(buffer, " %02x", data->cs2000_regs[i]);
  946. snd_iprintf(buffer, "\n10:");
  947. for (i = 0x10; i < 0x1f; ++i)
  948. snd_iprintf(buffer, " %02x", data->cs2000_regs[i]);
  949. snd_iprintf(buffer, "\n");
  950. }
  951. }
  952. static void dump_st_registers(struct oxygen *chip,
  953. struct snd_info_buffer *buffer)
  954. {
  955. dump_pcm1796_registers(chip, buffer);
  956. dump_cs2000_registers(chip, buffer);
  957. }
  958. static const struct oxygen_model model_xonar_d2 = {
  959. .longname = "Asus Virtuoso 200",
  960. .chip = "AV200",
  961. .init = xonar_d2_init,
  962. .control_filter = xonar_d2_control_filter,
  963. .mixer_init = xonar_d2_mixer_init,
  964. .cleanup = xonar_d2_cleanup,
  965. .suspend = xonar_d2_suspend,
  966. .resume = xonar_d2_resume,
  967. .get_i2s_mclk = get_pcm1796_i2s_mclk,
  968. .set_dac_params = set_pcm1796_params,
  969. .set_adc_params = xonar_set_cs53x1_params,
  970. .update_dac_volume = update_pcm1796_volume,
  971. .update_dac_mute = update_pcm1796_mute,
  972. .dump_registers = dump_pcm1796_registers,
  973. .dac_tlv = pcm1796_db_scale,
  974. .model_data_size = sizeof(struct xonar_pcm179x),
  975. .device_config = PLAYBACK_0_TO_I2S |
  976. PLAYBACK_1_TO_SPDIF |
  977. CAPTURE_0_FROM_I2S_2 |
  978. CAPTURE_1_FROM_SPDIF |
  979. MIDI_OUTPUT |
  980. MIDI_INPUT |
  981. AC97_CD_INPUT,
  982. .dac_channels_pcm = 8,
  983. .dac_channels_mixer = 8,
  984. .dac_volume_min = 255 - 2*60,
  985. .dac_volume_max = 255,
  986. .misc_flags = OXYGEN_MISC_MIDI,
  987. .function_flags = OXYGEN_FUNCTION_SPI |
  988. OXYGEN_FUNCTION_ENABLE_SPI_4_5,
  989. .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
  990. .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
  991. };
  992. static const struct oxygen_model model_xonar_hdav = {
  993. .longname = "Asus Virtuoso 200",
  994. .chip = "AV200",
  995. .init = xonar_hdav_init,
  996. .mixer_init = xonar_hdav_mixer_init,
  997. .cleanup = xonar_hdav_cleanup,
  998. .suspend = xonar_hdav_suspend,
  999. .resume = xonar_hdav_resume,
  1000. .pcm_hardware_filter = xonar_hdmi_pcm_hardware_filter,
  1001. .get_i2s_mclk = get_pcm1796_i2s_mclk,
  1002. .set_dac_params = set_hdav_params,
  1003. .set_adc_params = xonar_set_cs53x1_params,
  1004. .update_dac_volume = update_pcm1796_volume,
  1005. .update_dac_mute = update_pcm1796_mute,
  1006. .uart_input = xonar_hdmi_uart_input,
  1007. .ac97_switch = xonar_line_mic_ac97_switch,
  1008. .dump_registers = dump_pcm1796_registers,
  1009. .dac_tlv = pcm1796_db_scale,
  1010. .model_data_size = sizeof(struct xonar_hdav),
  1011. .device_config = PLAYBACK_0_TO_I2S |
  1012. PLAYBACK_1_TO_SPDIF |
  1013. CAPTURE_0_FROM_I2S_2 |
  1014. CAPTURE_1_FROM_SPDIF,
  1015. .dac_channels_pcm = 8,
  1016. .dac_channels_mixer = 2,
  1017. .dac_volume_min = 255 - 2*60,
  1018. .dac_volume_max = 255,
  1019. .misc_flags = OXYGEN_MISC_MIDI,
  1020. .function_flags = OXYGEN_FUNCTION_2WIRE,
  1021. .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
  1022. .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
  1023. };
  1024. static const struct oxygen_model model_xonar_st = {
  1025. .longname = "Asus Virtuoso 100",
  1026. .chip = "AV200",
  1027. .init = xonar_st_init,
  1028. .mixer_init = xonar_st_mixer_init,
  1029. .cleanup = xonar_st_cleanup,
  1030. .suspend = xonar_st_suspend,
  1031. .resume = xonar_st_resume,
  1032. .get_i2s_mclk = get_pcm1796_i2s_mclk,
  1033. .set_dac_params = set_st_params,
  1034. .set_adc_params = xonar_set_cs53x1_params,
  1035. .update_dac_volume = update_pcm1796_volume,
  1036. .update_dac_mute = update_pcm1796_mute,
  1037. .ac97_switch = xonar_line_mic_ac97_switch,
  1038. .dump_registers = dump_st_registers,
  1039. .dac_tlv = pcm1796_db_scale,
  1040. .model_data_size = sizeof(struct xonar_pcm179x),
  1041. .device_config = PLAYBACK_0_TO_I2S |
  1042. PLAYBACK_1_TO_SPDIF |
  1043. CAPTURE_0_FROM_I2S_2 |
  1044. AC97_FMIC_SWITCH,
  1045. .dac_channels_pcm = 2,
  1046. .dac_channels_mixer = 2,
  1047. .dac_volume_min = 255 - 2*60,
  1048. .dac_volume_max = 255,
  1049. .function_flags = OXYGEN_FUNCTION_2WIRE,
  1050. .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
  1051. .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
  1052. };
  1053. int __devinit get_xonar_pcm179x_model(struct oxygen *chip,
  1054. const struct pci_device_id *id)
  1055. {
  1056. switch (id->subdevice) {
  1057. case 0x8269:
  1058. chip->model = model_xonar_d2;
  1059. chip->model.shortname = "Xonar D2";
  1060. break;
  1061. case 0x82b7:
  1062. chip->model = model_xonar_d2;
  1063. chip->model.shortname = "Xonar D2X";
  1064. chip->model.init = xonar_d2x_init;
  1065. break;
  1066. case 0x8314:
  1067. chip->model = model_xonar_hdav;
  1068. oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
  1069. switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) {
  1070. default:
  1071. chip->model.shortname = "Xonar HDAV1.3";
  1072. break;
  1073. case GPIO_DB_H6:
  1074. chip->model.shortname = "Xonar HDAV1.3+H6";
  1075. chip->model.dac_channels_mixer = 8;
  1076. break;
  1077. }
  1078. break;
  1079. case 0x835d:
  1080. chip->model = model_xonar_st;
  1081. oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK);
  1082. switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) {
  1083. default:
  1084. chip->model.shortname = "Xonar ST";
  1085. break;
  1086. case GPIO_DB_H6:
  1087. chip->model.shortname = "Xonar ST+H6";
  1088. chip->model.control_filter = xonar_st_h6_control_filter;
  1089. chip->model.dac_channels_pcm = 8;
  1090. chip->model.dac_channels_mixer = 8;
  1091. break;
  1092. }
  1093. break;
  1094. case 0x835c:
  1095. chip->model = model_xonar_st;
  1096. chip->model.shortname = "Xonar STX";
  1097. chip->model.init = xonar_stx_init;
  1098. chip->model.resume = xonar_stx_resume;
  1099. chip->model.set_dac_params = set_pcm1796_params;
  1100. break;
  1101. case 0x835e:
  1102. snd_printk(KERN_ERR "the HDAV1.3 Slim is not supported\n");
  1103. return -ENODEV;
  1104. default:
  1105. return -EINVAL;
  1106. }
  1107. return 0;
  1108. }