@@ -362,22 +362,23 @@ static void cs42l43_stop_button_detect(struct cs42l43_codec *priv)
362
362
priv -> button_detect_running = false;
363
363
}
364
364
365
+ #define CS42L43_BUTTON_COMB_US 11000
365
366
#define CS42L43_BUTTON_COMB_MAX 512
366
367
#define CS42L43_BUTTON_ROUT 2210
367
368
368
- void cs42l43_button_press_work ( struct work_struct * work )
369
+ irqreturn_t cs42l43_button_press ( int irq , void * data )
369
370
{
370
- struct cs42l43_codec * priv = container_of (work , struct cs42l43_codec ,
371
- button_press_work .work );
371
+ struct cs42l43_codec * priv = data ;
372
372
struct cs42l43 * cs42l43 = priv -> core ;
373
+ irqreturn_t iret = IRQ_NONE ;
373
374
unsigned int buttons = 0 ;
374
375
unsigned int val = 0 ;
375
376
int i , ret ;
376
377
377
378
ret = pm_runtime_resume_and_get (priv -> dev );
378
379
if (ret ) {
379
380
dev_err (priv -> dev , "Failed to resume for button press: %d\n" , ret );
380
- return ;
381
+ return iret ;
381
382
}
382
383
383
384
mutex_lock (& priv -> jack_lock );
@@ -387,6 +388,9 @@ void cs42l43_button_press_work(struct work_struct *work)
387
388
goto error ;
388
389
}
389
390
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
+
390
394
regmap_read (cs42l43 -> regmap , CS42L43_DETECT_STATUS_1 , & val );
391
395
392
396
/* Bail if jack removed, the button is irrelevant and likely invalid */
@@ -420,34 +424,27 @@ void cs42l43_button_press_work(struct work_struct *work)
420
424
421
425
snd_soc_jack_report (priv -> jack_hp , buttons , CS42L43_JACK_BUTTONS );
422
426
427
+ iret = IRQ_HANDLED ;
428
+
423
429
error :
424
430
mutex_unlock (& priv -> jack_lock );
425
431
426
432
pm_runtime_mark_last_busy (priv -> dev );
427
433
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 ));
437
434
438
- return IRQ_HANDLED ;
435
+ return iret ;
439
436
}
440
437
441
- void cs42l43_button_release_work ( struct work_struct * work )
438
+ irqreturn_t cs42l43_button_release ( int irq , void * data )
442
439
{
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 ;
445
442
int ret ;
446
443
447
444
ret = pm_runtime_resume_and_get (priv -> dev );
448
445
if (ret ) {
449
446
dev_err (priv -> dev , "Failed to resume for button release: %d\n" , ret );
450
- return ;
447
+ return iret ;
451
448
}
452
449
453
450
mutex_lock (& priv -> jack_lock );
@@ -456,6 +453,8 @@ void cs42l43_button_release_work(struct work_struct *work)
456
453
dev_dbg (priv -> dev , "Button release IRQ\n" );
457
454
458
455
snd_soc_jack_report (priv -> jack_hp , 0 , CS42L43_JACK_BUTTONS );
456
+
457
+ iret = IRQ_HANDLED ;
459
458
} else {
460
459
dev_dbg (priv -> dev , "Spurious button release IRQ\n" );
461
460
}
@@ -464,15 +463,8 @@ void cs42l43_button_release_work(struct work_struct *work)
464
463
465
464
pm_runtime_mark_last_busy (priv -> dev );
466
465
pm_runtime_put_autosuspend (priv -> dev );
467
- }
468
466
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 ;
476
468
}
477
469
478
470
void cs42l43_bias_sense_timeout (struct work_struct * work )
@@ -787,8 +779,6 @@ irqreturn_t cs42l43_tip_sense(int irq, void *data)
787
779
788
780
cancel_delayed_work (& priv -> bias_sense_timeout );
789
781
cancel_delayed_work (& priv -> tip_sense_work );
790
- cancel_delayed_work (& priv -> button_press_work );
791
- cancel_work (& priv -> button_release_work );
792
782
793
783
// Ensure delay after suspend is long enough to avoid false detection
794
784
if (priv -> suspend_jack_debounce )
0 commit comments