@@ -361,22 +361,23 @@ static void cs42l43_stop_button_detect(struct cs42l43_codec *priv)
361361 priv -> button_detect_running = false;
362362}
363363
364+ #define CS42L43_BUTTON_COMB_US 11000
364365#define CS42L43_BUTTON_COMB_MAX 512
365366#define CS42L43_BUTTON_ROUT 2210
366367
367- void cs42l43_button_press_work ( struct work_struct * work )
368+ irqreturn_t cs42l43_button_press ( int irq , void * data )
368369{
369- struct cs42l43_codec * priv = container_of (work , struct cs42l43_codec ,
370- button_press_work .work );
370+ struct cs42l43_codec * priv = data ;
371371 struct cs42l43 * cs42l43 = priv -> core ;
372+ irqreturn_t iret = IRQ_NONE ;
372373 unsigned int buttons = 0 ;
373374 unsigned int val = 0 ;
374375 int i , ret ;
375376
376377 ret = pm_runtime_resume_and_get (priv -> dev );
377378 if (ret ) {
378379 dev_err (priv -> dev , "Failed to resume for button press: %d\n" , ret );
379- return ;
380+ return iret ;
380381 }
381382
382383 mutex_lock (& priv -> jack_lock );
@@ -386,6 +387,9 @@ void cs42l43_button_press_work(struct work_struct *work)
386387 goto error ;
387388 }
388389
390+ // Wait for 2 full cycles of comb filter to ensure good reading
391+ usleep_range (2 * CS42L43_BUTTON_COMB_US , 2 * CS42L43_BUTTON_COMB_US + 50 );
392+
389393 regmap_read (cs42l43 -> regmap , CS42L43_DETECT_STATUS_1 , & val );
390394
391395 /* Bail if jack removed, the button is irrelevant and likely invalid */
@@ -419,33 +423,26 @@ void cs42l43_button_press_work(struct work_struct *work)
419423
420424 snd_soc_jack_report (priv -> jack_hp , buttons , CS42L43_JACK_BUTTONS );
421425
426+ iret = IRQ_HANDLED ;
427+
422428error :
423429 mutex_unlock (& priv -> jack_lock );
424430
425431 pm_runtime_put_autosuspend (priv -> dev );
426- }
427-
428- irqreturn_t cs42l43_button_press (int irq , void * data )
429- {
430- struct cs42l43_codec * priv = data ;
431-
432- // Wait for 2 full cycles of comb filter to ensure good reading
433- queue_delayed_work (system_wq , & priv -> button_press_work ,
434- msecs_to_jiffies (20 ));
435432
436- return IRQ_HANDLED ;
433+ return iret ;
437434}
438435
439- void cs42l43_button_release_work ( struct work_struct * work )
436+ irqreturn_t cs42l43_button_release ( int irq , void * data )
440437{
441- struct cs42l43_codec * priv = container_of ( work , struct cs42l43_codec ,
442- button_release_work ) ;
438+ struct cs42l43_codec * priv = data ;
439+ irqreturn_t iret = IRQ_NONE ;
443440 int ret ;
444441
445442 ret = pm_runtime_resume_and_get (priv -> dev );
446443 if (ret ) {
447444 dev_err (priv -> dev , "Failed to resume for button release: %d\n" , ret );
448- return ;
445+ return iret ;
449446 }
450447
451448 mutex_lock (& priv -> jack_lock );
@@ -454,22 +451,17 @@ void cs42l43_button_release_work(struct work_struct *work)
454451 dev_dbg (priv -> dev , "Button release IRQ\n" );
455452
456453 snd_soc_jack_report (priv -> jack_hp , 0 , CS42L43_JACK_BUTTONS );
454+
455+ iret = IRQ_HANDLED ;
457456 } else {
458457 dev_dbg (priv -> dev , "Spurious button release IRQ\n" );
459458 }
460459
461460 mutex_unlock (& priv -> jack_lock );
462461
463462 pm_runtime_put_autosuspend (priv -> dev );
464- }
465463
466- irqreturn_t cs42l43_button_release (int irq , void * data )
467- {
468- struct cs42l43_codec * priv = data ;
469-
470- queue_work (system_wq , & priv -> button_release_work );
471-
472- return IRQ_HANDLED ;
464+ return iret ;
473465}
474466
475467void cs42l43_bias_sense_timeout (struct work_struct * work )
@@ -782,8 +774,6 @@ irqreturn_t cs42l43_tip_sense(int irq, void *data)
782774
783775 cancel_delayed_work (& priv -> bias_sense_timeout );
784776 cancel_delayed_work (& priv -> tip_sense_work );
785- cancel_delayed_work (& priv -> button_press_work );
786- cancel_work (& priv -> button_release_work );
787777
788778 // Ensure delay after suspend is long enough to avoid false detection
789779 if (priv -> suspend_jack_debounce )
0 commit comments