Lines Matching refs:rt5645

3  * rt5645.c  --  RT5645 ALSA SoC audio codec driver
31 #include "rt5645.h"
703 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
709 eq_param[i].reg = cpu_to_be16(rt5645->eq_param[i].reg);
710 eq_param[i].val = cpu_to_be16(rt5645->eq_param[i].val);
729 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
735 rt5645->eq_param[i].reg = be16_to_cpu(eq_param[i].reg);
736 rt5645->eq_param[i].val = be16_to_cpu(eq_param[i].val);
741 if (rt5645->eq_param[i].reg == 0)
743 else if (rt5645->eq_param[i].reg != RT5645_EQ_CTRL2)
750 if (!rt5645_validate_hweq(rt5645->eq_param[i].reg) &&
751 rt5645->eq_param[i].reg != 0)
753 else if (rt5645->eq_param[i].reg == 0)
771 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
774 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
779 mod_delayed_work(system_power_efficient_wq, &rt5645->rcclock_work,
876 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
879 rate = rt5645->sysclk / rl6231_get_pre_div(rt5645->regmap,
954 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
958 if (rt5645_validate_hweq(rt5645->eq_param[i].reg))
959 regmap_write(rt5645->regmap, rt5645->eq_param[i].reg,
960 rt5645->eq_param[i].val);
1674 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
1679 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
1684 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1688 regmap_read(rt5645->regmap, RT5645_PR_BASE +
1695 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1698 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1710 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1732 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1734 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1742 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
1743 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1746 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1777 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
1783 if (rt5645->codec_type == CODEC_TYPE_RT5645) {
1790 regmap_write(rt5645->regmap, RT5645_PR_BASE +
1810 if (rt5645->codec_type == CODEC_TYPE_RT5645) {
1817 regmap_write(rt5645->regmap, RT5645_PR_BASE +
2750 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2754 rt5645->lrck[dai->id] = params_rate(params);
2755 pre_div = rl6231_get_clk_info(rt5645->sysclk, rt5645->lrck[dai->id]);
2766 switch (rt5645->codec_type) {
2776 rt5645->bclk[dai->id] = rt5645->lrck[dai->id] * (32 << bclk_ms);
2779 rt5645->bclk[dai->id], rt5645->lrck[dai->id]);
2826 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2829 switch (rt5645->codec_type) {
2840 rt5645->master[dai->id] = 1;
2844 rt5645->master[dai->id] = 0;
2897 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2900 if (freq == rt5645->sysclk && clk_id == rt5645->sysclk_src)
2919 rt5645->sysclk = freq;
2920 rt5645->sysclk_src = clk_id;
2931 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
2935 if (source == rt5645->pll_src && freq_in == rt5645->pll_in &&
2936 freq_out == rt5645->pll_out)
2942 rt5645->pll_in = 0;
2943 rt5645->pll_out = 0;
2991 rt5645->pll_in = freq_in;
2992 rt5645->pll_out = freq_out;
2993 rt5645->pll_src = source;
3002 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3006 switch (rt5645->codec_type) {
3024 if (rt5645->codec_type == CODEC_TYPE_RT5645)
3067 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3099 if (rt5645->en_button_func)
3101 &rt5645->jack_detect_work,
3108 if (!rt5645->en_button_func)
3155 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3159 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0206);
3168 regmap_update_bits(rt5645->regmap, RT5645_PWR_ANLG1,
3171 regmap_update_bits(rt5645->regmap, RT5645_PWR_MIXER,
3173 regmap_update_bits(rt5645->regmap, RT5645_PWR_VOL,
3177 regmap_write(rt5645->regmap, RT5645_JD_CTRL3, 0x00f0);
3178 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
3180 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
3183 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
3187 regmap_read(rt5645->regmap, RT5645_IN1_CTRL3, &val);
3191 if ((val == 1 || val == 2) && !rt5645->pdata.no_headset_mic) {
3192 rt5645->jack_type = SND_JACK_HEADSET;
3193 if (rt5645->en_button_func) {
3197 if (rt5645->en_button_func)
3201 rt5645->jack_type = SND_JACK_HEADPHONE;
3203 if (rt5645->pdata.level_trigger_irq)
3204 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3207 regmap_write(rt5645->regmap, RT5645_CHARGE_PUMP, 0x0e06);
3209 rt5645->jack_type = 0;
3211 regmap_update_bits(rt5645->regmap, RT5645_HP_VOL,
3214 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2,
3216 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1,
3219 if (rt5645->en_button_func)
3222 if (rt5645->pdata.jd_mode == 0)
3226 if (rt5645->pdata.level_trigger_irq)
3227 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
3231 return rt5645->jack_type;
3252 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3254 rt5645->hp_jack = hp_jack;
3255 rt5645->mic_jack = mic_jack;
3256 rt5645->btn_jack = btn_jack;
3257 if (rt5645->btn_jack && rt5645->codec_type == CODEC_TYPE_RT5650) {
3258 rt5645->en_button_func = true;
3259 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
3261 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL1,
3263 regmap_update_bits(rt5645->regmap, RT5645_DEPOP_M1,
3266 rt5645_irq(0, rt5645);
3294 struct rt5645_priv *rt5645 =
3298 if (!rt5645->component)
3301 mutex_lock(&rt5645->jd_mutex);
3303 switch (rt5645->pdata.jd_mode) {
3304 case 0: /* Not using rt5645 JD */
3305 if (rt5645->gpiod_hp_det) {
3306 gpio_state = gpiod_get_value(rt5645->gpiod_hp_det);
3307 if (rt5645->pdata.inv_hp_pol)
3309 dev_dbg(rt5645->component->dev, "gpio_state = %d\n",
3311 report = rt5645_jack_detect(rt5645->component, gpio_state);
3313 snd_soc_jack_report(rt5645->hp_jack,
3315 snd_soc_jack_report(rt5645->mic_jack,
3317 mutex_unlock(&rt5645->jd_mutex);
3320 val = snd_soc_component_read(rt5645->component, RT5645_A_JD_CTRL1) & 0x0020;
3322 default: /* read rt5645 jd1_1 status */
3323 val = snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x1000;
3328 if (!val && (rt5645->jack_type == 0)) { /* jack in */
3329 report = rt5645_jack_detect(rt5645->component, 1);
3330 } else if (!val && rt5645->jack_type == SND_JACK_HEADSET) {
3333 if (snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) {
3336 btn_type = rt5645_button_detect(rt5645->component);
3366 dev_err(rt5645->component->dev,
3373 report = rt5645->jack_type;
3375 mod_timer(&rt5645->btn_check_timer,
3381 snd_soc_component_update_bits(rt5645->component,
3383 rt5645_jack_detect(rt5645->component, 0);
3386 mutex_unlock(&rt5645->jd_mutex);
3388 snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE);
3389 snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE);
3390 if (rt5645->en_button_func)
3391 snd_soc_jack_report(rt5645->btn_jack,
3398 struct rt5645_priv *rt5645 =
3401 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
3407 struct rt5645_priv *rt5645 = data;
3410 &rt5645->jack_detect_work, msecs_to_jiffies(250));
3417 struct rt5645_priv *rt5645 = from_timer(rt5645, t, btn_check_timer);
3420 &rt5645->jack_detect_work, msecs_to_jiffies(5));
3426 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3428 rt5645->component = component;
3430 switch (rt5645->codec_type) {
3438 if (rt5645->v_id < 3) {
3457 if (rt5645->pdata.jd_mode) {
3463 if (rt5645->pdata.long_name)
3464 component->card->long_name = rt5645->pdata.long_name;
3466 rt5645->eq_param = devm_kcalloc(component->dev,
3470 if (!rt5645->eq_param)
3484 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3486 regcache_cache_only(rt5645->regmap, true);
3487 regcache_mark_dirty(rt5645->regmap);
3494 struct rt5645_priv *rt5645 = snd_soc_component_get_drvdata(component);
3496 regcache_cache_only(rt5645->regmap, false);
3497 regcache_sync(rt5645->regmap);
3520 .name = "rt5645-aif1",
3539 .name = "rt5645-aif2",
3621 { "rt5645", 0 },
3629 { .compatible = "realtek,rt5645", },
3664 .long_name = "gpd-win-pocket-rt5645",
3882 static int rt5645_parse_dt(struct rt5645_priv *rt5645, struct device *dev)
3884 rt5645->pdata.in2_diff = device_property_read_bool(dev,
3887 "realtek,dmic1-data-pin", &rt5645->pdata.dmic1_data_pin);
3889 "realtek,dmic2-data-pin", &rt5645->pdata.dmic2_data_pin);
3891 "realtek,jd-mode", &rt5645->pdata.jd_mode);
3900 struct rt5645_priv *rt5645;
3905 rt5645 = devm_kzalloc(&i2c->dev, sizeof(struct rt5645_priv),
3907 if (rt5645 == NULL)
3910 rt5645->i2c = i2c;
3911 i2c_set_clientdata(i2c, rt5645);
3920 rt5645->pdata = *pdata;
3922 rt5645_parse_dt(rt5645, &i2c->dev);
3924 rt5645->pdata = jd_mode3_platform_data;
3927 rt5645->pdata.in2_diff = QUIRK_IN2_DIFF(quirk);
3928 rt5645->pdata.level_trigger_irq = QUIRK_LEVEL_IRQ(quirk);
3929 rt5645->pdata.inv_jd1_1 = QUIRK_INV_JD1_1(quirk);
3930 rt5645->pdata.inv_hp_pol = QUIRK_INV_HP_POL(quirk);
3931 rt5645->pdata.jd_mode = QUIRK_JD_MODE(quirk);
3932 rt5645->pdata.dmic1_data_pin = QUIRK_DMIC1_DATA_PIN(quirk);
3933 rt5645->pdata.dmic2_data_pin = QUIRK_DMIC2_DATA_PIN(quirk);
3944 rt5645->pdata.no_headset_mic = true;
3947 rt5645->gpiod_hp_det = devm_gpiod_get_optional(&i2c->dev, "hp-detect",
3950 if (IS_ERR(rt5645->gpiod_hp_det)) {
3952 ret = PTR_ERR(rt5645->gpiod_hp_det);
3961 for (i = 0; i < ARRAY_SIZE(rt5645->supplies); i++)
3962 rt5645->supplies[i].supply = rt5645_supply_names[i];
3965 ARRAY_SIZE(rt5645->supplies),
3966 rt5645->supplies);
3972 ret = regulator_bulk_enable(ARRAY_SIZE(rt5645->supplies),
3973 rt5645->supplies);
4000 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5645_regmap);
4001 rt5645->codec_type = CODEC_TYPE_RT5645;
4004 rt5645->regmap = devm_regmap_init_i2c(i2c, &rt5650_regmap);
4005 rt5645->codec_type = CODEC_TYPE_RT5650;
4009 "Device with ID register %#x is not rt5645 or rt5650\n",
4015 if (IS_ERR(rt5645->regmap)) {
4016 ret = PTR_ERR(rt5645->regmap);
4022 regmap_write(rt5645->regmap, RT5645_RESET, 0);
4025 rt5645->v_id = val & 0xff;
4027 regmap_write(rt5645->regmap, RT5645_AD_DA_MIXER, 0x8080);
4029 ret = regmap_multi_reg_write(rt5645->regmap, init_list,
4034 if (rt5645->codec_type == CODEC_TYPE_RT5650) {
4035 ret = regmap_multi_reg_write(rt5645->regmap, rt5650_init_list,
4042 regmap_update_bits(rt5645->regmap, RT5645_CLSD_OUT_CTRL, 0xc0, 0xc0);
4044 if (rt5645->pdata.in2_diff)
4045 regmap_update_bits(rt5645->regmap, RT5645_IN2_CTRL,
4048 if (rt5645->pdata.dmic1_data_pin || rt5645->pdata.dmic2_data_pin) {
4049 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4052 switch (rt5645->pdata.dmic1_data_pin) {
4054 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4059 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4061 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4063 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4068 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4070 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4079 switch (rt5645->pdata.dmic2_data_pin) {
4081 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4086 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4088 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4093 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4095 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4101 regmap_update_bits(rt5645->regmap, RT5645_DMIC_CTRL1,
4103 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4112 if (rt5645->pdata.jd_mode) {
4113 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
4116 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
4118 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
4120 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
4122 regmap_update_bits(rt5645->regmap, RT5645_HPO_MIXER,
4124 regmap_update_bits(rt5645->regmap, RT5645_MICBIAS,
4126 regmap_update_bits(rt5645->regmap, RT5645_GPIO_CTRL1,
4128 switch (rt5645->pdata.jd_mode) {
4130 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
4135 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
4141 regmap_update_bits(rt5645->regmap, RT5645_A_JD_CTRL1,
4148 if (rt5645->pdata.inv_jd1_1) {
4149 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
4154 regmap_update_bits(rt5645->regmap, RT5645_ADDA_CLK1,
4157 if (rt5645->pdata.level_trigger_irq) {
4158 regmap_update_bits(rt5645->regmap, RT5645_IRQ_CTRL2,
4161 timer_setup(&rt5645->btn_check_timer, rt5645_btn_check_callback, 0);
4163 mutex_init(&rt5645->jd_mutex);
4164 INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work);
4165 INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work);
4167 if (rt5645->i2c->irq) {
4168 ret = request_threaded_irq(rt5645->i2c->irq, NULL, rt5645_irq,
4170 | IRQF_ONESHOT, "rt5645", rt5645);
4185 if (rt5645->i2c->irq)
4186 free_irq(rt5645->i2c->irq, rt5645);
4188 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
4194 struct rt5645_priv *rt5645 = i2c_get_clientdata(i2c);
4197 free_irq(i2c->irq, rt5645);
4203 del_timer_sync(&rt5645->btn_check_timer);
4205 cancel_delayed_work_sync(&rt5645->jack_detect_work);
4206 cancel_delayed_work_sync(&rt5645->rcclock_work);
4208 regulator_bulk_disable(ARRAY_SIZE(rt5645->supplies), rt5645->supplies);
4213 struct rt5645_priv *rt5645 = i2c_get_clientdata(i2c);
4215 regmap_update_bits(rt5645->regmap, RT5645_GEN_CTRL3,
4217 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL2, RT5645_CBJ_MN_JD,
4219 regmap_update_bits(rt5645->regmap, RT5645_IN1_CTRL1, RT5645_CBJ_BST1_EN,
4222 regmap_write(rt5645->regmap, RT5645_RESET, 0);
4227 struct rt5645_priv *rt5645 = dev_get_drvdata(dev);
4229 del_timer_sync(&rt5645->btn_check_timer);
4230 cancel_delayed_work_sync(&rt5645->jack_detect_work);
4231 cancel_delayed_work_sync(&rt5645->rcclock_work);
4233 regcache_cache_only(rt5645->regmap, true);
4234 regcache_mark_dirty(rt5645->regmap);
4240 struct rt5645_priv *rt5645 = dev_get_drvdata(dev);
4242 regcache_cache_only(rt5645->regmap, false);
4243 regcache_sync(rt5645->regmap);
4245 if (rt5645->hp_jack) {
4246 rt5645->jack_type = 0;
4247 rt5645_jack_detect_work(&rt5645->jack_detect_work.work);
4258 .name = "rt5645",