xonar_pcm179x.c 34 KB

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