Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

gpio: remove gpiod_sysfs_set_active_low

Remove gpiod_sysfs_set_active_low (and gpio_sysfs_set_active_low) which
allowed code to change the polarity of a gpio line even after it had
been exported through sysfs.

Drivers should not care, and generally does not know, about gpio-line
polarity which is a hardware feature that needs to be described by
firmware.

It is currently possible to define gpio-line polarity in device-tree and
acpi firmware or using platform data. Userspace can also change the
polarity through sysfs.

Note that drivers using the legacy gpio interface could still use
GPIOF_ACTIVE_LOW to change the polarity before exporting the gpio.

There are no in-kernel users of this interface.

Cc: Jonathan Corbet <corbet@lwn.net>
Cc: Harry Wei <harryxiyou@gmail.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: linux-doc@vger.kernel.org
Cc: linux-kernel@zh-kernel.org
Cc: linux-arch@vger.kernel.org
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>

authored by

Johan Hovold and committed by
Linus Walleij
166a85e4 426577bd

+2 -89
-9
Documentation/gpio/gpio-legacy.txt
··· 751 751 int gpio_export_link(struct device *dev, const char *name, 752 752 unsigned gpio) 753 753 754 - /* change the polarity of a GPIO node in sysfs */ 755 - int gpio_sysfs_set_active_low(unsigned gpio, int value); 756 - 757 754 After a kernel driver requests a GPIO, it may only be made available in 758 755 the sysfs interface by gpio_export(). The driver can control whether the 759 756 signal direction may change. This helps drivers prevent userspace code ··· 764 767 symlinks from elsewhere in sysfs to the GPIO sysfs node. Drivers can 765 768 use this to provide the interface under their own device in sysfs with 766 769 a descriptive name. 767 - 768 - Drivers can use gpio_sysfs_set_active_low() to hide GPIO line polarity 769 - differences between boards from user space. This only affects the 770 - sysfs interface. Polarity change can be done both before and after 771 - gpio_export(), and previously enabled poll(2) support for either 772 - rising or falling edge will be reconfigured to follow this setting.
-8
Documentation/gpio/sysfs.txt
··· 132 132 int gpiod_export_link(struct device *dev, const char *name, 133 133 struct gpio_desc *desc); 134 134 135 - /* change the polarity of a GPIO node in sysfs */ 136 - int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value); 137 - 138 135 After a kernel driver requests a GPIO, it may only be made available in 139 136 the sysfs interface by gpiod_export(). The driver can control whether the 140 137 signal direction may change. This helps drivers prevent userspace code ··· 145 148 symlinks from elsewhere in sysfs to the GPIO sysfs node. Drivers can 146 149 use this to provide the interface under their own device in sysfs with 147 150 a descriptive name. 148 - 149 - Drivers can use gpiod_sysfs_set_active_low() to hide GPIO line polarity 150 - differences between boards from user space. Polarity change can be done both 151 - before and after gpiod_export(), and previously enabled poll(2) support for 152 - either rising or falling edge will be reconfigured to follow this setting.
-8
Documentation/zh_CN/gpio.txt
··· 638 638 int gpio_export_link(struct device *dev, const char *name, 639 639 unsigned gpio) 640 640 641 - /* 改变 sysfs 中的一个 GPIO 节点的极性 */ 642 - int gpio_sysfs_set_active_low(unsigned gpio, int value); 643 - 644 641 在一个内核驱动申请一个 GPIO 之后,它可以通过 gpio_export()使其在 sysfs 645 642 接口中可见。该驱动可以控制信号方向是否可修改。这有助于防止用户空间代码无意间 646 643 破坏重要的系统状态。 ··· 648 651 在 GPIO 被导出之后,gpio_export_link()允许在 sysfs 文件系统的任何地方 649 652 创建一个到这个 GPIO sysfs 节点的符号链接。这样驱动就可以通过一个描述性的 650 653 名字,在 sysfs 中他们所拥有的设备下提供一个(到这个 GPIO sysfs 节点的)接口。 651 - 652 - 驱动可以使用 gpio_sysfs_set_active_low() 来在用户空间隐藏电路板之间 653 - GPIO 线的极性差异。这个仅对 sysfs 接口起作用。极性的改变可以在 gpio_export() 654 - 前后进行,且之前使能的轮询操作(poll(2))支持(上升或下降沿)将会被重新配置来遵循 655 - 这个设置。
+2 -46
drivers/gpio/gpiolib-sysfs.c
··· 308 308 clear_bit(FLAG_ACTIVE_LOW, &desc->flags); 309 309 310 310 /* reconfigure poll(2) support if enabled on one edge only */ 311 - if (dev != NULL && (!!test_bit(FLAG_TRIG_RISE, &desc->flags) ^ 312 - !!test_bit(FLAG_TRIG_FALL, &desc->flags))) { 311 + if (!!test_bit(FLAG_TRIG_RISE, &desc->flags) ^ 312 + !!test_bit(FLAG_TRIG_FALL, &desc->flags)) { 313 313 unsigned long trigger_flags = desc->flags & GPIO_TRIGGER_MASK; 314 314 315 315 gpio_setup_irq(desc, dev, 0); ··· 679 679 return status; 680 680 } 681 681 EXPORT_SYMBOL_GPL(gpiod_export_link); 682 - 683 - /** 684 - * gpiod_sysfs_set_active_low - set the polarity of gpio sysfs value 685 - * @gpio: gpio to change 686 - * @value: non-zero to use active low, i.e. inverted values 687 - * 688 - * Set the polarity of /sys/class/gpio/gpioN/value sysfs attribute. 689 - * The GPIO does not have to be exported yet. If poll(2) support has 690 - * been enabled for either rising or falling edge, it will be 691 - * reconfigured to follow the new polarity. 692 - * 693 - * Returns zero on success, else an error. 694 - */ 695 - int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) 696 - { 697 - struct device *dev = NULL; 698 - int status = -EINVAL; 699 - 700 - if (!desc) { 701 - pr_warn("%s: invalid GPIO\n", __func__); 702 - return -EINVAL; 703 - } 704 - 705 - mutex_lock(&sysfs_lock); 706 - 707 - if (test_bit(FLAG_EXPORT, &desc->flags)) { 708 - dev = class_find_device(&gpio_class, NULL, desc, match_export); 709 - if (dev == NULL) { 710 - status = -ENODEV; 711 - goto unlock; 712 - } 713 - } 714 - 715 - status = sysfs_set_active_low(desc, dev, value); 716 - put_device(dev); 717 - unlock: 718 - mutex_unlock(&sysfs_lock); 719 - 720 - if (status) 721 - gpiod_dbg(desc, "%s: status %d\n", __func__, status); 722 - 723 - return status; 724 - } 725 - EXPORT_SYMBOL_GPL(gpiod_sysfs_set_active_low); 726 682 727 683 /** 728 684 * gpiod_unexport - reverse effect of gpio_export()
-5
include/asm-generic/gpio.h
··· 128 128 return gpiod_export_link(dev, name, gpio_to_desc(gpio)); 129 129 } 130 130 131 - static inline int gpio_sysfs_set_active_low(unsigned gpio, int value) 132 - { 133 - return gpiod_sysfs_set_active_low(gpio_to_desc(gpio), value); 134 - } 135 - 136 131 static inline void gpio_unexport(unsigned gpio) 137 132 { 138 133 gpiod_unexport(gpio_to_desc(gpio));
-7
include/linux/gpio.h
··· 196 196 return -EINVAL; 197 197 } 198 198 199 - static inline int gpio_sysfs_set_active_low(unsigned gpio, int value) 200 - { 201 - /* GPIO can never have been requested */ 202 - WARN_ON(1); 203 - return -EINVAL; 204 - } 205 - 206 199 static inline void gpio_unexport(unsigned gpio) 207 200 { 208 201 /* GPIO can never have been exported */
-6
include/linux/gpio/consumer.h
··· 449 449 int gpiod_export(struct gpio_desc *desc, bool direction_may_change); 450 450 int gpiod_export_link(struct device *dev, const char *name, 451 451 struct gpio_desc *desc); 452 - int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value); 453 452 void gpiod_unexport(struct gpio_desc *desc); 454 453 455 454 #else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ ··· 461 462 462 463 static inline int gpiod_export_link(struct device *dev, const char *name, 463 464 struct gpio_desc *desc) 464 - { 465 - return -ENOSYS; 466 - } 467 - 468 - static inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) 469 465 { 470 466 return -ENOSYS; 471 467 }