Lines Matching +full:mic +full:- +full:int
1 // SPDX-License-Identifier: GPL-2.0-only
3 * bytcr_rt5651.c - ASoc Machine driver for Intel Byt CR platform
29 #include <sound/soc-acpi.h>
31 #include "../atom/sst-atom-controls.h"
32 #include "../common/soc-intel-quirks.h"
81 /* jack-detect-source + inv + dmic-en + ovcd-th + -sf + terminating entry */
94 /* Default: jack-detect on JD1_1, internal mic on in2, headsetmic on in3 */
98 static int quirk_override = -1;
99 module_param_named(quirk, quirk_override, int, 0444);
100 MODULE_PARM_DESC(quirk, "Board-specific quirk override");
104 int map;
128 dev_info(dev, "quirk realtek,jack-detect-source %ld\n",
130 dev_info(dev, "quirk realtek,over-current-threshold-microamp %ld\n",
132 dev_info(dev, "quirk realtek,over-current-scale-factor %ld\n",
153 #define BYT_CODEC_DAI1 "rt5651-aif1"
154 #define BYT_CODEC_DAI2 "rt5651-aif2"
156 static int byt_rt5651_prepare_and_enable_pll1(struct snd_soc_dai *codec_dai,
157 int rate, int bclk_ratio)
159 int clk_id, clk_freq, ret;
174 dev_err(codec_dai->component->dev, "can't set pll: %d\n", ret);
181 dev_err(codec_dai->component->dev, "can't set clock %d\n", ret);
188 static int platform_clock_control(struct snd_soc_dapm_widget *w,
189 struct snd_kcontrol *k, int event)
191 struct snd_soc_dapm_context *dapm = w->dapm;
192 struct snd_soc_card *card = dapm->card;
195 int ret;
201 dev_err(card->dev,
203 return -EIO;
207 ret = clk_prepare_enable(priv->mclk);
209 dev_err(card->dev, "could not configure MCLK state");
223 clk_disable_unprepare(priv->mclk);
227 dev_err(card->dev, "can't set codec sysclk: %d\n", ret);
234 static int rt5651_ext_amp_power_event(struct snd_soc_dapm_widget *w,
235 struct snd_kcontrol *kcontrol, int event)
237 struct snd_soc_card *card = w->dapm->card;
241 gpiod_set_value_cansleep(priv->ext_amp_gpio, 1);
243 gpiod_set_value_cansleep(priv->ext_amp_gpio, 0);
250 SND_SOC_DAPM_MIC("Headset Mic", NULL),
251 SND_SOC_DAPM_MIC("Internal Mic", NULL),
264 {"Headset Mic", NULL, "Platform Clock"},
265 {"Internal Mic", NULL, "Platform Clock"},
270 {"Headset Mic", NULL, "micbias1"}, /* lowercase for rt5651 */
281 {"DMIC L1", NULL, "Internal Mic"},
282 {"DMIC R1", NULL, "Internal Mic"},
283 {"IN2P", NULL, "Headset Mic"},
287 {"Internal Mic", NULL, "micbias1"},
288 {"IN1P", NULL, "Internal Mic"},
289 {"IN3P", NULL, "Headset Mic"},
293 {"Internal Mic", NULL, "micbias1"},
294 {"IN2P", NULL, "Internal Mic"},
295 {"IN3P", NULL, "Headset Mic"},
299 {"Internal Mic", NULL, "micbias1"},
300 {"IN1P", NULL, "Internal Mic"},
301 {"IN2P", NULL, "Internal Mic"},
302 {"IN3P", NULL, "Headset Mic"},
343 SOC_DAPM_PIN_SWITCH("Headset Mic"),
344 SOC_DAPM_PIN_SWITCH("Internal Mic"),
355 .pin = "Headset Mic",
360 static int byt_rt5651_aif1_hw_params(struct snd_pcm_substream *substream,
366 int rate = params_rate(params);
367 int bclk_ratio;
381 { "hp-detect-gpios", &pov_p1006w_hp_detect, 1, },
382 { "ext-amp-enable-gpios", &pov_p1006w_ext_amp_en, 1, },
386 static int byt_rt5651_pov_p1006w_quirk_cb(const struct dmi_system_id *id)
388 byt_rt5651_quirk = (unsigned long)id->driver_data;
393 static int byt_rt5651_quirk_cb(const struct dmi_system_id *id)
395 byt_rt5651_quirk = (unsigned long)id->driver_data;
437 /* I.T.Works TW701, Ployer Momo7w and Trekstor ST70416-6
543 static int byt_rt5651_add_codec_device_props(struct device *i2c_dev,
548 int cnt = 0;
549 int ret;
551 props[cnt++] = PROPERTY_ENTRY_U32("realtek,jack-detect-source",
554 props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-threshold-microamp",
557 props[cnt++] = PROPERTY_ENTRY_U32("realtek,over-current-scale-factor",
561 props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,dmic-en");
564 props[cnt++] = PROPERTY_ENTRY_BOOL("realtek,jack-detect-not-inverted");
579 static int byt_rt5651_init(struct snd_soc_pcm_runtime *runtime)
581 struct snd_soc_card *card = runtime->card;
582 struct snd_soc_component *codec = snd_soc_rtd_to_codec(runtime, 0)->component;
585 int num_routes;
586 int report;
587 int ret;
589 card->dapm.idle_bias = false;
591 /* Start with RC clk for jack-detect (we disable MCLK below) */
613 ret = snd_soc_dapm_add_routes(&card->dapm, custom_map, num_routes);
618 ret = snd_soc_dapm_add_routes(&card->dapm,
622 ret = snd_soc_dapm_add_routes(&card->dapm,
626 ret = snd_soc_dapm_add_routes(&card->dapm,
630 ret = snd_soc_dapm_add_routes(&card->dapm,
640 dev_err(card->dev, "unable to add card controls\n");
652 ret = clk_prepare_enable(priv->mclk);
654 clk_disable_unprepare(priv->mclk);
657 ret = clk_set_rate(priv->mclk, 25000000);
659 ret = clk_set_rate(priv->mclk, 19200000);
662 dev_err(card->dev, "unable to set MCLK rate\n");
667 else if (priv->hp_detect)
671 ret = snd_soc_card_jack_new_pins(runtime->card, "Headset",
672 report, &priv->jack,
676 dev_err(runtime->dev, "jack creation failed %d\n", ret);
681 snd_jack_set_key(priv->jack.jack, SND_JACK_BTN_0,
684 ret = snd_soc_component_set_jack(codec, &priv->jack,
685 priv->hp_detect);
693 static int byt_rt5651_codec_fixup(struct snd_soc_pcm_runtime *rtd,
700 int ret, bits;
703 rate->min = rate->max = 48000;
704 channels->min = channels->max = 2;
708 /* set SSP0 to 16-bit */
712 /* set SSP2 to 24-bit */
729 dev_err(rtd->dev, "can't set format to I2S, err %d\n", ret);
735 dev_err(rtd->dev, "can't set I2S config, err %d\n", ret);
742 static const unsigned int rates_48000[] = {
751 static int byt_rt5651_aif1_startup(struct snd_pcm_substream *substream)
753 return snd_pcm_hw_constraint_list(substream->runtime, 0,
770 DAILINK_COMP_ARRAY(COMP_CPU("media-cpu-dai")));
773 DAILINK_COMP_ARRAY(COMP_CPU("deepbuffer-cpu-dai")));
776 DAILINK_COMP_ARRAY(COMP_CPU("ssp2-port")));
778 DAILINK_COMP_ARRAY(COMP_CODEC("i2c-10EC5651:00", "rt5651-aif1")));
781 DAILINK_COMP_ARRAY(COMP_PLATFORM("sst-mfld-platform")));
793 .name = "Deep-Buffer Audio Port",
794 .stream_name = "Deep-Buffer Audio",
801 /* CODEC<->CODEC link */
804 .name = "SSP2-Codec",
819 static char byt_rt5651_long_name[50]; /* = "bytcr-rt5651-*-spk-*-mic[-swapped-hp]" */
821 static char byt_rt5651_components[50]; /* = "cfg-spk:* cfg-mic:*" */
823 static int byt_rt5651_suspend(struct snd_soc_card *card)
831 if (!strcmp(component->name, byt_rt5651_codec_name)) {
832 dev_dbg(component->dev, "disabling jack detect before suspend\n");
841 static int byt_rt5651_resume(struct snd_soc_card *card)
850 if (!strcmp(component->name, byt_rt5651_codec_name)) {
851 dev_dbg(component->dev, "re-enabling jack detect after resume\n");
852 snd_soc_component_set_jack(component, &priv->jack,
853 priv->hp_detect);
862 #define SOF_CARD_NAME "bytcht rt5651" /* card name will be 'sof-bytcht rt5651' */
865 #define CARD_NAME "bytcr-rt5651"
889 * We want the GpioIo one for the ext-amp-enable-gpio.
891 { "ext-amp-enable-gpios", &ext_amp_enable_gpios, 1, ACPI_GPIO_QUIRK_ONLY_GPIOIO },
900 static int snd_byt_rt5651_mc_probe(struct platform_device *pdev)
902 struct device *dev = &pdev->dev;
911 int ret_val = 0;
912 int dai_index = 0;
913 int i;
917 return -ENOMEM;
926 !strcmp(byt_rt5651_dais[i].codecs->name,
927 "i2c-10EC5651:00")) {
934 adev = acpi_dev_get_first_match_dev(mach->id, NULL, -1);
937 "i2c-%s", acpi_dev_name(adev));
938 byt_rt5651_dais[dai_index].codecs->name = byt_rt5651_codec_name;
940 dev_err(dev, "Error cannot find '%s' dev\n", mach->id);
941 return -ENOENT;
947 return -EPROBE_DEFER;
948 priv->codec_dev = get_device(codec_dev);
955 if (mach->mach_params.acpi_ipc_irq_index == 0)
965 * with the codec driver/pdata are non-existent
970 /* format specified: 2 64-bit integers */
985 pkg_found = snd_soc_acpi_find_package_from_hid(mach->id,
1001 /* no BIOS indications, assume SSP0-AIF2 connection */
1009 if (quirk_override != -1) {
1026 priv->ext_amp_gpio = devm_fwnode_gpiod_get(dev, codec_dev->fwnode,
1027 "ext-amp-enable",
1029 "speaker-amp");
1030 if (IS_ERR(priv->ext_amp_gpio)) {
1031 ret_val = PTR_ERR(priv->ext_amp_gpio);
1033 case -ENOENT:
1034 priv->ext_amp_gpio = NULL;
1037 dev_err(dev, "Failed to get ext-amp-enable GPIO: %d\n", ret_val);
1039 case -EPROBE_DEFER:
1043 priv->hp_detect = devm_fwnode_gpiod_get(dev, codec_dev->fwnode,
1044 "hp-detect",
1046 "hp-detect");
1047 if (IS_ERR(priv->hp_detect)) {
1048 ret_val = PTR_ERR(priv->hp_detect);
1050 case -ENOENT:
1051 priv->hp_detect = NULL;
1054 dev_err(dev, "Failed to get hp-detect GPIO: %d\n", ret_val);
1056 case -EPROBE_DEFER:
1066 byt_rt5651_dais[dai_index].codecs->dai_name = "rt5651-aif2";
1070 byt_rt5651_dais[dai_index].cpus->dai_name = "ssp0-port";
1073 priv->mclk = devm_clk_get_optional(dev, "pmc_plt_clk_3");
1074 if (IS_ERR(priv->mclk)) {
1075 ret_val = dev_err_probe(dev, PTR_ERR(priv->mclk),
1083 if (!priv->mclk)
1088 "cfg-spk:%s cfg-mic:%s%s",
1092 " cfg-hp:lrswap" : "");
1096 "bytcr-rt5651-%s-spk-%s-mic%s",
1101 "-hp-swapped" : "");
1106 platform_name = mach->mach_params.platform;
1126 dev->driver->pm = &snd_soc_pm_ops;
1137 device_remove_software_node(priv->codec_dev);
1139 put_device(priv->codec_dev);
1148 device_remove_software_node(priv->codec_dev);
1149 put_device(priv->codec_dev);
1163 MODULE_AUTHOR("Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>");