Lines Matching +full:asrc +full:- +full:clk +full:- +full:map

1 // SPDX-License-Identifier: GPL-2.0-only
3 * rt5640.c -- RT5640/RT5639 ALSA SoC audio codec driver
27 #include <sound/soc-dapm.h>
340 static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
341 static const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0);
342 static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
343 static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000);
451 * set_dmic_clk - Set parameter of dmic.
461 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
465 rate = rt5640->sysclk / rl6231_get_pre_div(rt5640->regmap,
469 dev_err(component->dev, "Failed to set DMIC clock\n");
479 struct snd_soc_component *component = snd_soc_dapm_to_component(source->dapm);
482 if (!rt5640->asrc_en)
885 /* digital interface and iis interface map */
921 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
923 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
925 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
928 regmap_write(rt5640->regmap, RT5640_PR_BASE + RT5640_HP_DCC_INT1,
931 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
933 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
937 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1,
946 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2,
949 regmap_update_bits(rt5640->regmap, RT5640_CHARGE_PUMP,
952 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M3,
958 regmap_write(rt5640->regmap, RT5640_PR_BASE +
960 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1,
963 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE +
970 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
976 rt5640->hp_mute = false;
980 rt5640->hp_mute = true;
994 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1023 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1039 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
1044 if (!rt5640->hp_mute)
1057 /* ASRC */
1058 SND_SOC_DAPM_SUPPLY_S("Stereo Filter ASRC", 1, RT5640_ASRC_1,
1060 SND_SOC_DAPM_SUPPLY_S("I2S2 Filter ASRC", 1, RT5640_ASRC_1,
1062 SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5640_ASRC_1,
1064 SND_SOC_DAPM_SUPPLY_S("DMIC1 ASRC", 1, RT5640_ASRC_1,
1066 SND_SOC_DAPM_SUPPLY_S("DMIC2 ASRC", 1, RT5640_ASRC_1,
1090 SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
1332 { "I2S1", NULL, "Stereo Filter ASRC", is_using_asrc },
1333 { "I2S2", NULL, "I2S2 ASRC", is_using_asrc },
1334 { "I2S2", NULL, "I2S2 Filter ASRC", is_using_asrc },
1335 { "DMIC1", NULL, "DMIC1 ASRC", is_using_asrc },
1336 { "DMIC2", NULL, "DMIC2 ASRC", is_using_asrc },
1374 {"DMIC L1", NULL, "DMIC CLK"},
1376 {"DMIC R1", NULL, "DMIC CLK"},
1378 {"DMIC L2", NULL, "DMIC CLK"},
1380 {"DMIC R2", NULL, "DMIC CLK"},
1651 return -EINVAL;
1689 ret = -EINVAL;
1699 struct snd_soc_component *component = dai->component;
1704 rt5640->lrck[dai->id] = params_rate(params);
1705 pre_div = rl6231_get_clk_info(rt5640->sysclk, rt5640->lrck[dai->id]);
1707 dev_err(component->dev, "Unsupported clock setting %d for DAI %d\n",
1708 rt5640->lrck[dai->id], dai->id);
1709 return -EINVAL;
1713 dev_err(component->dev, "Unsupported frame size: %d\n", frame_size);
1720 rt5640->bclk[dai->id] = rt5640->lrck[dai->id] * (32 << bclk_ms);
1722 dev_dbg(dai->dev, "bclk is %dHz and lrck is %dHz\n",
1723 rt5640->bclk[dai->id], rt5640->lrck[dai->id]);
1724 dev_dbg(dai->dev, "bclk_ms is %d and pre_div is %d for iis %d\n",
1725 bclk_ms, pre_div, dai->id);
1740 return -EINVAL;
1743 dai_sel = get_sdp_info(component, dai->id);
1745 dev_err(component->dev, "Failed to get sdp info: %d\n", dai_sel);
1746 return -EINVAL;
1770 struct snd_soc_component *component = dai->component;
1777 rt5640->master[dai->id] = 1;
1781 rt5640->master[dai->id] = 0;
1784 return -EINVAL;
1794 return -EINVAL;
1810 return -EINVAL;
1813 dai_sel = get_sdp_info(component, dai->id);
1815 dev_err(component->dev, "Failed to get sdp info: %d\n", dai_sel);
1816 return -EINVAL;
1835 struct snd_soc_component *component = dai->component;
1843 ret = clk_set_rate(rt5640->mclk, freq);
1857 dev_err(component->dev, "Invalid clock id (%d)\n", clk_id);
1858 return -EINVAL;
1864 rt5640->sysclk = freq;
1865 rt5640->sysclk_src = clk_id;
1867 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
1874 struct snd_soc_component *component = dai->component;
1879 if (source == rt5640->pll_src && freq_in == rt5640->pll_in &&
1880 freq_out == rt5640->pll_out)
1884 dev_dbg(component->dev, "PLL disabled\n");
1886 rt5640->pll_in = 0;
1887 rt5640->pll_out = 0;
1907 dev_err(component->dev, "Unknown PLL source %d\n", source);
1908 return -EINVAL;
1913 dev_err(component->dev, "Unsupported input clock %d\n", freq_in);
1917 dev_dbg(component->dev, "bypass=%d m=%d n=%d k=%d\n",
1927 rt5640->pll_in = freq_in;
1928 rt5640->pll_out = freq_out;
1929 rt5640->pll_src = source;
1953 clk_disable_unprepare(rt5640->mclk);
1955 ret = clk_prepare_enable(rt5640->mclk);
1987 if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
2008 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
2012 regmap_update_bits(rt5640->regmap, RT5640_DMIC,
2014 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
2019 regmap_update_bits(rt5640->regmap, RT5640_DMIC,
2021 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1,
2042 return -EINVAL;
2046 return -EINVAL;
2088 rt5640->asrc_en = true;
2091 rt5640->asrc_en = false;
2107 /* OVCD is unreliable when used with RCCLK as sysclk-source */
2108 if (rt5640->use_platform_clock)
2121 if (rt5640->use_platform_clock)
2136 rt5640->ovcd_irq_enabled = true;
2145 rt5640->ovcd_irq_enabled = false;
2159 dev_dbg(component->dev, "irq ctrl2 %#04x\n", val);
2169 if (rt5640->jd_gpio)
2170 val = gpiod_get_value(rt5640->jd_gpio) ? RT5640_JD_STATUS : 0;
2174 dev_dbg(component->dev, "irq status %#04x\n", val);
2176 if (rt5640->jd_inverted)
2182 /* Jack detect and button-press timings */
2195 rt5640->poll_count = 0;
2196 rt5640->press_count = 0;
2197 rt5640->release_count = 0;
2198 rt5640->pressed = false;
2199 rt5640->press_reported = false;
2201 schedule_delayed_work(&rt5640->bp_work, msecs_to_jiffies(BP_POLL_TIME));
2208 struct snd_soc_component *component = rt5640->component;
2215 rt5640->release_count = 0;
2216 rt5640->press_count++;
2218 if (rt5640->press_count >= BP_THRESHOLD)
2219 rt5640->pressed = true;
2222 rt5640->press_count = 0;
2223 rt5640->release_count++;
2228 * at least JACK_UNPLUG_TIME milli-seconds before reporting a press.
2230 rt5640->poll_count++;
2231 if (rt5640->poll_count < (JACK_UNPLUG_TIME / BP_POLL_TIME)) {
2232 schedule_delayed_work(&rt5640->bp_work,
2237 if (rt5640->pressed && !rt5640->press_reported) {
2238 dev_dbg(component->dev, "headset button press\n");
2239 snd_soc_jack_report(rt5640->jack, SND_JACK_BTN_0,
2241 rt5640->press_reported = true;
2244 if (rt5640->release_count >= BP_THRESHOLD) {
2245 if (rt5640->press_reported) {
2246 dev_dbg(component->dev, "headset button release\n");
2247 snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0);
2249 /* Re-enable OVCD IRQ to detect next press */
2254 schedule_delayed_work(&rt5640->bp_work, msecs_to_jiffies(BP_POLL_TIME));
2269 /* Clear any previous over-current status flag */
2289 dev_dbg(component->dev, "jack mic-gnd shorted\n");
2295 dev_dbg(component->dev, "jack mic-gnd open\n");
2303 dev_err(component->dev, "Error detecting headset vs headphones, bad contact?, assuming headphones\n");
2312 struct snd_soc_component *component = rt5640->component;
2315 if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) {
2321 dev_dbg(component->dev, "mic jack status %d\n",
2333 dev_dbg(component->dev, "headphone jack status %d\n",
2342 snd_soc_jack_report(rt5640->jack, jack_type, SND_JACK_HEADSET);
2349 if (rt5640->jack->status & SND_JACK_HEADPHONE) {
2350 if (rt5640->jack->status & SND_JACK_MICROPHONE) {
2351 cancel_delayed_work_sync(&rt5640->bp_work);
2355 snd_soc_jack_report(rt5640->jack, 0,
2357 dev_dbg(component->dev, "jack unplugged\n");
2359 } else if (!(rt5640->jack->status & SND_JACK_HEADPHONE)) {
2361 WARN_ON(rt5640->ovcd_irq_enabled);
2371 dev_dbg(component->dev, "detect status %#02x\n", status);
2372 snd_soc_jack_report(rt5640->jack, status, SND_JACK_HEADSET);
2373 } else if (rt5640->ovcd_irq_enabled && rt5640_micbias1_ovcd(component)) {
2374 dev_dbg(component->dev, "OVCD IRQ\n");
2389 * If the jack-detect IRQ flag goes high (unplug) after our
2392 * we react to edges, we miss the unplug event -> recheck.
2394 queue_delayed_work(system_long_wq, &rt5640->jack_work, 0);
2403 if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
2406 if (rt5640->jack)
2407 mod_delayed_work(system_long_wq, &rt5640->jack_work, delay);
2416 queue_delayed_work(system_long_wq, &rt5640->jack_work,
2426 if (rt5640->jd_gpio_irq_requested) {
2427 free_irq(rt5640->jd_gpio_irq, rt5640);
2428 rt5640->jd_gpio_irq_requested = false;
2431 if (rt5640->irq_requested) {
2432 free_irq(rt5640->irq, rt5640);
2433 rt5640->irq_requested = false;
2436 cancel_delayed_work_sync(&rt5640->jack_work);
2437 cancel_delayed_work_sync(&rt5640->bp_work);
2445 0xa800 | rt5640->ovcd_sf);
2449 rt5640->ovcd_th | RT5640_MIC1_OVCD_EN);
2452 * The over-current-detect is only reliable in detecting the absence
2453 * of over-current, when the mic-contact in the jack is short-circuited,
2454 * the hardware periodically retries if it can apply the bias-current
2455 * leading to the ovcd status flip-flopping 1-0-1 with it being 0 about
2470 * soc_remove_component() force-disables jack and thus rt5640->jack
2473 if (!rt5640->jack)
2478 if (rt5640->jack->status & SND_JACK_MICROPHONE) {
2481 snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0);
2484 rt5640->jd_gpio = NULL;
2485 rt5640->jack = NULL;
2495 /* Select JD-source */
2497 RT5640_JD_MASK, rt5640->jd_src << RT5640_JD_SFT);
2512 * All IRQs get or-ed together, so we need the jack IRQ to report 0
2517 if (rt5640->jd_inverted) {
2518 if (rt5640->jd_src == RT5640_JD_SRC_JD1_IN4P)
2521 else if (rt5640->jd_src == RT5640_JD_SRC_JD2_IN4N)
2526 if (rt5640->jd_src == RT5640_JD_SRC_JD1_IN4P)
2529 else if (rt5640->jd_src == RT5640_JD_SRC_JD2_IN4N)
2537 rt5640->jack = jack;
2538 if (rt5640->jack->status & SND_JACK_MICROPHONE) {
2543 if (jack_data && jack_data->codec_irq_override)
2544 rt5640->irq = jack_data->codec_irq_override;
2546 if (jack_data && jack_data->jd_gpio) {
2547 rt5640->jd_gpio = jack_data->jd_gpio;
2548 rt5640->jd_gpio_irq = gpiod_to_irq(rt5640->jd_gpio);
2550 ret = request_irq(rt5640->jd_gpio_irq, rt5640_jd_gpio_irq,
2552 "rt5640-jd-gpio", rt5640);
2554 dev_warn(component->dev, "Failed to request jd GPIO IRQ %d: %d\n",
2555 rt5640->jd_gpio_irq, ret);
2559 rt5640->jd_gpio_irq_requested = true;
2562 if (jack_data && jack_data->use_platform_clock)
2563 rt5640->use_platform_clock = jack_data->use_platform_clock;
2565 ret = request_irq(rt5640->irq, rt5640_irq,
2569 dev_warn(component->dev, "Failed to request IRQ %d: %d\n", rt5640->irq, ret);
2573 rt5640->irq_requested = true;
2576 queue_delayed_work(system_long_wq, &rt5640->jack_work, 0);
2618 rt5640->jack = jack;
2620 ret = request_irq(rt5640->irq, rt5640_irq,
2623 dev_warn(component->dev, "Failed to request IRQ %d: %d\n", rt5640->irq, ret);
2624 rt5640->jack = NULL;
2627 rt5640->irq_requested = true;
2630 queue_delayed_work(system_long_wq, &rt5640->jack_work, 0);
2642 if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER)
2663 rt5640->mclk = devm_clk_get_optional(component->dev, "mclk");
2664 if (IS_ERR(rt5640->mclk))
2665 return PTR_ERR(rt5640->mclk);
2667 rt5640->component = component;
2697 dev_err(component->dev,
2699 return -ENODEV;
2703 * Note on some platforms the platform code may need to add device-props
2706 * rt5640_i2c_probe(), so that the platform-code can attach extra
2709 if (device_property_read_bool(component->dev, "realtek,in1-differential"))
2713 if (device_property_read_bool(component->dev, "realtek,in2-differential"))
2717 if (device_property_read_bool(component->dev, "realtek,in3-differential"))
2721 if (device_property_read_bool(component->dev, "realtek,lout-differential"))
2725 if (device_property_read_u32(component->dev, "realtek,dmic1-data-pin",
2727 dmic1_data_pin = val - 1;
2731 if (device_property_read_u32(component->dev, "realtek,dmic2-data-pin",
2733 dmic2_data_pin = val - 1;
2740 if (device_property_read_u32(component->dev,
2741 "realtek,jack-detect-source", &val) == 0) {
2743 rt5640->jd_src = val;
2745 dev_warn(component->dev, "Warning: Invalid jack-detect-source value: %d, leaving jack-detect disabled\n",
2749 if (!device_property_read_bool(component->dev, "realtek,jack-detect-not-inverted"))
2750 rt5640->jd_inverted = true;
2754 * threshold and scale-factor are 2000µA and 0.75. For an effective
2757 rt5640->ovcd_th = RT5640_MIC1_OVTH_2000UA;
2758 rt5640->ovcd_sf = RT5640_MIC_OVCD_SF_0P75;
2760 if (device_property_read_u32(component->dev,
2761 "realtek,over-current-threshold-microamp", &val) == 0) {
2764 rt5640->ovcd_th = RT5640_MIC1_OVTH_600UA;
2767 rt5640->ovcd_th = RT5640_MIC1_OVTH_1500UA;
2770 rt5640->ovcd_th = RT5640_MIC1_OVTH_2000UA;
2773 dev_warn(component->dev, "Warning: Invalid over-current-threshold-microamp value: %d, defaulting to 2000uA\n",
2778 if (device_property_read_u32(component->dev,
2779 "realtek,over-current-scale-factor", &val) == 0) {
2781 rt5640->ovcd_sf = val << RT5640_MIC_OVCD_SF_SFT;
2783 dev_warn(component->dev, "Warning: Invalid over-current-scale-factor value: %d, defaulting to 0.75\n",
2800 if (rt5640->jack) {
2802 disable_irq(rt5640->irq);
2803 cancel_delayed_work_sync(&rt5640->jack_work);
2804 cancel_delayed_work_sync(&rt5640->bp_work);
2809 regcache_cache_only(rt5640->regmap, true);
2810 regcache_mark_dirty(rt5640->regmap);
2811 if (rt5640->ldo1_en)
2812 gpiod_set_value_cansleep(rt5640->ldo1_en, 0);
2821 if (rt5640->ldo1_en) {
2822 gpiod_set_value_cansleep(rt5640->ldo1_en, 1);
2826 regcache_cache_only(rt5640->regmap, false);
2827 regcache_sync(rt5640->regmap);
2829 if (rt5640->jack) {
2830 if (rt5640->jd_src == RT5640_JD_SRC_HDA_HEADER) {
2834 if (rt5640->jd_inverted) {
2835 if (rt5640->jd_src == RT5640_JD_SRC_JD2_IN4N)
2844 if (rt5640->jd_src == RT5640_JD_SRC_JD2_IN4N)
2856 enable_irq(rt5640->irq);
2857 queue_delayed_work(system_long_wq, &rt5640->jack_work, 0);
2880 .name = "rt5640-aif1",
2899 .name = "rt5640-aif2",
2989 rt5640 = devm_kzalloc(&i2c->dev,
2993 return -ENOMEM;
2996 rt5640->ldo1_en = devm_gpiod_get_optional(&i2c->dev,
2997 "realtek,ldo1-en",
2999 if (IS_ERR(rt5640->ldo1_en))
3000 return PTR_ERR(rt5640->ldo1_en);
3002 if (rt5640->ldo1_en) {
3003 gpiod_set_consumer_name(rt5640->ldo1_en, "RT5640 LDO1_EN");
3007 rt5640->regmap = devm_regmap_init_i2c(i2c, &rt5640_regmap);
3008 if (IS_ERR(rt5640->regmap)) {
3009 ret = PTR_ERR(rt5640->regmap);
3010 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
3015 regmap_read(rt5640->regmap, RT5640_VENDOR_ID2, &val);
3017 dev_err(&i2c->dev,
3019 return -ENODEV;
3022 regmap_write(rt5640->regmap, RT5640_RESET, 0);
3024 ret = regmap_register_patch(rt5640->regmap, init_list,
3027 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
3029 regmap_update_bits(rt5640->regmap, RT5640_DUMMY1,
3032 rt5640->hp_mute = true;
3033 rt5640->irq = i2c->irq;
3034 INIT_DELAYED_WORK(&rt5640->bp_work, rt5640_button_press_work);
3035 INIT_DELAYED_WORK(&rt5640->jack_work, rt5640_jack_work);
3037 /* Make sure work is stopped on probe-error / remove */
3038 ret = devm_add_action_or_reset(&i2c->dev, rt5640_disable_irq_and_cancel_work, rt5640);
3042 return devm_snd_soc_register_component(&i2c->dev,