• Home
  • Raw
  • Download

Lines Matching +full:enum +full:- +full:model

1 // SPDX-License-Identifier: GPL-2.0-only
3 * C-Media CMI8788 driver for C-Media's reference design and similar models
11 * SPI 0 -> 1st AK4396 (front)
12 * SPI 1 -> 2nd AK4396 (surround)
13 * SPI 2 -> 3rd AK4396 (center/LFE)
14 * SPI 3 -> WM8785
15 * SPI 4 -> 4th AK4396 (back)
17 * GPIO 0 -> DFS0 of AK5385
18 * GPIO 1 -> DFS1 of AK5385
20 * X-Meridian models:
21 * GPIO 4 -> enable extension S/PDIF input
22 * GPIO 6 -> enable on-board S/PDIF input
25 * GPIO 6 -> S/PDIF from optical (0) or coaxial (1) input
26 * GPIO 8 -> enable headphone amplifier
30 * LINE_OUT -> input of ADC
32 * AUX_IN <- aux
33 * CD_IN <- CD
34 * MIC_IN <- mic
36 * GPO 0 -> route line-in (0) or AC97 output (1) to ADC input
57 MODULE_DESCRIPTION("C-Media CMI8788 driver");
59 MODULE_SUPPORTED_DEVICE("{{C-Media,CMI8786}"
60 ",{C-Media,CMI8787}"
61 ",{C-Media,CMI8788}}");
74 enum {
89 /* C-Media's reference design */
105 /* Kuroutoshikou CMI8787-HG2PCI */
111 /* AuzenTech X-Meridian */
113 /* AuzenTech X-Meridian 2G */
115 /* HT-Omega Claro */
117 /* HT-Omega Claro halo */
149 struct generic_data *data = chip->model_data; in ak4396_write()
157 data->ak4396_regs[codec][reg] = value; in ak4396_write()
163 struct generic_data *data = chip->model_data; in ak4396_write_cached()
165 if (value != data->ak4396_regs[codec][reg]) in ak4396_write_cached()
171 struct generic_data *data = chip->model_data; in wm8785_write()
179 if (reg < ARRAY_SIZE(data->wm8785_regs)) in wm8785_write()
180 data->wm8785_regs[reg] = value; in wm8785_write()
185 struct generic_data *data = chip->model_data; in ak4396_registers_init()
188 for (i = 0; i < data->dacs; ++i) { in ak4396_registers_init()
192 data->ak4396_regs[0][AK4396_CONTROL_2]); in ak4396_registers_init()
196 chip->dac_volume[i * 2]); in ak4396_registers_init()
198 chip->dac_volume[i * 2 + 1]); in ak4396_registers_init()
204 struct generic_data *data = chip->model_data; in ak4396_init()
206 data->dacs = chip->model.dac_channels_pcm / 2; in ak4396_init()
207 data->ak4396_regs[0][AK4396_CONTROL_2] = in ak4396_init()
210 snd_component_add(chip->card, "AK4396"); in ak4396_init()
217 snd_component_add(chip->card, "AK5385"); in ak5385_init()
222 struct generic_data *data = chip->model_data; in wm8785_registers_init()
225 wm8785_write(chip, WM8785_R0, data->wm8785_regs[0]); in wm8785_registers_init()
226 wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); in wm8785_registers_init()
231 struct generic_data *data = chip->model_data; in wm8785_init()
233 data->wm8785_regs[0] = in wm8785_init()
235 data->wm8785_regs[2] = WM8785_HPFR | WM8785_HPFL; in wm8785_init()
237 snd_component_add(chip->card, "WM8785"); in wm8785_init()
284 snd_component_add(chip->card, "CS5340"); in fantasia_init()
336 struct generic_data *data = chip->model_data; in set_ak4396_params()
340 value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_DFS_MASK; in set_ak4396_params()
350 if (value != data->ak4396_regs[0][AK4396_CONTROL_2]) { in set_ak4396_params()
351 for (i = 0; i < data->dacs; ++i) { in set_ak4396_params()
363 struct generic_data *data = chip->model_data; in update_ak4396_volume()
366 for (i = 0; i < data->dacs; ++i) { in update_ak4396_volume()
368 chip->dac_volume[i * 2]); in update_ak4396_volume()
370 chip->dac_volume[i * 2 + 1]); in update_ak4396_volume()
376 struct generic_data *data = chip->model_data; in update_ak4396_mute()
380 value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_SMUTE; in update_ak4396_mute()
381 if (chip->dac_mute) in update_ak4396_mute()
383 for (i = 0; i < data->dacs; ++i) in update_ak4396_mute()
390 struct generic_data *data = chip->model_data; in set_wm8785_params()
400 if (value != data->wm8785_regs[0]) { in set_wm8785_params()
403 wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); in set_wm8785_params()
430 "Sharp Roll-off", "Slow Roll-off" in rolloff_info()
439 struct oxygen *chip = ctl->private_data; in rolloff_get()
440 struct generic_data *data = chip->model_data; in rolloff_get()
442 value->value.enumerated.item[0] = in rolloff_get()
443 (data->ak4396_regs[0][AK4396_CONTROL_2] & AK4396_SLOW) != 0; in rolloff_get()
450 struct oxygen *chip = ctl->private_data; in rolloff_put()
451 struct generic_data *data = chip->model_data; in rolloff_put()
456 mutex_lock(&chip->mutex); in rolloff_put()
457 reg = data->ak4396_regs[0][AK4396_CONTROL_2]; in rolloff_put()
458 if (value->value.enumerated.item[0]) in rolloff_put()
462 changed = reg != data->ak4396_regs[0][AK4396_CONTROL_2]; in rolloff_put()
464 for (i = 0; i < data->dacs; ++i) in rolloff_put()
467 mutex_unlock(&chip->mutex); in rolloff_put()
473 .name = "DAC Filter Playback Enum",
482 "None", "High-pass Filter" in hpf_info()
490 struct oxygen *chip = ctl->private_data; in hpf_get()
491 struct generic_data *data = chip->model_data; in hpf_get()
493 value->value.enumerated.item[0] = in hpf_get()
494 (data->wm8785_regs[WM8785_R2] & WM8785_HPFR) != 0; in hpf_get()
500 struct oxygen *chip = ctl->private_data; in hpf_put()
501 struct generic_data *data = chip->model_data; in hpf_put()
505 mutex_lock(&chip->mutex); in hpf_put()
506 reg = data->wm8785_regs[WM8785_R2] & ~(WM8785_HPFR | WM8785_HPFL); in hpf_put()
507 if (value->value.enumerated.item[0]) in hpf_put()
509 changed = reg != data->wm8785_regs[WM8785_R2]; in hpf_put()
512 mutex_unlock(&chip->mutex); in hpf_put()
518 .name = "ADC Filter Capture Enum",
527 static const char *const names[2] = { "On-board", "Extension" }; in meridian_dig_source_info()
543 struct oxygen *chip = ctl->private_data; in meridian_dig_source_get()
545 value->value.enumerated.item[0] = in meridian_dig_source_get()
554 struct oxygen *chip = ctl->private_data; in claro_dig_source_get()
556 value->value.enumerated.item[0] = in claro_dig_source_get()
565 struct oxygen *chip = ctl->private_data; in meridian_dig_source_put()
569 mutex_lock(&chip->mutex); in meridian_dig_source_put()
572 if (value->value.enumerated.item[0] == 0) in meridian_dig_source_put()
579 mutex_unlock(&chip->mutex); in meridian_dig_source_put()
586 struct oxygen *chip = ctl->private_data; in claro_dig_source_put()
590 mutex_lock(&chip->mutex); in claro_dig_source_put()
593 if (value->value.enumerated.item[0]) in claro_dig_source_put()
598 mutex_unlock(&chip->mutex); in claro_dig_source_put()
604 .name = "IEC958 Source Capture Enum",
612 .name = "IEC958 Source Capture Enum",
620 return snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); in generic_mixer_init()
630 err = snd_ctl_add(chip->card, snd_ctl_new1(&hpf_control, chip)); in generic_wm8785_mixer_init()
643 err = snd_ctl_add(chip->card, in meridian_mixer_init()
657 err = snd_ctl_add(chip->card, in claro_mixer_init()
671 err = snd_ctl_add(chip->card, in claro_halo_mixer_init()
681 struct generic_data *data = chip->model_data; in dump_ak4396_registers()
684 for (dac = 0; dac < data->dacs; ++dac) { in dump_ak4396_registers()
687 snd_iprintf(buffer, " %02x", data->ak4396_regs[dac][i]); in dump_ak4396_registers()
695 struct generic_data *data = chip->model_data; in dump_wm8785_registers()
700 snd_iprintf(buffer, " %03x", data->wm8785_regs[i]); in dump_wm8785_registers()
714 .shortname = "C-Media CMI8788",
715 .longname = "C-Media Oxygen HD Audio",
751 [MODEL_MERIDIAN] = "AuzenTech X-Meridian", in get_oxygen_model()
752 [MODEL_MERIDIAN_2G] = "AuzenTech X-Meridian 2G", in get_oxygen_model()
753 [MODEL_CLARO] = "HT-Omega Claro", in get_oxygen_model()
754 [MODEL_CLARO_HALO] = "HT-Omega Claro halo", in get_oxygen_model()
757 [MODEL_HG2PCI] = "CMI8787-HG2PCI", in get_oxygen_model()
762 chip->model = model_generic; in get_oxygen_model()
763 switch (id->driver_data) { in get_oxygen_model()
766 chip->model.init = meridian_init; in get_oxygen_model()
767 chip->model.mixer_init = meridian_mixer_init; in get_oxygen_model()
768 chip->model.resume = meridian_resume; in get_oxygen_model()
769 chip->model.set_adc_params = set_ak5385_params; in get_oxygen_model()
770 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
771 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
775 if (id->driver_data == MODEL_MERIDIAN) in get_oxygen_model()
776 chip->model.device_config |= AC97_CD_INPUT; in get_oxygen_model()
779 chip->model.init = claro_init; in get_oxygen_model()
780 chip->model.mixer_init = claro_mixer_init; in get_oxygen_model()
781 chip->model.cleanup = claro_cleanup; in get_oxygen_model()
782 chip->model.suspend = claro_suspend; in get_oxygen_model()
783 chip->model.resume = claro_resume; in get_oxygen_model()
786 chip->model.init = claro_halo_init; in get_oxygen_model()
787 chip->model.mixer_init = claro_halo_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()
791 chip->model.set_adc_params = set_ak5385_params; in get_oxygen_model()
792 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
793 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
802 chip->model.shortname = "C-Media CMI8787"; in get_oxygen_model()
803 chip->model.chip = "CMI8787"; in get_oxygen_model()
804 if (id->driver_data == MODEL_FANTASIA) in get_oxygen_model()
805 chip->model.init = fantasia_init; in get_oxygen_model()
807 chip->model.init = stereo_output_init; in get_oxygen_model()
808 chip->model.resume = stereo_resume; in get_oxygen_model()
809 chip->model.mixer_init = generic_mixer_init; in get_oxygen_model()
810 chip->model.set_adc_params = set_no_params; in get_oxygen_model()
811 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
812 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
814 if (id->driver_data == MODEL_FANTASIA) { in get_oxygen_model()
815 chip->model.device_config |= CAPTURE_0_FROM_I2S_1; in get_oxygen_model()
816 chip->model.adc_mclks = OXYGEN_MCLKS(256, 128, 128); in get_oxygen_model()
818 chip->model.dac_channels_pcm = 2; in get_oxygen_model()
819 chip->model.dac_channels_mixer = 2; in get_oxygen_model()
823 chip->model = model_xonar_dg; in get_oxygen_model()
826 if (id->driver_data == MODEL_MERIDIAN || in get_oxygen_model()
827 id->driver_data == MODEL_MERIDIAN_2G || in get_oxygen_model()
828 id->driver_data == MODEL_CLARO_HALO) { in get_oxygen_model()
829 chip->model.misc_flags = OXYGEN_MISC_MIDI; in get_oxygen_model()
830 chip->model.device_config |= MIDI_OUTPUT | MIDI_INPUT; in get_oxygen_model()
832 if (id->driver_data < ARRAY_SIZE(names) && names[id->driver_data]) in get_oxygen_model()
833 chip->model.shortname = names[id->driver_data]; in get_oxygen_model()
844 return -ENODEV; in generic_oxygen_probe()
847 return -ENOENT; in generic_oxygen_probe()