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");
71 enum {
86 /* C-Media's reference design */
102 /* Kuroutoshikou CMI8787-HG2PCI */
108 /* AuzenTech X-Meridian */
110 /* AuzenTech X-Meridian 2G */
112 /* HT-Omega Claro */
114 /* HT-Omega Claro halo */
146 struct generic_data *data = chip->model_data; in ak4396_write()
154 data->ak4396_regs[codec][reg] = value; in ak4396_write()
160 struct generic_data *data = chip->model_data; in ak4396_write_cached()
162 if (value != data->ak4396_regs[codec][reg]) in ak4396_write_cached()
168 struct generic_data *data = chip->model_data; in wm8785_write()
176 if (reg < ARRAY_SIZE(data->wm8785_regs)) in wm8785_write()
177 data->wm8785_regs[reg] = value; in wm8785_write()
182 struct generic_data *data = chip->model_data; in ak4396_registers_init()
185 for (i = 0; i < data->dacs; ++i) { in ak4396_registers_init()
189 data->ak4396_regs[0][AK4396_CONTROL_2]); in ak4396_registers_init()
193 chip->dac_volume[i * 2]); in ak4396_registers_init()
195 chip->dac_volume[i * 2 + 1]); in ak4396_registers_init()
201 struct generic_data *data = chip->model_data; in ak4396_init()
203 data->dacs = chip->model.dac_channels_pcm / 2; in ak4396_init()
204 data->ak4396_regs[0][AK4396_CONTROL_2] = in ak4396_init()
207 snd_component_add(chip->card, "AK4396"); in ak4396_init()
214 snd_component_add(chip->card, "AK5385"); in ak5385_init()
219 struct generic_data *data = chip->model_data; in wm8785_registers_init()
222 wm8785_write(chip, WM8785_R0, data->wm8785_regs[0]); in wm8785_registers_init()
223 wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); in wm8785_registers_init()
228 struct generic_data *data = chip->model_data; in wm8785_init()
230 data->wm8785_regs[0] = in wm8785_init()
232 data->wm8785_regs[2] = WM8785_HPFR | WM8785_HPFL; in wm8785_init()
234 snd_component_add(chip->card, "WM8785"); in wm8785_init()
281 snd_component_add(chip->card, "CS5340"); in fantasia_init()
333 struct generic_data *data = chip->model_data; in set_ak4396_params()
337 value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_DFS_MASK; in set_ak4396_params()
347 if (value != data->ak4396_regs[0][AK4396_CONTROL_2]) { in set_ak4396_params()
348 for (i = 0; i < data->dacs; ++i) { in set_ak4396_params()
360 struct generic_data *data = chip->model_data; in update_ak4396_volume()
363 for (i = 0; i < data->dacs; ++i) { in update_ak4396_volume()
365 chip->dac_volume[i * 2]); in update_ak4396_volume()
367 chip->dac_volume[i * 2 + 1]); in update_ak4396_volume()
373 struct generic_data *data = chip->model_data; in update_ak4396_mute()
377 value = data->ak4396_regs[0][AK4396_CONTROL_2] & ~AK4396_SMUTE; in update_ak4396_mute()
378 if (chip->dac_mute) in update_ak4396_mute()
380 for (i = 0; i < data->dacs; ++i) in update_ak4396_mute()
387 struct generic_data *data = chip->model_data; in set_wm8785_params()
397 if (value != data->wm8785_regs[0]) { in set_wm8785_params()
400 wm8785_write(chip, WM8785_R2, data->wm8785_regs[2]); in set_wm8785_params()
427 "Sharp Roll-off", "Slow Roll-off" in rolloff_info()
436 struct oxygen *chip = ctl->private_data; in rolloff_get()
437 struct generic_data *data = chip->model_data; in rolloff_get()
439 value->value.enumerated.item[0] = in rolloff_get()
440 (data->ak4396_regs[0][AK4396_CONTROL_2] & AK4396_SLOW) != 0; in rolloff_get()
447 struct oxygen *chip = ctl->private_data; in rolloff_put()
448 struct generic_data *data = chip->model_data; in rolloff_put()
453 mutex_lock(&chip->mutex); in rolloff_put()
454 reg = data->ak4396_regs[0][AK4396_CONTROL_2]; in rolloff_put()
455 if (value->value.enumerated.item[0]) in rolloff_put()
459 changed = reg != data->ak4396_regs[0][AK4396_CONTROL_2]; in rolloff_put()
461 for (i = 0; i < data->dacs; ++i) in rolloff_put()
464 mutex_unlock(&chip->mutex); in rolloff_put()
470 .name = "DAC Filter Playback Enum",
479 "None", "High-pass Filter" in hpf_info()
487 struct oxygen *chip = ctl->private_data; in hpf_get()
488 struct generic_data *data = chip->model_data; in hpf_get()
490 value->value.enumerated.item[0] = in hpf_get()
491 (data->wm8785_regs[WM8785_R2] & WM8785_HPFR) != 0; in hpf_get()
497 struct oxygen *chip = ctl->private_data; in hpf_put()
498 struct generic_data *data = chip->model_data; in hpf_put()
502 mutex_lock(&chip->mutex); in hpf_put()
503 reg = data->wm8785_regs[WM8785_R2] & ~(WM8785_HPFR | WM8785_HPFL); in hpf_put()
504 if (value->value.enumerated.item[0]) in hpf_put()
506 changed = reg != data->wm8785_regs[WM8785_R2]; in hpf_put()
509 mutex_unlock(&chip->mutex); in hpf_put()
515 .name = "ADC Filter Capture Enum",
524 static const char *const names[2] = { "On-board", "Extension" }; in meridian_dig_source_info()
540 struct oxygen *chip = ctl->private_data; in meridian_dig_source_get()
542 value->value.enumerated.item[0] = in meridian_dig_source_get()
551 struct oxygen *chip = ctl->private_data; in claro_dig_source_get()
553 value->value.enumerated.item[0] = in claro_dig_source_get()
562 struct oxygen *chip = ctl->private_data; in meridian_dig_source_put()
566 mutex_lock(&chip->mutex); in meridian_dig_source_put()
569 if (value->value.enumerated.item[0] == 0) in meridian_dig_source_put()
576 mutex_unlock(&chip->mutex); in meridian_dig_source_put()
583 struct oxygen *chip = ctl->private_data; in claro_dig_source_put()
587 mutex_lock(&chip->mutex); in claro_dig_source_put()
590 if (value->value.enumerated.item[0]) in claro_dig_source_put()
595 mutex_unlock(&chip->mutex); in claro_dig_source_put()
601 .name = "IEC958 Source Capture Enum",
609 .name = "IEC958 Source Capture Enum",
617 return snd_ctl_add(chip->card, snd_ctl_new1(&rolloff_control, chip)); in generic_mixer_init()
627 err = snd_ctl_add(chip->card, snd_ctl_new1(&hpf_control, chip)); in generic_wm8785_mixer_init()
640 err = snd_ctl_add(chip->card, in meridian_mixer_init()
654 err = snd_ctl_add(chip->card, in claro_mixer_init()
668 err = snd_ctl_add(chip->card, in claro_halo_mixer_init()
678 struct generic_data *data = chip->model_data; in dump_ak4396_registers()
681 for (dac = 0; dac < data->dacs; ++dac) { in dump_ak4396_registers()
684 snd_iprintf(buffer, " %02x", data->ak4396_regs[dac][i]); in dump_ak4396_registers()
692 struct generic_data *data = chip->model_data; in dump_wm8785_registers()
697 snd_iprintf(buffer, " %03x", data->wm8785_regs[i]); in dump_wm8785_registers()
711 .shortname = "C-Media CMI8788",
712 .longname = "C-Media Oxygen HD Audio",
748 [MODEL_MERIDIAN] = "AuzenTech X-Meridian", in get_oxygen_model()
749 [MODEL_MERIDIAN_2G] = "AuzenTech X-Meridian 2G", in get_oxygen_model()
750 [MODEL_CLARO] = "HT-Omega Claro", in get_oxygen_model()
751 [MODEL_CLARO_HALO] = "HT-Omega Claro halo", in get_oxygen_model()
754 [MODEL_HG2PCI] = "CMI8787-HG2PCI", in get_oxygen_model()
759 chip->model = model_generic; in get_oxygen_model()
760 switch (id->driver_data) { in get_oxygen_model()
763 chip->model.init = meridian_init; in get_oxygen_model()
764 chip->model.mixer_init = meridian_mixer_init; in get_oxygen_model()
765 chip->model.resume = meridian_resume; in get_oxygen_model()
766 chip->model.set_adc_params = set_ak5385_params; in get_oxygen_model()
767 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
768 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
772 if (id->driver_data == MODEL_MERIDIAN) in get_oxygen_model()
773 chip->model.device_config |= AC97_CD_INPUT; in get_oxygen_model()
776 chip->model.init = claro_init; in get_oxygen_model()
777 chip->model.mixer_init = claro_mixer_init; in get_oxygen_model()
778 chip->model.cleanup = claro_cleanup; in get_oxygen_model()
779 chip->model.suspend = claro_suspend; in get_oxygen_model()
780 chip->model.resume = claro_resume; in get_oxygen_model()
783 chip->model.init = claro_halo_init; in get_oxygen_model()
784 chip->model.mixer_init = claro_halo_mixer_init; in get_oxygen_model()
785 chip->model.cleanup = claro_cleanup; in get_oxygen_model()
786 chip->model.suspend = claro_suspend; in get_oxygen_model()
787 chip->model.resume = claro_resume; in get_oxygen_model()
788 chip->model.set_adc_params = set_ak5385_params; in get_oxygen_model()
789 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
790 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
799 chip->model.shortname = "C-Media CMI8787"; in get_oxygen_model()
800 chip->model.chip = "CMI8787"; in get_oxygen_model()
801 if (id->driver_data == MODEL_FANTASIA) in get_oxygen_model()
802 chip->model.init = fantasia_init; in get_oxygen_model()
804 chip->model.init = stereo_output_init; in get_oxygen_model()
805 chip->model.resume = stereo_resume; in get_oxygen_model()
806 chip->model.mixer_init = generic_mixer_init; in get_oxygen_model()
807 chip->model.set_adc_params = set_no_params; in get_oxygen_model()
808 chip->model.dump_registers = dump_ak4396_registers; in get_oxygen_model()
809 chip->model.device_config = PLAYBACK_0_TO_I2S | in get_oxygen_model()
811 if (id->driver_data == MODEL_FANTASIA) { in get_oxygen_model()
812 chip->model.device_config |= CAPTURE_0_FROM_I2S_1; in get_oxygen_model()
813 chip->model.adc_mclks = OXYGEN_MCLKS(256, 128, 128); in get_oxygen_model()
815 chip->model.dac_channels_pcm = 2; in get_oxygen_model()
816 chip->model.dac_channels_mixer = 2; in get_oxygen_model()
820 chip->model = model_xonar_dg; in get_oxygen_model()
823 if (id->driver_data == MODEL_MERIDIAN || in get_oxygen_model()
824 id->driver_data == MODEL_MERIDIAN_2G || in get_oxygen_model()
825 id->driver_data == MODEL_CLARO_HALO) { in get_oxygen_model()
826 chip->model.misc_flags = OXYGEN_MISC_MIDI; in get_oxygen_model()
827 chip->model.device_config |= MIDI_OUTPUT | MIDI_INPUT; in get_oxygen_model()
829 if (id->driver_data < ARRAY_SIZE(names) && names[id->driver_data]) in get_oxygen_model()
830 chip->model.shortname = names[id->driver_data]; in get_oxygen_model()
841 return -ENODEV; in generic_oxygen_probe()
844 return -ENOENT; in generic_oxygen_probe()