On Tue, Dec 07, 2021 at 10:34:07AM +0100, Bartosz Golaszewski wrote: > Software nodes allow us to represent hierarchies for device components > that don't have their struct device representation yet - for instance: > banks of GPIOs under a common GPIO expander. The core gpiolib core > however doesn't offer any way of passing this information from the > drivers. > > This extends struct gpio_chip with a pointer to fwnode that can be set > by the driver and used to pass device properties for child nodes. > > This is similar to how we handle device-tree sub-nodes with > CONFIG_OF_GPIO enabled. Reviewed-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Signed-off-by: Bartosz Golaszewski <brgl@xxxxxxxx> > --- > drivers/gpio/gpiolib.c | 7 ++++++- > include/linux/gpio/driver.h | 2 ++ > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index 22b98a590a88..6af732bf4c99 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -593,13 +593,18 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, > struct lock_class_key *lock_key, > struct lock_class_key *request_key) > { > - struct fwnode_handle *fwnode = gc->parent ? dev_fwnode(gc->parent) : NULL; > + struct fwnode_handle *fwnode = NULL; > unsigned long flags; > int ret = 0; > unsigned i; > int base = gc->base; > struct gpio_device *gdev; > > + if (gc->fwnode) > + fwnode = gc->fwnode; > + else if (gc->parent) > + fwnode = dev_fwnode(gc->parent); > + > /* > * First: allocate and populate the internal stat container, and > * set up the struct device. > diff --git a/include/linux/gpio/driver.h b/include/linux/gpio/driver.h > index a673a359e20b..b0728c8ad90c 100644 > --- a/include/linux/gpio/driver.h > +++ b/include/linux/gpio/driver.h > @@ -289,6 +289,7 @@ struct gpio_irq_chip { > * number or the name of the SoC IP-block implementing it. > * @gpiodev: the internal state holder, opaque struct > * @parent: optional parent device providing the GPIOs > + * @fwnode: optional fwnode providing this controller's properties > * @owner: helps prevent removal of modules exporting active GPIOs > * @request: optional hook for chip-specific activation, such as > * enabling module power and clock; may sleep > @@ -377,6 +378,7 @@ struct gpio_chip { > const char *label; > struct gpio_device *gpiodev; > struct device *parent; > + struct fwnode_handle *fwnode; > struct module *owner; > > int (*request)(struct gpio_chip *gc, > -- > 2.25.1 > -- With Best Regards, Andy Shevchenko