gpiolib: eventual of_node retirement
Subsystems (4)
Andy Shevchenko
maintainerv4 cover gpiolib: eventual of_node retirement
Now that all GPIO library users are converted to use fwnode, Drop redundant field from struct gpio_chip and accompanying code.
Bart, I prefer this series to go as soon as possible if you have no objection. Or even as v6.2 material.
Thierry, can you please test it once again, so we will be sure there is no breakage for OF platforms?
v4: added couple of additional patches to the bundle that missed
the merge window by one or another reason
v3: rebased against latest Linux Next: expected not to fail now
(Also keeping in mind Thierry's report, so reworked a bit)
v2: resent against latest Linux Next: expected not to fail now
(Linux Next has no more users of of_node member of gpio_chip)
v1: to test for now (using CIs and build bots) what is left unconverted
(Expected to fail in some configurations!)
Andy Shevchenko (3):
gpiolib: Introduce gpio_device_get() and gpio_device_put()
gpiolib: Get rid of not used of_node member
gpiolib: sort header inclusion alphabetically
drivers/gpio/gpiolib-acpi.c | 10 ------- drivers/gpio/gpiolib-acpi.h | 4 --- drivers/gpio/gpiolib-cdev.c | 21 ++++++------- drivers/gpio/gpiolib-of.c | 25 ++++------------ drivers/gpio/gpiolib-of.h | 5 ---- drivers/gpio/gpiolib.c | 60 +++++++++++++++++-------------------- drivers/gpio/gpiolib.h | 10 +++++++ include/linux/gpio/driver.h | 7 ----- 8 files changed, 51 insertions(+), 91 deletions(-)
base-commit: 1b929c02afd37871d5afb9d498426f83432e71c2
Signature · 1 line
2.35.1
Andy Shevchenko
maintainerPATCH v4 1/3 gpiolib: Introduce gpio_device_get() and gpio_device_put()
Introduce gpio_device_get() and gpio_device_put() helpers and convert existing users.
--- drivers/gpio/gpiolib-cdev.c | 21 +++++++++------------ drivers/gpio/gpiolib.c | 14 ++++++-------- drivers/gpio/gpiolib.h | 10 ++++++++++ 3 files changed, 25 insertions(+), 20 deletions(-)
drivers/gpio/gpiolib-cdev.c +9 -12
@@ -321,7 +321,7 @@ static void linehandle_free(struct linehandle_state *lh)if (lh->descs[i])gpiod_free (lh->descs[i]);kfree (lh->label); -put_device (&lh->gdev->dev); +gpio_device_put (lh->gdev);kfree (lh); }
@@ -363,8 +363,7 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip) lh =kzalloc (sizeof (*lh),GFP_KERNEL );if (!lh)return -ENOMEM ; - lh->gdev = gdev; -get_device (&gdev->dev); + lh->gdev =gpio_device_get (gdev);if (handlereq.consumer_label[0 ] !='\0' ) {/* label is only initialized if consumer_label is set */
@@ -1576,7 +1575,7 @@ static void linereq_free(struct linereq *lr) }kfifo_free (&lr->events);kfree (lr->label); -put_device (&lr->gdev->dev); +gpio_device_put (lr->gdev);kfree (lr); }
@@ -1646,8 +1645,7 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)if (!lr)return -ENOMEM ; - lr->gdev = gdev; -get_device (&gdev->dev); + lr->gdev =gpio_device_get (gdev);for (i =0 ; i < ulr.num_lines; i++) { lr->lines[i].req = lr;
@@ -1916,7 +1914,7 @@ static void lineevent_free(struct lineevent_state *le)if (le->desc)gpiod_free (le->desc);kfree (le->label); -put_device (&le->gdev->dev); +gpio_device_put (le->gdev);kfree (le); }
@@ -2094,8 +2092,7 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) le =kzalloc (sizeof (*le),GFP_KERNEL );if (!le)return -ENOMEM ; - le->gdev = gdev; -get_device (&gdev->dev); + le->gdev =gpio_device_get (gdev);if (eventreq.consumer_label[0 ] !='\0' ) {/* label is only initialized if consumer_label is set */
@@ -2671,7 +2668,7 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file)init_waitqueue_head (&cdev->wait);INIT_KFIFO (cdev->events); - cdev->gdev = gdev; + cdev->gdev =gpio_device_get (gdev); cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; ret = blocking_notifier_chain_register(&gdev->notifier,
@@ -2679,7 +2676,6 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file)if (ret) goto out_free_bitmap; -get_device (&gdev->dev); file->private_data = cdev; ret =nonseekable_open (inode, file);
@@ -2694,6 +2690,7 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file)blocking_notifier_chain_unregister (&gdev->notifier, &cdev->lineinfo_changed_nb); out_free_bitmap: +gpio_device_put (gdev);bitmap_free (cdev->watched_lines); out_free_cdev:kfree (cdev);
@@ -2716,7 +2713,7 @@ static int gpio_chrdev_release(struct inode *inode, struct file *file)bitmap_free (cdev->watched_lines);blocking_notifier_chain_unregister (&gdev->notifier, &cdev->lineinfo_changed_nb); -put_device (&gdev->dev); +gpio_device_put (gdev);kfree (cdev);return 0 ;
drivers/gpio/gpiolib.c +6 -8
@@ -882,7 +882,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,gpiochip_free_valid_mask (gc);if (gdev->dev.release) {/* release() has been registered by gpiochip_setup_dev() */ -put_device (&gdev->dev); +gpio_device_put (gdev); goto err_print_message; } err_remove_from_list:
@@ -972,7 +972,7 @@ void gpiochip_remove(struct gpio_chip *gc)*/ gcdev_unregister (gdev);up_write (&gdev->sem); -put_device (&gdev->dev); +gpio_device_put (gdev); }EXPORT_SYMBOL_GPL (gpiochip_remove);
@@ -2063,17 +2063,15 @@ static int validate_desc(const struct gpio_desc *desc, const char *func)int gpiod_request (struct gpio_desc *desc,const char *label) {int ret = -EPROBE_DEFER ; -struct gpio_device *gdev;VALIDATE_DESC (desc); - gdev = desc->gdev; -if (try_module_get (gdev->owner)) { +if (try_module_get (desc->gdev->owner)) { ret =gpiod_request_commit (desc, label);if (ret) -module_put (gdev->owner); +module_put (desc->gdev->owner);else -get_device (&gdev->dev); +gpio_device_get (desc->gdev); }if (ret)
@@ -2134,7 +2132,7 @@ void gpiod_free(struct gpio_desc *desc) {if (desc && desc->gdev &&gpiod_free_commit (desc)) {module_put (desc->gdev->owner); -put_device (&desc->gdev->dev); +gpio_device_put (desc->gdev); }else {WARN_ON (extra_checks); }
drivers/gpio/gpiolib.h +10 -0
@@ -82,6 +82,16 @@ static inline struct gpio_device *to_gpio_device(struct device *dev) return container_of(dev, struct gpio_device, dev); } +static inline struct gpio_device *gpio_device_get (struct gpio_device *gdev) +{ +return to_gpio_device (get_device (&gdev->dev)); +} + +static inline void gpio_device_put (struct gpio_device *gdev) +{ +put_device (&gdev->dev); +} +/* gpio suffixes used for ACPI and device tree lookup */ static __maybe_unused const char *const gpio_suffixes[] = {"gpios" ,"gpio" };
Signature · 1 line
2.35.1
Andy Shevchenko
maintainerPATCH v4 2/3 gpiolib: Get rid of not used of_node member
In reply to Andy ShevchenkoAll new drivers should use fwnode and / or parent to provide the necessary information to the GPIO library.
--- drivers/gpio/gpiolib-acpi.c | 10 ---------- drivers/gpio/gpiolib-acpi.h | 4 ---- drivers/gpio/gpiolib-of.c | 25 +++++-------------------- drivers/gpio/gpiolib-of.h | 5 ----- drivers/gpio/gpiolib.c | 11 +++-------- include/linux/gpio/driver.h | 7 ------- 6 files changed, 8 insertions(+), 54 deletions(-)
drivers/gpio/gpiolib-acpi.c +0 -10
@@ -1387,16 +1387,6 @@ void acpi_gpiochip_remove(struct gpio_chip *chip)kfree (acpi_gpio); } -void acpi_gpio_dev_init (struct gpio_chip *gc,struct gpio_device *gdev) -{ -/* Set default fwnode to parent's one if present */ -if (gc->parent) -ACPI_COMPANION_SET (&gdev->dev,ACPI_COMPANION (gc->parent)); - -if (gc->fwnode) -device_set_node (&gdev->dev, gc->fwnode); -} -static int acpi_gpio_package_count (const union acpi_object *obj) {const union acpi_object *element = obj->package.elements;
drivers/gpio/gpiolib-acpi.h +0 -4
@@ -26,8 +26,6 @@ struct gpio_device;void acpi_gpiochip_add (struct gpio_chip *chip);void acpi_gpiochip_remove (struct gpio_chip *chip); -void acpi_gpio_dev_init (struct gpio_chip *gc,struct gpio_device *gdev); -void acpi_gpiochip_request_interrupts (struct gpio_chip *chip);void acpi_gpiochip_free_interrupts (struct gpio_chip *chip);
@@ -42,8 +40,6 @@ int acpi_gpio_count(struct device *dev, const char *con_id);static inline void acpi_gpiochip_add (struct gpio_chip *chip) { }static inline void acpi_gpiochip_remove (struct gpio_chip *chip) { } -static inline void acpi_gpio_dev_init (struct gpio_chip *gc,struct gpio_device *gdev) { } -static inline void acpi_gpiochip_request_interrupts (struct gpio_chip *chip) { }
drivers/gpio/gpiolib-of.c +5 -20
@@ -668,7 +668,7 @@ static struct gpio_desc *of_parse_own_gpio(struct device_node *np,u32 tmp;int ret; - chip_np = chip->of_node; + chip_np =dev_of_node (&chip->gpiodev->dev);if (!chip_np)return ERR_PTR (-EINVAL );
@@ -760,7 +760,7 @@ static int of_gpiochip_scan_gpios(struct gpio_chip *chip)struct device_node *np;int ret; -for_each_available_child_of_node (chip->of_node, np) { +for_each_available_child_of_node (dev_of_node (&chip->gpiodev->dev), np) {if (!of_property_read_bool (np,"gpio-hog" ))continue ;
@@ -970,14 +970,15 @@ EXPORT_SYMBOL_GPL(of_mm_gpiochip_remove);#ifdef CONFIG_PINCTRL static int of_gpiochip_add_pin_range (struct gpio_chip *chip) { -struct device_node *np = chip->of_node;struct of_phandle_args pinspec;struct pinctrl_dev *pctldev; +struct device_node *np;int index =0 , ret;const char *name;static const char group_names_propname[] ="gpio-ranges-group-names" ;struct property *group_names; + np =dev_of_node (&chip->gpiodev->dev);if (!np)return 0 ;
@@ -1063,7 +1064,7 @@ int of_gpiochip_add(struct gpio_chip *chip)struct device_node *np;int ret; - np =to_of_node (dev_fwnode (&chip->gpiodev->dev)); + np =dev_of_node (&chip->gpiodev->dev);if (!np)return 0 ;
@@ -1092,19 +1093,3 @@ void of_gpiochip_remove(struct gpio_chip *chip) {fwnode_handle_put (chip->fwnode); } - -void of_gpio_dev_init (struct gpio_chip *gc,struct gpio_device *gdev) -{ -/* Set default OF node to parent's one if present */ -if (gc->parent) - gdev->dev.of_node = gc->parent->of_node; - -if (gc->fwnode) - gc->of_node =to_of_node (gc->fwnode); - -/* If the gpiochip has an assigned OF node this takes precedence */ -if (gc->of_node) - gdev->dev.of_node = gc->of_node; -else - gc->of_node = gdev->dev.of_node; -}
drivers/gpio/gpiolib-of.h +0 -5
@@ -23,7 +23,6 @@ struct gpio_desc *of_find_gpio(struct device_node *np,int of_gpiochip_add (struct gpio_chip *gc);void of_gpiochip_remove (struct gpio_chip *gc);int of_gpio_get_count (struct device *dev,const char *con_id); -void of_gpio_dev_init (struct gpio_chip *gc,struct gpio_device *gdev);#else static inline struct gpio_desc *of_find_gpio(struct device_node *np, const char *con_id,
@@ -38,10 +37,6 @@ static inline int of_gpio_get_count(struct device *dev, const char *con_id) {return 0 ; } -static inline void of_gpio_dev_init (struct gpio_chip *gc, -struct gpio_device *gdev) -{ -}#endif /* CONFIG_OF_GPIO */ extern struct notifier_block gpio_of_notifier;
drivers/gpio/gpiolib.c +3 -8
@@ -659,10 +659,12 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,int base =0 ;int ret =0 ; +/* If the calling driver did not initialize firmware node, do it here */ if (gc->fwnode) fwnode = gc->fwnode;else if (gc->parent) fwnode =dev_fwnode (gc->parent); + gc->fwnode = fwnode;/* * First: allocate and populate the internal stat container, and
@@ -676,14 +678,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, gdev->chip = gc; gc->gpiodev = gdev; -of_gpio_dev_init (gc, gdev); -acpi_gpio_dev_init (gc, gdev); - -/* -* Assign fwnode depending on the result of the previous calls, -* if none of them succeed, assign it to the parent's one. -*/ - gc->fwnode = gdev->dev.fwnode =dev_fwnode (&gdev->dev) ?: fwnode; +device_set_node (&gdev->dev, gc->fwnode); gdev->id =ida_alloc (&gpio_ida,GFP_KERNEL );if (gdev->id <0 ) {
include/linux/gpio/driver.h +0 -7
@@ -503,13 +503,6 @@ struct gpio_chip {* the device tree automatically may have an OF translation */ -/** -* @of_node: -* -* Pointer to a device tree node representing this GPIO controller. -*/ -struct device_node *of_node; -/** * @of_gpio_n_cells: *
Signature · 1 line
2.35.1
Andy Shevchenko
maintainerPATCH v4 3/3 gpiolib: sort header inclusion alphabetically
In reply to Andy ShevchenkoSort header inclusion alphabetically.
--- drivers/gpio/gpiolib.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-)
drivers/gpio/gpiolib.c +18 -17
@@ -1,34 +1,35 @@// SPDX-License-Identifier: GPL-2.0 +#include <linux/acpi.h> #include <linux/bitmap.h> -#include <linux/kernel.h> -#include <linux/module.h> -#include <linux/interrupt.h> -#include <linux/irq.h> -#include <linux/spinlock.h> -#include <linux/list.h> +#include <linux/compat.h> +#include <linux/debugfs.h> #include <linux/device.h> #include <linux/err.h> -#include <linux/debugfs.h> -#include <linux/seq_file.h> +#include <linux/file.h> +#include <linux/fs.h> #include <linux/gpio.h> -#include <linux/idr.h> -#include <linux/slab.h> -#include <linux/acpi.h> #include <linux/gpio/driver.h> #include <linux/gpio/machine.h> +#include <linux/idr.h> +#include <linux/interrupt.h> +#include <linux/irq.h> +#include <linux/kernel.h> +#include <linux/list.h> +#include <linux/module.h> #include <linux/pinctrl/consumer.h> -#include <linux/fs.h> -#include <linux/compat.h> -#include <linux/file.h> +#include <linux/seq_file.h> +#include <linux/slab.h> +#include <linux/spinlock.h> +#include <uapi/linux/gpio.h> -#include "gpiolib.h" -#include "gpiolib-of.h" #include "gpiolib-acpi.h" -#include "gpiolib-swnode.h" #include "gpiolib-cdev.h" +#include "gpiolib-of.h" +#include "gpiolib-swnode.h" #include "gpiolib-sysfs.h" +#include "gpiolib.h" #define CREATE_TRACE_POINTS #include <trace/events/gpio.h>
Signature · 1 line
2.35.1
Quoted 3 lines · Andy Shevchenko
Now that all GPIO library users are converted to use fwnode, Drop redundant field from struct
gpio_chipand accompanying code.
This is great stuff.
Yours,
Linus Walleij
Quoted 41 lines · Andy Shevchenko
Now that all GPIO library users are converted to use fwnode, Drop redundant field from struct
gpio_chipand accompanying code.Bart, I prefer this series to go as soon as possible if you have no objection. Or even as v6.2 material.
Thierry, can you please test it once again, so we will be sure there is no breakage for OF platforms?
Cc Thierry Reding <[email protected]>v4: added couple of additional patches to the bundle that missed
the merge window by one or another reasonv3: rebased against latest Linux Next: expected not to fail now
(Also keeping in mind Thierry's report, so reworked a bit)v2: resent against latest Linux Next: expected not to fail now
(Linux Next has no more users ofof_nodemember ofgpio_chip)v1: to test for now (using CIs and build bots) what is left unconverted
(Expected to fail in some configurations!)Andy Shevchenko (3):
gpiolib: Introducegpio_device_get()andgpio_device_put()
gpiolib: Get rid of not usedof_nodemember
gpiolib: sort header inclusion alphabeticallydrivers/gpio/gpiolib-acpi.c | 10 ------- drivers/gpio/gpiolib-acpi.h | 4 --- drivers/gpio/gpiolib-cdev.c | 21 ++++++------- drivers/gpio/gpiolib-of.c | 25 ++++------------ drivers/gpio/gpiolib-of.h | 5 ---- drivers/gpio/gpiolib.c | 60 +++++++++++++++++-------------------- drivers/gpio/gpiolib.h | 10 +++++++ include/linux/gpio/driver.h | 7 ----- 8 files changed, 51 insertions(+), 91 deletions(-)
Quoted 4 lines
base-commit:
1b929c02afd37871d5afb9d498426f83432e71c2--
2.35.1
I applied the series, let's give it some time in next and see that nothing breaks.
Bart
Quoted 9 lines · Andy Shevchenko
Now that all GPIO library users are converted to use fwnode, Drop redundant field from struct
gpio_chipand accompanying code.Bart, I prefer this series to go as soon as possible if you have no objection. Or even as v6.2 material.
Thierry, can you please test it once again, so we will be sure there is no breakage for OF platforms?
Seems to be working fine on at least Jetson TX1, so:
Andy Shevchenko
maintainerQuoted 8 lines · Thierry Reding
Quoted 7 lines · Andy Shevchenko
Now that all GPIO library users are converted to use fwnode, Drop redundant field from struct
gpio_chipand accompanying code.Bart, I prefer this series to go as soon as possible if you have no objection. Or even as v6.2 material.
Quoted 6 lines
Quoted 2 lines
Thierry, can you please test it once again, so we will be sure there is no breakage for OF platforms?
Seems to be working fine on at least Jetson TX1, so:
Tested-by Thierry Reding <[email protected]>
Thank you and HNY!
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 9 lines · Andy Shevchenko
Quoted 8 lines · Thierry Reding
Quoted 7 lines · Andy Shevchenko
Now that all GPIO library users are converted to use fwnode, Drop redundant field from struct
gpio_chipand accompanying code.Bart, I prefer this series to go as soon as possible if you have no objection. Or even as v6.2 material.
Quoted 8 lines
Quoted 6 lines
Quoted 2 lines
Thierry, can you please test it once again, so we will be sure there is no breakage for OF platforms?
Seems to be working fine on at least Jetson TX1, so:
Tested-by Thierry Reding <[email protected]>Thank you and HNY!
Happy New Year!
Thierry