diff mbox series

ASoC: rt5650: add mutex to avoid the jack detection failure

Message ID 20231122100123.2831753-1-shumingf@realtek.com (mailing list archive)
State Accepted
Commit cdba4301adda7c60a2064bf808e48fccd352aaa9
Headers show
Series ASoC: rt5650: add mutex to avoid the jack detection failure | expand

Commit Message

Shuming [范書銘] Nov. 22, 2023, 10:01 a.m. UTC
From: Shuming Fan <shumingf@realtek.com>

This patch adds the jd_mutex to protect the jack detection control flow.
And only the headset type could check the button status.

Signed-off-by: Shuming Fan <shumingf@realtek.com>
---
 sound/soc/codecs/rt5645.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Comments

Mark Brown Nov. 22, 2023, 11:17 a.m. UTC | #1
On Wed, Nov 22, 2023 at 06:01:23PM +0800, shumingf@realtek.com wrote:

> This patch adds the jd_mutex to protect the jack detection control flow.
> And only the headset type could check the button status.

What's the protection here for - as far as I can see the mutex is only
taken in the jack detection work function which should only ever have
one copy running at once by virtue of being a single work function?
Shuming [范書銘] Nov. 22, 2023, 12:46 p.m. UTC | #2
> > This patch adds the jd_mutex to protect the jack detection control flow.
> > And only the headset type could check the button status.
> 
> What's the protection here for - as far as I can see the mutex is only taken in
> the jack detection work function which should only ever have one copy running
> at once by virtue of being a single work function?

In the rt5645_sys_resume function, the driver calls rt5645_jack_detect_work function directly.
It is possible that the work and rt5645_sys_resume both call rt5645_jack_detect_work function.
Therefore, we need the mutex to protect.
Mark Brown Nov. 23, 2023, 10:36 a.m. UTC | #3
On Wed, 22 Nov 2023 18:01:23 +0800, shumingf@realtek.com wrote:
> This patch adds the jd_mutex to protect the jack detection control flow.
> And only the headset type could check the button status.
> 
> 

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/1] ASoC: rt5650: add mutex to avoid the jack detection failure
      commit: cdba4301adda7c60a2064bf808e48fccd352aaa9

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark
diff mbox series

Patch

diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c
index 7938b52d741d..a0d01d71d8b5 100644
--- a/sound/soc/codecs/rt5645.c
+++ b/sound/soc/codecs/rt5645.c
@@ -448,6 +448,7 @@  struct rt5645_priv {
 	struct regulator_bulk_data supplies[ARRAY_SIZE(rt5645_supply_names)];
 	struct rt5645_eq_param_s *eq_param;
 	struct timer_list btn_check_timer;
+	struct mutex jd_mutex;
 
 	int codec_type;
 	int sysclk;
@@ -3193,6 +3194,8 @@  static int rt5645_jack_detect(struct snd_soc_component *component, int jack_inse
 				rt5645_enable_push_button_irq(component, true);
 			}
 		} else {
+			if (rt5645->en_button_func)
+				rt5645_enable_push_button_irq(component, false);
 			snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
 			snd_soc_dapm_sync(dapm);
 			rt5645->jack_type = SND_JACK_HEADPHONE;
@@ -3295,6 +3298,8 @@  static void rt5645_jack_detect_work(struct work_struct *work)
 	if (!rt5645->component)
 		return;
 
+	mutex_lock(&rt5645->jd_mutex);
+
 	switch (rt5645->pdata.jd_mode) {
 	case 0: /* Not using rt5645 JD */
 		if (rt5645->gpiod_hp_det) {
@@ -3321,7 +3326,7 @@  static void rt5645_jack_detect_work(struct work_struct *work)
 
 	if (!val && (rt5645->jack_type == 0)) { /* jack in */
 		report = rt5645_jack_detect(rt5645->component, 1);
-	} else if (!val && rt5645->jack_type != 0) {
+	} else if (!val && rt5645->jack_type == SND_JACK_HEADSET) {
 		/* for push button and jack out */
 		btn_type = 0;
 		if (snd_soc_component_read(rt5645->component, RT5645_INT_IRQ_ST) & 0x4) {
@@ -3377,6 +3382,8 @@  static void rt5645_jack_detect_work(struct work_struct *work)
 		rt5645_jack_detect(rt5645->component, 0);
 	}
 
+	mutex_unlock(&rt5645->jd_mutex);
+
 	snd_soc_jack_report(rt5645->hp_jack, report, SND_JACK_HEADPHONE);
 	snd_soc_jack_report(rt5645->mic_jack, report, SND_JACK_MICROPHONE);
 	if (rt5645->en_button_func)
@@ -4150,6 +4157,7 @@  static int rt5645_i2c_probe(struct i2c_client *i2c)
 	}
 	timer_setup(&rt5645->btn_check_timer, rt5645_btn_check_callback, 0);
 
+	mutex_init(&rt5645->jd_mutex);
 	INIT_DELAYED_WORK(&rt5645->jack_detect_work, rt5645_jack_detect_work);
 	INIT_DELAYED_WORK(&rt5645->rcclock_work, rt5645_rcclock_work);