• Home
  • Raw
  • Download

Lines Matching full:rt5640

3  * rt5640.c  --  RT5640/RT5639 ALSA SoC audio codec driver
33 #include "rt5640.h"
463 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in set_dmic_clk() local
466 rate = rt5640->sysclk / rl6231_get_pre_div(rt5640->regmap, in set_dmic_clk()
481 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in is_using_asrc() local
483 if (!rt5640->asrc_en) in is_using_asrc()
919 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in hp_amp_power_on() local
922 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + in hp_amp_power_on()
924 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2, in hp_amp_power_on()
926 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1, in hp_amp_power_on()
929 regmap_write(rt5640->regmap, RT5640_PR_BASE + RT5640_HP_DCC_INT1, in hp_amp_power_on()
932 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1, in hp_amp_power_on()
934 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1, in hp_amp_power_on()
938 regmap_update_bits(rt5640->regmap, RT5640_PWR_ANLG1, in hp_amp_power_on()
945 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_pmu_depop() local
947 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M2, in rt5640_pmu_depop()
950 regmap_update_bits(rt5640->regmap, RT5640_CHARGE_PUMP, in rt5640_pmu_depop()
953 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M3, in rt5640_pmu_depop()
959 regmap_write(rt5640->regmap, RT5640_PR_BASE + in rt5640_pmu_depop()
961 regmap_update_bits(rt5640->regmap, RT5640_DEPOP_M1, in rt5640_pmu_depop()
964 regmap_update_bits(rt5640->regmap, RT5640_PR_BASE + in rt5640_pmu_depop()
972 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_hp_event() local
977 rt5640->hp_mute = false; in rt5640_hp_event()
981 rt5640->hp_mute = true; in rt5640_hp_event()
1041 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_hp_post_event() local
1045 if (!rt5640->hp_mute) in rt5640_hp_post_event()
1701 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_hw_params() local
1705 rt5640->lrck[dai->id] = params_rate(params); in rt5640_hw_params()
1706 pre_div = rl6231_get_clk_info(rt5640->sysclk, rt5640->lrck[dai->id]); in rt5640_hw_params()
1709 rt5640->lrck[dai->id], dai->id); in rt5640_hw_params()
1721 rt5640->bclk[dai->id] = rt5640->lrck[dai->id] * (32 << bclk_ms); in rt5640_hw_params()
1724 rt5640->bclk[dai->id], rt5640->lrck[dai->id]); in rt5640_hw_params()
1772 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_set_dai_fmt() local
1778 rt5640->master[dai->id] = 1; in rt5640_set_dai_fmt()
1782 rt5640->master[dai->id] = 0; in rt5640_set_dai_fmt()
1837 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_set_dai_sysclk() local
1841 if (freq == rt5640->sysclk && clk_id == rt5640->sysclk_src) in rt5640_set_dai_sysclk()
1863 rt5640->sysclk = freq; in rt5640_set_dai_sysclk()
1864 rt5640->sysclk_src = clk_id; in rt5640_set_dai_sysclk()
1874 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_set_dai_pll() local
1878 if (source == rt5640->pll_src && freq_in == rt5640->pll_in && in rt5640_set_dai_pll()
1879 freq_out == rt5640->pll_out) in rt5640_set_dai_pll()
1885 rt5640->pll_in = 0; in rt5640_set_dai_pll()
1886 rt5640->pll_out = 0; in rt5640_set_dai_pll()
1926 rt5640->pll_in = freq_in; in rt5640_set_dai_pll()
1927 rt5640->pll_out = freq_out; in rt5640_set_dai_pll()
1928 rt5640->pll_src = source; in rt5640_set_dai_pll()
1936 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_set_bias_level() local
1951 if (IS_ERR(rt5640->mclk)) in rt5640_set_bias_level()
1955 clk_disable_unprepare(rt5640->mclk); in rt5640_set_bias_level()
1957 ret = clk_prepare_enable(rt5640->mclk); in rt5640_set_bias_level()
2003 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_dmic_enable() local
2005 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1, in rt5640_dmic_enable()
2009 regmap_update_bits(rt5640->regmap, RT5640_DMIC, in rt5640_dmic_enable()
2011 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1, in rt5640_dmic_enable()
2016 regmap_update_bits(rt5640->regmap, RT5640_DMIC, in rt5640_dmic_enable()
2018 regmap_update_bits(rt5640->regmap, RT5640_GPIO_CTRL1, in rt5640_dmic_enable()
2029 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_sel_asrc_clk_src() local
2085 rt5640->asrc_en = true; in rt5640_sel_asrc_clk_src()
2088 rt5640->asrc_en = false; in rt5640_sel_asrc_clk_src()
2123 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_enable_micbias1_ovcd_irq() local
2127 rt5640->ovcd_irq_enabled = true; in rt5640_enable_micbias1_ovcd_irq()
2132 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_disable_micbias1_ovcd_irq() local
2136 rt5640->ovcd_irq_enabled = false; in rt5640_disable_micbias1_ovcd_irq()
2157 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_jack_inserted() local
2163 if (rt5640->jd_inverted) in rt5640_jack_inserted()
2180 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_start_button_press_work() local
2182 rt5640->poll_count = 0; in rt5640_start_button_press_work()
2183 rt5640->press_count = 0; in rt5640_start_button_press_work()
2184 rt5640->release_count = 0; in rt5640_start_button_press_work()
2185 rt5640->pressed = false; in rt5640_start_button_press_work()
2186 rt5640->press_reported = false; in rt5640_start_button_press_work()
2188 schedule_delayed_work(&rt5640->bp_work, msecs_to_jiffies(BP_POLL_TIME)); in rt5640_start_button_press_work()
2193 struct rt5640_priv *rt5640 = in rt5640_button_press_work() local
2195 struct snd_soc_component *component = rt5640->component; in rt5640_button_press_work()
2202 rt5640->release_count = 0; in rt5640_button_press_work()
2203 rt5640->press_count++; in rt5640_button_press_work()
2205 if (rt5640->press_count >= BP_THRESHOLD) in rt5640_button_press_work()
2206 rt5640->pressed = true; in rt5640_button_press_work()
2209 rt5640->press_count = 0; in rt5640_button_press_work()
2210 rt5640->release_count++; in rt5640_button_press_work()
2217 rt5640->poll_count++; in rt5640_button_press_work()
2218 if (rt5640->poll_count < (JACK_UNPLUG_TIME / BP_POLL_TIME)) { in rt5640_button_press_work()
2219 schedule_delayed_work(&rt5640->bp_work, in rt5640_button_press_work()
2224 if (rt5640->pressed && !rt5640->press_reported) { in rt5640_button_press_work()
2226 snd_soc_jack_report(rt5640->jack, SND_JACK_BTN_0, in rt5640_button_press_work()
2228 rt5640->press_reported = true; in rt5640_button_press_work()
2231 if (rt5640->release_count >= BP_THRESHOLD) { in rt5640_button_press_work()
2232 if (rt5640->press_reported) { in rt5640_button_press_work()
2234 snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0); in rt5640_button_press_work()
2241 schedule_delayed_work(&rt5640->bp_work, msecs_to_jiffies(BP_POLL_TIME)); in rt5640_button_press_work()
2291 struct rt5640_priv *rt5640 = in rt5640_jack_work() local
2293 struct snd_soc_component *component = rt5640->component; in rt5640_jack_work()
2298 if (rt5640->jack->status & SND_JACK_HEADPHONE) { in rt5640_jack_work()
2299 if (rt5640->jack->status & SND_JACK_MICROPHONE) { in rt5640_jack_work()
2300 cancel_delayed_work_sync(&rt5640->bp_work); in rt5640_jack_work()
2304 snd_soc_jack_report(rt5640->jack, 0, in rt5640_jack_work()
2308 } else if (!(rt5640->jack->status & SND_JACK_HEADPHONE)) { in rt5640_jack_work()
2310 WARN_ON(rt5640->ovcd_irq_enabled); in rt5640_jack_work()
2321 snd_soc_jack_report(rt5640->jack, status, SND_JACK_HEADSET); in rt5640_jack_work()
2322 } else if (rt5640->ovcd_irq_enabled && rt5640_micbias1_ovcd(component)) { in rt5640_jack_work()
2343 queue_work(system_long_wq, &rt5640->jack_work); in rt5640_jack_work()
2349 struct rt5640_priv *rt5640 = data; in rt5640_irq() local
2351 if (rt5640->jack) in rt5640_irq()
2352 queue_work(system_long_wq, &rt5640->jack_work); in rt5640_irq()
2359 struct rt5640_priv *rt5640 = data; in rt5640_cancel_work() local
2361 cancel_work_sync(&rt5640->jack_work); in rt5640_cancel_work()
2362 cancel_delayed_work_sync(&rt5640->bp_work); in rt5640_cancel_work()
2368 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_enable_jack_detect() local
2372 RT5640_JD_MASK, rt5640->jd_src); in rt5640_enable_jack_detect()
2389 0xa800 | rt5640->ovcd_sf); in rt5640_enable_jack_detect()
2393 rt5640->ovcd_th | RT5640_MIC1_OVCD_EN); in rt5640_enable_jack_detect()
2413 if (rt5640->jd_inverted) in rt5640_enable_jack_detect()
2420 rt5640->jack = jack; in rt5640_enable_jack_detect()
2421 if (rt5640->jack->status & SND_JACK_MICROPHONE) { in rt5640_enable_jack_detect()
2426 enable_irq(rt5640->irq); in rt5640_enable_jack_detect()
2428 queue_work(system_long_wq, &rt5640->jack_work); in rt5640_enable_jack_detect()
2433 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_disable_jack_detect() local
2436 * soc_remove_component() force-disables jack and thus rt5640->jack in rt5640_disable_jack_detect()
2439 if (!rt5640->jack) in rt5640_disable_jack_detect()
2442 disable_irq(rt5640->irq); in rt5640_disable_jack_detect()
2443 rt5640_cancel_work(rt5640); in rt5640_disable_jack_detect()
2445 if (rt5640->jack->status & SND_JACK_MICROPHONE) { in rt5640_disable_jack_detect()
2448 snd_soc_jack_report(rt5640->jack, 0, SND_JACK_BTN_0); in rt5640_disable_jack_detect()
2451 rt5640->jack = NULL; in rt5640_disable_jack_detect()
2468 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_probe() local
2475 rt5640->mclk = devm_clk_get(component->dev, "mclk"); in rt5640_probe()
2476 if (PTR_ERR(rt5640->mclk) == -EPROBE_DEFER) in rt5640_probe()
2479 rt5640->component = component; in rt5640_probe()
2510 "The driver is for RT5639 RT5640 or RT5642 only\n"); in rt5640_probe()
2551 rt5640->jd_src = val << RT5640_JD_SFT; in rt5640_probe()
2558 rt5640->jd_inverted = true; in rt5640_probe()
2565 rt5640->ovcd_th = RT5640_MIC1_OVTH_2000UA; in rt5640_probe()
2566 rt5640->ovcd_sf = RT5640_MIC_OVCD_SF_0P75; in rt5640_probe()
2572 rt5640->ovcd_th = RT5640_MIC1_OVTH_600UA; in rt5640_probe()
2575 rt5640->ovcd_th = RT5640_MIC1_OVTH_1500UA; in rt5640_probe()
2578 rt5640->ovcd_th = RT5640_MIC1_OVTH_2000UA; in rt5640_probe()
2589 rt5640->ovcd_sf = val << RT5640_MIC_OVCD_SF_SFT; in rt5640_probe()
2606 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_suspend() local
2610 regcache_cache_only(rt5640->regmap, true); in rt5640_suspend()
2611 regcache_mark_dirty(rt5640->regmap); in rt5640_suspend()
2612 if (gpio_is_valid(rt5640->ldo1_en)) in rt5640_suspend()
2613 gpio_set_value_cansleep(rt5640->ldo1_en, 0); in rt5640_suspend()
2620 struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component); in rt5640_resume() local
2622 if (gpio_is_valid(rt5640->ldo1_en)) { in rt5640_resume()
2623 gpio_set_value_cansleep(rt5640->ldo1_en, 1); in rt5640_resume()
2627 regcache_cache_only(rt5640->regmap, false); in rt5640_resume()
2628 regcache_sync(rt5640->regmap); in rt5640_resume()
2650 .name = "rt5640-aif1",
2669 .name = "rt5640-aif2",
2727 { "rt5640", 0 },
2737 { .compatible = "realtek,rt5640", },
2755 static int rt5640_parse_dt(struct rt5640_priv *rt5640, struct device_node *np) in rt5640_parse_dt() argument
2757 rt5640->ldo1_en = of_get_named_gpio(np, "realtek,ldo1-en-gpios", 0); in rt5640_parse_dt()
2764 if (!gpio_is_valid(rt5640->ldo1_en) && in rt5640_parse_dt()
2765 (rt5640->ldo1_en != -ENOENT)) in rt5640_parse_dt()
2766 return rt5640->ldo1_en; in rt5640_parse_dt()
2774 struct rt5640_priv *rt5640; in rt5640_i2c_probe() local
2778 rt5640 = devm_kzalloc(&i2c->dev, in rt5640_i2c_probe()
2781 if (NULL == rt5640) in rt5640_i2c_probe()
2783 i2c_set_clientdata(i2c, rt5640); in rt5640_i2c_probe()
2786 ret = rt5640_parse_dt(rt5640, i2c->dev.of_node); in rt5640_i2c_probe()
2790 rt5640->ldo1_en = -EINVAL; in rt5640_i2c_probe()
2792 rt5640->regmap = devm_regmap_init_i2c(i2c, &rt5640_regmap); in rt5640_i2c_probe()
2793 if (IS_ERR(rt5640->regmap)) { in rt5640_i2c_probe()
2794 ret = PTR_ERR(rt5640->regmap); in rt5640_i2c_probe()
2800 if (gpio_is_valid(rt5640->ldo1_en)) { in rt5640_i2c_probe()
2801 ret = devm_gpio_request_one(&i2c->dev, rt5640->ldo1_en, in rt5640_i2c_probe()
2803 "RT5640 LDO1_EN"); in rt5640_i2c_probe()
2806 rt5640->ldo1_en, ret); in rt5640_i2c_probe()
2812 regmap_read(rt5640->regmap, RT5640_VENDOR_ID2, &val); in rt5640_i2c_probe()
2815 "Device with ID register %#x is not rt5640/39\n", val); in rt5640_i2c_probe()
2819 regmap_write(rt5640->regmap, RT5640_RESET, 0); in rt5640_i2c_probe()
2821 ret = regmap_register_patch(rt5640->regmap, init_list, in rt5640_i2c_probe()
2826 regmap_update_bits(rt5640->regmap, RT5640_DUMMY1, in rt5640_i2c_probe()
2829 rt5640->hp_mute = true; in rt5640_i2c_probe()
2830 rt5640->irq = i2c->irq; in rt5640_i2c_probe()
2831 INIT_DELAYED_WORK(&rt5640->bp_work, rt5640_button_press_work); in rt5640_i2c_probe()
2832 INIT_WORK(&rt5640->jack_work, rt5640_jack_work); in rt5640_i2c_probe()
2835 ret = devm_add_action_or_reset(&i2c->dev, rt5640_cancel_work, rt5640); in rt5640_i2c_probe()
2839 ret = devm_request_irq(&i2c->dev, rt5640->irq, rt5640_irq, in rt5640_i2c_probe()
2841 | IRQF_ONESHOT, "rt5640", rt5640); in rt5640_i2c_probe()
2844 disable_irq(rt5640->irq); in rt5640_i2c_probe()
2847 rt5640->irq, ret); in rt5640_i2c_probe()
2848 rt5640->irq = -ENXIO; in rt5640_i2c_probe()
2858 .name = "rt5640",
2867 MODULE_DESCRIPTION("ASoC RT5640/RT5639 driver");