Re: [PATCH 01/10] input: keyboard: adp5588-keys: support gpi key events as 'gpio keys'

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, 2022-07-08 at 15:24 +0000, Sa, Nuno wrote:
> 
> 
> > -----Original Message-----
> > From: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
> > Sent: Friday, July 8, 2022 5:05 PM
> > To: Sa, Nuno <Nuno.Sa@xxxxxxxxxx>
> > Cc: devicetree <devicetree@xxxxxxxxxxxxxxx>; open list:GPIO
> > SUBSYSTEM <linux-gpio@xxxxxxxxxxxxxxx>; linux-input <linux-
> > input@xxxxxxxxxxxxxxx>; Dmitry Torokhov
> > <dmitry.torokhov@xxxxxxxxx>; Bartosz Golaszewski
> > <brgl@xxxxxxxx>; Hennerich, Michael
> > <Michael.Hennerich@xxxxxxxxxx>; Rob Herring
> > <robh+dt@xxxxxxxxxx>; Krzysztof Kozlowski
> > <krzysztof.kozlowski+dt@xxxxxxxxxx>; Linus Walleij
> > <linus.walleij@xxxxxxxxxx>
> > Subject: Re: [PATCH 01/10] input: keyboard: adp5588-keys: support
> > gpi
> > key events as 'gpio keys'
> > 
> > [External]
> > 
> > On Fri, Jul 8, 2022 at 4:55 PM Sa, Nuno <Nuno.Sa@xxxxxxxxxx> wrote:
> > > > From: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
> > > > Sent: Friday, July 8, 2022 4:18 PM
> > > > On Fri, Jul 8, 2022 at 11:36 AM Nuno Sá <nuno.sa@xxxxxxxxxx>
> > wrote:
> > 
> > ...
> > 
> > > > > +       kpad->gc.parent = &kpad->client->dev;
> > > > 
> > > > > +       kpad->gc.of_node = kpad->client->dev.of_node;
> > > > 
> > > > We are going to remove of_node from GPIO. Moreover the parent
> > > > device
> > > > and its node is a duplication, just drop the latter and GPIO
> > > > library
> > > > will take care of it.
> > > > 
> > > 
> > > Well the of_node was set so that I had a proper name in the IRQ
> > domain
> > > IIRC. Will this be handled in the GPIO lib in the future?
> > 
> > In your case it's a dup. So in _your_ case it will be handled in
> > the
> > future. For the rest we already have an fwnode member.
> 
> ok, I will drop the assignment...
> 
> > > The parent assignment was also to make things neater in
> > > /sys/kernel/debug/gpio.
> > 
> > Sure.
> > 
> > ...
> > 
> > > > > +       girq->handler = handle_simple_irq;
> > > > 
> > > > By default it should be handle_bad_irq() and locked in the -
> > > > > irq_set_type().
> > > > 
> > > > > +       girq->threaded = true;
> > > > 
> > > > See documentation above.
> > > 
> > > I see... I will look at Docs. In practice I don't think this
> > > matters much
> > > since this handler should never really be called (I think) as we
> > > just
> > > call handle_nested_irq().
> > 
> > There are two different comments, one about handler, another about
> > how
> > to properly write IRQ chip data structure and mask()/unmask()
> > callbacks.
> > 

So I think I have most of stuff understood for v2. About the handler, I
don't think we really need to set 'handle_edge_irq()' in
'irq_set_type()' as this is a nested threaded interrupt and so, the
desc->handle_irq() should never be called (I think, not 100% if there's
any strange case where it might).

That said, if you still think that I should do it (for correctness),
fine by me.

> > ...
> > 
> > > > > +       /* should never happen */
> > > > 
> > > > Then why it's here?
> > > 
> > > because I do not trust the HW to always cooperate :). In theory,
> > > we can get some invalid 'gpio' from it.
> > > 
> > > > > +       WARN_ON_ONCE(hwirq == ngpios);
> > 
> > On some setups this can lead to panic. Why? Is this so critical
> > error?
> 
> Ahh, you're right. Forgot that in some cases WARN can actually panic.
> 
> > hardware can't anymore function?
> 
> If we get in here, the device is probably in a very bad state but
> that
> does not mean that the system is...
> 
> I will just move to dev_warn(). Thanks for the remainder!
> 
> > ...
> > 
> > > > I don't know this code, can you summarize why this additional
> > mapping
> > > > is needed?
> > > 
> > > You have 18 possible pins to use as GPIOs (and hence be IRQ
> > sources). Now,
> > > if you just want to use pins 16 and 17 that will map int hwirq 0
> > > and 1.
> > But
> > > what we get from the device in 'key_val - GPI_PIN_BASE' is, for
> > example,
> > > 16 and so we need to get the hwirq which will be 0. It's pretty
> > > much
> > the
> > > reverse of what it's being done in the GPIOs callbacks.
> > 
> > Any reason why irq_valid_mask can't be used for that?
> 
> I will have to look at irq_valid_mask.
> 
> > ...
> > 
> > > > > +       /*
> > > > > +        * Default is active low which means key_press is
> > > > > asserted
> > on
> > > > > +        * the falling edge.
> > > > > +        */
> > > > > +       if ((irq_type & IRQ_TYPE_EDGE_RISING && !key_press)
> > > > > ||
> > > > > +           (irq_type & IRQ_TYPE_EDGE_FALLING && key_press))
> > > > 
> > > > This is dup from ->irq_set_type(). Or how this can be not like
> > > > this?
> > > 
> > > We get here if we get a key press (falling edge) or a key release
> > (rising
> > > edge). The events are given by the device and it might be that in
> > some
> > > cases we just want to handle/propagate key presses
> > > (not sure if it makes sense). So we need to match it with the
> > > appropriate irq_type requested. Note that this kind of
> > > controlling the
> > IRQ
> > > from SW as there's no way from doing it in the device. That is
> > > why we
> > don't
> > > do more than just making sure the IRQ types are valid in
> > irq_set_type.
> > 
> > I see, thanks for elaboration.
> > 
> > ...
> > 
> > > > > +               handle_nested_irq(irq);
> > > > 
> > > > There is new helpers I believe for getting domain and handle an
> > IRQ.
> > > > Grep for the recent (one-two last cycles) changes in the GPIO
> > drivers.
> > > > 
> > > 
> > > Hmm, I think I saw it but somehow I though I could not use it
> > (because
> > > of the previous calls to get the irq_type). Hmmm...
> > 
> > Maybe you can double check?
> 
> Sure, I think the helper can be used...
> 

So I did looked and I think you are thinking about
'generic_handle_domain_irq()'. For nested threaded I could not find a
similar one (maybe a new helper to be added).

- Nuno Sá




[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux