Re: [PATCH 1/1] pps: clients: gpio: Bypass edge's direction check when not needed

From: Bastien Curutchet
Date: Fri Apr 12 2024 - 08:20:55 EST


Hi Rodolfo,

On 4/12/24 08:44, Rodolfo Giometti wrote:
On 11/04/24 14:44, Bastien Curutchet wrote:

However we should think very well about this modification since it could be the case where we have a device sending both assert and clear events but we wish to catch just the asserts... in this case we will get doubled asserts!


My understanding is that clear events are to be captured only when this
capture_clear boolean is set. If it is not set, the PPS_CAPTURECLEAR
flag is not added to pps_source_info->mode and get_irqf_trigger_flags()
will return only one edge flag (rising or falling depending on
assert-falling-edge DT property).

Yes. You are right.

By the way, I see that the capture_clear is never set since the legacy
platform data support has been dropped (commit ee89646619ba).

I see, but it can be re-enabled in the future... In this scenario, I think we should add a DT entry to enable this special behavior. Maybe we can also add a warning as below: >
static irqreturn_t pps_gpio_irq_handler(int irq, void *data)
{
        ...
        if ((rising_edge && !info->assert_falling_edge) ||
                        (!rising_edge && info->assert_falling_edge))
                pps_event(info->pps, &ts, PPS_CAPTUREASSERT, data);
        else if (info->capture_clear &&
                        ((rising_edge && info->assert_falling_edge) ||
                        (!rising_edge && !info->assert_falling_edge)))
                pps_event(info->pps, &ts, PPS_CAPTURECLEAR, data);
    else
        dev_warn_ratelimited(dev, "no ASSERT or CAPTURE event? "
            "Maybe you need support-tiny-assert-pulse?");

        return IRQ_HANDLED;
}


I'm not sure a DT entry is needed. IMO there are two cases:
1) capture_clear is unset. We need to capture only assert events,
interrupt will be triggered by assert edge only so there is no need
to check GPIO state: we can use the bypass.
2) capture_clear is set. We need to capture assert and/or clear
events, interrupt will be triggered by both assert and clear edges
so we can't avoid the GPIO state checking to distinguish clear
events from assert events: we can't use the bypass.

So if we bypass the GPIO's state check when capture_clear is unset and
leave current behavior when capture_clear is set:
- case 1) will be more efficient and we won't lose tiny pulses anymore
- case 2) is unchanged: we still might lose tiny pulses but as bypass
can't be done here, I think that we can't do better.

I agree that adding warning when the handler is left without triggering
a pps event can be useful, I can add it in a V3 version.


Best regards,
Bastien