Lines Matching +full:output +full:- +full:impedance +full:- +full:ohms

1 // SPDX-License-Identifier: GPL-2.0-only
10 * ------------
14 * SPI 0 -> 1st PCM1796 (front)
15 * SPI 1 -> 2nd PCM1796 (surround)
16 * SPI 2 -> 3rd PCM1796 (center/LFE)
17 * SPI 4 -> 4th PCM1796 (back)
19 * GPIO 2 -> M0 of CS5381
20 * GPIO 3 -> M1 of CS5381
21 * GPIO 5 <- external power present (D2X only)
22 * GPIO 7 -> ALT
23 * GPIO 8 -> enable output to speakers
27 * LINE_OUT -> input of ADC
29 * AUX_IN <- aux
30 * VIDEO_IN <- CD
31 * FMIC_IN <- mic
33 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
38 * ----------------------
42 * I²C <-> PCM1796 (addr 1001100) (front)
44 * GPI 0 <- external power present
46 * GPIO 0 -> enable HDMI (0) or speaker (1) output
47 * GPIO 2 -> M0 of CS5381
48 * GPIO 3 -> M1 of CS5381
49 * GPIO 4 <- daughterboard detection
50 * GPIO 5 <- daughterboard detection
51 * GPIO 6 -> ?
52 * GPIO 7 -> ?
53 * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
55 * UART <-> HDMI controller
59 * LINE_OUT -> input of ADC
61 * AUX_IN <- aux
62 * CD_IN <- CD
63 * MIC_IN <- mic
65 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
68 * ----------------
70 * GPIO 4 <- 1
73 * ----------------
75 * GPIO 4 <- 0
76 * GPIO 5 <- 0
78 * I²C <-> PCM1796 (addr 1001101) (surround)
79 * <-> PCM1796 (addr 1001110) (center/LFE)
80 * <-> PCM1796 (addr 1001111) (back)
83 * ---------------------
85 * GPIO 4 <- 0
86 * GPIO 5 <- 1
88 * I²C <-> CS4362A (addr 0011000) (surround, center/LFE, back)
93 * ----------------------------------
97 * I²C <-> PCM1792A (addr 1001100)
98 * <-> CS2000 (addr 1001110) (ST only)
100 * ADC1 MCLK -> REF_CLK of CS2000 (ST only)
102 * GPI 0 <- external power present (STX only)
104 * GPIO 0 -> enable output to speakers
105 * GPIO 1 -> route HP to front panel (0) or rear jack (1)
106 * GPIO 2 -> M0 of CS5381
107 * GPIO 3 -> M1 of CS5381
108 * GPIO 4 <- daughterboard detection
109 * GPIO 5 <- daughterboard detection
110 * GPIO 6 -> ?
111 * GPIO 7 -> route output to speaker jacks (0) or HP (1)
112 * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
116 * SCK <- CLK_OUT of CS2000 (ST only)
120 * LINE_OUT -> input of ADC
122 * AUX_IN <- aux
123 * MIC_IN <- mic
125 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
128 * ----------------
130 * GPIO 4 <- 0
131 * GPIO 5 <- 0
136 * -----------
140 * I²C <-> PCM1796 (addr 1001100) (front)
141 * <-> CS4362A (addr 0011000) (surround, center/LFE, back)
142 * <-> CS2000 (addr 1001110)
144 * ADC1 MCLK -> REF_CLK of CS2000
146 * GPI 0 <- external power present
148 * GPIO 0 -> enable output
149 * GPIO 1 -> route HP to front panel (0) or rear jack (1)
150 * GPIO 2 -> M0 of CS5381
151 * GPIO 3 -> M1 of CS5381
152 * GPIO 4 -> enable output
153 * GPIO 5 -> enable output
154 * GPIO 6 -> ?
155 * GPIO 7 -> route output to HP (0) or speaker (1)
156 * GPIO 8 -> route input jack to mic-in (0) or line-in (1)
160 * LINE_OUT -> input of ADC
162 * AUX_IN <- aux
163 * VIDEO_IN <- ?
164 * FMIC_IN <- mic
166 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
167 * GPO 1 -> route mic-in from input jack (0) or front panel header (1)
235 /* maps ALSA channel pair number to SPI output */
256 struct xonar_pcm179x *data = chip->model_data;
258 if ((chip->model.function_flags & OXYGEN_FUNCTION_2WIRE_SPI_MASK) ==
263 if ((unsigned int)(reg - PCM1796_REG_BASE)
264 < ARRAY_SIZE(data->pcm1796_regs[codec]))
265 data->pcm1796_regs[codec][reg - PCM1796_REG_BASE] = value;
271 struct xonar_pcm179x *data = chip->model_data;
273 if (value != data->pcm1796_regs[codec][reg - PCM1796_REG_BASE])
279 struct xonar_pcm179x *data = chip->model_data;
282 data->cs2000_regs[reg] = value;
287 struct xonar_pcm179x *data = chip->model_data;
289 if (value != data->cs2000_regs[reg])
295 struct xonar_pcm179x *data = chip->model_data;
300 gain_offset = data->hp_active ? data->hp_gain_offset : 0;
301 for (i = 0; i < data->dacs; ++i) {
304 data->pcm1796_regs[0][18 - PCM1796_REG_BASE]);
305 pcm1796_write(chip, i, 16, chip->dac_volume[i * 2]
307 pcm1796_write(chip, i, 17, chip->dac_volume[i * 2 + 1]
310 data->pcm1796_regs[0][19 - PCM1796_REG_BASE]);
312 data->pcm1796_regs[0][20 - PCM1796_REG_BASE]);
320 struct xonar_pcm179x *data = chip->model_data;
322 data->pcm1796_regs[0][18 - PCM1796_REG_BASE] =
324 if (!data->broken_i2c)
325 data->pcm1796_regs[0][18 - PCM1796_REG_BASE] |= PCM1796_MUTE;
326 data->pcm1796_regs[0][19 - PCM1796_REG_BASE] =
328 data->pcm1796_regs[0][20 - PCM1796_REG_BASE] =
329 data->h6 ? PCM1796_OS_64 : PCM1796_OS_128;
331 data->current_rate = 48000;
336 struct xonar_pcm179x *data = chip->model_data;
338 data->generic.anti_pop_delay = 300;
339 data->generic.output_enable_bit = GPIO_D2_OUTPUT_ENABLE;
340 data->dacs = 4;
352 snd_component_add(chip->card, "PCM1796");
353 snd_component_add(chip->card, "CS5381");
358 struct xonar_pcm179x *data = chip->model_data;
360 data->generic.ext_power_reg = OXYGEN_GPIO_DATA;
361 data->generic.ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK;
362 data->generic.ext_power_bit = GPIO_D2X_EXT_POWER;
370 struct xonar_hdav *data = chip->model_data;
377 data->pcm179x.generic.anti_pop_delay = 100;
378 data->pcm179x.generic.output_enable_bit = GPIO_HDAV_OUTPUT_ENABLE;
379 data->pcm179x.generic.ext_power_reg = OXYGEN_GPI_DATA;
380 data->pcm179x.generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
381 data->pcm179x.generic.ext_power_bit = GPI_EXT_POWER;
382 data->pcm179x.dacs = chip->model.dac_channels_mixer / 2;
383 data->pcm179x.h6 = chip->model.dac_channels_mixer > 2;
393 xonar_hdmi_init(chip, &data->hdmi);
396 snd_component_add(chip->card, "PCM1796");
397 snd_component_add(chip->card, "CS5381");
410 struct xonar_pcm179x *data = chip->model_data;
412 data->generic.output_enable_bit = GPIO_ST_OUTPUT_ENABLE;
413 data->dacs = chip->model.dac_channels_mixer / 2;
414 data->h6 = chip->model.dac_channels_mixer > 2;
415 data->hp_gain_offset = 2*-18;
428 snd_component_add(chip->card, "PCM1792A");
429 snd_component_add(chip->card, "CS5381");
434 struct xonar_pcm179x *data = chip->model_data;
451 data->cs2000_regs[CS2000_FUN_CFG_1]);
459 struct xonar_pcm179x *data = chip->model_data;
461 data->generic.anti_pop_delay = 100;
462 data->h6 = chip->model.dac_channels_mixer > 2;
463 data->has_cs2000 = true;
464 data->cs2000_regs[CS2000_FUN_CFG_1] = CS2000_REF_CLK_DIV_1;
465 data->broken_i2c = true;
470 OXYGEN_I2S_MCLK(data->h6 ? MCLK_256 : MCLK_512) |
479 snd_component_add(chip->card, "CS2000");
484 struct xonar_pcm179x *data = chip->model_data;
487 data->generic.anti_pop_delay = 800;
488 data->generic.ext_power_reg = OXYGEN_GPI_DATA;
489 data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
490 data->generic.ext_power_bit = GPI_EXT_POWER;
497 struct xonar_pcm179x *data = chip->model_data;
499 data->generic.ext_power_reg = OXYGEN_GPI_DATA;
500 data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
501 data->generic.ext_power_bit = GPI_EXT_POWER;
504 data->generic.anti_pop_delay = 100;
505 data->has_cs2000 = true;
506 data->cs2000_regs[CS2000_FUN_CFG_1] = CS2000_REF_CLK_DIV_1;
519 data->generic.output_enable_bit = GPIO_XENSE_OUTPUT_ENABLE;
520 data->dacs = 1;
521 data->hp_gain_offset = 2*-18;
535 snd_component_add(chip->card, "PCM1796");
536 snd_component_add(chip->card, "CS5381");
537 snd_component_add(chip->card, "CS2000");
580 struct xonar_hdav *data = chip->model_data;
583 xonar_hdmi_resume(chip, &data->hdmi);
601 struct xonar_pcm179x *data = chip->model_data;
605 if (data->current_rate <= 48000 && !data->h6)
609 for (i = 0; i < data->dacs; ++i)
615 struct xonar_pcm179x *data = chip->model_data;
619 reg = data->pcm1796_regs[0][18 - PCM1796_REG_BASE] & ~PCM1796_DMF_MASK;
620 if (data->current_rate == 48000)
622 else if (data->current_rate == 44100)
624 else if (data->current_rate == 32000)
626 for (i = 0; i < data->dacs; ++i)
633 struct xonar_pcm179x *data = chip->model_data;
636 data->current_rate = params_rate(params);
643 struct xonar_pcm179x *data = chip->model_data;
647 gain_offset = data->hp_active ? data->hp_gain_offset : 0;
648 for (i = 0; i < data->dacs; ++i) {
649 pcm1796_write_cached(chip, i, 16, chip->dac_volume[i * 2]
651 pcm1796_write_cached(chip, i, 17, chip->dac_volume[i * 2 + 1]
659 struct xonar_pcm179x *data = chip->model_data;
663 value = data->pcm1796_regs[0][18 - PCM1796_REG_BASE];
664 if (chip->dac_mute)
668 for (i = 0; i < data->dacs; ++i)
674 struct xonar_pcm179x *data = chip->model_data;
695 if (rate <= 96000 && (rate > 48000 || data->h6)) {
719 struct xonar_hdav *data = chip->model_data;
722 xonar_set_hdmi_params(chip, &data->hdmi, params);
738 "Sharp Roll-off", "Slow Roll-off"
747 struct oxygen *chip = ctl->private_data;
748 struct xonar_pcm179x *data = chip->model_data;
750 value->value.enumerated.item[0] =
751 (data->pcm1796_regs[0][19 - PCM1796_REG_BASE] &
759 struct oxygen *chip = ctl->private_data;
760 struct xonar_pcm179x *data = chip->model_data;
765 guard(mutex)(&chip->mutex);
766 reg = data->pcm1796_regs[0][19 - PCM1796_REG_BASE];
768 if (!value->value.enumerated.item[0])
772 changed = reg != data->pcm1796_regs[0][19 - PCM1796_REG_BASE];
774 for (i = 0; i < data->dacs; ++i)
791 struct oxygen *chip = ctl->private_data;
792 struct xonar_pcm179x *data = chip->model_data;
794 value->value.integer.value[0] =
795 !!(data->pcm1796_regs[0][18 - PCM1796_REG_BASE] & PCM1796_DME);
802 struct oxygen *chip = ctl->private_data;
803 struct xonar_pcm179x *data = chip->model_data;
808 guard(mutex)(&chip->mutex);
809 reg = data->pcm1796_regs[0][18 - PCM1796_REG_BASE];
810 if (!value->value.integer.value[0])
814 changed = reg != data->pcm1796_regs[0][18 - PCM1796_REG_BASE];
816 for (i = 0; i < data->dacs; ++i)
824 .name = "De-emphasis Playback Switch",
852 struct oxygen *chip = ctl->private_data;
857 value->value.enumerated.item[0] = 0;
859 value->value.enumerated.item[0] = 1;
861 value->value.enumerated.item[0] = 2;
869 struct oxygen *chip = ctl->private_data;
870 struct xonar_pcm179x *data = chip->model_data;
873 guard(mutex)(&chip->mutex);
876 switch (value->value.enumerated.item[0]) {
888 data->hp_active = gpio & GPIO_ST_HP;
897 "< 32 ohms", "32-64 ohms", "64-300 ohms", "300-600 ohms"
906 struct oxygen *chip = ctl->private_data;
907 struct xonar_pcm179x *data = chip->model_data;
909 guard(mutex)(&chip->mutex);
910 if (data->hp_gain_offset < 2*-12)
911 value->value.enumerated.item[0] = 0;
912 else if (data->hp_gain_offset < 2*-6)
913 value->value.enumerated.item[0] = 1;
914 else if (data->hp_gain_offset < 0)
915 value->value.enumerated.item[0] = 2;
917 value->value.enumerated.item[0] = 3;
925 static const s8 offsets[] = { 2*-18, 2*-12, 2*-6, 0 };
926 struct oxygen *chip = ctl->private_data;
927 struct xonar_pcm179x *data = chip->model_data;
931 if (value->value.enumerated.item[0] > 3)
932 return -EINVAL;
933 offset = offsets[value->value.enumerated.item[0]];
934 guard(mutex)(&chip->mutex);
935 changed = offset != data->hp_gain_offset;
937 data->hp_gain_offset = offset;
946 .name = "Analog Output",
953 .name = "Headphones Impedance Playback Enum",
963 struct oxygen *chip = ctl->private_data;
968 value->value.enumerated.item[0] = 0;
970 value->value.enumerated.item[0] = 1;
972 value->value.enumerated.item[0] = 2;
979 struct oxygen *chip = ctl->private_data;
980 struct xonar_pcm179x *data = chip->model_data;
983 guard(mutex)(&chip->mutex);
986 switch (value->value.enumerated.item[0]) {
998 data->hp_active = !(gpio & GPIO_XENSE_SPEAKERS);
1006 .name = "Analog Output",
1013 .name = "Headphones Impedance Playback Enum",
1024 guard(spinlock_irq)(&chip->reg_lock);
1031 static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -6000, 50, 0);
1035 if (!strncmp(template->name, "CD Capture ", 11))
1037 template->private_value ^= AC97_CD ^ AC97_VIDEO;
1043 if (!strncmp(template->name, "Master Playback ", 16))
1051 struct xonar_pcm179x *data = chip->model_data;
1054 if (!data->broken_i2c) {
1055 err = snd_ctl_add(chip->card,
1059 err = snd_ctl_add(chip->card,
1071 err = snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip));
1084 err = snd_ctl_add(chip->card, snd_ctl_new1(&hdav_hdmi_control, chip));
1099 err = snd_ctl_add(chip->card,
1116 err = snd_ctl_add(chip->card,
1130 struct xonar_pcm179x *data = chip->model_data;
1133 for (dac = 0; dac < data->dacs; ++dac) {
1137 data->pcm1796_regs[dac][i]);
1145 struct xonar_pcm179x *data = chip->model_data;
1148 if (data->has_cs2000) {
1151 snd_iprintf(buffer, " %02x", data->cs2000_regs[i]);
1154 snd_iprintf(buffer, " %02x", data->cs2000_regs[i]);
1191 .dac_volume_min = 255 - 2*60,
1226 .dac_volume_min = 255 - 2*60,
1259 .dac_volume_min = 255 - 2*60,
1271 switch (id->subdevice) {
1273 chip->model = model_xonar_d2;
1274 chip->model.shortname = "Xonar D2";
1277 chip->model = model_xonar_d2;
1278 chip->model.shortname = "Xonar D2X";
1279 chip->model.init = xonar_d2x_init;
1282 chip->model = model_xonar_hdav;
1286 chip->model.shortname = "Xonar HDAV1.3";
1289 chip->model.shortname = "Xonar HDAV1.3+H6";
1290 chip->model.dac_channels_mixer = 8;
1291 chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128);
1296 chip->model = model_xonar_st;
1300 chip->model.shortname = "Xonar ST";
1303 chip->model.shortname = "Xonar ST+H6";
1304 chip->model.control_filter = xonar_st_h6_control_filter;
1305 chip->model.dac_channels_pcm = 8;
1306 chip->model.dac_channels_mixer = 8;
1307 chip->model.dac_volume_min = 255;
1308 chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128);
1313 chip->model = model_xonar_st;
1314 chip->model.shortname = "Xonar STX";
1315 chip->model.init = xonar_stx_init;
1316 chip->model.resume = xonar_stx_resume;
1317 chip->model.set_dac_params = set_pcm1796_params;
1320 chip->model = model_xonar_st;
1324 chip->model.shortname = "Xonar STX II";
1327 chip->model.shortname = "Xonar STX II+H6";
1328 chip->model.dac_channels_pcm = 8;
1329 chip->model.dac_channels_mixer = 8;
1330 chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128);
1333 chip->model.init = xonar_stx_init;
1334 chip->model.resume = xonar_stx_resume;
1335 chip->model.set_dac_params = set_pcm1796_params;
1338 chip->model = model_xonar_st;
1339 chip->model.shortname = "Xonar Xense";
1340 chip->model.chip = "AV100";
1341 chip->model.init = xonar_xense_init;
1342 chip->model.mixer_init = xonar_xense_mixer_init;
1345 return -EINVAL;