Lines Matching refs:rt5645
3 * rt5645.c -- RT5645 ALSA SoC audio codec driver
32 #include "rt5645.h"
677 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
683 eq_param[i].reg = cpu_to_be16(rt5645->eq_param[i].reg);
684 eq_param[i].val = cpu_to_be16(rt5645->eq_param[i].val);
703 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
709 rt5645->eq_param[i].reg = be16_to_cpu(eq_param[i].reg);
710 rt5645->eq_param[i].val = be16_to_cpu(eq_param[i].val);
715 if (rt5645->eq_param[i].reg == 0)
717 else if (rt5645->eq_param[i].reg != RT5645_EQ_CTRL2)
724 if (!rt5645_validate_hweq(rt5645->eq_param[i].reg) &&
725 rt5645->eq_param[i].reg != 0)
727 else if (rt5645->eq_param[i].reg == 0)
745 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
748 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
753 mod_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work,
850 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
853 rate = rt5645->sysclk / rl6231_get_pre_div(rt5645->regmap,
928 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
932 if (rt5645_validate_hweq(rt5645->eq_param[i].reg))
933 regmap_write(rt5645->regmap, rt5645->eq_param[i].reg,
934 rt5645->eq_param[i].val);
1648 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
1652 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
1657 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1662 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1665 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1669 rt5645->hp_on = true;
1675 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1697 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1699 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1707 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
1708 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1711 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1741 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
1747 if (rt5645->codec_type == CODEC_TYPE_RT5645) {
1754 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1774 if (rt5645->codec_type == CODEC_TYPE_RT5645) {
1781 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1893 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
1897 if (rt5645->hp_on) {
1899 rt5645->hp_on = false;
2736 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2740 rt5645->lrck[dai->id] = params_rate(params);
2741 pre_div = rl6231_get_clk_info(rt5645->sysclk, rt5645->lrck[dai->id]);
2752 switch (rt5645->codec_type) {
2762 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms);
2765 rt5645->bclk[dai->id], rt5645->lrck[dai->id]);
2812 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2815 switch (rt5645->codec_type) {
2826 rt5645->master[dai->id] = 1;
2830 rt5645->master[dai->id] = 0;
2883 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2886 if (freq == rt5645->sysclk && clk_id == rt5645->sysclk_src)
2905 rt5645->sysclk = freq;
2906 rt5645->sysclk_src = clk_id;
2917 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2921 if (source == rt5645->pll_src && freq_in == rt5645->pll_in &&
2922 freq_out == rt5645->pll_out)
2928 rt5645->pll_in = 0;
2929 rt5645->pll_out = 0;
2977 rt5645->pll_in = freq_in;
2978 rt5645->pll_out = freq_out;
2979 rt5645->pll_src = source;
2988 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2992 switch (rt5645->codec_type) {
3010 if (rt5645->codec_type == CODEC_TYPE_RT5645)
3053 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3085 if (rt5645->en_button_func)
3087 &rt5645->jack_detect_work,
3094 if (!rt5645->en_button_func)
3141 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3145 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06);
3154 regmap_update_bits(rt5645->regmap, RT5645_PWR_ANLG1,
3157 regmap_update_bits(rt5645->regmap, RT5645_PWR_MIXER,
3159 regmap_update_bits(rt5645->regmap, RT5645_PWR_VOL,
3163 regmap_write(rt5645->regmap, RT5645_JD_CTRL3, 0x00f0);
3164 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
3166 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
3169 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
3173 regmap_read(rt5645->regmap, RT5645_IN1_CTRL3, &val);
3178 rt5645->jack_type = SND_JACK_HEADSET;
3179 if (rt5645->en_button_func) {
3183 if (rt5645->en_button_func)
3187 rt5645->jack_type = SND_JACK_HEADPHONE;
3189 if (rt5645->pdata.level_trigger_irq)
3190 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3193 rt5645->jack_type = 0;
3195 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL,
3198 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
3200 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
3203 if (rt5645->en_button_func)
3206 if (rt5645->pdata.jd_mode == 0)
3210 if (rt5645->pdata.level_trigger_irq)
3211 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3215 return rt5645->jack_type;
3236 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3238 rt5645->hp_jack = hp_jack;
3239 rt5645->mic_jack = mic_jack;
3240 rt5645->btn_jack = btn_jack;
3241 if (rt5645->btn_jack && rt5645->codec_type == CODEC_TYPE_RT5650) {
3242 rt5645->en_button_func = true;
3243 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
3245 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1,
3247 regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1,
3250 rt5645_irq(0, rt5645);
3258 struct rt5645_priv *rt5645 =
3262 if (!rt5645->component)
3265 mutex_lock(&rt5645->jd_mutex);
3267 switch (rt5645->pdata.jd_mode) {
3268 case 0: /* Not using rt5645 JD */
3269 if (rt5645->gpiod_hp_det) {
3270 gpio_state = gpiod_get_value(rt5645->gpiod_hp_det);
3271 dev_dbg(rt5645->component->dev, "gpio_state = %d\n",
3273 report = rt5645_jack_detect(rt5645->component, gpio_state);
3275 snd_soc_jack_report(rt5645->hp_jack,
3277 snd_soc_jack_report(rt5645->mic_jack,
3279 mutex_unlock(&rt5645->jd_mutex);
3282 val = snd_soc_component_read(rt5645->component, RT5645_A_JD_CTRL1) & 0x0020;
3284 default: /* read rt5645 jd1_1 status */
3285 val = snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x1000;
3290 if (!val && (rt5645->jack_type == 0)) { /* jack in */
3291 report = rt5645_jack_detect(rt5645->component, 1);
3292 } else if (!val && rt5645->jack_type == SND_JACK_HEADSET) {
3295 if (snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) {
3298 btn_type = rt5645_button_detect(rt5645->component);
3328 dev_err(rt5645->component->dev,
3335 report = rt5645->jack_type;
3337 mod_timer(&rt5645->btn_check_timer,
3343 snd_soc_component_update_bits(rt5645->component,
3345 rt5645_jack_detect(rt5645->component, 0);
3348 mutex_unlock(&rt5645->jd_mutex);
3350 snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE);
3351 snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE);
3352 if (rt5645->en_button_func)
3353 snd_soc_jack_report(rt5645->btn_jack,
3360 struct rt5645_priv *rt5645 =
3363 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
3369 struct rt5645_priv *rt5645 = data;
3372 &rt5645->jack_detect_work, msecs_to_jiffies(250));
3379 struct rt5645_priv *rt5645 = from_timer(rt5645, t, btn_check_timer);
3382 &rt5645->jack_detect_work, msecs_to_jiffies(5));
3388 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3390 rt5645->component = component;
3392 switch (rt5645->codec_type) {
3400 if (rt5645->v_id < 3) {
3419 if (rt5645->pdata.jd_mode) {
3425 if (rt5645->pdata.long_name)
3426 component->card->long_name = rt5645->pdata.long_name;
3428 rt5645->eq_param = devm_kcalloc(component->dev,
3432 if (!rt5645->eq_param)
3446 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3448 regcache_cache_only(rt5645->regmap, true);
3449 regcache_mark_dirty(rt5645->regmap);
3456 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3458 regcache_cache_only(rt5645->regmap, false);
3459 regcache_sync(rt5645->regmap);
3482 .name = "rt5645-aif1",
3501 .name = "rt5645-aif2",
3583 { "rt5645", 0 },
3591 { .compatible = "realtek,rt5645", },
3626 .long_name = "gpd-win-pocket-rt5645",
3807 static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev)
3809 rt5645->pdata.in2_diff = device_property_read_bool(dev,
3812 "realtek,dmic1-data-pin", &rt5645->pdata.dmic1_data_pin);
3814 "realtek,dmic2-data-pin", &rt5645->pdata.dmic2_data_pin);
3816 "realtek,jd-mode", &rt5645->pdata.jd_mode);
3826 struct rt5645_priv *rt5645;
3831 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv),
3833 if (rt5645 == NULL)
3836 rt5645->i2c = i2c;
3837 i2c_set_clientdata(i2c, rt5645);
3846 rt5645->pdata = *pdata;
3848 rt5645_parse_dt(rt5645, &i2c->dev);
3850 rt5645->pdata = jd_mode3_platform_data;
3853 rt5645->pdata.in2_diff = QUIRK_IN2_DIFF(quirk);
3854 rt5645->pdata.level_trigger_irq = QUIRK_LEVEL_IRQ(quirk);
3855 rt5645->pdata.inv_jd1_1 = QUIRK_INV_JD1_1(quirk);
3856 rt5645->pdata.jd_mode = QUIRK_JD_MODE(quirk);
3857 rt5645->pdata.dmic1_data_pin = QUIRK_DMIC1_DATA_PIN(quirk);
3858 rt5645->pdata.dmic2_data_pin = QUIRK_DMIC2_DATA_PIN(quirk);
3861 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect",
3864 if (IS_ERR(rt5645->gpiod_hp_det)) {
3866 ret = PTR_ERR(rt5645->gpiod_hp_det);
3875 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++)
3876 rt5645->supplies[i].supply = rt5645_supply_names[i];
3879 ARRAY_SIZE(rt5645->supplies),
3880 rt5645->supplies);
3886 ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies),
3887 rt5645->supplies);
3910 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap);
3911 rt5645->codec_type = CODEC_TYPE_RT5645;
3914 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5650_regmap);
3915 rt5645->codec_type = CODEC_TYPE_RT5650;
3919 "Device with ID register %#x is not rt5645 or rt5650\n",
3925 if (IS_ERR(rt5645->regmap)) {
3926 ret = PTR_ERR(rt5645->regmap);
3932 regmap_write(rt5645->regmap, RT5645_RESET, 0);
3935 rt5645->v_id = val & 0xff;
3937 regmap_write(rt5645->regmap, RT5645_AD_DA_MIXER, 0x8080);
3939 ret = regmap_register_patch(rt5645->regmap, init_list,
3944 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
3945 ret = regmap_register_patch(rt5645->regmap, rt5650_init_list,
3952 regmap_update_bits(rt5645->regmap, RT5645_CLSD_OUT_CTRL, 0xc0, 0xc0);
3954 if (rt5645->pdata.in2_diff)
3955 regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL,
3958 if (rt5645->pdata.dmic1_data_pin || rt5645->pdata.dmic2_data_pin) {
3959 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
3962 switch (rt5645->pdata.dmic1_data_pin) {
3964 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
3969 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
3971 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
3973 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
3978 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
3980 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
3989 switch (rt5645->pdata.dmic2_data_pin) {
3991 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
3996 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
3998 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4003 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4005 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4011 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4013 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4022 if (rt5645->pdata.jd_mode) {
4023 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
4026 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
4028 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
4030 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
4032 regmap_update_bits(rt5645->regmap, RT5645_HPO_MIXER,
4034 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
4036 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4038 switch (rt5645->pdata.jd_mode) {
4040 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
4045 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
4051 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
4058 if (rt5645->pdata.inv_jd1_1) {
4059 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
4064 regmap_update_bits(rt5645->regmap, RT5645_ADDA_CLK1,
4067 if (rt5645->pdata.level_trigger_irq) {
4068 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
4071 timer_setup(&rt5645->btn_check_timer, rt5645_btn_check_callback, 0);
4073 mutex_init(&rt5645->jd_mutex);
4074 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work);
4075 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work);
4077 if (rt5645->i2c->irq) {
4078 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq,
4080 | IRQF_ONESHOT, "rt5645", rt5645);
4095 if (rt5645->i2c->irq)
4096 free_irq(rt5645->i2c->irq, rt5645);
4098 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
4104 struct rt5645_priv *rt5645 = i2c_get_clientdata(i2c);
4107 free_irq(i2c->irq, rt5645);
4113 del_timer_sync(&rt5645->btn_check_timer);
4115 cancel_delayed_work_sync(&rt5645->jack_detect_work);
4116 cancel_delayed_work_sync(&rt5645->rcclock_work);
4118 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
4125 struct rt5645_priv *rt5645 = i2c_get_clientdata(i2c);
4127 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
4129 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, RT5645_CBJ_MN_JD,
4131 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, RT5645_CBJ_BST1_EN,
4134 regmap_write(rt5645->regmap, RT5645_RESET, 0);
4139 .name = "rt5645",