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