Suggestion on GPIO sysfs interface (gpio_export)

From: Kim Kyuwon
Date: Mon Apr 20 2009 - 01:23:18 EST


Hi All,

Exporting GPIOs by using gpio_export() is very useful to me.
But I want to access each GPIO by its name(or label) instead of
GPIO number, because GPIO label is more descriptive.

So I just modified gpio_export() to show the label information as shown below.
(This patch just shows the idea)

==
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 42fb2fd..392303d 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -363,7 +363,7 @@ static ssize_t export_store(struct class *class, const char *buf, size_t len)
if (status < 0)
goto done;

- status = gpio_export(gpio, true);
+ status = gpio_export(gpio, true, false);
if (status < 0)
gpio_free(gpio);
else
@@ -422,6 +422,7 @@ static struct class gpio_class = {
* gpio_export - export a GPIO through sysfs
* @gpio: gpio to make available, already requested
* @direction_may_change: true if userspace may change gpio direction
+ * @label_may_show: true if gpio label may show, instead of gpio number
* Context: arch_initcall or later
*
* When drivers want to make a GPIO accessible to userspace after they
@@ -433,7 +434,7 @@ static struct class gpio_class = {
*
* Returns zero on success, else an error.
*/
-int gpio_export(unsigned gpio, bool direction_may_change)
+int gpio_export(unsigned gpio, bool direction_may_change, bool label_may_show)
{
unsigned long flags;
struct gpio_desc *desc;
@@ -464,8 +465,15 @@ int gpio_export(unsigned gpio, bool direction_may_change)
if (status == 0) {
struct device *dev;

- dev = device_create(&gpio_class, desc->chip->dev, MKDEV(0, 0),
- desc, "gpio%d", gpio);
+#ifdef CONFIG_DEBUG_FS
+ if (label_may_show && desc->label)
+ dev = device_create(&gpio_class, desc->chip->dev,
+ MKDEV(0, 0), desc, "%s", desc->label);
+ else
+#endif
+ dev = device_create(&gpio_class, desc->chip->dev,
+ MKDEV(0, 0), desc, "gpio%d", gpio);
+
if (dev) {
if (direction_may_change)
status = sysfs_create_group(&dev->kobj,
diff --git a/drivers/mfd/dm355evm_msp.c b/drivers/mfd/dm355evm_msp.c
index 7ac12cb..4a37ff1 100644
--- a/drivers/mfd/dm355evm_msp.c
+++ b/drivers/mfd/dm355evm_msp.c
@@ -304,7 +304,7 @@ static int add_children(struct i2c_client *client)
gpio_direction_input(gpio);

/* make it easy for userspace to see these */
- gpio_export(gpio, false);
+ gpio_export(gpio, false, false);
}

/* MMC/SD inputs -- right after the last config input */
diff --git a/include/asm-generic/gpio.h b/include/asm-generic/gpio.h
index 81797ec..9852da4 100644
--- a/include/asm-generic/gpio.h
+++ b/include/asm-generic/gpio.h
@@ -135,7 +135,8 @@ extern int __gpio_to_irq(unsigned gpio);
* A sysfs interface can be exported by individual drivers if they want,
* but more typically is configured entirely from userspace.
*/
-extern int gpio_export(unsigned gpio, bool direction_may_change);
+extern int gpio_export(unsigned gpio, bool direction_may_change,
+ bool label_may_show);
extern void gpio_unexport(unsigned gpio);

#endif /* CONFIG_GPIO_SYSFS */
@@ -175,7 +176,8 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)

/* sysfs support is only available with gpiolib, where it's optional */

-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export(unsigned gpio, bool direction_may_change,
+ bool label_may_show)
{
return -ENOSYS;
}
diff --git a/include/linux/gpio.h b/include/linux/gpio.h
index e10c49a..1209149 100644
--- a/include/linux/gpio.h
+++ b/include/linux/gpio.h
@@ -82,7 +82,8 @@ static inline void gpio_set_value_cansleep(unsigned gpio, int value)
WARN_ON(1);
}

-static inline int gpio_export(unsigned gpio, bool direction_may_change)
+static inline int gpio_export(unsigned gpio, bool direction_may_change,
+ bool label_may_show)
{
/* GPIO can never have been requested or set as {in,out}put */
WARN_ON(1);
==

Can I ask you opinion about this idea?
If I get the positive answer, I will send the full patch set which
changes all board files and documentation related to gpio_export.

Regards,
Kim Kyuwon


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/