Lines Matching +full:assert +full:- +full:falling +full:- +full:edge
1 // SPDX-License-Identifier: GPL-2.0-only
6 #define pr_fmt(fmt) "tlmm-test: " fmt
22 * (pinctrl-msm) delivers expected number of interrupts in response to changing
26 * "gpio", which the tester is expected to specify an unused and non-connected
40 static int tlmm_test_gpio = -1;
53 * struct tlmm_test_priv - Per-test context
98 if (priv->intr_op & TLMM_TEST_COUNT) in tlmm_test_intr_fn()
99 atomic_inc(&priv->intr_count); in tlmm_test_intr_fn()
101 if (priv->intr_op & TLMM_TEST_OUTPUT_LOW) in tlmm_test_intr_fn()
103 if (priv->intr_op & TLMM_TEST_OUTPUT_HIGH) in tlmm_test_intr_fn()
106 if (atomic_dec_if_positive(&priv->intr_op_remain) > 0) { in tlmm_test_intr_fn()
109 if (priv->intr_op & TLMM_TEST_THEN_LOW) in tlmm_test_intr_fn()
111 if (priv->intr_op & TLMM_TEST_THEN_HIGH) in tlmm_test_intr_fn()
115 return priv->intr_op & TLMM_TEST_WAKE_THREAD ? IRQ_WAKE_THREAD : IRQ_HANDLED; in tlmm_test_intr_fn()
122 if (priv->thread_op & TLMM_TEST_COUNT) in tlmm_test_intr_thread_fn()
123 atomic_inc(&priv->thread_count); in tlmm_test_intr_thread_fn()
125 if (priv->thread_op & TLMM_TEST_OUTPUT_LOW) in tlmm_test_intr_thread_fn()
127 if (priv->thread_op & TLMM_TEST_OUTPUT_HIGH) in tlmm_test_intr_thread_fn()
130 if (atomic_dec_if_positive(&priv->thread_op_remain) > 0) { in tlmm_test_intr_thread_fn()
132 if (priv->thread_op & TLMM_TEST_THEN_LOW) in tlmm_test_intr_thread_fn()
134 if (priv->thread_op & TLMM_TEST_THEN_HIGH) in tlmm_test_intr_thread_fn()
143 struct tlmm_test_priv *priv = test->priv; in tlmm_test_request_hard_irq()
146 ret = request_irq(tlmm_suite.irq, tlmm_test_intr_fn, irqflags, test->name, priv); in tlmm_test_request_hard_irq()
152 struct tlmm_test_priv *priv = test->priv; in tlmm_test_request_threaded_irq()
157 irqflags, test->name, priv); in tlmm_test_request_threaded_irq()
164 struct tlmm_test_priv *priv = test->priv; in tlmm_test_silent()
166 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_silent()
168 /* GPIO line at non-triggering level */ in tlmm_test_silent()
178 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 0); in tlmm_test_silent()
190 * Test that no FALLING interrupts are triggered on a silent pin
214 * Square wave with 10 high pulses, assert that we get 10 rising interrupts
218 struct tlmm_test_priv *priv = test->priv; in tlmm_test_rising()
221 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_rising()
235 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_rising()
239 * Square wave with 10 low pulses, assert that we get 10 falling interrupts
243 struct tlmm_test_priv *priv = test->priv; in tlmm_test_falling()
246 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_falling()
259 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_falling()
264 * source", assert we get 10 interrupts
268 struct tlmm_test_priv *priv = test->priv; in tlmm_test_low()
271 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH; in tlmm_test_low()
272 atomic_set(&priv->intr_op_remain, 9); in tlmm_test_low()
284 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_low()
289 * source", assert we get 10 interrupts
293 struct tlmm_test_priv *priv = test->priv; in tlmm_test_high()
296 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW; in tlmm_test_high()
297 atomic_set(&priv->intr_op_remain, 9); in tlmm_test_high()
309 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_high()
314 * simulate a new interrupt, repeated 10 times, assert we get 10 interrupts
318 struct tlmm_test_priv *priv = test->priv; in tlmm_test_falling_in_handler()
320 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH | TLMM_TEST_THEN_LOW; in tlmm_test_falling_in_handler()
321 atomic_set(&priv->intr_op_remain, 10); in tlmm_test_falling_in_handler()
331 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_falling_in_handler()
336 * simulate a new interrupt, repeated 10 times, assert we get 10 interrupts
340 struct tlmm_test_priv *priv = test->priv; in tlmm_test_rising_in_handler()
342 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW | TLMM_TEST_THEN_HIGH; in tlmm_test_rising_in_handler()
343 atomic_set(&priv->intr_op_remain, 10); in tlmm_test_rising_in_handler()
353 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_rising_in_handler()
357 * Square wave with 10 high pulses, assert that we get 10 rising hard and
362 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_rising()
365 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_rising()
366 priv->thread_op = TLMM_TEST_COUNT; in tlmm_test_thread_rising()
379 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_rising()
380 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_rising()
384 * Square wave with 10 low pulses, assert that we get 10 falling interrupts
388 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_falling()
391 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_falling()
392 priv->thread_op = TLMM_TEST_COUNT; in tlmm_test_thread_falling()
405 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_falling()
406 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_falling()
411 * interrupt source", assert we get 10 interrupts
415 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_high()
418 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_high()
419 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW; in tlmm_test_thread_high()
430 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_high()
431 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_high()
436 * interrupt source", assert we get 10 interrupts
440 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_low()
443 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_low()
444 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH; in tlmm_test_thread_low()
455 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_low()
456 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_low()
461 * threaded handler to simulate a new interrupt, repeated 10 times, assert we
466 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_rising_in_handler()
468 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_rising_in_handler()
469 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_THEN_HIGH; in tlmm_test_thread_rising_in_handler()
470 atomic_set(&priv->thread_op_remain, 10); in tlmm_test_thread_rising_in_handler()
480 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_rising_in_handler()
481 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_rising_in_handler()
486 * threaded handler to simulate a new interrupt, repeated 10 times, assert we
491 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_falling_in_handler()
493 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_falling_in_handler()
494 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_THEN_LOW; in tlmm_test_thread_falling_in_handler()
495 atomic_set(&priv->thread_op_remain, 10); in tlmm_test_thread_falling_in_handler()
505 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_falling_in_handler()
506 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_falling_in_handler()
510 * Validate that edge interrupts occurring while irq is disabled is delivered
515 struct tlmm_test_priv *priv = test->priv; in tlmm_test_rising_while_disabled()
519 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_rising_while_disabled()
520 atomic_set(&priv->thread_op_remain, 10); in tlmm_test_rising_while_disabled()
528 before_edge = atomic_read(&priv->intr_count); in tlmm_test_rising_while_disabled()
532 after_edge = atomic_read(&priv->intr_count); in tlmm_test_rising_while_disabled()
542 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 1); in tlmm_test_rising_while_disabled()
552 atomic_set(&priv->intr_count, 0); in tlmm_test_init()
553 atomic_set(&priv->thread_count, 0); in tlmm_test_init()
555 atomic_set(&priv->intr_op_remain, 0); in tlmm_test_init()
556 atomic_set(&priv->thread_op_remain, 0); in tlmm_test_init()
558 test->priv = priv; in tlmm_test_init()
568 { .compatible = "qcom,sc8280xp-tlmm" },
569 { .compatible = "qcom,x1e80100-tlmm" },
581 pr_err("use the tlmm-test.gpio module parameter to specify which GPIO to use\n"); in tlmm_test_init_suite()
582 return -EINVAL; in tlmm_test_init_suite()
588 return -EINVAL; in tlmm_test_init_suite()
597 return -ENOMEM; in tlmm_test_init_suite()
620 return -EINVAL; in tlmm_test_init_suite()
629 tlmm_suite.irq = -1; in tlmm_test_exit_suite()
654 .name = "tlmm-test",