Skip to content

Commit a01f628

Browse files
bastien-curutchetgregkh
authored andcommittedJan 10, 2025
pps: clients: gpio: Bypass edge's direction check when not needed
In the IRQ handler, the GPIO's state is read to verify the direction of the edge that triggered the interruption before generating the PPS event. If a pulse is too short, the GPIO line can reach back its original state before this verification and the PPS event is lost. This check is needed when info->capture_clear is set because it needs interruptions on both rising and falling edges. When info->capture_clear is not set, interruption is triggered by one edge only so this check can be omitted. Add a warning if irq_handler is left without triggering any PPS event. Bypass the edge's direction verification when info->capture_clear is not set. Signed-off-by: Bastien Curutchet <bastien.curutchet@bootlin.com> Acked-by: Rodolfo Giometti <giometti@enneenne.com> Link: https://lore.kernel.org/r/20250108153012.514925-1-bastien.curutchet@bootlin.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 6d2478a commit a01f628

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed
 

‎drivers/pps/clients/pps-gpio.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,18 @@ static irqreturn_t pps_gpio_irq_handler(int irq, void *data)
5252

5353
info = data;
5454

55-
rising_edge = gpiod_get_value(info->gpio_pin);
55+
/* Small trick to bypass the check on edge's direction when capture_clear is unset */
56+
rising_edge = info->capture_clear ?
57+
gpiod_get_value(info->gpio_pin) : !info->assert_falling_edge;
5658
if ((rising_edge && !info->assert_falling_edge) ||
5759
(!rising_edge && info->assert_falling_edge))
5860
pps_event(info->pps, &ts, PPS_CAPTUREASSERT, data);
5961
else if (info->capture_clear &&
6062
((rising_edge && info->assert_falling_edge) ||
6163
(!rising_edge && !info->assert_falling_edge)))
6264
pps_event(info->pps, &ts, PPS_CAPTURECLEAR, data);
65+
else
66+
dev_warn_ratelimited(&info->pps->dev, "IRQ did not trigger any PPS event\n");
6367

6468
return IRQ_HANDLED;
6569
}

0 commit comments

Comments
 (0)
Please sign in to comment.