[PATCH 4/9] gpio: regmap: add the .get_direction() callback

Ioana Ciornei ioana.ciornei at nxp.com
Tue Jul 15 04:38:13 PDT 2025


On Mon, Jul 14, 2025 at 08:36:03AM +0200, Michael Walle wrote:
> On Fri Jul 11, 2025 at 8:06 PM CEST, Linus Walleij wrote:
> > On Fri, Jul 11, 2025 at 7:45 PM Andrew Lunn <andrew at lunn.ch> wrote:
> > > On Fri, Jul 11, 2025 at 07:43:13PM +0200, Linus Walleij wrote:
> > > > On Wed, Jul 9, 2025 at 5:09 PM Andrew Lunn <andrew at lunn.ch> wrote:
> > > >
> > > > > This is not my area, so i will deffer to the GPIO
> > > > > Maintainers. However, it is not clear to me what get_direction()
> > > > > should return.
> > > >
> > > > This callback should return the current direction as set up
> > > > in the hardware.
> > > >
> > > > A major usecase is that this is called when the gpiochip is
> > > > registered to read out all the current directions of the GPIO
> > > > lines, so the kernel has a clear idea of the state of the
> > > > hardware.
> > > >
> > > > Calling this should ideally result in a read of the status from
> > > > a hardware register.
> > >
> > > O.K, so completely different to what is proposed in this patch.
> > >
> > > Maybe you can suggest a better name.
> >
> > If the hardware only supports one direction, then .get_direction()
> > should return that direction.
> >
> > What the patch does is to
> > read the direction from the hardware and use that in the
> > set_direction() callback, as if all regmapped hardware in the
> > world had fixed direction, that's wrong.
> >
> > I'd just add something custom in gpio-regmap if this is
> > something reoccuring in regmapped GPIO drivers.
> >
> > bool is_fixed_direction(struct gpio_regmap *gpio, unsigned int offset)
> >
> > or so?
> >
> > Then the core can use is_fixed_direction() together
> > with gpio_get_direction() to check if it can do
> > a certain set_direction().
> >
> > Pseudocode:
> >
> > mydir = get_direction(line)
> > if (is_fixed_direction(line) && (mydir != requested_dir)
> >   return -ERROR;
> 
> You don't need a .is_fixed_direction(). You can deduce that if only
> .get_direction() is set in the gpio-regmap config.
> 
> mydir = get_direction(line)
> if (!config->set_direction && mydir != requested_dir)
>   return -ERROR;

This implies that gpio_regmap_config gets two new callbacks
.get_direction() and .set_direction() and that in case .set_direction()
is set in gpio-regmap config, then its used directly from
gpio_regmap_set_direction(), right?

>
> That or either Andrew's idea of setting a bitmap within the
> gpio-regmap config which already tells the gpio-regmap core and then
> amend gpio_regmap_get_direction() to return that fixed direction if
> that bitmap is not NULL.

Even though at first glance I was under the impression that the bitmap
solution is cleaner, how big should the bitmap be knows only the final
gpio driver. Without this information, we cannot know the bitmap size so
that we can use the DECLARE_BITMAP macro in gpio-regmap config.

Ioana



More information about the linux-arm-kernel mailing list