Commit 2cd9b0ef authored by Derek Fang's avatar Derek Fang Committed by Mark Brown

ASoC: rt5682: Re-detect the combo jack after resuming

Sometimes, end-users change the jack type under suspending,
so it needs to re-detect the combo jack type after resuming to
avoid any unexpected behaviors.
Signed-off-by: default avatarDerek Fang <derek.fang@realtek.com>
Link: https://lore.kernel.org/r/20211109095450.12950-2-derek.fang@realtek.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent a3774a2a
...@@ -198,6 +198,7 @@ static int rt5682_i2c_probe(struct i2c_client *i2c, ...@@ -198,6 +198,7 @@ static int rt5682_i2c_probe(struct i2c_client *i2c,
} }
mutex_init(&rt5682->calibrate_mutex); mutex_init(&rt5682->calibrate_mutex);
mutex_init(&rt5682->jdet_mutex);
rt5682_calibrate(rt5682); rt5682_calibrate(rt5682);
rt5682_apply_patch_list(rt5682, &i2c->dev); rt5682_apply_patch_list(rt5682, &i2c->dev);
......
...@@ -49,6 +49,7 @@ static const struct reg_sequence patch_list[] = { ...@@ -49,6 +49,7 @@ static const struct reg_sequence patch_list[] = {
{RT5682_CHARGE_PUMP_1, 0x0210}, {RT5682_CHARGE_PUMP_1, 0x0210},
{RT5682_HP_LOGIC_CTRL_2, 0x0007}, {RT5682_HP_LOGIC_CTRL_2, 0x0007},
{RT5682_SAR_IL_CMD_2, 0xac00}, {RT5682_SAR_IL_CMD_2, 0xac00},
{RT5682_CBJ_CTRL_7, 0x0104},
}; };
void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev) void rt5682_apply_patch_list(struct rt5682_priv *rt5682, struct device *dev)
...@@ -941,6 +942,10 @@ int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert) ...@@ -941,6 +942,10 @@ int rt5682_headset_detect(struct snd_soc_component *component, int jack_insert)
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
RT5682_HP_CHARGE_PUMP_1, RT5682_HP_CHARGE_PUMP_1,
RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0); RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
rt5682_enable_push_button_irq(component, false);
snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_LOW);
usleep_range(55000, 60000);
snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH); RT5682_TRIG_JD_MASK, RT5682_TRIG_JD_HIGH);
...@@ -1093,6 +1098,7 @@ void rt5682_jack_detect_handler(struct work_struct *work) ...@@ -1093,6 +1098,7 @@ void rt5682_jack_detect_handler(struct work_struct *work)
while (!rt5682->component->card->instantiated) while (!rt5682->component->card->instantiated)
usleep_range(10000, 15000); usleep_range(10000, 15000);
mutex_lock(&rt5682->jdet_mutex);
mutex_lock(&rt5682->calibrate_mutex); mutex_lock(&rt5682->calibrate_mutex);
val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL) val = snd_soc_component_read(rt5682->component, RT5682_AJD1_CTRL)
...@@ -1166,6 +1172,7 @@ void rt5682_jack_detect_handler(struct work_struct *work) ...@@ -1166,6 +1172,7 @@ void rt5682_jack_detect_handler(struct work_struct *work)
} }
mutex_unlock(&rt5682->calibrate_mutex); mutex_unlock(&rt5682->calibrate_mutex);
mutex_unlock(&rt5682->jdet_mutex);
} }
EXPORT_SYMBOL_GPL(rt5682_jack_detect_handler); EXPORT_SYMBOL_GPL(rt5682_jack_detect_handler);
...@@ -1515,6 +1522,7 @@ static int rt5682_hp_event(struct snd_soc_dapm_widget *w, ...@@ -1515,6 +1522,7 @@ static int rt5682_hp_event(struct snd_soc_dapm_widget *w,
{ {
struct snd_soc_component *component = struct snd_soc_component *component =
snd_soc_dapm_to_component(w->dapm); snd_soc_dapm_to_component(w->dapm);
struct rt5682_priv *rt5682 = snd_soc_component_get_drvdata(component);
switch (event) { switch (event) {
case SND_SOC_DAPM_PRE_PMU: case SND_SOC_DAPM_PRE_PMU:
...@@ -1526,12 +1534,17 @@ static int rt5682_hp_event(struct snd_soc_dapm_widget *w, ...@@ -1526,12 +1534,17 @@ static int rt5682_hp_event(struct snd_soc_dapm_widget *w,
RT5682_DEPOP_1, 0x60, 0x60); RT5682_DEPOP_1, 0x60, 0x60);
snd_soc_component_update_bits(component, snd_soc_component_update_bits(component,
RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080); RT5682_DAC_ADC_DIG_VOL1, 0x00c0, 0x0080);
mutex_lock(&rt5682->jdet_mutex);
snd_soc_component_update_bits(component, RT5682_HP_CTRL_2, snd_soc_component_update_bits(component, RT5682_HP_CTRL_2,
RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN, RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN,
RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN); RT5682_HP_C2_DAC_L_EN | RT5682_HP_C2_DAC_R_EN);
usleep_range(5000, 10000); usleep_range(5000, 10000);
snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1, snd_soc_component_update_bits(component, RT5682_CHARGE_PUMP_1,
RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_L); RT5682_CP_SW_SIZE_MASK, RT5682_CP_SW_SIZE_L);
mutex_unlock(&rt5682->jdet_mutex);
break; break;
case SND_SOC_DAPM_POST_PMD: case SND_SOC_DAPM_POST_PMD:
...@@ -2943,7 +2956,7 @@ static int rt5682_suspend(struct snd_soc_component *component) ...@@ -2943,7 +2956,7 @@ static int rt5682_suspend(struct snd_soc_component *component)
cancel_delayed_work_sync(&rt5682->jack_detect_work); cancel_delayed_work_sync(&rt5682->jack_detect_work);
cancel_delayed_work_sync(&rt5682->jd_check_work); cancel_delayed_work_sync(&rt5682->jd_check_work);
if (rt5682->hs_jack && rt5682->jack_type == SND_JACK_HEADSET) { if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {
val = snd_soc_component_read(component, val = snd_soc_component_read(component,
RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK; RT5682_CBJ_CTRL_2) & RT5682_JACK_TYPE_MASK;
...@@ -2974,6 +2987,8 @@ static int rt5682_suspend(struct snd_soc_component *component) ...@@ -2974,6 +2987,8 @@ static int rt5682_suspend(struct snd_soc_component *component)
snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK, RT5682_SAR_BUTT_DET_MASK | RT5682_SAR_BUTDET_MODE_MASK,
RT5682_SAR_BUTT_DET_EN | RT5682_SAR_BUTDET_POW_SAV); RT5682_SAR_BUTT_DET_EN | RT5682_SAR_BUTDET_POW_SAV);
snd_soc_component_update_bits(component, RT5682_HP_CHARGE_PUMP_1,
RT5682_OSW_L_MASK | RT5682_OSW_R_MASK, 0);
} }
regcache_cache_only(rt5682->regmap, true); regcache_cache_only(rt5682->regmap, true);
...@@ -2991,10 +3006,11 @@ static int rt5682_resume(struct snd_soc_component *component) ...@@ -2991,10 +3006,11 @@ static int rt5682_resume(struct snd_soc_component *component)
regcache_cache_only(rt5682->regmap, false); regcache_cache_only(rt5682->regmap, false);
regcache_sync(rt5682->regmap); regcache_sync(rt5682->regmap);
if (rt5682->hs_jack && rt5682->jack_type == SND_JACK_HEADSET) { if (rt5682->hs_jack && (rt5682->jack_type & SND_JACK_HEADSET) == SND_JACK_HEADSET) {
snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1, snd_soc_component_update_bits(component, RT5682_SAR_IL_CMD_1,
RT5682_SAR_BUTDET_MODE_MASK | RT5682_SAR_SEL_MB1_MB2_MASK, RT5682_SAR_BUTDET_MODE_MASK | RT5682_SAR_SEL_MB1_MB2_MASK,
RT5682_SAR_BUTDET_POW_NORM | RT5682_SAR_SEL_MB1_MB2_AUTO); RT5682_SAR_BUTDET_POW_NORM | RT5682_SAR_SEL_MB1_MB2_AUTO);
usleep_range(5000, 6000);
snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1, snd_soc_component_update_bits(component, RT5682_CBJ_CTRL_1,
RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK, RT5682_MB1_PATH_MASK | RT5682_MB2_PATH_MASK,
RT5682_CTRL_MB1_FSM | RT5682_CTRL_MB2_FSM); RT5682_CTRL_MB1_FSM | RT5682_CTRL_MB2_FSM);
...@@ -3002,8 +3018,9 @@ static int rt5682_resume(struct snd_soc_component *component) ...@@ -3002,8 +3018,9 @@ static int rt5682_resume(struct snd_soc_component *component)
RT5682_PWR_CBJ, RT5682_PWR_CBJ); RT5682_PWR_CBJ, RT5682_PWR_CBJ);
} }
rt5682->jack_type = 0;
mod_delayed_work(system_power_efficient_wq, mod_delayed_work(system_power_efficient_wq,
&rt5682->jack_detect_work, msecs_to_jiffies(250)); &rt5682->jack_detect_work, msecs_to_jiffies(0));
return 0; return 0;
} }
......
...@@ -1463,6 +1463,7 @@ struct rt5682_priv { ...@@ -1463,6 +1463,7 @@ struct rt5682_priv {
int jack_type; int jack_type;
int irq_work_delay_time; int irq_work_delay_time;
struct mutex jdet_mutex;
}; };
extern const char *rt5682_supply_names[RT5682_NUM_SUPPLIES]; extern const char *rt5682_supply_names[RT5682_NUM_SUPPLIES];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment