Re: [PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
* Grant Likely [120308 17:08]: > On Fri, 2 Mar 2012 11:06:15 -0800, Tony Lindgren wrote: > > > > Want to do that as a separate patch or want me to fold it in? > > I've got it as a separate commit in my gpio/next branch. OK great, below is my patch updated against gpio/next if you want to pick it up. Regards, Tony From: Tony Lindgren Date: Fri, 2 Mar 2012 11:30:23 -0800 Subject: [PATCH] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name() Currently there is no way for drivers to request a GPIO on a particular gpio chip using platform data. This makes it hard to support multiple GPIO controllers with platform driver with dynamic GPIO and interrupt numbering, such as with CONFIG_SPARSE_IRQ. Let's make it easier for platform device drivers to find GPIOs on a specific gpio_chip by adding two functions: gpiochip_find_by_name() and gpio_find_by_chip_name(). Note that these functions should not be used with device tree as pointed out by Grant Likely as the names are instantiated from device tree. As gpiochip_find() is already exported, we may as well export gpiochip_find_by_name() too. Cc: Grant Likely Cc: Linus Walleij Cc: Arnd Bergmann Cc: Rajendra Nayak Signed-off-by: Tony Lindgren --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1178,6 +1178,51 @@ struct gpio_chip *gpiochip_find(const void *data, } EXPORT_SYMBOL_GPL(gpiochip_find); +static int gpiochip_match_name(struct gpio_chip *chip, const void *name) +{ + return !strcmp(name, chip->label); +} + +/** + * gpiochip_find_by_name() - iterator for locating a gpio_chip by name + * @name: name of the gpio_chip + * + * Similar to bus_find_device_by_name. It returns a reference to the + * first gpio_chip with matching name. It ignores NULL and empty names. + * If you need to do something more complex, then use gpiochip_find. + */ +struct gpio_chip *gpiochip_find_by_name(const char *name) +{ + if (!name || !strcmp(name, "")) + return NULL; + + return gpiochip_find(name, gpiochip_match_name); +} +EXPORT_SYMBOL_GPL(gpiochip_find_by_name); + +/** + * gpio_find_by_chip_name() - find a gpio on a specific gpio_chip + * @chip_name: name of the gpio_chip + * @gpio_offset: offset of the gpio on the gpio_chip + * + * Note that gpiochip_find_by_name returns the first matching + * gpio_chip name. For more complex matching, see gpio_find. + */ +int gpio_find_by_chip_name(const char *chip_name, unsigned gpio_offset) +{ + struct gpio_chip *chip; + int gpio; + + chip = gpiochip_find_by_name(chip_name); + if (!chip) + return -ENODEV; + + gpio = chip->base + gpio_offset; + + return gpio; +} +EXPORT_SYMBOL_GPL(gpio_find_by_chip_name); + /* These "optional" allocation calls help prevent drivers from stomping * on each other, and help provide better diagnostics in debugfs. * They're called even less than the "set direction" calls. --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h @@ -145,7 +145,8 @@ extern int __must_check gpiochip_remove(struct gpio_chip *chip); extern struct gpio_chip *gpiochip_find(const void *data, int (*match)(struct gpio_chip *chip, const void *data)); - +extern struct gpio_chip *gpiochip_find_by_name(const char *name); +extern int gpio_find_by_chip_name(const char *chip_name, unsigned gpio_offset); /* Always use the library code for GPIO management calls, * or when sleeping may be involved. -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
On Fri, 2 Mar 2012 11:06:15 -0800, Tony Lindgren wrote: > * Grant Likely [120302 10:16]: > > On Fri, 2 Mar 2012 10:08:48 -0800, Tony Lindgren wrote: > > > * Tony Lindgren [120302 08:31]: > > > > * Grant Likely [120302 01:00]: > > > > > On Thu, 01 Mar 2012 10:55:24 -0800, Tony Lindgren > > > > > wrote: > > > > > > + > > > > > > +/** > > > > > > + * gpiochip_find_by_name() - iterator for locating a gpio_chip by > > > > > > name > > > > > > + * @name: name of the gpio_chip > > > > > > + * > > > > > > + * Similar to bus_find_device_by_name. It returns a reference to > > > > > > the > > > > > > + * first gpio_chip with matching name. It ignores NULL and empty > > > > > > names. > > > > > > + * If you need to do something more complex, then use > > > > > > gpiochip_find. > > > > > > + */ > > > > > > +struct gpio_chip *gpiochip_find_by_name(const char *name) > > > > > > +{ > > > > > > + if (!name || !strcmp(name, "")) > > > > > > + return NULL; > > > > > > + > > > > > > + return gpiochip_find((void *)name, match_name); > > > > > > > > > > Nasty cast. Can the signature for gpiochip_find be changed to accept > > > > > a (const void *)? > > > > > > > > I think so, this too comes from the bus code. > > > > > > Looks like it can't be const as of_node_to_gpiochip uses it with > > > a struct device_node * that for of_get_named_gpio_flags comes from > > > of_parse_phandle_with_args. > > > > Really? It sees to work fine here: > > Hmm right you are. I must have missed adding the const to > of_gpiochip_is_match, that's good news :) > > Want to do that as a separate patch or want me to fold it in? I've got it as a separate commit in my gpio/next branch. g. > > --- > > > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > > index d773540..e633a2a 100644 > > --- a/drivers/gpio/gpiolib.c > > +++ b/drivers/gpio/gpiolib.c > > @@ -1152,8 +1152,9 @@ EXPORT_SYMBOL_GPL(gpiochip_remove); > > * non-zero, this function will return to the caller and not iterate over > > any > > * more gpio_chips. > > */ > > -struct gpio_chip *gpiochip_find(void *data, > > - int (*match)(struct gpio_chip *chip, void > > *data)) > > +struct gpio_chip *gpiochip_find(const void *data, > > + int (*match)(struct gpio_chip *chip, > > +const void *data)) > > { > > struct gpio_chip *chip = NULL; > > unsigned long flags; > > diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c > > index e034b38..bba8121 100644 > > --- a/drivers/of/gpio.c > > +++ b/drivers/of/gpio.c > > @@ -229,7 +229,7 @@ void of_gpiochip_remove(struct gpio_chip *chip) > > } > > > > /* Private function for resolving node pointer to gpio_chip */ > > -static int of_gpiochip_is_match(struct gpio_chip *chip, void *data) > > +static int of_gpiochip_is_match(struct gpio_chip *chip, const void *data) > > { > > return chip->of_node == data; > > } > > diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h > > index 1ff4e22..5f52690 100644 > > --- a/include/asm-generic/gpio.h > > +++ b/include/asm-generic/gpio.h > > @@ -142,9 +142,9 @@ extern int __must_check gpiochip_reserve(int start, int > > ngpio); > > /* add/remove chips */ > > extern int gpiochip_add(struct gpio_chip *chip); > > extern int __must_check gpiochip_remove(struct gpio_chip *chip); > > -extern struct gpio_chip *gpiochip_find(void *data, > > +extern struct gpio_chip *gpiochip_find(const void *data, > > int (*match)(struct gpio_chip *chip, > > -void *data)); > > +const void *data)); > > > > > > /* Always use the library code for GPIO management calls, > > -- email sent from notmuch.vim plugin -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
* Grant Likely [120302 10:16]: > On Fri, 2 Mar 2012 10:08:48 -0800, Tony Lindgren wrote: > > * Tony Lindgren [120302 08:31]: > > > * Grant Likely [120302 01:00]: > > > > On Thu, 01 Mar 2012 10:55:24 -0800, Tony Lindgren > > > > wrote: > > > > > + > > > > > +/** > > > > > + * gpiochip_find_by_name() - iterator for locating a gpio_chip by > > > > > name > > > > > + * @name: name of the gpio_chip > > > > > + * > > > > > + * Similar to bus_find_device_by_name. It returns a reference to the > > > > > + * first gpio_chip with matching name. It ignores NULL and empty > > > > > names. > > > > > + * If you need to do something more complex, then use gpiochip_find. > > > > > + */ > > > > > +struct gpio_chip *gpiochip_find_by_name(const char *name) > > > > > +{ > > > > > + if (!name || !strcmp(name, "")) > > > > > + return NULL; > > > > > + > > > > > + return gpiochip_find((void *)name, match_name); > > > > > > > > Nasty cast. Can the signature for gpiochip_find be changed to accept > > > > a (const void *)? > > > > > > I think so, this too comes from the bus code. > > > > Looks like it can't be const as of_node_to_gpiochip uses it with > > a struct device_node * that for of_get_named_gpio_flags comes from > > of_parse_phandle_with_args. > > Really? It sees to work fine here: Hmm right you are. I must have missed adding the const to of_gpiochip_is_match, that's good news :) Want to do that as a separate patch or want me to fold it in? Tony > --- > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index d773540..e633a2a 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -1152,8 +1152,9 @@ EXPORT_SYMBOL_GPL(gpiochip_remove); > * non-zero, this function will return to the caller and not iterate over any > * more gpio_chips. > */ > -struct gpio_chip *gpiochip_find(void *data, > - int (*match)(struct gpio_chip *chip, void > *data)) > +struct gpio_chip *gpiochip_find(const void *data, > + int (*match)(struct gpio_chip *chip, > + const void *data)) > { > struct gpio_chip *chip = NULL; > unsigned long flags; > diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c > index e034b38..bba8121 100644 > --- a/drivers/of/gpio.c > +++ b/drivers/of/gpio.c > @@ -229,7 +229,7 @@ void of_gpiochip_remove(struct gpio_chip *chip) > } > > /* Private function for resolving node pointer to gpio_chip */ > -static int of_gpiochip_is_match(struct gpio_chip *chip, void *data) > +static int of_gpiochip_is_match(struct gpio_chip *chip, const void *data) > { > return chip->of_node == data; > } > diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h > index 1ff4e22..5f52690 100644 > --- a/include/asm-generic/gpio.h > +++ b/include/asm-generic/gpio.h > @@ -142,9 +142,9 @@ extern int __must_check gpiochip_reserve(int start, int > ngpio); > /* add/remove chips */ > extern int gpiochip_add(struct gpio_chip *chip); > extern int __must_check gpiochip_remove(struct gpio_chip *chip); > -extern struct gpio_chip *gpiochip_find(void *data, > +extern struct gpio_chip *gpiochip_find(const void *data, > int (*match)(struct gpio_chip *chip, > - void *data)); > + const void *data)); > > > /* Always use the library code for GPIO management calls, > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
On Fri, 2 Mar 2012 10:08:48 -0800, Tony Lindgren wrote: > * Tony Lindgren [120302 08:31]: > > * Grant Likely [120302 01:00]: > > > On Thu, 01 Mar 2012 10:55:24 -0800, Tony Lindgren > > > wrote: > > > > + > > > > +/** > > > > + * gpiochip_find_by_name() - iterator for locating a gpio_chip by name > > > > + * @name: name of the gpio_chip > > > > + * > > > > + * Similar to bus_find_device_by_name. It returns a reference to the > > > > + * first gpio_chip with matching name. It ignores NULL and empty names. > > > > + * If you need to do something more complex, then use gpiochip_find. > > > > + */ > > > > +struct gpio_chip *gpiochip_find_by_name(const char *name) > > > > +{ > > > > + if (!name || !strcmp(name, "")) > > > > + return NULL; > > > > + > > > > + return gpiochip_find((void *)name, match_name); > > > > > > Nasty cast. Can the signature for gpiochip_find be changed to accept > > > a (const void *)? > > > > I think so, this too comes from the bus code. > > Looks like it can't be const as of_node_to_gpiochip uses it with > a struct device_node * that for of_get_named_gpio_flags comes from > of_parse_phandle_with_args. Really? It sees to work fine here: --- diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index d773540..e633a2a 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1152,8 +1152,9 @@ EXPORT_SYMBOL_GPL(gpiochip_remove); * non-zero, this function will return to the caller and not iterate over any * more gpio_chips. */ -struct gpio_chip *gpiochip_find(void *data, - int (*match)(struct gpio_chip *chip, void *data)) +struct gpio_chip *gpiochip_find(const void *data, + int (*match)(struct gpio_chip *chip, +const void *data)) { struct gpio_chip *chip = NULL; unsigned long flags; diff --git a/drivers/of/gpio.c b/drivers/of/gpio.c index e034b38..bba8121 100644 --- a/drivers/of/gpio.c +++ b/drivers/of/gpio.c @@ -229,7 +229,7 @@ void of_gpiochip_remove(struct gpio_chip *chip) } /* Private function for resolving node pointer to gpio_chip */ -static int of_gpiochip_is_match(struct gpio_chip *chip, void *data) +static int of_gpiochip_is_match(struct gpio_chip *chip, const void *data) { return chip->of_node == data; } diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index 1ff4e22..5f52690 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h @@ -142,9 +142,9 @@ extern int __must_check gpiochip_reserve(int start, int ngpio); /* add/remove chips */ extern int gpiochip_add(struct gpio_chip *chip); extern int __must_check gpiochip_remove(struct gpio_chip *chip); -extern struct gpio_chip *gpiochip_find(void *data, +extern struct gpio_chip *gpiochip_find(const void *data, int (*match)(struct gpio_chip *chip, -void *data)); +const void *data)); /* Always use the library code for GPIO management calls, -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
* Tony Lindgren [120302 08:31]: > * Grant Likely [120302 01:00]: > > On Thu, 01 Mar 2012 10:55:24 -0800, Tony Lindgren wrote: > > > + > > > +/** > > > + * gpiochip_find_by_name() - iterator for locating a gpio_chip by name > > > + * @name: name of the gpio_chip > > > + * > > > + * Similar to bus_find_device_by_name. It returns a reference to the > > > + * first gpio_chip with matching name. It ignores NULL and empty names. > > > + * If you need to do something more complex, then use gpiochip_find. > > > + */ > > > +struct gpio_chip *gpiochip_find_by_name(const char *name) > > > +{ > > > + if (!name || !strcmp(name, "")) > > > + return NULL; > > > + > > > + return gpiochip_find((void *)name, match_name); > > > > Nasty cast. Can the signature for gpiochip_find be changed to accept > > a (const void *)? > > I think so, this too comes from the bus code. Looks like it can't be const as of_node_to_gpiochip uses it with a struct device_node * that for of_get_named_gpio_flags comes from of_parse_phandle_with_args. Regards, Tony -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
Hi, Correcting a typo in the LKML address.. * Grant Likely [120302 01:00]: > On Thu, 01 Mar 2012 10:55:24 -0800, Tony Lindgren wrote: > > Currently there is no way for drivers to request a GPIO on a particular > > gpio chip. This makes it hard to support multiple GPIO controllers > > with dynamic GPIO and interrupt numbering, such as with CONFIG_SPARSE_IRQ. > > > > Make it easier for device drivers to find GPIOs on a specific gpio_chip > > by adding two functions: gpiochip_find_by_name() and > > gpio_find_by_chip_name(). > > > > Note that as gpiochip_find() is already exported, we may as well > > export gpiochip_find_by_name() too. > > How is the device going to know the name of the gpio controller? I > don't particularly like interfaces that find devices by-names since > I don't think device names can be relied to be stable when devices > are instantiated from device tree data. The gpio_chip name + gpio offset is coming from pdata until things are converted over to use DT. For DT, this should not be needed, this is needed for removing callbacks in pdata so we can clean up some drivers and keep them working with both pdata and DT until things are converted over to DT. > > +static int match_name(struct gpio_chip *chip, void *data) > > Even though this is a static, please keep the prefix to avoid > namespace conflicts. gpiochip_match_name() > > > +{ > > + const char *name = data; > > This is unnecessary; the void* can be passed directly to sysfs_streq... > but why is sysfs_streq being used here instead of strcmp? This is > not sysfs related code. That comes from the bus code, will take a look. > > + > > + return sysfs_streq(name, chip->label); > > +} > > + > > +/** > > + * gpiochip_find_by_name() - iterator for locating a gpio_chip by name > > + * @name: name of the gpio_chip > > + * > > + * Similar to bus_find_device_by_name. It returns a reference to the > > + * first gpio_chip with matching name. It ignores NULL and empty names. > > + * If you need to do something more complex, then use gpiochip_find. > > + */ > > +struct gpio_chip *gpiochip_find_by_name(const char *name) > > +{ > > + if (!name || !strcmp(name, "")) > > + return NULL; > > + > > + return gpiochip_find((void *)name, match_name); > > Nasty cast. Can the signature for gpiochip_find be changed to accept > a (const void *)? I think so, this too comes from the bus code. Regards, Tony -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
On Thu, 01 Mar 2012 10:55:24 -0800, Tony Lindgren wrote: > Currently there is no way for drivers to request a GPIO on a particular > gpio chip. This makes it hard to support multiple GPIO controllers > with dynamic GPIO and interrupt numbering, such as with CONFIG_SPARSE_IRQ. > > Make it easier for device drivers to find GPIOs on a specific gpio_chip > by adding two functions: gpiochip_find_by_name() and gpio_find_by_chip_name(). > > Note that as gpiochip_find() is already exported, we may as well > export gpiochip_find_by_name() too. How is the device going to know the name of the gpio controller? I don't particularly like interfaces that find devices by-names since I don't think device names can be relied to be stable when devices are instantiated from device tree data. > > Cc: Grant Likely > Cc: Linus Walleij > Cc: Arnd Bergmann > Cc: Rajendra Nayak > Signed-off-by: Tony Lindgren > --- > drivers/gpio/gpiolib.c | 47 > > include/asm-generic/gpio.h |3 ++- > 2 files changed, 49 insertions(+), 1 deletions(-) > > diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c > index 17fdf4b..0e5bf55 100644 > --- a/drivers/gpio/gpiolib.c > +++ b/drivers/gpio/gpiolib.c > @@ -1173,6 +1173,53 @@ struct gpio_chip *gpiochip_find(void *data, > } > EXPORT_SYMBOL_GPL(gpiochip_find); > > +static int match_name(struct gpio_chip *chip, void *data) Even though this is a static, please keep the prefix to avoid namespace conflicts. gpiochip_match_name() > +{ > + const char *name = data; This is unnecessary; the void* can be passed directly to sysfs_streq... but why is sysfs_streq being used here instead of strcmp? This is not sysfs related code. > + > + return sysfs_streq(name, chip->label); > +} > + > +/** > + * gpiochip_find_by_name() - iterator for locating a gpio_chip by name > + * @name: name of the gpio_chip > + * > + * Similar to bus_find_device_by_name. It returns a reference to the > + * first gpio_chip with matching name. It ignores NULL and empty names. > + * If you need to do something more complex, then use gpiochip_find. > + */ > +struct gpio_chip *gpiochip_find_by_name(const char *name) > +{ > + if (!name || !strcmp(name, "")) > + return NULL; > + > + return gpiochip_find((void *)name, match_name); Nasty cast. Can the signature for gpiochip_find be changed to accept a (const void *)? > +} > +EXPORT_SYMBOL_GPL(gpiochip_find_by_name); > + > +/** > + * gpio_find_by_chip_name() - find a gpio on a specific gpio_chip > + * @chip_name: name of the gpio_chip > + * @gpio_offset: offset of the gpio on the gpio_chip > + * > + * Note that gpiochip_find_by_name returns the first matching > + * gpio_chip name. For more complex matching, see gpio_find. > + */ > +int gpio_find_by_chip_name(const char *chip_name, unsigned gpio_offset) > +{ > + struct gpio_chip *chip; > + int gpio, res; > + > + chip = gpiochip_find_by_name(chip_name); > + if (!chip) > + return -ENODEV; > + > + gpio = chip->base + gpio_offset; > + > + return gpio; > +} > +EXPORT_SYMBOL_GPL(gpio_find_by_chip_name); > + > /* These "optional" allocation calls help prevent drivers from stomping > * on each other, and help provide better diagnostics in debugfs. > * They're called even less than the "set direction" calls. > diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h > index 1ff4e22..d7a2100 100644 > --- a/include/asm-generic/gpio.h > +++ b/include/asm-generic/gpio.h > @@ -145,7 +145,8 @@ extern int __must_check gpiochip_remove(struct gpio_chip > *chip); > extern struct gpio_chip *gpiochip_find(void *data, > int (*match)(struct gpio_chip *chip, >void *data)); > - > +extern struct gpio_chip *gpiochip_find_by_name(const char *name); > +extern int gpio_find_by_chip_name(const char *chip_name, unsigned > gpio_offset); > > /* Always use the library code for GPIO management calls, > * or when sleeping may be involved. > -- email sent from notmuch.vim plugin -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH 1/4] gpiolib: Add gpiochip_find_by_name() and gpio_find_by_chip_name()
Currently there is no way for drivers to request a GPIO on a particular gpio chip. This makes it hard to support multiple GPIO controllers with dynamic GPIO and interrupt numbering, such as with CONFIG_SPARSE_IRQ. Make it easier for device drivers to find GPIOs on a specific gpio_chip by adding two functions: gpiochip_find_by_name() and gpio_find_by_chip_name(). Note that as gpiochip_find() is already exported, we may as well export gpiochip_find_by_name() too. Cc: Grant Likely Cc: Linus Walleij Cc: Arnd Bergmann Cc: Rajendra Nayak Signed-off-by: Tony Lindgren --- drivers/gpio/gpiolib.c | 47 include/asm-generic/gpio.h |3 ++- 2 files changed, 49 insertions(+), 1 deletions(-) diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 17fdf4b..0e5bf55 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -1173,6 +1173,53 @@ struct gpio_chip *gpiochip_find(void *data, } EXPORT_SYMBOL_GPL(gpiochip_find); +static int match_name(struct gpio_chip *chip, void *data) +{ + const char *name = data; + + return sysfs_streq(name, chip->label); +} + +/** + * gpiochip_find_by_name() - iterator for locating a gpio_chip by name + * @name: name of the gpio_chip + * + * Similar to bus_find_device_by_name. It returns a reference to the + * first gpio_chip with matching name. It ignores NULL and empty names. + * If you need to do something more complex, then use gpiochip_find. + */ +struct gpio_chip *gpiochip_find_by_name(const char *name) +{ + if (!name || !strcmp(name, "")) + return NULL; + + return gpiochip_find((void *)name, match_name); +} +EXPORT_SYMBOL_GPL(gpiochip_find_by_name); + +/** + * gpio_find_by_chip_name() - find a gpio on a specific gpio_chip + * @chip_name: name of the gpio_chip + * @gpio_offset: offset of the gpio on the gpio_chip + * + * Note that gpiochip_find_by_name returns the first matching + * gpio_chip name. For more complex matching, see gpio_find. + */ +int gpio_find_by_chip_name(const char *chip_name, unsigned gpio_offset) +{ + struct gpio_chip *chip; + int gpio, res; + + chip = gpiochip_find_by_name(chip_name); + if (!chip) + return -ENODEV; + + gpio = chip->base + gpio_offset; + + return gpio; +} +EXPORT_SYMBOL_GPL(gpio_find_by_chip_name); + /* These "optional" allocation calls help prevent drivers from stomping * on each other, and help provide better diagnostics in debugfs. * They're called even less than the "set direction" calls. diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h index 1ff4e22..d7a2100 100644 --- a/include/asm-generic/gpio.h +++ b/include/asm-generic/gpio.h @@ -145,7 +145,8 @@ extern int __must_check gpiochip_remove(struct gpio_chip *chip); extern struct gpio_chip *gpiochip_find(void *data, int (*match)(struct gpio_chip *chip, void *data)); - +extern struct gpio_chip *gpiochip_find_by_name(const char *name); +extern int gpio_find_by_chip_name(const char *chip_name, unsigned gpio_offset); /* Always use the library code for GPIO management calls, * or when sleeping may be involved. -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html