gpiolib: allow exporting gpios with custom names
Subsystems (2)
PATCH 1/1 gpiolib: allow exporting gpios with custom names
This allows exporting gpio pins to sysfs with custom names. Before this patch only gpiochip-supplied names was used, or generic gpio%d. Added gpiod_export_name() and gpio_export_name() functions. gpio_request_one() now uses new behaviour with 'label' as gpio name.
--- drivers/gpio/gpiolib-sysfs.c | 16 +++++++++++++++- drivers/gpio/gpiolib.h | 1 + include/asm-generic/gpio.h | 6 ++++++ include/linux/gpio/consumer.h | 2 ++ 4 files changed, 24 insertions(+), 1 deletion(-)
drivers/gpio/gpiolib-sysfs.c +15 -1
@@ -561,7 +561,9 @@ int gpiod_export(struct gpio_desc *desc, bool direction_may_change)spin_unlock_irqrestore (&gpio_lock, flags); offset =gpio_chip_hwgpio (desc); -if (desc->chip->names && desc->chip->names[offset]) +if (desc->ioname) + ioname = desc->ioname; +else if (desc->chip->names && desc->chip->names[offset]) ioname = desc->chip->names[offset]; dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
@@ -602,6 +604,18 @@ fail_unlock: }EXPORT_SYMBOL_GPL (gpiod_export); +int gpiod_export_name (struct gpio_desc *desc,bool direction_may_change, +const char *name) +{ +if (!desc) { +pr_debug ("%s: invalid gpio descriptor\n" , __func__); +return -EINVAL ; + } + desc->ioname = name; +return gpiod_export (desc, direction_may_change); +} +EXPORT_SYMBOL_GPL (gpiod_export_name); +static int match_export (struct device *dev,const void *data) {return dev_get_drvdata (dev) == data;
drivers/gpio/gpiolib.h +1 -0
@@ -64,6 +64,7 @@ extern struct list_head gpio_chips;struct gpio_desc {struct gpio_chip *chip; +const char *ioname;unsigned long flags;/* flag symbols are bit numbers */ #define FLAG_REQUESTED 0
include/asm-generic/gpio.h +6 -0
@@ -123,6 +123,12 @@ static inline int gpio_export(unsigned gpio, bool direction_may_change)return gpiod_export (gpio_to_desc (gpio), direction_may_change); } +static inline int gpio_export_name (unsigned gpio,bool direction_may_change, +const char *name) +{ +return gpiod_export_name (gpio_to_desc (gpio), direction_may_change, name); +} +static inline int gpio_export_link (struct device *dev,const char *name,unsigned gpio) {
include/linux/gpio/consumer.h +2 -0
@@ -324,6 +324,8 @@ static inline int desc_to_gpio(const struct gpio_desc *desc)#if IS_ENABLED (CONFIG_GPIOLIB ) &&IS_ENABLED (CONFIG_GPIO_SYSFS )int gpiod_export (struct gpio_desc *desc,bool direction_may_change); +int gpiod_export_name (struct gpio_desc *desc,bool direction_may_change, +const char *name);int gpiod_export_link (struct device *dev,const char *name,struct gpio_desc *desc);int gpiod_sysfs_set_active_low (struct gpio_desc *desc,int value);
Signature · 1 line
1.8.5.3
Hi,
Quoted 3 lines · Alexey Ignatov
This allows exporting gpio pins to sysfs with custom names. Before this patch only gpiochip-supplied names was used, or generic gpio%d. Added
gpiod_export_name()andgpio_export_name()functions.
This looks very similar to another proposal that has been posted a few months ago:
https://lkml.org/lkml/2014/7/23/537
There has been a lenghty discussion about the merits/drawbacks of doing this instead of using gpiod_export_link(). To summarize my opinion on the matter, I *really* think using gpiod_export_link() is a better solution since it puts the GPIO under its owner's /sysfs node, instead of having totally unrelated GPIOs arbitrarily named under /sys/class/gpio. IIRC Linus was not too enthusiastic neither.
Could you explain why you think this change is needed, how you plan to make use of it, and why you cannot use gpiod_export_link() to do the same?
Quoted 1 line
gpio_request_one()now uses new behaviour with 'label' as gpio name.
Doesn't this mean that drivers that used gpio_request_one() to export a GPIO might see the exported name change all of a sudden? This might make a few people unhappy (also, I could not see this change in your patch, but only had a quick look).