Lines Matching +full:adc +full:- +full:dev
1 // SPDX-License-Identifier: GPL-2.0-only
3 * rt5660.c -- RT5660 ALSA SoC audio codec driver
24 #include <sound/soc-dapm.h>
151 static bool rt5660_volatile_register(struct device *dev, unsigned int reg) in rt5660_volatile_register() argument
178 static bool rt5660_readable_register(struct device *dev, unsigned int reg) in rt5660_readable_register() argument
296 static const DECLARE_TLV_DB_SCALE(rt5660_out_vol_tlv, -4650, 150, 0);
297 static const DECLARE_TLV_DB_SCALE(rt5660_dac_vol_tlv, -6525, 75, 0);
298 static const DECLARE_TLV_DB_SCALE(rt5660_adc_vol_tlv, -1725, 75, 0);
300 static const DECLARE_TLV_DB_SCALE(rt5660_bst_tlv, -1200, 75, 0);
328 /* ADC Digital Volume Control */
329 SOC_DOUBLE("ADC Capture Switch", RT5660_STO1_ADC_DIG_VOL,
331 SOC_DOUBLE_TLV("ADC Capture Volume", RT5660_STO1_ADC_DIG_VOL,
335 /* ADC Boost Volume Control */
336 SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5660_ADC_BST_VOL1,
342 * rt5660_set_dmic_clk - Set parameter of dmic.
352 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5660_set_dmic_clk()
356 rate = rt5660->sysclk / rl6231_get_pre_div(rt5660->regmap, in rt5660_set_dmic_clk()
360 dev_err(component->dev, "Failed to set DMIC clock\n"); in rt5660_set_dmic_clk()
371 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in rt5660_is_sys_clk_from_pll()
398 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5660_AD_DA_MIXER,
405 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5660_AD_DA_MIXER,
534 SOC_DAPM_ENUM("IF1 ADC Swap Source", rt5660_if1_adc_enum);
539 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5660_lout_event()
604 SND_SOC_DAPM_ADC("ADC L", NULL, SND_SOC_NOPM, 0, 0),
605 SND_SOC_DAPM_ADC("ADC R", NULL, SND_SOC_NOPM, 0, 0),
607 SND_SOC_DAPM_SUPPLY("ADC L power", RT5660_PWR_DIG1,
609 SND_SOC_DAPM_SUPPLY("ADC R power", RT5660_PWR_DIG1,
611 SND_SOC_DAPM_SUPPLY("ADC clock", RT5660_PR_BASE + RT5660_CHOP_DAC_ADC,
614 /* ADC Mixer */
615 SND_SOC_DAPM_SUPPLY("adc stereo1 filter", RT5660_PWR_DIG2,
617 SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0,
619 SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", SND_SOC_NOPM, 0, 0,
622 /* ADC */
623 SND_SOC_DAPM_ADC("Stereo1 ADC MIXL", NULL, RT5660_STO1_ADC_DIG_VOL,
625 SND_SOC_DAPM_ADC("Stereo1 ADC MIXR", NULL, RT5660_STO1_ADC_DIG_VOL,
636 SND_SOC_DAPM_PGA("IF1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
637 SND_SOC_DAPM_MUX("IF1 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
724 { "ADC L", NULL, "RECMIXL" },
725 { "ADC L", NULL, "ADC L power" },
726 { "ADC L", NULL, "ADC clock" },
727 { "ADC R", NULL, "RECMIXR" },
728 { "ADC R", NULL, "ADC R power" },
729 { "ADC R", NULL, "ADC clock" },
736 { "Sto1 ADC MIXL", "ADC1 Switch", "ADC L" },
737 { "Sto1 ADC MIXL", "ADC2 Switch", "DMIC L1" },
738 { "Sto1 ADC MIXR", "ADC1 Switch", "ADC R" },
739 { "Sto1 ADC MIXR", "ADC2 Switch", "DMIC R1" },
741 { "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
742 { "Stereo1 ADC MIXL", NULL, "adc stereo1 filter" },
743 { "adc stereo1 filter", NULL, "PLL1", rt5660_is_sys_clk_from_pll },
745 { "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
746 { "Stereo1 ADC MIXR", NULL, "adc stereo1 filter" },
747 { "adc stereo1 filter", NULL, "PLL1", rt5660_is_sys_clk_from_pll },
749 { "IF1 ADC", NULL, "Stereo1 ADC MIXL" },
750 { "IF1 ADC", NULL, "Stereo1 ADC MIXR" },
751 { "IF1 ADC", NULL, "I2S1" },
753 { "IF1 ADC Swap Mux", "L/R", "IF1 ADC" },
754 { "IF1 ADC Swap Mux", "R/L", "IF1 ADC" },
755 { "IF1 ADC Swap Mux", "L/L", "IF1 ADC" },
756 { "IF1 ADC Swap Mux", "R/R", "IF1 ADC" },
757 { "AIF1TX", NULL, "IF1 ADC Swap Mux" },
770 { "DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL" },
772 { "DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR" },
836 struct snd_soc_component *component = dai->component; in rt5660_hw_params()
841 rt5660->lrck[dai->id] = params_rate(params); in rt5660_hw_params()
842 pre_div = rl6231_get_clk_info(rt5660->sysclk, rt5660->lrck[dai->id]); in rt5660_hw_params()
844 dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n", in rt5660_hw_params()
845 rt5660->lrck[dai->id], dai->id); in rt5660_hw_params()
846 return -EINVAL; in rt5660_hw_params()
851 dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); in rt5660_hw_params()
860 rt5660->bclk[dai->id] = rt5660->lrck[dai->id] * (32 << bclk_ms); in rt5660_hw_params()
862 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n", in rt5660_hw_params()
863 rt5660->bclk[dai->id], rt5660->lrck[dai->id]); in rt5660_hw_params()
864 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", in rt5660_hw_params()
865 bclk_ms, pre_div, dai->id); in rt5660_hw_params()
880 return -EINVAL; in rt5660_hw_params()
883 switch (dai->id) { in rt5660_hw_params()
894 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5660_hw_params()
895 return -EINVAL; in rt5660_hw_params()
903 struct snd_soc_component *component = dai->component; in rt5660_set_dai_fmt()
909 rt5660->master[dai->id] = 1; in rt5660_set_dai_fmt()
914 rt5660->master[dai->id] = 0; in rt5660_set_dai_fmt()
918 return -EINVAL; in rt5660_set_dai_fmt()
930 return -EINVAL; in rt5660_set_dai_fmt()
950 return -EINVAL; in rt5660_set_dai_fmt()
953 switch (dai->id) { in rt5660_set_dai_fmt()
961 dev_err(component->dev, "Invalid dai->id: %d\n", dai->id); in rt5660_set_dai_fmt()
962 return -EINVAL; in rt5660_set_dai_fmt()
971 struct snd_soc_component *component = dai->component; in rt5660_set_dai_sysclk()
975 if (freq == rt5660->sysclk && clk_id == rt5660->sysclk_src) in rt5660_set_dai_sysclk()
992 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); in rt5660_set_dai_sysclk()
993 return -EINVAL; in rt5660_set_dai_sysclk()
999 rt5660->sysclk = freq; in rt5660_set_dai_sysclk()
1000 rt5660->sysclk_src = clk_id; in rt5660_set_dai_sysclk()
1002 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); in rt5660_set_dai_sysclk()
1010 struct snd_soc_component *component = dai->component; in rt5660_set_dai_pll()
1015 if (source == rt5660->pll_src && freq_in == rt5660->pll_in && in rt5660_set_dai_pll()
1016 freq_out == rt5660->pll_out) in rt5660_set_dai_pll()
1020 dev_dbg(component->dev, "PLL disabled\n"); in rt5660_set_dai_pll()
1022 rt5660->pll_in = 0; in rt5660_set_dai_pll()
1023 rt5660->pll_out = 0; in rt5660_set_dai_pll()
1041 dev_err(component->dev, "Unknown PLL source %d\n", source); in rt5660_set_dai_pll()
1042 return -EINVAL; in rt5660_set_dai_pll()
1047 dev_err(component->dev, "Unsupported input clock %d\n", freq_in); in rt5660_set_dai_pll()
1051 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", in rt5660_set_dai_pll()
1061 rt5660->pll_in = freq_in; in rt5660_set_dai_pll()
1062 rt5660->pll_out = freq_out; in rt5660_set_dai_pll()
1063 rt5660->pll_src = source; in rt5660_set_dai_pll()
1083 clk_disable_unprepare(rt5660->mclk); in rt5660_set_bias_level()
1085 ret = clk_prepare_enable(rt5660->mclk); in rt5660_set_bias_level()
1121 rt5660->component = component; in rt5660_probe()
1136 regcache_cache_only(rt5660->regmap, true); in rt5660_suspend()
1137 regcache_mark_dirty(rt5660->regmap); in rt5660_suspend()
1146 if (rt5660->pdata.poweroff_codec_in_suspend) in rt5660_resume()
1149 regcache_cache_only(rt5660->regmap, false); in rt5660_resume()
1150 regcache_sync(rt5660->regmap); in rt5660_resume()
1172 .name = "rt5660-aif1",
1249 static int rt5660_parse_dt(struct rt5660_priv *rt5660, struct device *dev) in rt5660_parse_dt() argument
1251 rt5660->pdata.in1_diff = device_property_read_bool(dev, in rt5660_parse_dt()
1252 "realtek,in1-differential"); in rt5660_parse_dt()
1253 rt5660->pdata.in3_diff = device_property_read_bool(dev, in rt5660_parse_dt()
1254 "realtek,in3-differential"); in rt5660_parse_dt()
1255 rt5660->pdata.poweroff_codec_in_suspend = device_property_read_bool(dev, in rt5660_parse_dt()
1256 "realtek,poweroff-in-suspend"); in rt5660_parse_dt()
1257 device_property_read_u32(dev, "realtek,dmic1-data-pin", in rt5660_parse_dt()
1258 &rt5660->pdata.dmic1_data_pin); in rt5660_parse_dt()
1265 struct rt5660_platform_data *pdata = dev_get_platdata(&i2c->dev); in rt5660_i2c_probe()
1270 rt5660 = devm_kzalloc(&i2c->dev, sizeof(struct rt5660_priv), in rt5660_i2c_probe()
1274 return -ENOMEM; in rt5660_i2c_probe()
1277 rt5660->mclk = devm_clk_get_optional(&i2c->dev, "mclk"); in rt5660_i2c_probe()
1278 if (IS_ERR(rt5660->mclk)) in rt5660_i2c_probe()
1279 return PTR_ERR(rt5660->mclk); in rt5660_i2c_probe()
1284 rt5660->pdata = *pdata; in rt5660_i2c_probe()
1285 else if (i2c->dev.of_node) in rt5660_i2c_probe()
1286 rt5660_parse_dt(rt5660, &i2c->dev); in rt5660_i2c_probe()
1288 rt5660->regmap = devm_regmap_init_i2c(i2c, &rt5660_regmap); in rt5660_i2c_probe()
1289 if (IS_ERR(rt5660->regmap)) { in rt5660_i2c_probe()
1290 ret = PTR_ERR(rt5660->regmap); in rt5660_i2c_probe()
1291 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt5660_i2c_probe()
1296 regmap_read(rt5660->regmap, RT5660_VENDOR_ID2, &val); in rt5660_i2c_probe()
1298 dev_err(&i2c->dev, in rt5660_i2c_probe()
1300 return -ENODEV; in rt5660_i2c_probe()
1303 regmap_write(rt5660->regmap, RT5660_RESET, 0); in rt5660_i2c_probe()
1305 ret = regmap_register_patch(rt5660->regmap, rt5660_patch, in rt5660_i2c_probe()
1308 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); in rt5660_i2c_probe()
1310 regmap_update_bits(rt5660->regmap, RT5660_GEN_CTRL1, in rt5660_i2c_probe()
1314 if (rt5660->pdata.dmic1_data_pin) { in rt5660_i2c_probe()
1315 regmap_update_bits(rt5660->regmap, RT5660_GPIO_CTRL1, in rt5660_i2c_probe()
1318 if (rt5660->pdata.dmic1_data_pin == RT5660_DMIC1_DATA_GPIO2) { in rt5660_i2c_probe()
1319 regmap_update_bits(rt5660->regmap, RT5660_DMIC_CTRL1, in rt5660_i2c_probe()
1322 regmap_update_bits(rt5660->regmap, RT5660_GPIO_CTRL1, in rt5660_i2c_probe()
1324 } else if (rt5660->pdata.dmic1_data_pin == RT5660_DMIC1_DATA_IN1P) { in rt5660_i2c_probe()
1325 regmap_update_bits(rt5660->regmap, RT5660_DMIC_CTRL1, in rt5660_i2c_probe()
1331 return devm_snd_soc_register_component(&i2c->dev, in rt5660_i2c_probe()