History

gpio: store reflect the label to userspace

The gpio_chip label is useful for userspace to understand what kind of GPIO chip it is dealing with. Let's store a copy of this label in the gpio_device, add it to the struct passed to userspace for GPIO_GET_CHIPINFO_IOCTL and modify lsgpio to show it.

Linus Walleij committed 10 years ago

Commit df4878e1 parent 0a7439e5 files · +22 −3Browse files

Unified · Split

5 files
  1. drivers/gpio/gpiolib.c +13 −0
  2. drivers/gpio/gpiolib.h +3 −0
  3. include/linux/gpio/driver.h +2 −1
  4. include/uapi/linux/gpio.h +2 −0
  5. tools/gpio/lsgpio.c +2 −2
drivers/gpio/gpiolib.c+13−0
@@ -342,6 +342,9 @@ static long gpio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) · 341 unmodified lines
342342 strncpy(chipinfo.name, dev_name(&gdev->dev),
343343 sizeof(chipinfo.name));
344344 chipinfo.name[sizeof(chipinfo.name)-1] = '\0';
345+ strncpy(chipinfo.label, gdev->label,
346+ sizeof(chipinfo.label));
347+ chipinfo.label[sizeof(chipinfo.label)-1] = '\0';
345348 chipinfo.lines = gdev->ngpio;
346349 if (copy_to_user(ip, &chipinfo, sizeof(chipinfo)))
347350 return -EFAULT;
@@ -479,6 +482,16 @@ int gpiochip_add_data(struct gpio_chip *chip, void *data) · 131 unmodified lines
479482 status = -EINVAL;
480483 goto err_free_gdev;
481484 }
485+
486+ if (chip->label)
487+ gdev->label = devm_kstrdup(&gdev->dev, chip->label, GFP_KERNEL);
488+ else
489+ gdev->label = devm_kstrdup(&gdev->dev, "unknown", GFP_KERNEL);
490+ if (!gdev->label) {
491+ status = -ENOMEM;
492+ goto err_free_gdev;
493+ }
494+
482495 gdev->ngpio = chip->ngpio;
483496 gdev->data = data;
484497
drivers/gpio/gpiolib.h+3−0
@@ -37,6 +37,8 @@ struct acpi_device; · 36 unmodified lines
3737 * of the @descs array.
3838 * @base: GPIO base in the DEPRECATED global Linux GPIO numberspace, assigned
3939 * at device creation time.
40+ * @label: a descriptive name for the GPIO device, such as the part number
41+ * or name of the IP component in a System on Chip.
4042 * @data: per-instance data assigned by the driver
4143 * @list: links gpio_device:s together for traversal
4244 *
@@ -55,6 +57,7 @@ struct gpio_device { · 12 unmodified lines
5557 struct gpio_desc *descs;
5658 int base;
5759 u16 ngpio;
60+ char *label;
5861 void *data;
5962 struct list_head list;
6063
include/linux/gpio/driver.h+2−1
@@ -21,7 +21,8 @@ struct gpio_device; · 20 unmodified lines
2121
2222 /**
2323 * struct gpio_chip - abstract a GPIO controller
24− * @label: for diagnostics
24+ * @label: a functional name for the GPIO device, such as a part
25+ * number or the name of the SoC IP-block implementing it.
2526 * @gpiodev: the internal state holder, opaque struct
2627 * @parent: optional parent device providing the GPIOs
2728 * @owner: helps prevent removal of modules exporting active GPIOs
include/uapi/linux/gpio.h+2−0
@@ -16,10 +16,12 @@ · 15 unmodified lines
1616 /**
1717 * struct gpiochip_info - Information about a certain GPIO chip
1818 * @name: the name of this GPIO chip
19+ * @label: a functional name for this GPIO chip
1920 * @lines: number of GPIO lines on this chip
2021 */
2122 struct gpiochip_info {
2223 char name[32];
24+ char label[32];
2325 __u32 lines;
2426 };
2527
tools/gpio/lsgpio.c+2−2
@@ -54,8 +54,8 @@ int list_device(const char *device_name) · 53 unmodified lines
5454
5555 goto free_chrdev_name;
5656 }
57− fprintf(stdout, "GPIO chip: %s, %u GPIO lines\n",
58− cinfo.name, cinfo.lines);
57+ fprintf(stdout, "GPIO chip: %s, \"%s\", %u GPIO lines\n",
58+ cinfo.name, cinfo.label, cinfo.lines);
5959
6060 if (close(fd) == -1) {
6161 ret = -errno;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t