Lines Matching +full:adc +full:- +full:clk
2 * rt5514.c -- RT5514 ALSA SoC audio codec driver
28 #include <sound/soc-dapm.h>
35 #include "rt5514-spi.h"
124 regmap_write(rt5514->i2c_regmap, 0x18002000, 0x000010ec); in rt5514_enable_dsp_prepare()
126 regmap_write(rt5514->i2c_regmap, 0x18002200, 0x00028604); in rt5514_enable_dsp_prepare()
128 regmap_write(rt5514->i2c_regmap, 0xfafafafa, 0x00000001); in rt5514_enable_dsp_prepare()
129 /* mini-core reset */ in rt5514_enable_dsp_prepare()
130 regmap_write(rt5514->i2c_regmap, 0x18002f00, 0x0005514b); in rt5514_enable_dsp_prepare()
131 regmap_write(rt5514->i2c_regmap, 0x18002f00, 0x00055149); in rt5514_enable_dsp_prepare()
133 regmap_write(rt5514->i2c_regmap, 0xfafafafa, 0x00000000); in rt5514_enable_dsp_prepare()
135 regmap_write(rt5514->i2c_regmap, 0x18002070, 0x00000040); in rt5514_enable_dsp_prepare()
137 regmap_write(rt5514->i2c_regmap, 0x18002240, 0x0000000a); in rt5514_enable_dsp_prepare()
139 regmap_write(rt5514->i2c_regmap, 0x18002100, 0x0000000b); in rt5514_enable_dsp_prepare()
141 regmap_write(rt5514->i2c_regmap, 0x18002004, 0x00808b81); in rt5514_enable_dsp_prepare()
142 /* DSP clk source = pll3, ENABLE DSP clk */ in rt5514_enable_dsp_prepare()
143 regmap_write(rt5514->i2c_regmap, 0x18002f08, 0x00000005); in rt5514_enable_dsp_prepare()
144 /* Enable DSP clk auto switch */ in rt5514_enable_dsp_prepare()
145 regmap_write(rt5514->i2c_regmap, 0x18001114, 0x00000001); in rt5514_enable_dsp_prepare()
147 regmap_write(rt5514->i2c_regmap, 0x18001118, 0x00000001); in rt5514_enable_dsp_prepare()
277 /* {-3, 0, +3, +4.5, +7.5, +9.5, +12, +14, +17} dB */
279 0, 2, TLV_DB_SCALE_ITEM(-300, 300, 0),
288 static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
296 ucontrol->value.integer.value[0] = rt5514->dsp_enabled; in rt5514_dsp_voice_wake_up_get()
304 regmap_write(rt5514->regmap, RT5514_ANA_CTRL_PLL3, 0x0000000a); in rt5514_calibration()
305 regmap_update_bits(rt5514->regmap, RT5514_PLL_SOURCE_CTRL, 0xf, in rt5514_calibration()
307 regmap_update_bits(rt5514->regmap, RT5514_PWR_ANA1, 0x301, in rt5514_calibration()
309 regmap_write(rt5514->regmap, RT5514_PLL3_CALIB_CTRL4, in rt5514_calibration()
310 0x80000000 | rt5514->pll3_cal_value); in rt5514_calibration()
311 regmap_write(rt5514->regmap, RT5514_PLL3_CALIB_CTRL1, in rt5514_calibration()
313 regmap_update_bits(rt5514->regmap, RT5514_PLL3_CALIB_CTRL5, in rt5514_calibration()
315 regmap_update_bits(rt5514->regmap, RT5514_PLL3_CALIB_CTRL5, in rt5514_calibration()
318 regmap_update_bits(rt5514->regmap, RT5514_PLL3_CALIB_CTRL5, in rt5514_calibration()
320 regmap_update_bits(rt5514->regmap, RT5514_PWR_ANA1, 0x301, 0); in rt5514_calibration()
321 regmap_update_bits(rt5514->regmap, RT5514_PLL_SOURCE_CTRL, 0xf, in rt5514_calibration()
336 if (ucontrol->value.integer.value[0] == rt5514->dsp_enabled) in rt5514_dsp_voice_wake_up_put()
340 rt5514->dsp_enabled = ucontrol->value.integer.value[0]; in rt5514_dsp_voice_wake_up_put()
342 if (rt5514->dsp_enabled) { in rt5514_dsp_voice_wake_up_put()
343 if (rt5514->pdata.dsp_calib_clk_name && in rt5514_dsp_voice_wake_up_put()
344 !IS_ERR(rt5514->dsp_calib_clk)) { in rt5514_dsp_voice_wake_up_put()
345 if (clk_set_rate(rt5514->dsp_calib_clk, in rt5514_dsp_voice_wake_up_put()
346 rt5514->pdata.dsp_calib_clk_rate)) in rt5514_dsp_voice_wake_up_put()
347 dev_err(component->dev, in rt5514_dsp_voice_wake_up_put()
350 if (clk_prepare_enable(rt5514->dsp_calib_clk)) in rt5514_dsp_voice_wake_up_put()
351 dev_err(component->dev, in rt5514_dsp_voice_wake_up_put()
361 dev_err(component->dev, "There is no SPI driver for" in rt5514_dsp_voice_wake_up_put()
365 rt5514->pll3_cal_value = buf[0] | buf[1] << 8 | in rt5514_dsp_voice_wake_up_put()
369 clk_disable_unprepare(rt5514->dsp_calib_clk); in rt5514_dsp_voice_wake_up_put()
374 request_firmware(&fw, RT5514_FIRMWARE1, component->dev); in rt5514_dsp_voice_wake_up_put()
377 rt5514_spi_burst_write(0x4ff60000, fw->data, in rt5514_dsp_voice_wake_up_put()
378 ((fw->size/8)+1)*8); in rt5514_dsp_voice_wake_up_put()
380 dev_err(component->dev, "There is no SPI driver for" in rt5514_dsp_voice_wake_up_put()
387 request_firmware(&fw, RT5514_FIRMWARE2, component->dev); in rt5514_dsp_voice_wake_up_put()
390 rt5514_spi_burst_write(0x4ffc0000, fw->data, in rt5514_dsp_voice_wake_up_put()
391 ((fw->size/8)+1)*8); in rt5514_dsp_voice_wake_up_put()
393 dev_err(component->dev, "There is no SPI driver for" in rt5514_dsp_voice_wake_up_put()
401 regmap_write(rt5514->i2c_regmap, 0x18002f00, in rt5514_dsp_voice_wake_up_put()
404 if (rt5514->pdata.dsp_calib_clk_name && in rt5514_dsp_voice_wake_up_put()
405 !IS_ERR(rt5514->dsp_calib_clk)) { in rt5514_dsp_voice_wake_up_put()
408 regmap_write(rt5514->i2c_regmap, 0x1800211c, in rt5514_dsp_voice_wake_up_put()
409 rt5514->pll3_cal_value); in rt5514_dsp_voice_wake_up_put()
410 regmap_write(rt5514->i2c_regmap, 0x18002124, in rt5514_dsp_voice_wake_up_put()
412 regmap_write(rt5514->i2c_regmap, 0x18002124, in rt5514_dsp_voice_wake_up_put()
414 regmap_write(rt5514->i2c_regmap, 0x18002124, in rt5514_dsp_voice_wake_up_put()
418 regmap_multi_reg_write(rt5514->i2c_regmap, in rt5514_dsp_voice_wake_up_put()
420 regcache_mark_dirty(rt5514->regmap); in rt5514_dsp_voice_wake_up_put()
421 regcache_sync(rt5514->regmap); in rt5514_dsp_voice_wake_up_put()
441 /* ADC Mixer*/
445 SOC_DAPM_SINGLE("ADC Switch", RT5514_DOWNFILTER0_CTRL1,
452 SOC_DAPM_SINGLE("ADC Switch", RT5514_DOWNFILTER0_CTRL2,
459 SOC_DAPM_SINGLE("ADC Switch", RT5514_DOWNFILTER1_CTRL1,
466 SOC_DAPM_SINGLE("ADC Switch", RT5514_DOWNFILTER1_CTRL2,
490 * rt5514_calc_dmic_clk - Calculate the frequency divider parameter of dmic.
495 * 1MHz - 3MHz range.
504 return -EINVAL; in rt5514_calc_dmic_clk()
513 dev_warn(component->dev, "Base clock rate %d is too high\n", rate); in rt5514_calc_dmic_clk()
514 return -EINVAL; in rt5514_calc_dmic_clk()
520 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm); in rt5514_set_dmic_clk()
524 idx = rt5514_calc_dmic_clk(component, rt5514->sysclk); in rt5514_set_dmic_clk()
526 dev_err(component->dev, "Failed to set DMIC clock\n"); in rt5514_set_dmic_clk()
528 regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL1, in rt5514_set_dmic_clk()
532 if (rt5514->pdata.dmic_init_delay) in rt5514_set_dmic_clk()
533 msleep(rt5514->pdata.dmic_init_delay); in rt5514_set_dmic_clk()
541 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in rt5514_is_sys_clk_from_pll()
544 if (rt5514->sysclk_src == RT5514_SCLK_S_PLL1) in rt5514_is_sys_clk_from_pll()
553 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm); in rt5514_i2s_use_asrc()
556 return (rt5514->sysclk > rt5514->lrck * 384); in rt5514_i2s_use_asrc()
572 SND_SOC_DAPM_SUPPLY_S("DMIC CLK", 1, SND_SOC_NOPM, 0, 0,
575 SND_SOC_DAPM_SUPPLY("ADC CLK", RT5514_CLK_CTRL1,
580 SND_SOC_DAPM_SUPPLY("LDO18 ADC", RT5514_PWR_ANA1,
596 SND_SOC_DAPM_SUPPLY("ADC Power", SND_SOC_NOPM, 0, 0, NULL, 0),
634 /* ADC Mux */
640 /* ADC Mixer */
641 SND_SOC_DAPM_SUPPLY("adc stereo1 filter", RT5514_CLK_CTRL1,
643 SND_SOC_DAPM_SUPPLY("adc stereo2 filter", RT5514_CLK_CTRL1,
646 SND_SOC_DAPM_MIXER("Sto1 ADC MIXL", SND_SOC_NOPM, 0, 0,
648 SND_SOC_DAPM_MIXER("Sto1 ADC MIXR", SND_SOC_NOPM, 0, 0,
650 SND_SOC_DAPM_MIXER("Sto2 ADC MIXL", SND_SOC_NOPM, 0, 0,
652 SND_SOC_DAPM_MIXER("Sto2 ADC MIXR", SND_SOC_NOPM, 0, 0,
655 SND_SOC_DAPM_ADC("Stereo1 ADC MIXL", NULL, RT5514_DOWNFILTER0_CTRL1,
657 SND_SOC_DAPM_ADC("Stereo1 ADC MIXR", NULL, RT5514_DOWNFILTER0_CTRL2,
659 SND_SOC_DAPM_ADC("Stereo2 ADC MIXL", NULL, RT5514_DOWNFILTER1_CTRL1,
661 SND_SOC_DAPM_ADC("Stereo2 ADC MIXR", NULL, RT5514_DOWNFILTER1_CTRL2,
664 /* ADC PGA */
665 SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
666 SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
678 { "DMIC1L", NULL, "DMIC CLK" },
679 { "DMIC1R", NULL, "DMIC CLK" },
680 { "DMIC2L", NULL, "DMIC CLK" },
681 { "DMIC2R", NULL, "DMIC CLK" },
686 { "Sto1 ADC MIXL", "DMIC Switch", "Stereo1 DMIC Mux" },
687 { "Sto1 ADC MIXL", "ADC Switch", "AMICL" },
688 { "Sto1 ADC MIXR", "DMIC Switch", "Stereo1 DMIC Mux" },
689 { "Sto1 ADC MIXR", "ADC Switch", "AMICR" },
691 { "ADC Power", NULL, "LDO18 IN" },
692 { "ADC Power", NULL, "LDO18 ADC" },
693 { "ADC Power", NULL, "LDO21" },
694 { "ADC Power", NULL, "BG LDO18 IN" },
695 { "ADC Power", NULL, "BG LDO21" },
696 { "ADC Power", NULL, "BG MBIAS" },
697 { "ADC Power", NULL, "MBIAS" },
698 { "ADC Power", NULL, "VREF2" },
699 { "ADC Power", NULL, "VREF1" },
713 { "AMICL", NULL, "ADC CLK" },
714 { "AMICL", NULL, "ADC Power" },
716 { "AMICR", NULL, "ADC CLK" },
717 { "AMICR", NULL, "ADC Power" },
723 { "Stereo1 ADC MIXL", NULL, "Sto1 ADC MIXL" },
724 { "Stereo1 ADC MIXR", NULL, "Sto1 ADC MIXR" },
726 { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL" },
727 { "Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR" },
728 { "Stereo1 ADC MIX", NULL, "adc stereo1 filter" },
729 { "adc stereo1 filter", NULL, "PLL1", rt5514_is_sys_clk_from_pll },
730 { "adc stereo1 filter", NULL, "ASRC AD1", rt5514_i2s_use_asrc },
735 { "Sto2 ADC MIXL", "DMIC Switch", "Stereo2 DMIC Mux" },
736 { "Sto2 ADC MIXL", "ADC Switch", "AMICL" },
737 { "Sto2 ADC MIXR", "DMIC Switch", "Stereo2 DMIC Mux" },
738 { "Sto2 ADC MIXR", "ADC Switch", "AMICR" },
740 { "Stereo2 ADC MIXL", NULL, "Sto2 ADC MIXL" },
741 { "Stereo2 ADC MIXR", NULL, "Sto2 ADC MIXR" },
743 { "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXL" },
744 { "Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXR" },
745 { "Stereo2 ADC MIX", NULL, "adc stereo2 filter" },
746 { "adc stereo2 filter", NULL, "PLL1", rt5514_is_sys_clk_from_pll },
747 { "adc stereo2 filter", NULL, "ASRC AD2", rt5514_i2s_use_asrc },
749 { "AIF1TX", NULL, "Stereo1 ADC MIX"},
750 { "AIF1TX", NULL, "Stereo2 ADC MIX"},
756 struct snd_soc_component *component = dai->component; in rt5514_hw_params()
761 rt5514->lrck = params_rate(params); in rt5514_hw_params()
762 pre_div = rl6231_get_clk_info(rt5514->sysclk, rt5514->lrck); in rt5514_hw_params()
764 dev_err(component->dev, "Unsupported clock setting\n"); in rt5514_hw_params()
765 return -EINVAL; in rt5514_hw_params()
770 dev_err(component->dev, "Unsupported frame size: %d\n", frame_size); in rt5514_hw_params()
771 return -EINVAL; in rt5514_hw_params()
775 rt5514->bclk = rt5514->lrck * (32 << bclk_ms); in rt5514_hw_params()
777 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n", in rt5514_hw_params()
778 rt5514->bclk, rt5514->lrck); in rt5514_hw_params()
779 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n", in rt5514_hw_params()
780 bclk_ms, pre_div, dai->id); in rt5514_hw_params()
795 return -EINVAL; in rt5514_hw_params()
798 regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, RT5514_I2S_DL_MASK, in rt5514_hw_params()
800 regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL1, in rt5514_hw_params()
803 regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL2, in rt5514_hw_params()
813 struct snd_soc_component *component = dai->component; in rt5514_set_dai_fmt()
834 return -EINVAL; in rt5514_set_dai_fmt()
854 return -EINVAL; in rt5514_set_dai_fmt()
857 regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, in rt5514_set_dai_fmt()
867 struct snd_soc_component *component = dai->component; in rt5514_set_dai_sysclk()
871 if (freq == rt5514->sysclk && clk_id == rt5514->sysclk_src) in rt5514_set_dai_sysclk()
884 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id); in rt5514_set_dai_sysclk()
885 return -EINVAL; in rt5514_set_dai_sysclk()
888 regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL2, in rt5514_set_dai_sysclk()
891 rt5514->sysclk = freq; in rt5514_set_dai_sysclk()
892 rt5514->sysclk_src = clk_id; in rt5514_set_dai_sysclk()
894 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id); in rt5514_set_dai_sysclk()
902 struct snd_soc_component *component = dai->component; in rt5514_set_dai_pll()
908 dev_dbg(component->dev, "PLL disabled\n"); in rt5514_set_dai_pll()
910 rt5514->pll_in = 0; in rt5514_set_dai_pll()
911 rt5514->pll_out = 0; in rt5514_set_dai_pll()
912 regmap_update_bits(rt5514->regmap, RT5514_CLK_CTRL2, in rt5514_set_dai_pll()
919 if (source == rt5514->pll_src && freq_in == rt5514->pll_in && in rt5514_set_dai_pll()
920 freq_out == rt5514->pll_out) in rt5514_set_dai_pll()
925 regmap_update_bits(rt5514->regmap, RT5514_PLL_SOURCE_CTRL, in rt5514_set_dai_pll()
930 regmap_update_bits(rt5514->regmap, RT5514_PLL_SOURCE_CTRL, in rt5514_set_dai_pll()
935 dev_err(component->dev, "Unknown PLL source %d\n", source); in rt5514_set_dai_pll()
936 return -EINVAL; in rt5514_set_dai_pll()
941 dev_err(component->dev, "Unsupport input clock %d\n", freq_in); in rt5514_set_dai_pll()
945 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n", in rt5514_set_dai_pll()
949 regmap_write(rt5514->regmap, RT5514_ANA_CTRL_PLL1_1, in rt5514_set_dai_pll()
953 regmap_update_bits(rt5514->regmap, RT5514_ANA_CTRL_PLL1_2, in rt5514_set_dai_pll()
956 rt5514->pll_in = freq_in; in rt5514_set_dai_pll()
957 rt5514->pll_out = freq_out; in rt5514_set_dai_pll()
958 rt5514->pll_src = source; in rt5514_set_dai_pll()
966 struct snd_soc_component *component = dai->component; in rt5514_set_tdm_slot()
1040 regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL1, RT5514_TDM_MODE | in rt5514_set_tdm_slot()
1045 regmap_update_bits(rt5514->regmap, RT5514_I2S_CTRL2, in rt5514_set_tdm_slot()
1060 if (IS_ERR(rt5514->mclk)) in rt5514_set_bias_level()
1064 clk_disable_unprepare(rt5514->mclk); in rt5514_set_bias_level()
1066 ret = clk_prepare_enable(rt5514->mclk); in rt5514_set_bias_level()
1079 if (rt5514->dsp_enabled) { in rt5514_set_bias_level()
1080 rt5514->dsp_enabled = 0; in rt5514_set_bias_level()
1081 regmap_multi_reg_write(rt5514->i2c_regmap, in rt5514_set_bias_level()
1084 regcache_mark_dirty(rt5514->regmap); in rt5514_set_bias_level()
1085 regcache_sync(rt5514->regmap); in rt5514_set_bias_level()
1100 struct platform_device *pdev = container_of(component->dev, in rt5514_probe()
1103 rt5514->mclk = devm_clk_get(component->dev, "mclk"); in rt5514_probe()
1104 if (PTR_ERR(rt5514->mclk) == -EPROBE_DEFER) in rt5514_probe()
1105 return -EPROBE_DEFER; in rt5514_probe()
1107 if (rt5514->pdata.dsp_calib_clk_name) { in rt5514_probe()
1108 rt5514->dsp_calib_clk = devm_clk_get(&pdev->dev, in rt5514_probe()
1109 rt5514->pdata.dsp_calib_clk_name); in rt5514_probe()
1110 if (PTR_ERR(rt5514->dsp_calib_clk) == -EPROBE_DEFER) in rt5514_probe()
1111 return -EPROBE_DEFER; in rt5514_probe()
1114 rt5514->component = component; in rt5514_probe()
1115 rt5514->pll3_cal_value = 0x0078b000; in rt5514_probe()
1125 regmap_read(rt5514->i2c_regmap, reg | RT5514_DSP_MAPPING, val); in rt5514_i2c_read()
1135 regmap_write(rt5514->i2c_regmap, reg | RT5514_DSP_MAPPING, val); in rt5514_i2c_write()
1154 .name = "rt5514-aif1",
1231 device_property_read_u32(dev, "realtek,dmic-init-delay-ms", in rt5514_parse_dp()
1232 &rt5514->pdata.dmic_init_delay); in rt5514_parse_dp()
1233 device_property_read_string(dev, "realtek,dsp-calib-clk-name", in rt5514_parse_dp()
1234 &rt5514->pdata.dsp_calib_clk_name); in rt5514_parse_dp()
1235 device_property_read_u32(dev, "realtek,dsp-calib-clk-rate", in rt5514_parse_dp()
1236 &rt5514->pdata.dsp_calib_clk_rate); in rt5514_parse_dp()
1251 regmap_read(rt5514->regmap, RT5514_VENDOR_ID2, &val); in rt5514_i2c_resume()
1259 struct rt5514_platform_data *pdata = dev_get_platdata(&i2c->dev); in rt5514_i2c_probe()
1264 rt5514 = devm_kzalloc(&i2c->dev, sizeof(struct rt5514_priv), in rt5514_i2c_probe()
1267 return -ENOMEM; in rt5514_i2c_probe()
1272 rt5514->pdata = *pdata; in rt5514_i2c_probe()
1274 rt5514_parse_dp(rt5514, &i2c->dev); in rt5514_i2c_probe()
1276 rt5514->i2c_regmap = devm_regmap_init_i2c(i2c, &rt5514_i2c_regmap); in rt5514_i2c_probe()
1277 if (IS_ERR(rt5514->i2c_regmap)) { in rt5514_i2c_probe()
1278 ret = PTR_ERR(rt5514->i2c_regmap); in rt5514_i2c_probe()
1279 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt5514_i2c_probe()
1284 rt5514->regmap = devm_regmap_init(&i2c->dev, NULL, i2c, &rt5514_regmap); in rt5514_i2c_probe()
1285 if (IS_ERR(rt5514->regmap)) { in rt5514_i2c_probe()
1286 ret = PTR_ERR(rt5514->regmap); in rt5514_i2c_probe()
1287 dev_err(&i2c->dev, "Failed to allocate register map: %d\n", in rt5514_i2c_probe()
1298 ret = regmap_read(rt5514->regmap, RT5514_VENDOR_ID2, &val); in rt5514_i2c_probe()
1300 ret = regmap_read(rt5514->regmap, RT5514_VENDOR_ID2, &val); in rt5514_i2c_probe()
1302 dev_err(&i2c->dev, in rt5514_i2c_probe()
1304 return -ENODEV; in rt5514_i2c_probe()
1307 ret = regmap_multi_reg_write(rt5514->i2c_regmap, rt5514_i2c_patch, in rt5514_i2c_probe()
1310 dev_warn(&i2c->dev, "Failed to apply i2c_regmap patch: %d\n", in rt5514_i2c_probe()
1313 ret = regmap_register_patch(rt5514->regmap, rt5514_patch, in rt5514_i2c_probe()
1316 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); in rt5514_i2c_probe()
1318 return devm_snd_soc_register_component(&i2c->dev, in rt5514_i2c_probe()