[Linux-stm32] STM32MP1 level triggered interrupts
Marc Zyngier
maz at kernel.org
Thu Jan 23 09:22:48 UTC 2020
On 2020-01-23 08:27, Alexandre Torgue wrote:
> On 1/22/20 8:29 PM, Marek Vasut wrote:
>> On 1/22/20 6:19 PM, Alexandre Torgue wrote:
>>
>> Hi,
>>
>> [...]
>>
>>>>> Concerning, your question:
>>>>>
>>>>> Setting your gpioC interruption as "falling edge" should be enough.
>>>>> On
>>>>> gpioCx falling edge, a high-level signal is generated by exti and
>>>>> sent
>>>>> to GIC (which triggers GIC interrupt). This signal remains high
>>>>> until
>>>>> stm32_irq_ack is called.
>>>>>
>>>>> So you only need: (ex for gpioc 1).
>>>>>
>>>>> interrupt-parent = <&gpioc>;
>>>>> interrupts = <1 IRQ_TYPE_EDGE_FALLING>;
>>>>
>>>> How does this deal with the case where the device holds the
>>>> interrupt
>>>> line low (since it's level-sensitive, active low) after the driver
>>>> interrupt handler finishes ? Does such condition generate another
>>>> interrupt and call the driver interrupt handler again ? I would
>>>> expect
>>>> the answer is no, because the interrupt is edge-triggered and there
>>>> is
>>>> no edge.
>>>
>>> Your assumption is good. If your device continue to hold the line to
>>> low
>>> at the end of your interrupt handler, no more interrupt will be
>>> generated.
>>
>> But does that basically mean that such a device cannot be used with
>> STM32MP1 or am I fundamentally mistaken and don't understand how a
>> level-triggered interrupt works ? :)
>
> You need to release the line in your device interrupt handler. If not,
> yes, you will miss interrupts :$
So to sum it up, this SoC doesn't support external level interrupts
on its own, full stop. You'd need some additional external sampling
HW to retrigger an edge on EOI.
M.
--
Jazz is not dead. It just smells funny...
More information about the Linux-stm32
mailing list