next-20160914 build: 2 failures 3 warnings (next-20160914)

Grygorii Strashko grygorii.strashko at ti.com
Mon Sep 19 08:31:50 PDT 2016


On 09/19/2016 02:30 PM, Arnd Bergmann wrote:
> On Monday, September 19, 2016 11:54:29 AM CEST Mark Brown wrote:
>> On Mon, Sep 19, 2016 at 12:31:04PM +0200, Arnd Bergmann wrote:
>>
>>> My guess is that this is indeed the correct fix, but I don't understand
>>> at all what the function does, and Marcin Niestroj said the same thing,
>>> he just copied the code from a driver that is always built-in.
>>
>> Yes, most of the code is copied from regmap-irq.  Setting the parent is
>> needed for edge triggered interrupts that don't latch state when
>> disabled but isn't needed in the general case.
> 
> I found this in the tps65217 data sheet:
> 
>  9.3.7 Interrupt Pin (nINT)
>  The interrupt pin is used to signal any event or fault
>  condition to the host processor. Whenever a fault or event
>  occurs in the IC the corresponding interrupt bit is set in
>  the INT register, and the open-drain output is pulled low.
>  The nINT pin is released (returns to Hi-Z state) and fault
>  bits are cleared when the INT register is read by the
>  host. However, if a failure persists, the corresponding
>  INT bit remains set and the nINT pin is pulled low again
>  after a maximum of 32 µs.
> 
>  Interrupt events include pushbutton pressed/released, USB
>  and AC voltage status change.
>  The MASK bits in the INT register are used to mask events
>  from generating interrupts. The MASK settings affect the
>  nINT pin only and have no impact on protection and
>  monitor circuits themselves. Note that persisting event
>  conditions such as ISINK enabled shutdown can cause the
>  nINT pin to be pulled low for an extended period of
>  time which can keep the host in a loop trying to resolve
>  the interrupt. If this behavior is not desired, set the
>  corresponding mask bit after receiving the interrupt and
>  keep polling the INT register to see when the event
>  condition has disappeared. Then unmask the interrupt bit
>  again.
> 
> Does this tell us if it's needed or not?
> 


The irq_set_parent() is required for proper supporting of lazy irq disabling
for threaded nested irqs and allow them to be re-triggered in the following case:

driverX:
 disable(nested_irq);
...
 parent irq triggered
   |- handle_nested_irq()
	|- mark nested_irq with IRQS_PENDING

...
driverX:
 enable(nested_irq);
   |- if IRQS_PENDING -> resend parent_irq [*], because nested threaded irq can't
      be resend by itself 

[*] if parent_irq is not set the IRQS_PENDING status will be ignored and irq might be lost.

Also, it was "mandatory" to be done before commit 75a06189fc5 
"genirq: Prevent resend to interrupts marked IRQ_NESTED_THREAD"
which made setting of parent_irq optional.

So, if is it required or not depends not only on HW, but, rather, on MFD drivers implementation
(Interrupt controller and MFD cell drivers).

-- 
regards,
-grygorii



More information about the linux-arm-kernel mailing list