[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <YMZXr2py6Esl6U2H@latitude>
Date: Sun, 13 Jun 2021 21:08:31 +0200
From: Jonathan Neuschäfer <j.neuschaefer@....net>
To: Andy Shevchenko <andy.shevchenko@...il.com>
Cc: Jonathan Neuschäfer <j.neuschaefer@....net>,
"open list:GPIO SUBSYSTEM" <linux-gpio@...r.kernel.org>,
devicetree <devicetree@...r.kernel.org>,
Linus Walleij <linus.walleij@...aro.org>,
Rob Herring <robh+dt@...nel.org>,
OpenBMC Maillist <openbmc@...ts.ozlabs.org>,
Tomer Maimon <tmaimon77@...il.com>,
Joel Stanley <joel@....id.au>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH 5/8] pinctrl: nuvoton: Add driver for WPCM450
On Sun, Jun 13, 2021 at 01:06:15PM +0300, Andy Shevchenko wrote:
> On Sun, Jun 13, 2021 at 2:20 AM Jonathan Neuschäfer <j.neuschaefer@....net> wrote:
> > On Wed, Jun 02, 2021 at 03:50:39PM +0300, Andy Shevchenko wrote:
> > > On Wed, Jun 2, 2021 at 3:05 PM Jonathan Neuschäfer <j.neuschaefer@....net> wrote:
[...]
> > > > +static int wpcm450_gpio_get_direction(struct gpio_chip *chip,
> > > > + unsigned int offset)
> > > > +{
> > > > + struct wpcm450_pinctrl *pctrl = gpiochip_get_data(chip);
> > > > + const struct wpcm450_port *port = to_port(offset);
> > > > + unsigned long flags;
> > > > + u32 cfg0;
> > > > + int dir;
> > > > +
> > > > + spin_lock_irqsave(&pctrl->lock, flags);
> > > > + if (port->cfg0) {
> > > > + cfg0 = ioread32(pctrl->gpio_base + port->cfg0);
> > >
> > > > + dir = !(cfg0 & port_mask(port, offset));
> > > > + } else {
> > > > + /* If cfg0 is unavailable, the GPIO is always an input */
> > > > + dir = 1;
> > > > + }
> > >
> > > Why above is under spin lock?
> > > Same question for all other similar places in different functions, if any.
> >
> > My intention was to protect the ioread32. But given that it's just a
> > single MMIO read, this might be unnecessary.
>
> Sometimes it's necessary and I'm not talking about it. (I put blank
> lines around the code I was commenting on)
>
> So, What I meant above is to get something like this
>
> if (port->cfg0) {
> spin lock
> ...
> spin unlock
> } else {
> ...
> }
>
> or equivalent ideas.
Ah, in other words: Narrowing the scope of the lock as far as possible.
I'll keep it in mind for v2.
> > > What about the GPIO library API that does some additional stuff?
> >
> > I don't know which gpiolib function would be appropriate here, sorry.
>
> When you leave those request and release callbacks untouched the GPIO
> library will assign default ones. You may see what they do.
Ah, I see. I'll look into it.
> ...
>
> > > > + if (!of_find_property(np, "gpio-controller", NULL))
> > > > + return -ENODEV;
> > >
> > > Dead code?
> >
> > The point here was to check if the node is marked as a GPIO controller,
> > with the boolean property "gpio-controller" (so device_property_read_bool
> > would probably be more appropriate).
> >
> > However, since the gpio-controller property is already defined as
> > required in the DT binding, I'm not sure it's worth checking here.
>
> Exactly my point.
Alright.
Thanks,
Jonthan Neuschäfer
Download attachment "signature.asc" of type "application/pgp-signature" (834 bytes)
Powered by blists - more mailing lists