Lines Matching +full:mic +full:- +full:int

1 // SPDX-License-Identifier: GPL-2.0-only
3 * bytcht_es8316.c - ASoc Machine driver for Intel Baytrail/Cherrytrail
7 * Authors: David Yang <yangxiaohua@everest-semi.com>,
29 #include <sound/soc-acpi.h>
30 #include "../../codecs/es83xx-dsm-common.h"
31 #include "../atom/sst-atom-controls.h"
32 #include "../common/soc-intel-quirks.h"
34 /* jd-inv + terminating entry */
58 static int quirk_override = -1;
59 module_param_named(quirk, quirk_override, int, 0444);
60 MODULE_PARM_DESC(quirk, "Board-specific quirk override");
64 int map;
89 static int byt_cht_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
90 struct snd_kcontrol *kcontrol, int event)
92 struct snd_soc_card *card = w->dapm->card;
96 priv->speaker_en = true;
98 priv->speaker_en = false;
100 gpiod_set_value_cansleep(priv->speaker_en_gpio, priv->speaker_en);
108 SND_SOC_DAPM_MIC("Headset Mic", NULL),
109 SND_SOC_DAPM_MIC("Internal Mic", NULL),
130 {"MIC1", NULL, "Internal Mic"},
131 {"MIC2", NULL, "Headset Mic"},
135 {"MIC2", NULL, "Internal Mic"},
136 {"MIC1", NULL, "Headset Mic"},
158 SOC_DAPM_PIN_SWITCH("Headset Mic"),
159 SOC_DAPM_PIN_SWITCH("Internal Mic"),
168 .pin = "Headset Mic",
173 static int byt_cht_es8316_init(struct snd_soc_pcm_runtime *runtime)
175 struct snd_soc_component *codec = snd_soc_rtd_to_codec(runtime, 0)->component;
176 struct snd_soc_card *card = runtime->card;
179 int num_routes;
180 int ret;
182 card->dapm.idle_bias = false;
195 ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
206 ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
218 ret = clk_prepare_enable(priv->mclk);
220 clk_disable_unprepare(priv->mclk);
222 ret = clk_set_rate(priv->mclk, 19200000);
224 dev_err(card->dev, "unable to set MCLK rate\n");
226 ret = clk_prepare_enable(priv->mclk);
228 dev_err(card->dev, "unable to enable MCLK\n");
233 dev_err(card->dev, "can't set codec clock %d\n", ret);
239 &priv->jack, byt_cht_es8316_jack_pins,
242 dev_err(card->dev, "jack creation failed %d\n", ret);
246 snd_jack_set_key(priv->jack.jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
247 snd_soc_component_set_jack(codec, &priv->jack, NULL);
252 static int byt_cht_es8316_codec_fixup(struct snd_soc_pcm_runtime *rtd,
259 int ret, bits;
262 rate->min = rate->max = 48000;
263 channels->min = channels->max = 2;
266 /* set SSP0 to 16-bit */
270 /* set SSP2 to 24-bit */
277 * with explicit setting to I2S 2ch 24-bit. The word length is set with
286 dev_err(rtd->dev, "can't set format to I2S, err %d\n", ret);
292 dev_err(rtd->dev, "can't set I2S config, err %d\n", ret);
299 static int byt_cht_es8316_aif1_startup(struct snd_pcm_substream *substream)
301 return snd_pcm_hw_constraint_single(substream->runtime,
313 DAILINK_COMP_ARRAY(COMP_CPU("media-cpu-dai")));
316 DAILINK_COMP_ARRAY(COMP_CPU("deepbuffer-cpu-dai")));
319 DAILINK_COMP_ARRAY(COMP_CPU("ssp2-port")));
321 DAILINK_COMP_ARRAY(COMP_CODEC("i2c-ESSX8316:00", "ES8316 HiFi")));
324 DAILINK_COMP_ARRAY(COMP_PLATFORM("sst-mfld-platform")));
337 .name = "Deep-Buffer Audio Port",
338 .stream_name = "Deep-Buffer Audio",
348 .name = "SSP2-Codec",
363 static char long_name[50]; /* = "bytcht-es8316-*-spk-*-mic" */
365 static char components_string[32]; /* = "cfg-spk:* cfg-mic:* */
367 static int byt_cht_es8316_suspend(struct snd_soc_card *card)
372 if (!strcmp(component->name, codec_name)) {
373 dev_dbg(component->dev, "disabling jack detect before suspend\n");
382 static int byt_cht_es8316_resume(struct snd_soc_card *card)
388 if (!strcmp(component->name, codec_name)) {
389 dev_dbg(component->dev, "re-enabling jack detect after resume\n");
390 snd_soc_component_set_jack(component, &priv->jack, NULL);
398 * wrongly also set the speaker-enable GPIO to 1/0. Testing has shown
405 * is guaranteed to run after the touchscreen driver/ACPI-subsys has
412 gpiod_set_value_cansleep(priv->speaker_en_gpio, priv->speaker_en);
418 #define SOF_CARD_NAME "bytcht es8316" /* card name will be 'sof-bytcht es8316' */
421 #define CARD_NAME "bytcht-es8316"
442 { "speaker-enable-gpios", &first_gpio, 1 },
457 { /* Nanote UMPC-01 */
460 DMI_MATCH(DMI_PRODUCT_NAME, "UMPC-01"),
475 static int byt_cht_es8316_get_quirks_from_dsm(struct byt_cht_es8316_private *priv,
478 int ret, val1, val2, dsm_quirk = 0;
483 ret = es83xx_dsm(priv->codec_dev, PLATFORM_MAINMIC_TYPE_ARG, &val1);
487 ret = es83xx_dsm(priv->codec_dev, PLATFORM_HPMIC_TYPE_ARG, &val2);
496 dev_warn(priv->codec_dev, "Unknown mic settings mainmic 0x%02x hpmic 0x%02x\n",
498 return -EINVAL;
501 ret = es83xx_dsm(priv->codec_dev, PLATFORM_SPK_TYPE_ARG, &val1);
512 dev_warn(priv->codec_dev, "Unknown speaker setting 0x%02x\n", val1);
513 return -EINVAL;
516 ret = es83xx_dsm(priv->codec_dev, PLATFORM_HPDET_INV_ARG, &val1);
527 dev_warn(priv->codec_dev, "Unknown hpdet-inv setting 0x%02x\n", val1);
528 return -EINVAL;
535 static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
537 struct device *dev = &pdev->dev;
548 unsigned int cnt = 0;
549 int dai_index = 0;
550 int i;
551 int ret = 0;
555 return -ENOMEM;
560 !strcmp(byt_cht_es8316_dais[i].codecs->name,
561 "i2c-ESSX8316:00")) {
568 adev = acpi_dev_get_first_match_dev(mach->id, NULL, -1);
571 "i2c-%s", acpi_dev_name(adev));
572 byt_cht_es8316_dais[dai_index].codecs->name = codec_name;
574 dev_err(dev, "Error cannot find '%s' dev\n", mach->id);
575 return -ENOENT;
581 return -EPROBE_DEFER;
582 priv->codec_dev = get_device(codec_dev);
586 platform_name = mach->mach_params.platform;
595 es83xx_dsm_dump(priv->codec_dev);
598 is_bytcr = soc_intel_is_byt() && mach->mach_params.acpi_ipc_irq_index == 0;
601 quirk = (unsigned long)dmi_id->driver_data;
605 /* On BYTCR default to SSP0, internal-mic-in2-map, mono-spk */
609 /* Others default to internal-mic-in1-map, mono-speaker */
613 if (quirk_override != -1) {
621 byt_cht_es8316_dais[dai_index].cpus->dai_name = "ssp0-port";
624 priv->mclk = devm_clk_get(dev, "pmc_plt_clk_3");
625 if (IS_ERR(priv->mclk)) {
627 return dev_err_probe(dev, PTR_ERR(priv->mclk), "clk_get pmc_plt_clk_3 failed\n");
631 props[cnt++] = PROPERTY_ENTRY_BOOL("everest,jack-detect-inverted");
652 priv->speaker_en_gpio =
653 gpiod_get_optional(codec_dev, "speaker-enable",
656 if (IS_ERR(priv->speaker_en_gpio)) {
657 ret = dev_err_probe(dev, PTR_ERR(priv->speaker_en_gpio),
663 "cfg-spk:%s cfg-mic:%s",
668 snprintf(long_name, sizeof(long_name), "bytcht-es8316-%s-spk-%s-mic",
687 dev->driver->pm = &snd_soc_pm_ops;
694 gpiod_put(priv->speaker_en_gpio);
702 device_remove_software_node(priv->codec_dev);
703 put_device(priv->codec_dev);
712 gpiod_put(priv->speaker_en_gpio);
713 device_remove_software_node(priv->codec_dev);
714 put_device(priv->codec_dev);
727 MODULE_AUTHOR("David Yang <yangxiaohua@everest-semi.com>");