@@ -506,6 +506,42 @@ static void tlmm_test_thread_falling_in_handler(struct kunit *test)
506
506
KUNIT_ASSERT_EQ (test , atomic_read (& priv -> thread_count ), 10 );
507
507
}
508
508
509
+ /*
510
+ * Validate that edge interrupts occurring while irq is disabled is delivered
511
+ * once the interrupt is reenabled.
512
+ */
513
+ static void tlmm_test_rising_while_disabled (struct kunit * test )
514
+ {
515
+ struct tlmm_test_priv * priv = test -> priv ;
516
+ unsigned int after_edge ;
517
+ unsigned int before_edge ;
518
+
519
+ priv -> intr_op = TLMM_TEST_COUNT ;
520
+ atomic_set (& priv -> thread_op_remain , 10 );
521
+
522
+ tlmm_output_low ();
523
+
524
+ tlmm_test_request_hard_irq (test , IRQF_TRIGGER_RISING );
525
+ msleep (20 );
526
+
527
+ disable_irq (tlmm_suite .irq );
528
+ before_edge = atomic_read (& priv -> intr_count );
529
+
530
+ tlmm_output_high ();
531
+ msleep (20 );
532
+ after_edge = atomic_read (& priv -> intr_count );
533
+
534
+ msleep (20 );
535
+ enable_irq (tlmm_suite .irq );
536
+ msleep (20 );
537
+
538
+ free_irq (tlmm_suite .irq , priv );
539
+
540
+ KUNIT_ASSERT_EQ (test , before_edge , 0 );
541
+ KUNIT_ASSERT_EQ (test , after_edge , 0 );
542
+ KUNIT_ASSERT_EQ (test , atomic_read (& priv -> intr_count ), 1 );
543
+ }
544
+
509
545
static int tlmm_test_init (struct kunit * test )
510
546
{
511
547
struct tlmm_test_priv * priv ;
@@ -609,6 +645,7 @@ static struct kunit_case tlmm_test_cases[] = {
609
645
KUNIT_CASE (tlmm_test_thread_low ),
610
646
KUNIT_CASE (tlmm_test_thread_rising_in_handler ),
611
647
KUNIT_CASE (tlmm_test_thread_falling_in_handler ),
648
+ KUNIT_CASE (tlmm_test_rising_while_disabled ),
612
649
{}
613
650
};
614
651
0 commit comments