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