Lines Matching +full:chip +full:- +full:to +full:- +full:chip

21  * ------------
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)
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
38 * LINE_OUT -> input of ADC
40 * AUX_IN <- aux
41 * VIDEO_IN <- CD
42 * FMIC_IN <- mic
44 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
49 * ----------------------
53 * I²C <-> PCM1796 (addr 1001100) (front)
55 * GPI 0 <- external power present
57 * GPIO 0 -> enable HDMI (0) or speaker (1) output
58 * GPIO 2 -> M0 of CS5381
59 * GPIO 3 -> M1 of CS5381
60 * GPIO 4 <- daughterboard detection
61 * GPIO 5 <- daughterboard detection
62 * GPIO 6 -> ?
63 * GPIO 7 -> ?
64 * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
66 * UART <-> HDMI controller
70 * LINE_OUT -> input of ADC
72 * AUX_IN <- aux
73 * CD_IN <- CD
74 * MIC_IN <- mic
76 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
79 * ----------------
81 * GPIO 4 <- 1
84 * ----------------
86 * GPIO 4 <- 0
87 * GPIO 5 <- 0
89 * I²C <-> PCM1796 (addr 1001101) (surround)
90 * <-> PCM1796 (addr 1001110) (center/LFE)
91 * <-> PCM1796 (addr 1001111) (back)
94 * ---------------------
96 * GPIO 4 <- 0
97 * GPIO 5 <- 1
99 * I²C <-> CS4362A (addr 0011000) (surround, center/LFE, back)
104 * -----------------------------
108 * I²C <-> PCM1792A (addr 1001100)
109 * <-> CS2000 (addr 1001110) (ST only)
111 * ADC1 MCLK -> REF_CLK of CS2000 (ST only)
113 * GPI 0 <- external power present (STX only)
115 * GPIO 0 -> enable output to speakers
116 * GPIO 1 -> route HP to front panel (0) or rear jack (1)
117 * GPIO 2 -> M0 of CS5381
118 * GPIO 3 -> M1 of CS5381
119 * GPIO 4 <- daughterboard detection
120 * GPIO 5 <- daughterboard detection
121 * GPIO 6 -> ?
122 * GPIO 7 -> route output to speaker jacks (0) or HP (1)
123 * GPIO 8 -> route input jack to line-in (0) or mic-in (1)
127 * SCK <- CLK_OUT of CS2000 (ST only)
131 * LINE_OUT -> input of ADC
133 * AUX_IN <- aux
134 * MIC_IN <- mic
136 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
139 * ----------------
141 * GPIO 4 <- 0
142 * GPIO 5 <- 0
147 * -----------
151 * I²C <-> PCM1796 (addr 1001100) (front)
152 * <-> CS4362A (addr 0011000) (surround, center/LFE, back)
153 * <-> CS2000 (addr 1001110)
155 * ADC1 MCLK -> REF_CLK of CS2000
157 * GPI 0 <- external power present
159 * GPIO 0 -> enable output
160 * GPIO 1 -> route HP to front panel (0) or rear jack (1)
161 * GPIO 2 -> M0 of CS5381
162 * GPIO 3 -> M1 of CS5381
163 * GPIO 4 -> enable output
164 * GPIO 5 -> enable output
165 * GPIO 6 -> ?
166 * GPIO 7 -> route output to HP (0) or speaker (1)
167 * GPIO 8 -> route input jack to mic-in (0) or line-in (1)
171 * LINE_OUT -> input of ADC
173 * AUX_IN <- aux
174 * VIDEO_IN <- ?
175 * FMIC_IN <- mic
177 * GPO 0 -> route line-in (0) or AC97 output (1) to CS5381 input
178 * GPO 1 -> route mic-in from input jack (0) or front panel header (1)
240 static inline void pcm1796_write_spi(struct oxygen *chip, unsigned int codec, in pcm1796_write_spi() argument
243 /* maps ALSA channel pair number to SPI output */ in pcm1796_write_spi()
247 oxygen_write_spi(chip, OXYGEN_SPI_TRIGGER | in pcm1796_write_spi()
255 static inline void pcm1796_write_i2c(struct oxygen *chip, unsigned int codec, in pcm1796_write_i2c() argument
258 oxygen_write_i2c(chip, I2C_DEVICE_PCM1796(codec), reg, value); in pcm1796_write_i2c()
261 static void pcm1796_write(struct oxygen *chip, unsigned int codec, in pcm1796_write() argument
264 struct xonar_pcm179x *data = chip->model_data; in pcm1796_write()
266 if ((chip->model.function_flags & OXYGEN_FUNCTION_2WIRE_SPI_MASK) == in pcm1796_write()
268 pcm1796_write_spi(chip, codec, reg, value); in pcm1796_write()
270 pcm1796_write_i2c(chip, codec, reg, value); in pcm1796_write()
271 if ((unsigned int)(reg - PCM1796_REG_BASE) in pcm1796_write()
272 < ARRAY_SIZE(data->pcm1796_regs[codec])) in pcm1796_write()
273 data->pcm1796_regs[codec][reg - PCM1796_REG_BASE] = value; in pcm1796_write()
276 static void pcm1796_write_cached(struct oxygen *chip, unsigned int codec, in pcm1796_write_cached() argument
279 struct xonar_pcm179x *data = chip->model_data; in pcm1796_write_cached()
281 if (value != data->pcm1796_regs[codec][reg - PCM1796_REG_BASE]) in pcm1796_write_cached()
282 pcm1796_write(chip, codec, reg, value); in pcm1796_write_cached()
285 static void cs2000_write(struct oxygen *chip, u8 reg, u8 value) in cs2000_write() argument
287 struct xonar_pcm179x *data = chip->model_data; in cs2000_write()
289 oxygen_write_i2c(chip, I2C_DEVICE_CS2000, reg, value); in cs2000_write()
290 data->cs2000_regs[reg] = value; in cs2000_write()
293 static void cs2000_write_cached(struct oxygen *chip, u8 reg, u8 value) in cs2000_write_cached() argument
295 struct xonar_pcm179x *data = chip->model_data; in cs2000_write_cached()
297 if (value != data->cs2000_regs[reg]) in cs2000_write_cached()
298 cs2000_write(chip, reg, value); in cs2000_write_cached()
301 static void pcm1796_registers_init(struct oxygen *chip) in pcm1796_registers_init() argument
303 struct xonar_pcm179x *data = chip->model_data; in pcm1796_registers_init()
308 gain_offset = data->hp_active ? data->hp_gain_offset : 0; in pcm1796_registers_init()
309 for (i = 0; i < data->dacs; ++i) { in pcm1796_registers_init()
311 pcm1796_write(chip, i, 18, in pcm1796_registers_init()
312 data->pcm1796_regs[0][18 - PCM1796_REG_BASE]); in pcm1796_registers_init()
313 pcm1796_write(chip, i, 16, chip->dac_volume[i * 2] in pcm1796_registers_init()
315 pcm1796_write(chip, i, 17, chip->dac_volume[i * 2 + 1] in pcm1796_registers_init()
317 pcm1796_write(chip, i, 19, in pcm1796_registers_init()
318 data->pcm1796_regs[0][19 - PCM1796_REG_BASE]); in pcm1796_registers_init()
319 pcm1796_write(chip, i, 20, in pcm1796_registers_init()
320 data->pcm1796_regs[0][20 - PCM1796_REG_BASE]); in pcm1796_registers_init()
321 pcm1796_write(chip, i, 21, 0); in pcm1796_registers_init()
326 static void pcm1796_init(struct oxygen *chip) in pcm1796_init() argument
328 struct xonar_pcm179x *data = chip->model_data; in pcm1796_init()
330 data->pcm1796_regs[0][18 - PCM1796_REG_BASE] = in pcm1796_init()
332 if (!data->broken_i2c) in pcm1796_init()
333 data->pcm1796_regs[0][18 - PCM1796_REG_BASE] |= PCM1796_MUTE; in pcm1796_init()
334 data->pcm1796_regs[0][19 - PCM1796_REG_BASE] = in pcm1796_init()
336 data->pcm1796_regs[0][20 - PCM1796_REG_BASE] = in pcm1796_init()
337 data->h6 ? PCM1796_OS_64 : PCM1796_OS_128; in pcm1796_init()
338 pcm1796_registers_init(chip); in pcm1796_init()
339 data->current_rate = 48000; in pcm1796_init()
342 static void xonar_d2_init(struct oxygen *chip) in xonar_d2_init() argument
344 struct xonar_pcm179x *data = chip->model_data; in xonar_d2_init()
346 data->generic.anti_pop_delay = 300; in xonar_d2_init()
347 data->generic.output_enable_bit = GPIO_D2_OUTPUT_ENABLE; in xonar_d2_init()
348 data->dacs = 4; in xonar_d2_init()
350 pcm1796_init(chip); in xonar_d2_init()
352 oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2_ALT); in xonar_d2_init()
353 oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_D2_ALT); in xonar_d2_init()
355 oxygen_ac97_set_bits(chip, 0, CM9780_JACK, CM9780_FMIC2MIC); in xonar_d2_init()
357 xonar_init_cs53x1(chip); in xonar_d2_init()
358 xonar_enable_output(chip); in xonar_d2_init()
360 snd_component_add(chip->card, "PCM1796"); in xonar_d2_init()
361 snd_component_add(chip->card, "CS5381"); in xonar_d2_init()
364 static void xonar_d2x_init(struct oxygen *chip) in xonar_d2x_init() argument
366 struct xonar_pcm179x *data = chip->model_data; in xonar_d2x_init()
368 data->generic.ext_power_reg = OXYGEN_GPIO_DATA; in xonar_d2x_init()
369 data->generic.ext_power_int_reg = OXYGEN_GPIO_INTERRUPT_MASK; in xonar_d2x_init()
370 data->generic.ext_power_bit = GPIO_D2X_EXT_POWER; in xonar_d2x_init()
371 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_D2X_EXT_POWER); in xonar_d2x_init()
372 xonar_init_ext_power(chip); in xonar_d2x_init()
373 xonar_d2_init(chip); in xonar_d2x_init()
376 static void xonar_hdav_init(struct oxygen *chip) in xonar_hdav_init() argument
378 struct xonar_hdav *data = chip->model_data; in xonar_hdav_init()
380 oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, in xonar_hdav_init()
385 data->pcm179x.generic.anti_pop_delay = 100; in xonar_hdav_init()
386 data->pcm179x.generic.output_enable_bit = GPIO_HDAV_OUTPUT_ENABLE; in xonar_hdav_init()
387 data->pcm179x.generic.ext_power_reg = OXYGEN_GPI_DATA; in xonar_hdav_init()
388 data->pcm179x.generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; in xonar_hdav_init()
389 data->pcm179x.generic.ext_power_bit = GPI_EXT_POWER; in xonar_hdav_init()
390 data->pcm179x.dacs = chip->model.dac_channels_mixer / 2; in xonar_hdav_init()
391 data->pcm179x.h6 = chip->model.dac_channels_mixer > 2; in xonar_hdav_init()
393 pcm1796_init(chip); in xonar_hdav_init()
395 oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, in xonar_hdav_init()
397 oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, GPIO_INPUT_ROUTE); in xonar_hdav_init()
399 xonar_init_cs53x1(chip); in xonar_hdav_init()
400 xonar_init_ext_power(chip); in xonar_hdav_init()
401 xonar_hdmi_init(chip, &data->hdmi); in xonar_hdav_init()
402 xonar_enable_output(chip); in xonar_hdav_init()
404 snd_component_add(chip->card, "PCM1796"); in xonar_hdav_init()
405 snd_component_add(chip->card, "CS5381"); in xonar_hdav_init()
408 static void xonar_st_init_i2c(struct oxygen *chip) in xonar_st_init_i2c() argument
410 oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, in xonar_st_init_i2c()
416 static void xonar_st_init_common(struct oxygen *chip) in xonar_st_init_common() argument
418 struct xonar_pcm179x *data = chip->model_data; in xonar_st_init_common()
420 data->generic.output_enable_bit = GPIO_ST_OUTPUT_ENABLE; in xonar_st_init_common()
421 data->dacs = chip->model.dac_channels_mixer / 2; in xonar_st_init_common()
422 data->hp_gain_offset = 2*-18; in xonar_st_init_common()
424 pcm1796_init(chip); in xonar_st_init_common()
426 oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, in xonar_st_init_common()
429 oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, in xonar_st_init_common()
432 xonar_init_cs53x1(chip); in xonar_st_init_common()
433 xonar_enable_output(chip); in xonar_st_init_common()
435 snd_component_add(chip->card, "PCM1792A"); in xonar_st_init_common()
436 snd_component_add(chip->card, "CS5381"); in xonar_st_init_common()
439 static void cs2000_registers_init(struct oxygen *chip) in cs2000_registers_init() argument
441 struct xonar_pcm179x *data = chip->model_data; in cs2000_registers_init()
443 cs2000_write(chip, CS2000_GLOBAL_CFG, CS2000_FREEZE); in cs2000_registers_init()
444 cs2000_write(chip, CS2000_DEV_CTRL, 0); in cs2000_registers_init()
445 cs2000_write(chip, CS2000_DEV_CFG_1, in cs2000_registers_init()
450 cs2000_write(chip, CS2000_DEV_CFG_2, in cs2000_registers_init()
453 cs2000_write(chip, CS2000_RATIO_0 + 0, 0x00); /* 1.0 */ in cs2000_registers_init()
454 cs2000_write(chip, CS2000_RATIO_0 + 1, 0x10); in cs2000_registers_init()
455 cs2000_write(chip, CS2000_RATIO_0 + 2, 0x00); in cs2000_registers_init()
456 cs2000_write(chip, CS2000_RATIO_0 + 3, 0x00); in cs2000_registers_init()
457 cs2000_write(chip, CS2000_FUN_CFG_1, in cs2000_registers_init()
458 data->cs2000_regs[CS2000_FUN_CFG_1]); in cs2000_registers_init()
459 cs2000_write(chip, CS2000_FUN_CFG_2, 0); in cs2000_registers_init()
460 cs2000_write(chip, CS2000_GLOBAL_CFG, CS2000_EN_DEV_CFG_2); in cs2000_registers_init()
464 static void xonar_st_init(struct oxygen *chip) in xonar_st_init() argument
466 struct xonar_pcm179x *data = chip->model_data; in xonar_st_init()
468 data->generic.anti_pop_delay = 100; in xonar_st_init()
469 data->h6 = chip->model.dac_channels_mixer > 2; in xonar_st_init()
470 data->has_cs2000 = 1; in xonar_st_init()
471 data->cs2000_regs[CS2000_FUN_CFG_1] = CS2000_REF_CLK_DIV_1; in xonar_st_init()
472 data->broken_i2c = true; in xonar_st_init()
474 oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, in xonar_st_init()
477 OXYGEN_I2S_MCLK(data->h6 ? MCLK_256 : MCLK_512) | in xonar_st_init()
482 xonar_st_init_i2c(chip); in xonar_st_init()
483 cs2000_registers_init(chip); in xonar_st_init()
484 xonar_st_init_common(chip); in xonar_st_init()
486 snd_component_add(chip->card, "CS2000"); in xonar_st_init()
489 static void xonar_stx_init(struct oxygen *chip) in xonar_stx_init() argument
491 struct xonar_pcm179x *data = chip->model_data; in xonar_stx_init()
493 xonar_st_init_i2c(chip); in xonar_stx_init()
494 data->generic.anti_pop_delay = 800; in xonar_stx_init()
495 data->generic.ext_power_reg = OXYGEN_GPI_DATA; in xonar_stx_init()
496 data->generic.ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; in xonar_stx_init()
497 data->generic.ext_power_bit = GPI_EXT_POWER; in xonar_stx_init()
498 xonar_init_ext_power(chip); in xonar_stx_init()
499 xonar_st_init_common(chip); in xonar_stx_init()
502 static void xonar_d2_cleanup(struct oxygen *chip) in xonar_d2_cleanup() argument
504 xonar_disable_output(chip); in xonar_d2_cleanup()
507 static void xonar_hdav_cleanup(struct oxygen *chip) in xonar_hdav_cleanup() argument
509 xonar_hdmi_cleanup(chip); in xonar_hdav_cleanup()
510 xonar_disable_output(chip); in xonar_hdav_cleanup()
514 static void xonar_st_cleanup(struct oxygen *chip) in xonar_st_cleanup() argument
516 xonar_disable_output(chip); in xonar_st_cleanup()
519 static void xonar_d2_suspend(struct oxygen *chip) in xonar_d2_suspend() argument
521 xonar_d2_cleanup(chip); in xonar_d2_suspend()
524 static void xonar_hdav_suspend(struct oxygen *chip) in xonar_hdav_suspend() argument
526 xonar_hdav_cleanup(chip); in xonar_hdav_suspend()
529 static void xonar_st_suspend(struct oxygen *chip) in xonar_st_suspend() argument
531 xonar_st_cleanup(chip); in xonar_st_suspend()
534 static void xonar_d2_resume(struct oxygen *chip) in xonar_d2_resume() argument
536 pcm1796_registers_init(chip); in xonar_d2_resume()
537 xonar_enable_output(chip); in xonar_d2_resume()
540 static void xonar_hdav_resume(struct oxygen *chip) in xonar_hdav_resume() argument
542 struct xonar_hdav *data = chip->model_data; in xonar_hdav_resume()
544 pcm1796_registers_init(chip); in xonar_hdav_resume()
545 xonar_hdmi_resume(chip, &data->hdmi); in xonar_hdav_resume()
546 xonar_enable_output(chip); in xonar_hdav_resume()
549 static void xonar_stx_resume(struct oxygen *chip) in xonar_stx_resume() argument
551 pcm1796_registers_init(chip); in xonar_stx_resume()
552 xonar_enable_output(chip); in xonar_stx_resume()
555 static void xonar_st_resume(struct oxygen *chip) in xonar_st_resume() argument
557 cs2000_registers_init(chip); in xonar_st_resume()
558 xonar_stx_resume(chip); in xonar_st_resume()
561 static void update_pcm1796_oversampling(struct oxygen *chip) in update_pcm1796_oversampling() argument
563 struct xonar_pcm179x *data = chip->model_data; in update_pcm1796_oversampling()
567 if (data->current_rate <= 48000 && !data->h6) in update_pcm1796_oversampling()
571 for (i = 0; i < data->dacs; ++i) in update_pcm1796_oversampling()
572 pcm1796_write_cached(chip, i, 20, reg); in update_pcm1796_oversampling()
575 static void set_pcm1796_params(struct oxygen *chip, in set_pcm1796_params() argument
578 struct xonar_pcm179x *data = chip->model_data; in set_pcm1796_params()
581 data->current_rate = params_rate(params); in set_pcm1796_params()
582 update_pcm1796_oversampling(chip); in set_pcm1796_params()
585 static void update_pcm1796_volume(struct oxygen *chip) in update_pcm1796_volume() argument
587 struct xonar_pcm179x *data = chip->model_data; in update_pcm1796_volume()
591 gain_offset = data->hp_active ? data->hp_gain_offset : 0; in update_pcm1796_volume()
592 for (i = 0; i < data->dacs; ++i) { in update_pcm1796_volume()
593 pcm1796_write_cached(chip, i, 16, chip->dac_volume[i * 2] in update_pcm1796_volume()
595 pcm1796_write_cached(chip, i, 17, chip->dac_volume[i * 2 + 1] in update_pcm1796_volume()
601 static void update_pcm1796_mute(struct oxygen *chip) in update_pcm1796_mute() argument
603 struct xonar_pcm179x *data = chip->model_data; in update_pcm1796_mute()
608 if (chip->dac_mute) in update_pcm1796_mute()
610 for (i = 0; i < data->dacs; ++i) in update_pcm1796_mute()
611 pcm1796_write_cached(chip, i, 18, value); in update_pcm1796_mute()
614 static void update_cs2000_rate(struct oxygen *chip, unsigned int rate) in update_cs2000_rate() argument
616 struct xonar_pcm179x *data = chip->model_data; in update_cs2000_rate()
637 if (rate <= 96000 && (rate > 48000 || data->h6)) { in update_cs2000_rate()
645 oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT, rate_mclk, in update_cs2000_rate()
647 cs2000_write_cached(chip, CS2000_FUN_CFG_1, reg); in update_cs2000_rate()
651 static void set_st_params(struct oxygen *chip, in set_st_params() argument
654 update_cs2000_rate(chip, params_rate(params)); in set_st_params()
655 set_pcm1796_params(chip, params); in set_st_params()
658 static void set_hdav_params(struct oxygen *chip, in set_hdav_params() argument
661 struct xonar_hdav *data = chip->model_data; in set_hdav_params()
663 set_pcm1796_params(chip, params); in set_hdav_params()
664 xonar_set_hdmi_params(chip, &data->hdmi, params); in set_hdav_params()
680 "Sharp Roll-off", "Slow Roll-off" in rolloff_info()
689 struct oxygen *chip = ctl->private_data; in rolloff_get() local
690 struct xonar_pcm179x *data = chip->model_data; in rolloff_get()
692 value->value.enumerated.item[0] = in rolloff_get()
693 (data->pcm1796_regs[0][19 - PCM1796_REG_BASE] & in rolloff_get()
701 struct oxygen *chip = ctl->private_data; in rolloff_put() local
702 struct xonar_pcm179x *data = chip->model_data; in rolloff_put()
707 mutex_lock(&chip->mutex); in rolloff_put()
708 reg = data->pcm1796_regs[0][19 - PCM1796_REG_BASE]; in rolloff_put()
710 if (!value->value.enumerated.item[0]) in rolloff_put()
714 changed = reg != data->pcm1796_regs[0][19 - PCM1796_REG_BASE]; in rolloff_put()
716 for (i = 0; i < data->dacs; ++i) in rolloff_put()
717 pcm1796_write(chip, i, 19, reg); in rolloff_put()
719 mutex_unlock(&chip->mutex); in rolloff_put()
753 struct oxygen *chip = ctl->private_data; in st_output_switch_get() local
756 gpio = oxygen_read16(chip, OXYGEN_GPIO_DATA); in st_output_switch_get()
758 value->value.enumerated.item[0] = 0; in st_output_switch_get()
760 value->value.enumerated.item[0] = 1; in st_output_switch_get()
762 value->value.enumerated.item[0] = 2; in st_output_switch_get()
770 struct oxygen *chip = ctl->private_data; in st_output_switch_put() local
771 struct xonar_pcm179x *data = chip->model_data; in st_output_switch_put()
774 mutex_lock(&chip->mutex); in st_output_switch_put()
775 gpio_old = oxygen_read16(chip, OXYGEN_GPIO_DATA); in st_output_switch_put()
777 switch (value->value.enumerated.item[0]) { in st_output_switch_put()
788 oxygen_write16(chip, OXYGEN_GPIO_DATA, gpio); in st_output_switch_put()
789 data->hp_active = gpio & GPIO_ST_HP; in st_output_switch_put()
790 update_pcm1796_volume(chip); in st_output_switch_put()
791 mutex_unlock(&chip->mutex); in st_output_switch_put()
799 "< 64 ohms", "64-300 ohms", "300-600 ohms" in st_hp_volume_offset_info()
808 struct oxygen *chip = ctl->private_data; in st_hp_volume_offset_get() local
809 struct xonar_pcm179x *data = chip->model_data; in st_hp_volume_offset_get()
811 mutex_lock(&chip->mutex); in st_hp_volume_offset_get()
812 if (data->hp_gain_offset < 2*-6) in st_hp_volume_offset_get()
813 value->value.enumerated.item[0] = 0; in st_hp_volume_offset_get()
814 else if (data->hp_gain_offset < 0) in st_hp_volume_offset_get()
815 value->value.enumerated.item[0] = 1; in st_hp_volume_offset_get()
817 value->value.enumerated.item[0] = 2; in st_hp_volume_offset_get()
818 mutex_unlock(&chip->mutex); in st_hp_volume_offset_get()
826 static const s8 offsets[] = { 2*-18, 2*-6, 0 }; in st_hp_volume_offset_put()
827 struct oxygen *chip = ctl->private_data; in st_hp_volume_offset_put() local
828 struct xonar_pcm179x *data = chip->model_data; in st_hp_volume_offset_put()
832 if (value->value.enumerated.item[0] > 2) in st_hp_volume_offset_put()
833 return -EINVAL; in st_hp_volume_offset_put()
834 offset = offsets[value->value.enumerated.item[0]]; in st_hp_volume_offset_put()
835 mutex_lock(&chip->mutex); in st_hp_volume_offset_put()
836 changed = offset != data->hp_gain_offset; in st_hp_volume_offset_put()
838 data->hp_gain_offset = offset; in st_hp_volume_offset_put()
839 update_pcm1796_volume(chip); in st_hp_volume_offset_put()
841 mutex_unlock(&chip->mutex); in st_hp_volume_offset_put()
862 static void xonar_line_mic_ac97_switch(struct oxygen *chip, in xonar_line_mic_ac97_switch() argument
866 spin_lock_irq(&chip->reg_lock); in xonar_line_mic_ac97_switch()
867 oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, in xonar_line_mic_ac97_switch()
870 spin_unlock_irq(&chip->reg_lock); in xonar_line_mic_ac97_switch()
874 static const DECLARE_TLV_DB_SCALE(pcm1796_db_scale, -6000, 50, 0);
878 if (!strncmp(template->name, "CD Capture ", 11)) in xonar_d2_control_filter()
879 /* CD in is actually connected to the video in pin */ in xonar_d2_control_filter()
880 template->private_value ^= AC97_CD ^ AC97_VIDEO; in xonar_d2_control_filter()
886 if (!strncmp(template->name, "Master Playback ", 16)) in xonar_st_h6_control_filter()
887 /* no volume/mute, as I²C to the third DAC does not work */ in xonar_st_h6_control_filter()
892 static int add_pcm1796_controls(struct oxygen *chip) in add_pcm1796_controls() argument
894 struct xonar_pcm179x *data = chip->model_data; in add_pcm1796_controls()
897 if (!data->broken_i2c) { in add_pcm1796_controls()
898 err = snd_ctl_add(chip->card, in add_pcm1796_controls()
899 snd_ctl_new1(&rolloff_control, chip)); in add_pcm1796_controls()
906 static int xonar_d2_mixer_init(struct oxygen *chip) in xonar_d2_mixer_init() argument
910 err = snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); in xonar_d2_mixer_init()
913 err = add_pcm1796_controls(chip); in xonar_d2_mixer_init()
919 static int xonar_hdav_mixer_init(struct oxygen *chip) in xonar_hdav_mixer_init() argument
923 err = snd_ctl_add(chip->card, snd_ctl_new1(&hdav_hdmi_control, chip)); in xonar_hdav_mixer_init()
926 err = add_pcm1796_controls(chip); in xonar_hdav_mixer_init()
932 static int xonar_st_mixer_init(struct oxygen *chip) in xonar_st_mixer_init() argument
938 err = snd_ctl_add(chip->card, in xonar_st_mixer_init()
939 snd_ctl_new1(&st_controls[i], chip)); in xonar_st_mixer_init()
943 err = add_pcm1796_controls(chip); in xonar_st_mixer_init()
949 static void dump_pcm1796_registers(struct oxygen *chip, in dump_pcm1796_registers() argument
952 struct xonar_pcm179x *data = chip->model_data; in dump_pcm1796_registers()
955 for (dac = 0; dac < data->dacs; ++dac) { in dump_pcm1796_registers()
959 data->pcm1796_regs[dac][i]); in dump_pcm1796_registers()
964 static void dump_cs2000_registers(struct oxygen *chip, in dump_cs2000_registers() argument
967 struct xonar_pcm179x *data = chip->model_data; in dump_cs2000_registers()
970 if (data->has_cs2000) { in dump_cs2000_registers()
973 snd_iprintf(buffer, " %02x", data->cs2000_regs[i]); in dump_cs2000_registers()
976 snd_iprintf(buffer, " %02x", data->cs2000_regs[i]); in dump_cs2000_registers()
981 static void dump_st_registers(struct oxygen *chip, in dump_st_registers() argument
984 dump_pcm1796_registers(chip, buffer); in dump_st_registers()
985 dump_cs2000_registers(chip, buffer); in dump_st_registers()
990 .chip = "AV200",
1013 .dac_volume_min = 255 - 2*60,
1026 .chip = "AV200",
1048 .dac_volume_min = 255 - 2*60,
1060 .chip = "AV200",
1081 .dac_volume_min = 255 - 2*60,
1090 int __devinit get_xonar_pcm179x_model(struct oxygen *chip, in get_xonar_pcm179x_model() argument
1093 switch (id->subdevice) { in get_xonar_pcm179x_model()
1095 chip->model = model_xonar_d2; in get_xonar_pcm179x_model()
1096 chip->model.shortname = "Xonar D2"; in get_xonar_pcm179x_model()
1099 chip->model = model_xonar_d2; in get_xonar_pcm179x_model()
1100 chip->model.shortname = "Xonar D2X"; in get_xonar_pcm179x_model()
1101 chip->model.init = xonar_d2x_init; in get_xonar_pcm179x_model()
1104 chip->model = model_xonar_hdav; in get_xonar_pcm179x_model()
1105 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK); in get_xonar_pcm179x_model()
1106 switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) { in get_xonar_pcm179x_model()
1108 chip->model.shortname = "Xonar HDAV1.3"; in get_xonar_pcm179x_model()
1111 chip->model.shortname = "Xonar HDAV1.3+H6"; in get_xonar_pcm179x_model()
1112 chip->model.dac_channels_mixer = 8; in get_xonar_pcm179x_model()
1113 chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128); in get_xonar_pcm179x_model()
1118 chip->model = model_xonar_st; in get_xonar_pcm179x_model()
1119 oxygen_clear_bits16(chip, OXYGEN_GPIO_CONTROL, GPIO_DB_MASK); in get_xonar_pcm179x_model()
1120 switch (oxygen_read16(chip, OXYGEN_GPIO_DATA) & GPIO_DB_MASK) { in get_xonar_pcm179x_model()
1122 chip->model.shortname = "Xonar ST"; in get_xonar_pcm179x_model()
1125 chip->model.shortname = "Xonar ST+H6"; in get_xonar_pcm179x_model()
1126 chip->model.control_filter = xonar_st_h6_control_filter; in get_xonar_pcm179x_model()
1127 chip->model.dac_channels_pcm = 8; in get_xonar_pcm179x_model()
1128 chip->model.dac_channels_mixer = 8; in get_xonar_pcm179x_model()
1129 chip->model.dac_volume_min = 255; in get_xonar_pcm179x_model()
1130 chip->model.dac_mclks = OXYGEN_MCLKS(256, 128, 128); in get_xonar_pcm179x_model()
1135 chip->model = model_xonar_st; in get_xonar_pcm179x_model()
1136 chip->model.shortname = "Xonar STX"; in get_xonar_pcm179x_model()
1137 chip->model.init = xonar_stx_init; in get_xonar_pcm179x_model()
1138 chip->model.resume = xonar_stx_resume; in get_xonar_pcm179x_model()
1139 chip->model.set_dac_params = set_pcm1796_params; in get_xonar_pcm179x_model()
1142 return -EINVAL; in get_xonar_pcm179x_model()