Skip to content

Commit 0cbce86

Browse files
charleskeepaxvinodkoul
authored andcommitted
ASoC: cs42l43: Remove unnecessary work functions
Now the SoundWire IRQ lock has been changed in the core, it is no longer necessary to use a bunch of work functions to dodge mutex inversions. Signed-off-by: Charles Keepax <[email protected]> Acked-by: Mark Brown <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Vinod Koul <[email protected]>
1 parent ccb7bb1 commit 0cbce86

File tree

3 files changed

+23
-52
lines changed

3 files changed

+23
-52
lines changed

sound/soc/codecs/cs42l43-jack.c

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -362,22 +362,23 @@ static void cs42l43_stop_button_detect(struct cs42l43_codec *priv)
362362
priv->button_detect_running = false;
363363
}
364364

365+
#define CS42L43_BUTTON_COMB_US 11000
365366
#define CS42L43_BUTTON_COMB_MAX 512
366367
#define CS42L43_BUTTON_ROUT 2210
367368

368-
void cs42l43_button_press_work(struct work_struct *work)
369+
irqreturn_t cs42l43_button_press(int irq, void *data)
369370
{
370-
struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
371-
button_press_work.work);
371+
struct cs42l43_codec *priv = data;
372372
struct cs42l43 *cs42l43 = priv->core;
373+
irqreturn_t iret = IRQ_NONE;
373374
unsigned int buttons = 0;
374375
unsigned int val = 0;
375376
int i, ret;
376377

377378
ret = pm_runtime_resume_and_get(priv->dev);
378379
if (ret) {
379380
dev_err(priv->dev, "Failed to resume for button press: %d\n", ret);
380-
return;
381+
return iret;
381382
}
382383

383384
mutex_lock(&priv->jack_lock);
@@ -387,6 +388,9 @@ void cs42l43_button_press_work(struct work_struct *work)
387388
goto error;
388389
}
389390

391+
// Wait for 2 full cycles of comb filter to ensure good reading
392+
usleep_range(2 * CS42L43_BUTTON_COMB_US, 2 * CS42L43_BUTTON_COMB_US + 50);
393+
390394
regmap_read(cs42l43->regmap, CS42L43_DETECT_STATUS_1, &val);
391395

392396
/* Bail if jack removed, the button is irrelevant and likely invalid */
@@ -420,34 +424,27 @@ void cs42l43_button_press_work(struct work_struct *work)
420424

421425
snd_soc_jack_report(priv->jack_hp, buttons, CS42L43_JACK_BUTTONS);
422426

427+
iret = IRQ_HANDLED;
428+
423429
error:
424430
mutex_unlock(&priv->jack_lock);
425431

426432
pm_runtime_mark_last_busy(priv->dev);
427433
pm_runtime_put_autosuspend(priv->dev);
428-
}
429-
430-
irqreturn_t cs42l43_button_press(int irq, void *data)
431-
{
432-
struct cs42l43_codec *priv = data;
433-
434-
// Wait for 2 full cycles of comb filter to ensure good reading
435-
queue_delayed_work(system_wq, &priv->button_press_work,
436-
msecs_to_jiffies(20));
437434

438-
return IRQ_HANDLED;
435+
return iret;
439436
}
440437

441-
void cs42l43_button_release_work(struct work_struct *work)
438+
irqreturn_t cs42l43_button_release(int irq, void *data)
442439
{
443-
struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
444-
button_release_work);
440+
struct cs42l43_codec *priv = data;
441+
irqreturn_t iret = IRQ_NONE;
445442
int ret;
446443

447444
ret = pm_runtime_resume_and_get(priv->dev);
448445
if (ret) {
449446
dev_err(priv->dev, "Failed to resume for button release: %d\n", ret);
450-
return;
447+
return iret;
451448
}
452449

453450
mutex_lock(&priv->jack_lock);
@@ -456,6 +453,8 @@ void cs42l43_button_release_work(struct work_struct *work)
456453
dev_dbg(priv->dev, "Button release IRQ\n");
457454

458455
snd_soc_jack_report(priv->jack_hp, 0, CS42L43_JACK_BUTTONS);
456+
457+
iret = IRQ_HANDLED;
459458
} else {
460459
dev_dbg(priv->dev, "Spurious button release IRQ\n");
461460
}
@@ -464,15 +463,8 @@ void cs42l43_button_release_work(struct work_struct *work)
464463

465464
pm_runtime_mark_last_busy(priv->dev);
466465
pm_runtime_put_autosuspend(priv->dev);
467-
}
468466

469-
irqreturn_t cs42l43_button_release(int irq, void *data)
470-
{
471-
struct cs42l43_codec *priv = data;
472-
473-
queue_work(system_wq, &priv->button_release_work);
474-
475-
return IRQ_HANDLED;
467+
return iret;
476468
}
477469

478470
void cs42l43_bias_sense_timeout(struct work_struct *work)
@@ -787,8 +779,6 @@ irqreturn_t cs42l43_tip_sense(int irq, void *data)
787779

788780
cancel_delayed_work(&priv->bias_sense_timeout);
789781
cancel_delayed_work(&priv->tip_sense_work);
790-
cancel_delayed_work(&priv->button_press_work);
791-
cancel_work(&priv->button_release_work);
792782

