@@ -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+
423429error :
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
478470void 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 )
0 commit comments