Lines Matching +full:reg +full:- +full:names
2 * C-Media CMI8788 driver for C-Media's reference design and similar models
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 * SPI 0 -> 1st AK4396 (front)
24 * SPI 1 -> 2nd AK4396 (surround)
25 * SPI 2 -> 3rd AK4396 (center/LFE)
26 * SPI 3 -> WM8785
27 * SPI 4 -> 4th AK4396 (back)
29 * GPIO 0 -> DFS0 of AK5385
30 * GPIO 1 -> DFS1 of AK5385
32 * X-Meridian models:
33 * GPIO 4 -> enable extension S/PDIF input
34 * GPIO 6 -> enable on-board S/PDIF input
37 * GPIO 6 -> S/PDIF from optical (0) or coaxial (1) input
38 * GPIO 8 -> enable headphone amplifier
42 * LINE_OUT -> input of ADC
44 * AUX_IN <- aux
45 * CD_IN <- CD
46 * MIC_IN <- mic
48 * GPO 0 -> route line-in (0) or AC97 output (1) to ADC input
69 MODULE_DESCRIPTION("C-Media CMI8788 driver");
71 MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8786}"
72 ",{C-Media,CMI8787}"
73 ",{C-Media,CMI8788}}");
100 /* C-Media's reference design */
114 /* Kuroutoshikou CMI8787-HG2PCI */
120 /* AuzenTech X-Meridian */
122 /* AuzenTech X-Meridian 2G */
124 /* HT-Omega Claro */
126 /* HT-Omega Claro halo */
152 u8 reg, u8 value) in ak4396_write() argument
158 struct generic_data *data = chip->model_data; in ak4396_write()
165 AK4396_WRITE | (reg << 8) | value); in ak4396_write()
166 data->ak4396_regs[codec][reg] = value; in ak4396_write()
170 u8 reg, u8 value) in ak4396_write_cached() argument
172 struct generic_data *data = chip->model_data; in ak4396_write_cached()
174 if (value != data->ak4396_regs[codec][reg]) in ak4396_write_cached()
175 ak4396_write(chip, codec, reg, value); in ak4396_write_cached()
178 static void wm8785_write(struct oxygen *chip, u8 reg, unsigned int value) in wm8785_write() argument
180 struct generic_data *data = chip->model_data; in wm8785_write()
187 (reg << 9) | value); in wm8785_write()
188 if (reg < ARRAY_SIZE(data->wm8785_regs)) in wm8785_write()
189 data->wm8785_regs[reg] = value; in wm8785_write()
194 struct generic_data *data = chip->model_data; in ak4396_registers_init()
197 for (i = 0; i < data->dacs; ++i) { in ak4396_registers_init()
201 data->ak4396_regs[0][AK4396_CONTROL_2]); in ak4396_registers_init()
205 chip->dac_volume[i * 2]); in ak4396_registers_init()
207 chip->dac_volume[i * 2 + 1]); in ak4396_registers_init()
213 struct generic_data *data = chip->model_data; in ak4396_init()
215 data->dacs = chip->model.dac_channels_pcm / 2; in ak4396_init()
216 data->ak4396_regs[0][AK4396_CONTROL_2] = in ak4396_init()
219 snd_component_add(chip->card, "AK4396"); in ak4396_init()
226 snd_component_add(chip->card, "AK5385"); in ak5385_init()
231 struct generic_data *data = chip->model_data; in wm8785_registers_init()
234 wm8785_write(chip, WM8785_R0, data->wm8785_regs[0]); in wm8785_registers_init()
235 wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); in wm8785_registers_init()
240 struct generic_data *data = chip->model_data; in wm8785_init()
242 data->wm8785_regs[0] = in wm8785_init()
244 data->wm8785_regs[2] = WM8785_HPFR | WM8785_HPFL; in wm8785_init()
246 snd_component_add(chip->card, "WM8785"); in wm8785_init()
293 snd_component_add(chip->card, "CS5340"); in fantasia_init()
345 struct generic_data *data = chip->model_data; in set_ak4396_params()
349 value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_DFS_MASK; in set_ak4396_params()
359 if (value != data->ak4396_regs[0][AK4396_CONTROL_2]) { in set_ak4396_params()
360 for (i = 0; i < data->dacs; ++i) { in set_ak4396_params()
372 struct generic_data *data = chip->model_data; in update_ak4396_volume()
375 for (i = 0; i < data->dacs; ++i) { in update_ak4396_volume()
377 chip->dac_volume[i * 2]); in update_ak4396_volume()
379 chip->dac_volume[i * 2 + 1]); in update_ak4396_volume()
385 struct generic_data *data = chip->model_data; in update_ak4396_mute()
389 value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_SMUTE; in update_ak4396_mute()
390 if (chip->dac_mute) in update_ak4396_mute()
392 for (i = 0; i < data->dacs; ++i) in update_ak4396_mute()
399 struct generic_data *data = chip->model_data; in set_wm8785_params()
409 if (value != data->wm8785_regs[0]) { in set_wm8785_params()
412 wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); in set_wm8785_params()
438 static const char *const names[2] = { in rolloff_info() local
439 "Sharp Roll-off", "Slow Roll-off" in rolloff_info()
442 return snd_ctl_enum_info(info, 1, 2, names); in rolloff_info()
448 struct oxygen *chip = ctl->private_data; in rolloff_get()
449 struct generic_data *data = chip->model_data; in rolloff_get()
451 value->value.enumerated.item[0] = in rolloff_get()
452 (data->ak4396_regs[0][AK4396_CONTROL_2] & AK4396_SLOW) != 0; in rolloff_get()
459 struct oxygen *chip = ctl->private_data; in rolloff_put()
460 struct generic_data *data = chip->model_data; in rolloff_put()
463 u8 reg; in rolloff_put() local
465 mutex_lock(&chip->mutex); in rolloff_put()
466 reg = data->ak4396_regs[0][AK4396_CONTROL_2]; in rolloff_put()
467 if (value->value.enumerated.item[0]) in rolloff_put()
468 reg |= AK4396_SLOW; in rolloff_put()
470 reg &= ~AK4396_SLOW; in rolloff_put()
471 changed = reg != data->ak4396_regs[0][AK4396_CONTROL_2]; in rolloff_put()
473 for (i = 0; i < data->dacs; ++i) in rolloff_put()
474 ak4396_write(chip, i, AK4396_CONTROL_2, reg); in rolloff_put()
476 mutex_unlock(&chip->mutex); in rolloff_put()
490 static const char *const names[2] = { in hpf_info() local
491 "None", "High-pass Filter" in hpf_info()
494 return snd_ctl_enum_info(info, 1, 2, names); in hpf_info()
499 struct oxygen *chip = ctl->private_data; in hpf_get()
500 struct generic_data *data = chip->model_data; in hpf_get()
502 value->value.enumerated.item[0] = in hpf_get()
503 (data->wm8785_regs[WM8785_R2] & WM8785_HPFR) != 0; in hpf_get()
509 struct oxygen *chip = ctl->private_data; in hpf_put()
510 struct generic_data *data = chip->model_data; in hpf_put()
511 unsigned int reg; in hpf_put() local
514 mutex_lock(&chip->mutex); in hpf_put()
515 reg = data->wm8785_regs[WM8785_R2] & ~(WM8785_HPFR | WM8785_HPFL); in hpf_put()
516 if (value->value.enumerated.item[0]) in hpf_put()
517 reg |= WM8785_HPFR | WM8785_HPFL; in hpf_put()
518 changed = reg != data->wm8785_regs[WM8785_R2]; in hpf_put()
520 wm8785_write(chip, WM8785_R2, reg); in hpf_put()
521 mutex_unlock(&chip->mutex); in hpf_put()
536 static const char *const names[2] = { "On-board", "Extension" }; in meridian_dig_source_info() local
538 return snd_ctl_enum_info(info, 1, 2, names); in meridian_dig_source_info()
544 static const char *const names[2] = { "Optical", "Coaxial" }; in claro_dig_source_info() local
546 return snd_ctl_enum_info(info, 1, 2, names); in claro_dig_source_info()
552 struct oxygen *chip = ctl->private_data; in meridian_dig_source_get()
554 value->value.enumerated.item[0] = in meridian_dig_source_get()
563 struct oxygen *chip = ctl->private_data; in claro_dig_source_get()
565 value->value.enumerated.item[0] = in claro_dig_source_get()
574 struct oxygen *chip = ctl->private_data; in meridian_dig_source_put()
578 mutex_lock(&chip->mutex); in meridian_dig_source_put()
581 if (value->value.enumerated.item[0] == 0) in meridian_dig_source_put()
588 mutex_unlock(&chip->mutex); in meridian_dig_source_put()
595 struct oxygen *chip = ctl->private_data; in claro_dig_source_put()
599 mutex_lock(&chip->mutex); in claro_dig_source_put()
602 if (value->value.enumerated.item[0]) in claro_dig_source_put()
607 mutex_unlock(&chip->mutex); in claro_dig_source_put()
629 return snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); in generic_mixer_init()
639 err = snd_ctl_add(chip->card, snd_ctl_new1(&hpf_control, chip)); in generic_wm8785_mixer_init()
652 err = snd_ctl_add(chip->card, in meridian_mixer_init()
666 err = snd_ctl_add(chip->card, in claro_mixer_init()
680 err = snd_ctl_add(chip->card, in claro_halo_mixer_init()
690 struct generic_data *data = chip->model_data; in dump_ak4396_registers()
693 for (dac = 0; dac < data->dacs; ++dac) { in dump_ak4396_registers()
696 snd_iprintf(buffer, " %02x", data->ak4396_regs[dac][i]); in dump_ak4396_registers()
704 struct generic_data *data = chip->model_data; in dump_wm8785_registers()
709 snd_iprintf(buffer, " %03x", data->wm8785_regs[i]); in dump_wm8785_registers()
723 .shortname = "C-Media CMI8788",
724 .longname = "C-Media Oxygen HD Audio",
759 static const char *const names[] = { in get_oxygen_model() local
760 [MODEL_MERIDIAN] = "AuzenTech X-Meridian", in get_oxygen_model()
761 [MODEL_MERIDIAN_2G] = "AuzenTech X-Meridian 2G", in get_oxygen_model()
762 [MODEL_CLARO] = "HT-Omega Claro", in get_oxygen_model()
763 [MODEL_CLARO_HALO] = "HT-Omega Claro halo", in get_oxygen_model()
766 [MODEL_HG2PCI] = "CMI8787-HG2PCI", in get_oxygen_model()
769 chip->model = model_generic; in get_oxygen_model()
770 switch (id->driver_data) { in get_oxygen_model()
773 chip->model.init = meridian_init; in get_oxygen_model()
774 chip->model.mixer_init = meridian_mixer_init; in get_oxygen_model()
775 chip->model.resume = meridian_resume; in get_oxygen_model()
776 chip->model.set_adc_params = set_ak5385_params; in get_oxygen_model()
777 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
778 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
782 if (id->driver_data == MODEL_MERIDIAN) in get_oxygen_model()
783 chip->model.device_config |= AC97_CD_INPUT; in get_oxygen_model()
786 chip->model.init = claro_init; in get_oxygen_model()
787 chip->model.mixer_init = claro_mixer_init; in get_oxygen_model()
788 chip->model.cleanup = claro_cleanup; in get_oxygen_model()
789 chip->model.suspend = claro_suspend; in get_oxygen_model()
790 chip->model.resume = claro_resume; in get_oxygen_model()
793 chip->model.init = claro_halo_init; in get_oxygen_model()
794 chip->model.mixer_init = claro_halo_mixer_init; in get_oxygen_model()
795 chip->model.cleanup = claro_cleanup; in get_oxygen_model()
796 chip->model.suspend = claro_suspend; in get_oxygen_model()
797 chip->model.resume = claro_resume; in get_oxygen_model()
798 chip->model.set_adc_params = set_ak5385_params; in get_oxygen_model()
799 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
800 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
809 chip->model.shortname = "C-Media CMI8787"; in get_oxygen_model()
810 chip->model.chip = "CMI8787"; in get_oxygen_model()
811 if (id->driver_data == MODEL_FANTASIA) in get_oxygen_model()
812 chip->model.init = fantasia_init; in get_oxygen_model()
814 chip->model.init = stereo_output_init; in get_oxygen_model()
815 chip->model.resume = stereo_resume; in get_oxygen_model()
816 chip->model.mixer_init = generic_mixer_init; in get_oxygen_model()
817 chip->model.set_adc_params = set_no_params; in get_oxygen_model()
818 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
819 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
821 if (id->driver_data == MODEL_FANTASIA) { in get_oxygen_model()
822 chip->model.device_config |= CAPTURE_0_FROM_I2S_1; in get_oxygen_model()
823 chip->model.adc_mclks = OXYGEN_MCLKS(256, 128, 128); in get_oxygen_model()
825 chip->model.dac_channels_pcm = 2; in get_oxygen_model()
826 chip->model.dac_channels_mixer = 2; in get_oxygen_model()
829 chip->model = model_xonar_dg; in get_oxygen_model()
832 if (id->driver_data == MODEL_MERIDIAN || in get_oxygen_model()
833 id->driver_data == MODEL_MERIDIAN_2G || in get_oxygen_model()
834 id->driver_data == MODEL_CLARO_HALO) { in get_oxygen_model()
835 chip->model.misc_flags = OXYGEN_MISC_MIDI; in get_oxygen_model()
836 chip->model.device_config |= MIDI_OUTPUT | MIDI_INPUT; in get_oxygen_model()
838 if (id->driver_data < ARRAY_SIZE(names) && names[id->driver_data]) in get_oxygen_model()
839 chip->model.shortname = names[id->driver_data]; in get_oxygen_model()
850 return -ENODEV; in generic_oxygen_probe()
853 return -ENOENT; in generic_oxygen_probe()