793783
// Ensure delay after suspend is long enough to avoid false detection
794784
if (priv->suspend_jack_debounce)

sound/soc/codecs/cs42l43.c

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,14 @@ static void cs42l43_hp_ilimit_clear_work(struct work_struct *work)
167167
snd_soc_dapm_mutex_unlock(dapm);
168168
}
169169

170-
static void cs42l43_hp_ilimit_work(struct work_struct *work)
170+
static irqreturn_t cs42l43_hp_ilimit(int irq, void *data)
171171
{
172-
struct cs42l43_codec *priv = container_of(work, struct cs42l43_codec,
173-
hp_ilimit_work);
172+
struct cs42l43_codec *priv = data;
174173
struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(priv->component);
175174
struct cs42l43 *cs42l43 = priv->core;
176175

176+
dev_dbg(priv->dev, "headphone ilimit IRQ\n");
177+
177178
snd_soc_dapm_mutex_lock(dapm);
178179

179180
if (priv->hp_ilimit_count < CS42L43_HP_ILIMIT_MAX_COUNT) {
@@ -183,7 +184,7 @@ static void cs42l43_hp_ilimit_work(struct work_struct *work)
183184

184185
priv->hp_ilimit_count++;
185186
snd_soc_dapm_mutex_unlock(dapm);
186-
return;
187+
return IRQ_HANDLED;
187188
}
188189

189190
dev_err(priv->dev, "Disabling headphone for %dmS, due to frequent current limit\n",
@@ -218,15 +219,6 @@ static void cs42l43_hp_ilimit_work(struct work_struct *work)
218219
priv->hp_ilimited = false;
219220

220221
snd_soc_dapm_mutex_unlock(dapm);
221-
}
222-
223-
static irqreturn_t cs42l43_hp_ilimit(int irq, void *data)
224-
{
225-
struct cs42l43_codec *priv = data;
226-
227-
dev_dbg(priv->dev, "headphone ilimit IRQ\n");
228-
229-
queue_work(system_long_wq, &priv->hp_ilimit_work);
230222

231223
return IRQ_HANDLED;
232224
}
@@ -2159,10 +2151,7 @@ static void cs42l43_component_remove(struct snd_soc_component *component)
21592151

21602152
cancel_delayed_work_sync(&priv->bias_sense_timeout);
21612153
cancel_delayed_work_sync(&priv->tip_sense_work);
2162-
cancel_delayed_work_sync(&priv->button_press_work);
2163-
cancel_work_sync(&priv->button_release_work);
21642154

2165-
cancel_work_sync(&priv->hp_ilimit_work);
21662155
cancel_delayed_work_sync(&priv->hp_ilimit_clear_work);
21672156

21682157
priv->component = NULL;
@@ -2314,10 +2303,7 @@ static int cs42l43_codec_probe(struct platform_device *pdev)
23142303

23152304
INIT_DELAYED_WORK(&priv->tip_sense_work, cs42l43_tip_sense_work);
23162305
INIT_DELAYED_WORK(&priv->bias_sense_timeout, cs42l43_bias_sense_timeout);
2317-
INIT_DELAYED_WORK(&priv->button_press_work, cs42l43_button_press_work);
23182306
INIT_DELAYED_WORK(&priv->hp_ilimit_clear_work, cs42l43_hp_ilimit_clear_work);
2319-
INIT_WORK(&priv->button_release_work, cs42l43_button_release_work);
2320-
INIT_WORK(&priv->hp_ilimit_work, cs42l43_hp_ilimit_work);
23212307

23222308
pm_runtime_set_autosuspend_delay(priv->dev, 100);
23232309
pm_runtime_use_autosuspend(priv->dev);

sound/soc/codecs/cs42l43.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,6 @@ struct cs42l43_codec {
8888

8989
struct delayed_work tip_sense_work;
9090
struct delayed_work bias_sense_timeout;
91-
struct delayed_work button_press_work;
92-
struct work_struct button_release_work;
9391
struct completion type_detect;
9492
struct completion load_detect;
9593

@@ -99,7 +97,6 @@ struct cs42l43_codec {
9997
int jack_override;
10098
bool suspend_jack_debounce;
10199

102-
struct work_struct hp_ilimit_work;
103100
struct delayed_work hp_ilimit_clear_work;
104101
bool hp_ilimited;
105102
int hp_ilimit_count;
@@ -134,8 +131,6 @@ int cs42l43_set_jack(struct snd_soc_component *component,
134131
struct snd_soc_jack *jack, void *d);
135132
void cs42l43_bias_sense_timeout(struct work_struct *work);
136133
void cs42l43_tip_sense_work(struct work_struct *work);
137-
void cs42l43_button_press_work(struct work_struct *work);
138-
void cs42l43_button_release_work(struct work_struct *work);
139134
irqreturn_t cs42l43_bias_detect_clamp(int irq, void *data);
140135
irqreturn_t cs42l43_button_press(int irq, void *data);
141136
irqreturn_t cs42l43_button_release(int irq, void *data);

0 commit comments

Comments
 (0)