Lines Matching +full:- +full:10
1 // SPDX-License-Identifier: GPL-2.0-only
6 #define pr_fmt(fmt) "tlmm-test: " fmt
23 * (pinctrl-msm) delivers expected number of interrupts in response to changing
27 * "gpio", which the tester is expected to specify an unused and non-connected
41 static int tlmm_test_gpio = -1;
57 * struct tlmm_test_priv - Per-test context
102 if (priv->intr_op & TLMM_TEST_COUNT) in tlmm_test_intr_fn()
103 atomic_inc(&priv->intr_count); in tlmm_test_intr_fn()
105 if (priv->intr_op & TLMM_TEST_OUTPUT_LOW) in tlmm_test_intr_fn()
107 if (priv->intr_op & TLMM_TEST_OUTPUT_HIGH) in tlmm_test_intr_fn()
110 if (atomic_dec_if_positive(&priv->intr_op_remain) > 0) { in tlmm_test_intr_fn()
113 if (priv->intr_op & TLMM_TEST_THEN_LOW) in tlmm_test_intr_fn()
115 if (priv->intr_op & TLMM_TEST_THEN_HIGH) in tlmm_test_intr_fn()
119 return priv->intr_op & TLMM_TEST_WAKE_THREAD ? IRQ_WAKE_THREAD : IRQ_HANDLED; in tlmm_test_intr_fn()
126 if (priv->thread_op & TLMM_TEST_COUNT) in tlmm_test_intr_thread_fn()
127 atomic_inc(&priv->thread_count); in tlmm_test_intr_thread_fn()
129 if (priv->thread_op & TLMM_TEST_OUTPUT_LOW) in tlmm_test_intr_thread_fn()
131 if (priv->thread_op & TLMM_TEST_OUTPUT_HIGH) in tlmm_test_intr_thread_fn()
134 if (atomic_dec_if_positive(&priv->thread_op_remain) > 0) { in tlmm_test_intr_thread_fn()
136 if (priv->thread_op & TLMM_TEST_THEN_LOW) in tlmm_test_intr_thread_fn()
138 if (priv->thread_op & TLMM_TEST_THEN_HIGH) in tlmm_test_intr_thread_fn()
147 struct tlmm_test_priv *priv = test->priv; in tlmm_test_request_hard_irq()
150 ret = request_irq(tlmm_suite.irq, tlmm_test_intr_fn, irqflags, test->name, priv); in tlmm_test_request_hard_irq()
156 struct tlmm_test_priv *priv = test->priv; in tlmm_test_request_threaded_irq()
161 irqflags, test->name, priv); in tlmm_test_request_threaded_irq()
168 struct tlmm_test_priv *priv = test->priv; in tlmm_test_silent()
170 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_silent()
172 /* GPIO line at non-triggering level */ in tlmm_test_silent()
182 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 0); in tlmm_test_silent()
218 * Square wave with 10 high pulses, assert that we get 10 rising interrupts
222 struct tlmm_test_priv *priv = test->priv; in tlmm_test_rising()
225 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_rising()
230 for (i = 0; i < 10; i++) { in tlmm_test_rising()
239 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_rising()
243 * Square wave with 10 low pulses, assert that we get 10 falling interrupts
247 struct tlmm_test_priv *priv = test->priv; in tlmm_test_falling()
250 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_falling()
255 for (i = 0; i < 10; i++) { in tlmm_test_falling()
263 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_falling()
267 * Drive line low 10 times, handler drives it high to "clear the interrupt
268 * source", assert we get 10 interrupts
272 struct tlmm_test_priv *priv = test->priv; in tlmm_test_low()
275 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH; in tlmm_test_low()
276 atomic_set(&priv->intr_op_remain, 9); in tlmm_test_low()
281 for (i = 0; i < 10; i++) { in tlmm_test_low()
288 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_low()
292 * Drive line high 10 times, handler drives it low to "clear the interrupt
293 * source", assert we get 10 interrupts
297 struct tlmm_test_priv *priv = test->priv; in tlmm_test_high()
300 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW; in tlmm_test_high()
301 atomic_set(&priv->intr_op_remain, 9); in tlmm_test_high()
306 for (i = 0; i < 10; i++) { in tlmm_test_high()
313 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_high()
318 * simulate a new interrupt, repeated 10 times, assert we get 10 interrupts
322 struct tlmm_test_priv *priv = test->priv; in tlmm_test_falling_in_handler()
324 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH | TLMM_TEST_THEN_LOW; in tlmm_test_falling_in_handler()
325 atomic_set(&priv->intr_op_remain, 10); in tlmm_test_falling_in_handler()
335 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_falling_in_handler()
340 * simulate a new interrupt, repeated 10 times, assert we get 10 interrupts
344 struct tlmm_test_priv *priv = test->priv; in tlmm_test_rising_in_handler()
346 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW | TLMM_TEST_THEN_HIGH; in tlmm_test_rising_in_handler()
347 atomic_set(&priv->intr_op_remain, 10); in tlmm_test_rising_in_handler()
357 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_rising_in_handler()
361 * Square wave with 10 high pulses, assert that we get 10 rising hard and
362 * 10 threaded interrupts
366 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_rising()
369 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_rising()
370 priv->thread_op = TLMM_TEST_COUNT; in tlmm_test_thread_rising()
375 for (i = 0; i < 10; i++) { in tlmm_test_thread_rising()
383 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_rising()
384 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_rising()
388 * Square wave with 10 low pulses, assert that we get 10 falling interrupts
392 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_falling()
395 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_falling()
396 priv->thread_op = TLMM_TEST_COUNT; in tlmm_test_thread_falling()
401 for (i = 0; i < 10; i++) { in tlmm_test_thread_falling()
409 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_falling()
410 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_falling()
414 * Drive line high 10 times, threaded handler drives it low to "clear the
415 * interrupt source", assert we get 10 interrupts
419 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_high()
422 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_high()
423 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW; in tlmm_test_thread_high()
428 for (i = 0; i < 10; i++) { in tlmm_test_thread_high()
434 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_high()
435 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_high()
439 * Drive line low 10 times, threaded handler drives it high to "clear the
440 * interrupt source", assert we get 10 interrupts
444 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_low()
447 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_low()
448 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH; in tlmm_test_thread_low()
453 for (i = 0; i < 10; i++) { in tlmm_test_thread_low()
459 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_low()
460 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_low()
465 * threaded handler to simulate a new interrupt, repeated 10 times, assert we
466 * get 10 interrupts
470 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_rising_in_handler()
472 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_LOW | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_rising_in_handler()
473 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_THEN_HIGH; in tlmm_test_thread_rising_in_handler()
474 atomic_set(&priv->thread_op_remain, 10); in tlmm_test_thread_rising_in_handler()
484 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_rising_in_handler()
485 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_rising_in_handler()
490 * threaded handler to simulate a new interrupt, repeated 10 times, assert we
491 * get 10 interrupts
495 struct tlmm_test_priv *priv = test->priv; in tlmm_test_thread_falling_in_handler()
497 priv->intr_op = TLMM_TEST_COUNT | TLMM_TEST_OUTPUT_HIGH | TLMM_TEST_WAKE_THREAD; in tlmm_test_thread_falling_in_handler()
498 priv->thread_op = TLMM_TEST_COUNT | TLMM_TEST_THEN_LOW; in tlmm_test_thread_falling_in_handler()
499 atomic_set(&priv->thread_op_remain, 10); in tlmm_test_thread_falling_in_handler()
509 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 10); in tlmm_test_thread_falling_in_handler()
510 KUNIT_ASSERT_EQ(test, atomic_read(&priv->thread_count), 10); in tlmm_test_thread_falling_in_handler()
519 struct tlmm_test_priv *priv = test->priv; in tlmm_test_rising_while_disabled()
523 priv->intr_op = TLMM_TEST_COUNT; in tlmm_test_rising_while_disabled()
524 atomic_set(&priv->thread_op_remain, 10); in tlmm_test_rising_while_disabled()
532 before_edge = atomic_read(&priv->intr_count); in tlmm_test_rising_while_disabled()
536 after_edge = atomic_read(&priv->intr_count); in tlmm_test_rising_while_disabled()
546 KUNIT_ASSERT_EQ(test, atomic_read(&priv->intr_count), 1); in tlmm_test_rising_while_disabled()
556 atomic_set(&priv->intr_count, 0); in tlmm_test_init()
557 atomic_set(&priv->thread_count, 0); in tlmm_test_init()
559 atomic_set(&priv->intr_op_remain, 0); in tlmm_test_init()
560 atomic_set(&priv->thread_op_remain, 0); in tlmm_test_init()
562 test->priv = priv; in tlmm_test_init()
572 { .compatible = "qcom,sc8280xp-tlmm" },
573 { .compatible = "qcom,x1e80100-tlmm" },
584 count = of_property_count_strings(tlmm, "reg-names"); in tlmm_reg_base()
592 return -ENOMEM; in tlmm_reg_base()
594 ret = of_property_read_string_array(tlmm, "reg-names", reg_names, count); in tlmm_reg_base()
597 return -EINVAL; in tlmm_reg_base()
610 ret = -EINVAL; in tlmm_reg_base()
626 pr_err("use the tlmm-test.gpio module parameter to specify which GPIO to use\n"); in tlmm_test_init_suite()
627 return -EINVAL; in tlmm_test_init_suite()
633 return -EINVAL; in tlmm_test_init_suite()
642 return -ENOMEM; in tlmm_test_init_suite()
665 return -EINVAL; in tlmm_test_init_suite()
674 tlmm_suite.irq = -1; in tlmm_test_exit_suite()
699 .name = "tlmm-test",