Lines Matching +full:spk +full:- +full:playback +full:- +full:dai +full:- +full:link
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * wm9712.c -- ALSA Soc WM9712 codec support
5 * Copyright 2006-12 Wolfson Microelectronics PLC.
115 static const DECLARE_TLV_DB_SCALE(main_tlv, -3450, 150, 0);
134 SOC_DOUBLE("Speaker Playback Volume", AC97_MASTER, 8, 0, 31, 1),
135 SOC_SINGLE("Speaker Playback Switch", AC97_MASTER, 15, 1, 1),
136 SOC_DOUBLE("Headphone Playback Volume", AC97_HEADPHONE, 8, 0, 31, 1),
137 SOC_SINGLE("Headphone Playback Switch", AC97_HEADPHONE, 15, 1, 1),
138 SOC_DOUBLE("PCM Playback Volume", AC97_PCM, 8, 0, 31, 1),
140 SOC_SINGLE("Speaker Playback ZC Switch", AC97_MASTER, 7, 1, 0),
141 SOC_SINGLE("Speaker Playback Invert Switch", AC97_MASTER, 6, 1, 0),
142 SOC_SINGLE("Headphone Playback ZC Switch", AC97_HEADPHONE, 7, 1, 0),
143 SOC_SINGLE("Mono Playback ZC Switch", AC97_MASTER_MONO, 7, 1, 0),
144 SOC_SINGLE("Mono Playback Volume", AC97_MASTER_MONO, 0, 31, 1),
145 SOC_SINGLE("Mono Playback Switch", AC97_MASTER_MONO, 15, 1, 1),
170 SOC_SINGLE("Aux Playback Headphone Volume", AC97_CD, 12, 7, 1),
171 SOC_SINGLE("Aux Playback Speaker Volume", AC97_CD, 8, 7, 1),
172 SOC_SINGLE("Aux Playback Phone Volume", AC97_CD, 4, 7, 1),
181 SOC_SINGLE("3D Upper Cut-off Switch", AC97_3D_CONTROL, 5, 1, 1),
182 SOC_SINGLE("3D Lower Cut-off Switch", AC97_3D_CONTROL, 4, 1, 1),
183 SOC_SINGLE("3D Playback Volume", AC97_3D_CONTROL, 0, 15, 0),
186 SOC_SINGLE("Bass Cut-off Switch", AC97_MASTER_TONE, 12, 1, 1),
187 SOC_SINGLE("Tone Cut-off Switch", AC97_MASTER_TONE, 4, 1, 1),
188 SOC_SINGLE("Playback Attenuate (-6dB) Switch", AC97_MASTER_TONE, 6, 1, 0),
221 unsigned int val = ucontrol->value.integer.value[0];
223 (struct soc_mixer_control *)kcontrol->private_value;
228 mixer = mc->shift >> 8;
229 shift = mc->shift & 0xff;
232 mutex_lock(&wm9712->lock);
233 old = wm9712->hp_mixer[mixer];
234 if (ucontrol->value.integer.value[0])
235 wm9712->hp_mixer[mixer] |= mask;
237 wm9712->hp_mixer[mixer] &= ~mask;
239 change = old != wm9712->hp_mixer[mixer];
244 if ((wm9712->hp_mixer[0] & mask) ||
245 (wm9712->hp_mixer[1] & mask))
254 mutex_unlock(&wm9712->lock);
266 (struct soc_mixer_control *)kcontrol->private_value;
269 mixer = mc->shift >> 8;
270 shift = mc->shift & 0xff;
272 ucontrol->value.integer.value[0] =
273 (wm9712->hp_mixer[mixer] >> shift) & 1;
285 WM9712_HP_MIXER_CTRL("Aux Playback Switch", HPL_MIXER, 4),
288 WM9712_HP_MIXER_CTRL("PCM Playback Switch", HPL_MIXER, 1),
295 WM9712_HP_MIXER_CTRL("Aux Playback Switch", HPR_MIXER, 4),
298 WM9712_HP_MIXER_CTRL("PCM Playback Switch", HPR_MIXER, 1),
305 SOC_DAPM_SINGLE("Aux Playback Switch", AC97_CD, 11, 1, 1),
308 SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PCM, 14, 1, 1),
314 SOC_DAPM_SINGLE("Aux Playback Switch", AC97_CD, 7, 1, 1),
316 SOC_DAPM_SINGLE("PCM Playback Switch", AC97_PCM, 13, 1, 1),
329 /* spk mux */
383 SND_SOC_DAPM_DAC("Left DAC", "Left HiFi Playback", AC97_INT_PAGING, 14, 1),
384 SND_SOC_DAPM_DAC("Right DAC", "Right HiFi Playback", AC97_INT_PAGING, 13, 1),
385 SND_SOC_DAPM_DAC("Aux DAC", "Aux Playback", SND_SOC_NOPM, 0, 0),
411 /* virtual mixer - mixes left & right channels for spk and mono */
417 {"Left HP Mixer", "Aux Playback Switch", "Aux DAC"},
420 {"Left HP Mixer", "PCM Playback Switch", "Left DAC"},
426 {"Right HP Mixer", "Aux Playback Switch", "Aux DAC"},
429 {"Right HP Mixer", "PCM Playback Switch", "Right DAC"},
436 {"Speaker Mixer", "PCM Playback Switch", "AC97 Mixer"},
438 {"Speaker Mixer", "Aux Playback Switch", "Aux DAC"},
443 {"Phone Mixer", "Aux Playback Switch", "Aux DAC"},
444 {"Phone Mixer", "PCM Playback Switch", "AC97 Mixer"},
520 struct snd_soc_dai *dai)
522 struct snd_soc_component *component = dai->component;
524 struct snd_pcm_runtime *runtime = substream->runtime;
528 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
533 return snd_soc_component_write(component, reg, runtime->rate);
537 struct snd_soc_dai *dai)
539 struct snd_soc_component *component = dai->component;
540 struct snd_pcm_runtime *runtime = substream->runtime;
545 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
546 return -ENODEV;
548 return snd_soc_component_write(component, AC97_PCM_SURR_DAC_RATE, runtime->rate);
565 .name = "wm9712-hifi",
566 .playback = {
567 .stream_name = "HiFi Playback",
581 .name = "wm9712-aux",
582 .playback = {
583 .stream_name = "Aux Playback",
603 /* disable everything including AC link */
616 ret = snd_ac97_reset(wm9712->ac97, true, WM9712_VENDOR_ID,
634 if (wm9712->mfd_pdata) {
635 wm9712->ac97 = wm9712->mfd_pdata->ac97;
636 regmap = wm9712->mfd_pdata->regmap;
640 wm9712->ac97 = snd_soc_new_ac97_component(component, WM9712_VENDOR_ID,
642 if (IS_ERR(wm9712->ac97)) {
643 ret = PTR_ERR(wm9712->ac97);
644 dev_err(component->dev,
649 regmap = regmap_init_ac97(wm9712->ac97, &wm9712_regmap_config);
651 snd_soc_free_ac97_component(wm9712->ac97);
655 return -ENXIO;
670 if (IS_ENABLED(CONFIG_SND_SOC_AC97_BUS) && !wm9712->mfd_pdata) {
672 snd_soc_free_ac97_component(wm9712->ac97);
697 wm9712 = devm_kzalloc(&pdev->dev, sizeof(*wm9712), GFP_KERNEL);
699 return -ENOMEM;
701 mutex_init(&wm9712->lock);
703 wm9712->mfd_pdata = dev_get_platdata(&pdev->dev);
706 return devm_snd_soc_register_component(&pdev->dev,
712 .name = "wm9712-codec",