gpiolib: Two new helpers and way toward fwnode
Subsystems (10)
v4 cover gpiolib: Two new helpers and way toward fwnode
This is a spin-off of the previous work of switching GPIO library to use fwnode instead of of_node. Here we introduce a couple of a new macro helpers, which allows to switch some of the drivers to use fwnode and partially fwnode APIs. As a result of this cleanup a few drivers switched to use GPIO fwnode instead of of_node.
Bart, Linus, I can take it thru my tree with an immutable branch if it's the way you prefer, otherwise please suggest on how to proceed.
Changelog v4:
- fixed compilation of the Samsung pin control drivers (LKP)
- explained in the commit message why namespacing is good for meson defs
- added tag to one of meson patches (Neil)
Changelog v3:
- moved count initialization to the definition in patch 2 (Geert)
- replaced of_args by args, used %pfwP in patch 7 (Geert)
- fixed kernel doc warning in patch 7
- added tags to patches 1, 2, 6, and 7 (Geert)
- added tag to patch 4 (Fabien)
- renamed MREG to MESON_REG in patch 9 (Neil)
- added tag to patch 10 (Neil)
- used --base for cover-letter
Changelog v2:
- properly based, so kbuild bot may test it (LKP)
- fixed typo in the macro (Geert)
- split to two macro helpers and rename the gpiochip_count()
- tagged one of stm32 and one of meson patches (Fabien, Neil)
- unified previously standalone armada patch
- due to above rewrote the armada patch from v1 completely (Sergey)
- added a lot of a new patches
- compile tested all of them on x86
Andy Shevchenko (13):
gpiolib: Introduce for_each_gpiochip_node() loop helper
gpiolib: Introduce gpiochip_node_count() helper
pinctrl: stm32: Replace custom code by gpiochip_node_count() call
pinctrl: stm32: Switch to use for_each_gpiochip_node() helper
pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
pinctrl: renesas: rza1: Replace custom code by gpiochip_node_count()
call
pinctrl: renesas: rza1: Switch to use for_each_gpiochip_node() helper
pinctrl: npcm7xx: Switch to use for_each_gpiochip_node() helper
pinctrl: meson: Rename REG_* to MESON_REG_*
pinctrl: meson: Enable COMPILE_TEST
pinctrl: meson: Replace custom code by gpiochip_node_count() call
pinctrl: armada-37xx: Switch to use fwnode instead of of_node
pinctrl: armada-37xx: Reuse GPIO fwnode in
armada_37xx_irqchip_register()
drivers/pinctrl/meson/Kconfig | 2 +- drivers/pinctrl/meson/pinctrl-meson.c | 52 ++++--- drivers/pinctrl/meson/pinctrl-meson.h | 24 ++-- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 34 ++--- drivers/pinctrl/nuvoton/pinctrl-npcm7xx.c | 142 +++++++++----------- drivers/pinctrl/renesas/pinctrl-rza1.c | 47 ++----- drivers/pinctrl/samsung/pinctrl-exynos.c | 8 +- drivers/pinctrl/samsung/pinctrl-s3c24xx.c | 2 +- drivers/pinctrl/samsung/pinctrl-s3c64xx.c | 4 +- drivers/pinctrl/samsung/pinctrl-samsung.c | 30 ++--- drivers/pinctrl/samsung/pinctrl-samsung.h | 2 +- drivers/pinctrl/stm32/pinctrl-stm32.c | 80 +++++------ include/linux/gpio/driver.h | 18 ++- 13 files changed, 198 insertions(+), 247 deletions(-)
base-commit: e5071887cd2296a7704dbcd10c1cedf0f11cdbd5
Signature · 1 line
2.35.1
PATCH v4 1/13 gpiolib: Introduce for_each_gpiochip_node() loop helper
Introduce for_each_gpiochip_node() loop helper which iterates over the GPIO controller child nodes of a given device.
--- include/linux/gpio/driver.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
include/linux/gpio/driver.h +6 -1
@@ -3,13 +3,14 @@#define __LINUX_GPIO_DRIVER_H#include <linux/device.h> -#include <linux/types.h> #include <linux/irq.h> #include <linux/irqchip/chained_irq.h> #include <linux/irqdomain.h> #include <linux/lockdep.h> #include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinconf-generic.h> +#include <linux/property.h> +#include <linux/types.h> struct gpio_desc ;struct of_phandle_args ;
@@ -750,4 +751,8 @@ static inline void gpiochip_unlock_as_irq(struct gpio_chip *gc, }#endif /* CONFIG_GPIOLIB */ +#define for_each_gpiochip_node (dev, child) \ + device_for_each_child_node(dev, child) \ + if (!fwnode_property_present(child, "gpio-controller")) {} else +#endif /* __LINUX_GPIO_DRIVER_H */
Signature · 1 line
2.35.1
Re: [PATCH v4 01/13] gpiolib: Introduce for_each_gpiochip_node() loop helper
Quoted 41 lines · Andy Shevchenko
Introduce
for_each_gpiochip_node()loop helper which iterates over the GPIO controller child nodes of a given device.Signed-off-by Andy Shevchenko <[email protected]>Reviewed-by Geert Uytterhoeven <[email protected]>Tested-by Geert Uytterhoeven <[email protected]>--- include/linux/gpio/driver.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)include/linux/gpio/driver.h +6
-2@@ -3,13 +3,14 @@#define __LINUX_GPIO_DRIVER_H#include <linux/device.h> -#include <linux/types.h> #include <linux/irq.h> #include <linux/irqchip/chained_irq.h> #include <linux/irqdomain.h> #include <linux/lockdep.h> #include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinconf-generic.h> +#include <linux/property.h> +#include <linux/types.h> struct gpio_desc ;struct of_phandle_args ;@@ -750,4 +751,8 @@ static inline void gpiochip_unlock_as_irq(struct gpio_chip *gc, }#endif /* CONFIG_GPIOLIB */ +#define for_each_gpiochip_node (dev, child) \ + device_for_each_child_node(dev, child) \ + if (!fwnode_property_present(child, "gpio-controller")) {} else +#endif /* __LINUX_GPIO_DRIVER_H */ --
Quoted 2 lines
2.35.1
_______________________________________________
linux-amlogic mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-amlogic
PATCH v4 2/13 gpiolib: Introduce gpiochip_node_count() helper
In reply to Andy ShevchenkoThe gpiochip_node_count() helper iterates over the device child nodes that have the "gpio-controller" property set. It returns the number of such nodes under a given device.
--- include/linux/gpio/driver.h | 11 +++++++++++ 1 file changed, 11 insertions(+)
include/linux/gpio/driver.h +11 -0
@@ -755,4 +755,15 @@ static inline void gpiochip_unlock_as_irq(struct gpio_chip *gc, device_for_each_child_node(dev, child) \if (!fwnode_property_present (child,"gpio-controller" )) {}else +static inline unsigned int gpiochip_node_count(struct device *dev) +{ +struct fwnode_handle *child; +unsigned int count =0 ; + +for_each_gpiochip_node (dev, child) + count++; + +return count; +} +#endif /* __LINUX_GPIO_DRIVER_H */
Signature · 1 line
2.35.1
Re: [PATCH v4 02/13] gpiolib: Introduce gpiochip_node_count() helper
Quoted 33 lines · Andy Shevchenko
The
gpiochip_node_count()helper iterates over the device child nodes that have the "gpio-controller" property set. It returns the number of such nodes under a given device.Signed-off-by Andy Shevchenko <[email protected]>Reviewed-by Geert Uytterhoeven <[email protected]>Tested-by Geert Uytterhoeven <[email protected]>--- include/linux/gpio/driver.h | 11 +++++++++++ 1 file changed, 11 insertions(+)include/linux/gpio/driver.h +11
-1@@ -755,4 +755,15 @@ static inline void gpiochip_unlock_as_irq(struct gpio_chip *gc, device_for_each_child_node(dev, child) \if (!fwnode_property_present (child,"gpio-controller" )) {}else +static inline unsigned int gpiochip_node_count(struct device *dev) +{ +struct fwnode_handle *child; +unsigned int count =0 ; + +for_each_gpiochip_node (dev, child) + count++; + +return count; +} +#endif /* __LINUX_GPIO_DRIVER_H */ --
Quoted 2 lines
2.35.1
_______________________________________________
linux-amlogic mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-amlogic
PATCH v4 3/13 pinctrl: stm32: Replace custom code by gpiochip_node_count() call
In reply to Andy ShevchenkoSince we have generic function to count GPIO controller nodes under a given device, there is no need to open code it. Replace custom code by gpiochip_node_count() call.
--- drivers/pinctrl/stm32/pinctrl-stm32.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/pinctrl/stm32/pinctrl-stm32.c +3 -5
@@ -1423,7 +1423,8 @@ int stm32_pctl_probe(struct platform_device *pdev)struct device *dev = &pdev->dev;struct stm32_pinctrl *pctl;struct pinctrl_pin_desc *pins; -int i, ret, hwlock_id, banks =0 ; +int i, ret, hwlock_id; +unsigned int banks;if (!np)return -EINVAL ;
@@ -1513,10 +1514,7 @@ int stm32_pctl_probe(struct platform_device *pdev)return PTR_ERR (pctl->pctl_dev); } -for_each_available_child_of_node (np, child) -if (of_property_read_bool (child,"gpio-controller" )) - banks++; - + banks =gpiochip_node_count (dev);if (!banks) {dev_err (dev,"at least one GPIO bank is required\n" );return -EINVAL ;
Signature · 1 line
2.35.1
PATCH v4 4/13 pinctrl: stm32: Switch to use for_each_gpiochip_node() helper
In reply to Andy ShevchenkoSwitch the code to use for_each_gpiochip_node() helper.
While at it, in order to avoid additional churn in the future, switch to fwnode APIs where it makes sense.
--- drivers/pinctrl/stm32/pinctrl-stm32.c | 72 ++++++++++++--------------- 1 file changed, 33 insertions(+), 39 deletions(-)
drivers/pinctrl/stm32/pinctrl-stm32.c +33 -39
@@ -24,6 +24,7 @@#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinmux.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/regmap.h> #include <linux/reset.h> #include <linux/slab.h>
@@ -1215,13 +1216,12 @@ static const struct pinconf_ops stm32_pconf_ops = { .pin_config_dbg_show = stm32_pconf_dbg_show, }; -static int stm32_gpiolib_register_bank (struct stm32_pinctrl *pctl, -struct device_node *np) +static int stm32_gpiolib_register_bank (struct stm32_pinctrl *pctl,struct fwnode_handle *fwnode) {struct stm32_gpio_bank *bank = &pctl->banks[pctl->nbanks];int bank_ioport_nr;struct pinctrl_gpio_range *range = &bank->range; -struct of_phandle_args args; +struct fwnode_reference_args args;struct device *dev = pctl->dev;struct resource res;int npins =STM32_GPIO_PINS_PER_BANK ;
@@ -1230,7 +1230,7 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl,if (!IS_ERR (bank->rstc))reset_control_deassert (bank->rstc); -if (of_address_to_resource (np,0 , &res)) +if (of_address_to_resource (to_of_node (fwnode),0 , &res))return -ENODEV ; bank->base =devm_ioremap_resource (dev, &res);
@@ -1245,15 +1245,15 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, bank->gpio_chip = stm32_gpio_template; -of_property_read_string (np,"st,bank-name" , &bank->gpio_chip.label); +fwnode_property_read_string (fwnode,"st,bank-name" , &bank->gpio_chip.label); -if (!of_parse_phandle_with_fixed_args (np,"gpio-ranges" ,3 , i, &args)) { +if (!fwnode_property_get_reference_args (fwnode,"gpio-ranges" ,NULL ,3 , i, &args)) { bank_nr = args.args[1 ] /STM32_GPIO_PINS_PER_BANK ; bank->gpio_chip.base = args.args[1 ];/* get the last defined gpio line (offset + nb of pins) */ npins = args.args[0 ] + args.args[2 ]; -while (!of_parse_phandle_with_fixed_args (np,"gpio-ranges" ,3 , ++i, &args)) +while (!fwnode_property_get_reference_args (fwnode,"gpio-ranges" ,NULL ,3 , ++i, &args)) npins =max (npins, (int )(args.args[0 ] + args.args[2 ])); }else { bank_nr = pctl->nbanks;
@@ -1268,20 +1268,20 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, &pctl->banks[bank_nr].range); } -if (of_property_read_u32 (np,"st,bank-ioport" , &bank_ioport_nr)) +if (fwnode_property_read_u32 (fwnode,"st,bank-ioport" , &bank_ioport_nr)) bank_ioport_nr = bank_nr; bank->gpio_chip.base = bank_nr *STM32_GPIO_PINS_PER_BANK ; bank->gpio_chip.ngpio = npins; - bank->gpio_chip.of_node = np; + bank->gpio_chip.fwnode = fwnode; bank->gpio_chip.parent = dev; bank->bank_nr = bank_nr; bank->bank_ioport_nr = bank_ioport_nr;spin_lock_init (&bank->lock);/* create irq hierarchical domain */ - bank->fwnode =of_node_to_fwnode (np); + bank->fwnode = fwnode; bank->domain = irq_domain_create_hierarchy(pctl->domain, 0, STM32_GPIO_IRQ_LINE, bank->fwnode,
@@ -1418,7 +1418,7 @@ static int stm32_pctrl_create_pins_tab(struct stm32_pinctrl *pctl,int stm32_pctl_probe (struct platform_device *pdev) {struct device_node *np = pdev->dev.of_node; -struct device_node *child; +struct fwnode_handle *child;const struct of_device_id *match;struct device *dev = &pdev->dev;struct stm32_pinctrl *pctl;
@@ -1525,40 +1525,34 @@ int stm32_pctl_probe(struct platform_device *pdev)return -ENOMEM ; i =0 ; -for_each_available_child_of_node (np, child) { +for_each_gpiochip_node (dev, child) {struct stm32_gpio_bank *bank = &pctl->banks[i]; +struct device_node *np =to_of_node (child); -if (of_property_read_bool (child,"gpio-controller" )) { - bank->rstc =of_reset_control_get_exclusive (child, -NULL ); -if (PTR_ERR (bank->rstc) == -EPROBE_DEFER ) { -of_node_put (child); -return -EPROBE_DEFER ; - } - - bank->clk =of_clk_get_by_name (child,NULL ); -if (IS_ERR (bank->clk)) { -if (PTR_ERR (bank->clk) != -EPROBE_DEFER ) -dev_err (dev, -"failed to get clk (%ld)\n" , -PTR_ERR (bank->clk)); -of_node_put (child); -return PTR_ERR (bank->clk); - } - i++; + bank->rstc =of_reset_control_get_exclusive (np,NULL ); +if (PTR_ERR (bank->rstc) == -EPROBE_DEFER ) { +fwnode_handle_put (child); +return -EPROBE_DEFER ; } - } -for_each_available_child_of_node (np, child) { -if (of_property_read_bool (child,"gpio-controller" )) { - ret =stm32_gpiolib_register_bank (pctl, child); -if (ret) { -of_node_put (child); -return ret; - } + bank->clk =of_clk_get_by_name (np,NULL ); +if (IS_ERR (bank->clk)) { +if (PTR_ERR (bank->clk) != -EPROBE_DEFER ) +dev_err (dev,"failed to get clk (%ld)\n" ,PTR_ERR (bank->clk)); +fwnode_handle_put (child); +return PTR_ERR (bank->clk); + } + i++; + } - pctl->nbanks++; +for_each_gpiochip_node (dev, child) { + ret =stm32_gpiolib_register_bank (pctl, child); +if (ret) { +fwnode_handle_put (child); +return ret; } + + pctl->nbanks++; }dev_info (dev,"Pinctrl STM32 initialized\n" );
Signature · 1 line
2.35.1
PATCH v4 5/13 pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
In reply to Andy ShevchenkoSwitch the code to use for_each_gpiochip_node() helper.
While at it, in order to avoid additional churn in the future, switch to fwnode APIs where it makes sense.
--- drivers/pinctrl/samsung/pinctrl-exynos.c | 8 +++--- drivers/pinctrl/samsung/pinctrl-s3c24xx.c | 2 +- drivers/pinctrl/samsung/pinctrl-s3c64xx.c | 4 +-- drivers/pinctrl/samsung/pinctrl-samsung.c | 30 +++++++++++------------ drivers/pinctrl/samsung/pinctrl-samsung.h | 2 +- 5 files changed, 22 insertions(+), 24 deletions(-)
drivers/pinctrl/samsung/pinctrl-exynos.c +4 -4
@@ -307,7 +307,7 @@ __init int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d) } bank->irq_chip->chip.name = bank->name; - bank->irq_domain =irq_domain_add_linear (bank->of_node, + bank->irq_domain =irq_domain_create_linear (bank->fwnode, bank->nr_pins, &exynos_eint_irqd_ops, bank);if (!bank->irq_domain) {dev_err (dev,"gpio irq domain add failed\n" );
@@ -565,7 +565,7 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) } bank->irq_chip->chip.name = bank->name; - bank->irq_domain =irq_domain_add_linear (bank->of_node, + bank->irq_domain =irq_domain_create_linear (bank->fwnode, bank->nr_pins, &exynos_eint_irqd_ops, bank);if (!bank->irq_domain) {dev_err (dev,"wkup irq domain add failed\n" );
@@ -573,7 +573,7 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)return -ENXIO ; } -if (!of_find_property (bank->of_node,"interrupts" ,NULL )) { +if (!fwnode_property_present (bank->fwnode,"interrupts" )) { bank->eint_type =EINT_TYPE_WKUP_MUX ; ++muxed_banks;continue ;
@@ -588,7 +588,7 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d) }for (idx =0 ; idx < bank->nr_pins; ++idx) { - irq =irq_of_parse_and_map (bank->of_node, idx); + irq =irq_of_parse_and_map (to_of_node (bank->fwnode), idx);if (!irq) {dev_err (dev,"irq number for eint-%s-%d not found\n" , bank->name, idx);
drivers/pinctrl/samsung/pinctrl-s3c24xx.c +1 -1
@@ -525,7 +525,7 @@ static int s3c24xx_eint_init(struct samsung_pinctrl_drv_data *d) ops = (bank->eint_offset ==0 ) ? &s3c24xx_gpf_irq_ops : &s3c24xx_gpg_irq_ops; - bank->irq_domain =irq_domain_add_linear (bank->of_node, + bank->irq_domain =irq_domain_create_linear (bank->fwnode, bank->nr_pins, ops, ddata);if (!bank->irq_domain) {dev_err (dev,"wkup irq domain add failed\n" );
drivers/pinctrl/samsung/pinctrl-s3c64xx.c +2 -2
@@ -471,7 +471,7 @@ static int s3c64xx_eint_gpio_init(struct samsung_pinctrl_drv_data *d) mask = bank->eint_mask; nr_eints =fls (mask); - bank->irq_domain =irq_domain_add_linear (bank->of_node, + bank->irq_domain =irq_domain_create_linear (bank->fwnode, nr_eints, &s3c64xx_gpio_irqd_ops, bank);if (!bank->irq_domain) {dev_err (dev,"gpio irq domain add failed\n" );
@@ -743,7 +743,7 @@ static int s3c64xx_eint_eint0_init(struct samsung_pinctrl_drv_data *d)return -ENOMEM ; ddata->bank = bank; - bank->irq_domain =irq_domain_add_linear (bank->of_node, + bank->irq_domain =irq_domain_create_linear (bank->fwnode, nr_eints, &s3c64xx_eint0_irqd_ops, ddata);if (!bank->irq_domain) {dev_err (dev,"wkup irq domain add failed\n" );
drivers/pinctrl/samsung/pinctrl-samsung.c +14 -16
@@ -18,6 +18,7 @@#include <linux/init.h> #include <linux/platform_device.h> #include <linux/io.h> +#include <linux/property.h> #include <linux/slab.h> #include <linux/err.h> #include <linux/gpio/driver.h>
@@ -966,7 +967,7 @@ static int samsung_gpiolib_register(struct platform_device *pdev, gc->base = bank->grange.base; gc->ngpio = bank->nr_pins; gc->parent = &pdev->dev; - gc->of_node = bank->of_node; + gc->fwnode = bank->fwnode; gc->label = bank->name; ret =devm_gpiochip_add_data (&pdev->dev, gc, bank);
@@ -1002,27 +1003,25 @@ samsung_pinctrl_get_soc_data_for_of_alias(struct platform_device *pdev)return &(of_data->ctrl[id]); } -static void samsung_banks_of_node_put (struct samsung_pinctrl_drv_data *d) +static void samsung_banks_node_put (struct samsung_pinctrl_drv_data *d) {struct samsung_pin_bank *bank;unsigned int i; bank = d->pin_banks;for (i =0 ; i < d->nr_banks; ++i, ++bank) -of_node_put (bank->of_node); +fwnode_handle_put (bank->fwnode); }/* * Iterate over all driver pin banks to find one matching the name of node, * skipping optional "-gpio" node suffix. When found, assign node to the bank. */ -static void samsung_banks_of_node_get (struct device *dev, -struct samsung_pinctrl_drv_data *d, -struct device_node *node) +static void samsung_banks_node_get (struct device *dev,struct samsung_pinctrl_drv_data *d) {const char *suffix ="-gpio-bank" ;struct samsung_pin_bank *bank; -struct device_node *child; +struct fwnode_handle *child;/* Pin bank names are up to 4 characters */ char node_name[20 ];unsigned int i;
@@ -1038,17 +1037,17 @@ static void samsung_banks_of_node_get(struct device *dev,continue ; } -for_each_child_of_node (node, child) { -if (!of_find_property (child,"gpio-controller" ,NULL )) -continue ; -if (of_node_name_eq (child, node_name)) +for_each_gpiochip_node (dev, child) { +struct device_node *np =to_of_node (child); + +if (of_node_name_eq (np, node_name))break ; -else if (of_node_name_eq (child, bank->name)) +if (of_node_name_eq (np, bank->name))break ; }if (child) - bank->of_node = child; + bank->fwnode = child;else dev_warn (dev,"Missing node for bank %s - invalid DTB\n" , bank->name);
@@ -1061,7 +1060,6 @@ static const struct samsung_pin_ctrl * samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d, struct platform_device *pdev) { - struct device_node *node = pdev->dev.of_node; const struct samsung_pin_bank_data *bdata;const struct samsung_pin_ctrl *ctrl;struct samsung_pin_bank *bank;
@@ -1125,7 +1123,7 @@ samsung_pinctrl_get_soc_data(struct samsung_pinctrl_drv_data *d,*/ d->virt_base = virt_base[0 ]; -samsung_banks_of_node_get (&pdev->dev, d, node); +samsung_banks_node_get (&pdev->dev, d); d->pin_base = pin_base; pin_base += d->nr_pins;
@@ -1186,7 +1184,7 @@ static int samsung_pinctrl_probe(struct platform_device *pdev) err_unregister:samsung_pinctrl_unregister (pdev, drvdata); err_put_banks: -samsung_banks_of_node_put (drvdata); +samsung_banks_node_put (drvdata);return ret; }
drivers/pinctrl/samsung/pinctrl-samsung.h +1 -1
@@ -165,7 +165,7 @@ struct samsung_pin_bank {u32 pin_base;void *soc_priv; -struct device_node *of_node; +struct fwnode_handle *fwnode;struct samsung_pinctrl_drv_data *drvdata;struct irq_domain *irq_domain;struct gpio_chip gpio_chip;
Signature · 1 line
2.35.1
Re: [PATCH v4 05/13] pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
Quoted 2 lines · Andy Shevchenko
Switch the code to use
for_each_gpiochip_node()helper.
(...)
drivers/pinctrl/samsung/pinctrl-samsung.c samsung_pinctrl_get_soc_data_for_of_alias(struct platform_device *pdev) · line 1020
Quoted 8 lines
/*
* Iterate over all driver pin banks to find one matching the name of node,
* skipping optional "-gpio" node suffix. When found, assign node to the bank. */drivers/pinctrl/samsung/pinctrl-samsung.c +1
-3-static void samsung_banks_of_node_get (struct device *dev, -struct samsung_pinctrl_drv_data *d, -struct device_node *node) +static void samsung_banks_node_get (struct device *dev,struct samsung_pinctrl_drv_data *d)
This is worth simplification anyway, so please split it to separate patch.
Quoted 9 lines
{
drivers/pinctrl/samsung/pinctrl-samsung.c +1
-1const char *suffix ="-gpio-bank" ;struct samsung_pin_bank *bank; -struct device_node *child; +struct fwnode_handle *child;/* Pin bank names are up to 4 characters */ char node_name[20 ];unsigned int i;
drivers/pinctrl/samsung/pinctrl-samsung.c static void samsung_banks_of_node_get(struct device *dev, · line 1043
Quoted 6 lines
drivers/pinctrl/samsung/pinctrl-samsung.c +0
-3@@ -1038,17 +1037,17 @@ static void samsung_banks_of_node_get(struct device *dev,continue ; } -for_each_child_of_node (node, child) { -if (!of_find_property (child,"gpio-controller" ,NULL )) -continue ;
This does not look equivalent. There are nodes without this property.
drivers/pinctrl/samsung/pinctrl-samsung.c static void samsung_banks_of_node_get(struct device *dev, · line 1047
Quoted 10 lines
drivers/pinctrl/samsung/pinctrl-samsung.c +5
-2-if (of_node_name_eq (child, node_name)) +for_each_gpiochip_node (dev, child) { +struct device_node *np =to_of_node (child); + +if (of_node_name_eq (np, node_name))break ; -else if (of_node_name_eq (child, bank->name)) +if (of_node_name_eq (np, bank->name))break ; }
This patch has to wait till someone provides you a tested-by. I might do it around next week.
Best regards,
Krzysztof
Re: [PATCH v4 05/13] pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
Quoted 2 lines · Krzysztof Kozlowski
Quoted 1 line · Andy Shevchenko
Switch the code to use
for_each_gpiochip_node()helper.
(...)
Quoted 10 lines
drivers/pinctrl/samsung/pinctrl-samsung.c samsung_pinctrl_get_soc_data_for_of_alias(struct platform_device *pdev) · line 1020
Quoted 8 lines
/*
* Iterate over all driver pin banks to find one matching the name of node,
* skipping optional "-gpio" node suffix. When found, assign node to the bank. */drivers/pinctrl/samsung/pinctrl-samsung.c +1
-3-static void samsung_banks_of_node_get (struct device *dev, -struct samsung_pinctrl_drv_data *d, -struct device_node *node) +static void samsung_banks_node_get (struct device *dev,struct samsung_pinctrl_drv_data *d)This is worth simplification anyway, so please split it to separate patch.
Not sure what to do and why it worth an additional churn.
Quoted 12 lines
Quoted 12 lines
{
drivers/pinctrl/samsung/pinctrl-samsung.c +1
-1const char *suffix ="-gpio-bank" ;struct samsung_pin_bank *bank; -struct device_node *child; +struct fwnode_handle *child;/* Pin bank names are up to 4 characters */ char node_name[20 ];unsigned int i;@@ -1038,17 +1037,17 @@ static void samsung_banks_of_node_get(struct device *dev,continue ; }
Quoted 5 lines
drivers/pinctrl/samsung/pinctrl-samsung.c static void samsung_banks_of_node_get(struct device *dev, · line 1043
Quoted 3 lines
drivers/pinctrl/samsung/pinctrl-samsung.c +0
-3-for_each_child_of_node (node, child) { -if (!of_find_property (child,"gpio-controller" ,NULL )) -continue ;This does not look equivalent. There are nodes without this property.
Not sure I understand why not. The macro checks for the property and iterates over nodes that have this property.
Can you elaborate, please?
Quoted 5 lines
Quoted 5 lines
drivers/pinctrl/samsung/pinctrl-samsung.c +4
-1-if (of_node_name_eq (child, node_name)) +for_each_gpiochip_node (dev, child) { +struct device_node *np =to_of_node (child); + +if (of_node_name_eq (np, node_name))
Quoted 8 lines
drivers/pinctrl/samsung/pinctrl-samsung.c static void samsung_banks_of_node_get(struct device *dev, · line 1047
Quoted 5 lines
drivers/pinctrl/samsung/pinctrl-samsung.c +1
-1break ; - else if (of_node_name_eq(child, bank->name)) +if (of_node_name_eq (np, bank->name))break ; }This patch has to wait till someone provides you a tested-by. I might do it around next week.
Fine with me, I will drop it from my repo for now.
Thanks for review!
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH v4 05/13] pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
Quoted 17 lines · Andy Shevchenko
Quoted 2 lines · Krzysztof Kozlowski
Quoted 1 line · Andy Shevchenko
Switch the code to use
for_each_gpiochip_node()helper.(...)
Quoted 10 lines
drivers/pinctrl/samsung/pinctrl-samsung.c samsung_pinctrl_get_soc_data_for_of_alias(struct platform_device *pdev) · line 1020
Quoted 8 lines
/*
* Iterate over all driver pin banks to find one matching the name of node,
* skipping optional "-gpio" node suffix. When found, assign node to the bank. */drivers/pinctrl/samsung/pinctrl-samsung.c +1
-3-static void samsung_banks_of_node_get (struct device *dev, -struct samsung_pinctrl_drv_data *d, -struct device_node *node) +static void samsung_banks_node_get (struct device *dev,struct samsung_pinctrl_drv_data *d)This is worth simplification anyway, so please split it to separate patch.
Quoted 1 line
Not sure what to do and why it worth an additional churn.
Makes this change smaller so it's easier to review.
Quoted 19 lines
Quoted 13 lines
Quoted 13 lines
{
drivers/pinctrl/samsung/pinctrl-samsung.c +1
-1const char *suffix ="-gpio-bank" ;struct samsung_pin_bank *bank; -struct device_node *child; +struct fwnode_handle *child;/* Pin bank names are up to 4 characters */ char node_name[20 ];unsigned int i;@@ -1038,17 +1037,17 @@ static void samsung_banks_of_node_get(struct device *dev,continue ; }Quoted 5 lines
drivers/pinctrl/samsung/pinctrl-samsung.c static void samsung_banks_of_node_get(struct device *dev, · line 1043
Quoted 3 lines
drivers/pinctrl/samsung/pinctrl-samsung.c +0
-3-for_each_child_of_node (node, child) { -if (!of_find_property (child,"gpio-controller" ,NULL )) -continue ;This does not look equivalent. There are nodes without this property.
Quoted 4 lines
Not sure I understand why not. The macro checks for the property and iterates over nodes that have this property.
Can you elaborate, please?
Eh, my bad, it is equivalent.
Quoted 15 lines
Quoted 14 lines
drivers/pinctrl/samsung/pinctrl-samsung.c static void samsung_banks_of_node_get(struct device *dev, · line 1047
Quoted 11 lines
drivers/pinctrl/samsung/pinctrl-samsung.c +5
-2-if (of_node_name_eq (child, node_name)) +for_each_gpiochip_node (dev, child) { +struct device_node *np =to_of_node (child); + +if (of_node_name_eq (np, node_name))break ; -else if (of_node_name_eq (child, bank->name)) +if (of_node_name_eq (np, bank->name))break ; }This patch has to wait till someone provides you a tested-by. I might do it around next week.
Quoted 1 line
Fine with me, I will drop it from my repo for now.
Best regards,
Krzysztof
Re: [PATCH v4 05/13] pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
Quoted 18 lines · Krzysztof Kozlowski
Quoted 17 lines · Andy Shevchenko
Quoted 2 lines · Krzysztof Kozlowski
Quoted 1 line · Andy Shevchenko
Switch the code to use
for_each_gpiochip_node()helper.(...)
Quoted 10 lines
drivers/pinctrl/samsung/pinctrl-samsung.c samsung_pinctrl_get_soc_data_for_of_alias(struct platform_device *pdev) · line 1020
Quoted 8 lines
/*
* Iterate over all driver pin banks to find one matching the name of node,
* skipping optional "-gpio" node suffix. When found, assign node to the bank. */drivers/pinctrl/samsung/pinctrl-samsung.c +1
-3-static void samsung_banks_of_node_get (struct device *dev, -struct samsung_pinctrl_drv_data *d, -struct device_node *node) +static void samsung_banks_node_get (struct device *dev,struct samsung_pinctrl_drv_data *d)This is worth simplification anyway, so please split it to separate patch.
Quoted 3 lines
Quoted 1 line
Not sure what to do and why it worth an additional churn.
Makes this change smaller so it's easier to review.
https://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git/log/?h=review-andy
That's how it looks like. Tell me if it is what you have had in mind.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH v4 05/13] pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
Quoted 6 lines · Andy Shevchenko
Quoted 2 lines
Makes this change smaller so it's easier to review.
https://git.kernel.org/pub/scm/linux/kernel/git/andy/linux-gpio-intel.git/log/?h=review-andy
That's how it looks like. Tell me if it is what you have had in mind.
Yes, thanks.
Best regards,
Krzysztof
Re: [PATCH v4 05/13] pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
In reply to Andy ShevchenkoQuoted 5 lines · Andy Shevchenko
Switch the code to use
for_each_gpiochip_node()helper.While at it, in order to avoid additional churn in the future, switch to fwnode APIs where it makes sense.
Quoted 9 lines
Signed-off-by Andy Shevchenko <[email protected]>--- drivers/pinctrl/samsung/pinctrl-exynos.c | 8 +++--- drivers/pinctrl/samsung/pinctrl-s3c24xx.c | 2 +- drivers/pinctrl/samsung/pinctrl-s3c64xx.c | 4 +-- drivers/pinctrl/samsung/pinctrl-samsung.c | 30 +++++++++++------------ drivers/pinctrl/samsung/pinctrl-samsung.h | 2 +- 5 files changed, 22 insertions(+), 24 deletions(-)
Best regards,
Krzysztof
Re: [PATCH v4 05/13] pinctrl: samsung: Switch to use for_each_gpiochip_node() helper
Quoted 15 lines · Krzysztof Kozlowski
Quoted 5 lines · Andy Shevchenko
Switch the code to use
for_each_gpiochip_node()helper.While at it, in order to avoid additional churn in the future, switch to fwnode APIs where it makes sense.
Quoted 8 lines
Signed-off-by Andy Shevchenko <[email protected]>--- drivers/pinctrl/samsung/pinctrl-exynos.c | 8 +++--- drivers/pinctrl/samsung/pinctrl-s3c24xx.c | 2 +- drivers/pinctrl/samsung/pinctrl-s3c64xx.c | 4 +-- drivers/pinctrl/samsung/pinctrl-samsung.c | 30 +++++++++++------------ drivers/pinctrl/samsung/pinctrl-samsung.h | 2 +- 5 files changed, 22 insertions(+), 24 deletions(-)
Quoted 1 line
Tested-by Krzysztof Kozlowski <[email protected]>
Thanks!
I'm going to spread this to two patches to which I pointed out before.
Signature · 2 lines
With Best Regards, Andy Shevchenko
PATCH v4 6/13 pinctrl: renesas: rza1: Replace custom code by gpiochip_node_count() call
In reply to Andy ShevchenkoSince we have generic function to count GPIO controller nodes under a given device, there is no need to open code it. Replace custom code by gpiochip_node_count() call.
--- drivers/pinctrl/renesas/pinctrl-rza1.c | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-)
drivers/pinctrl/renesas/pinctrl-rza1.c +1 -16
@@ -1154,21 +1154,6 @@ static const struct pinmux_ops rza1_pinmux_ops = {* RZ/A1 pin controller driver operations */ -static unsigned int rza1_count_gpio_chips (struct device_node *np) -{ -struct device_node *child; -unsigned int count =0 ; - -for_each_child_of_node (np, child) { -if (!of_property_read_bool (child,"gpio-controller" )) -continue ; - - count++; - } - -return count; -} -/** * rza1_parse_gpiochip() - parse and register a gpio chip and pin range *
@@ -1255,7 +1240,7 @@ static int rza1_gpio_register(struct rza1_pinctrl *rza1_pctl)unsigned int i;int ret; - ngpiochips =rza1_count_gpio_chips (np); + ngpiochips =gpiochip_node_count (rza1_pctl->dev);if (ngpiochips ==0 ) {dev_dbg (rza1_pctl->dev,"No gpiochip registered\n" );return 0 ;
Signature · 1 line
2.35.1
PATCH v4 7/13 pinctrl: renesas: rza1: Switch to use for_each_gpiochip_node() helper
In reply to Andy ShevchenkoSwitch the code to use for_each_gpiochip_node() helper.
While at it, in order to avoid additional churn in the future, switch to fwnode APIs where it makes sense.
--- drivers/pinctrl/renesas/pinctrl-rza1.c | 30 +++++++++++--------------- 1 file changed, 13 insertions(+), 17 deletions(-)
drivers/pinctrl/renesas/pinctrl-rza1.c +13 -17
@@ -24,6 +24,7 @@#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinmux.h> +#include <linux/property.h> #include <linux/slab.h> #include "../core.h"
@@ -1161,22 +1162,22 @@ static const struct pinmux_ops rza1_pinmux_ops = {* defined by gpio device tree binding documentation. * * @rza1_pctl: RZ/A1 pin controller device -* @np: of gpio-controller node +* @fwnode: gpio-controller firmware node * @chip: gpio chip to register to gpiolib * @range: pin range to register to pinctrl core */ static int rza1_parse_gpiochip (struct rza1_pinctrl *rza1_pctl, -struct device_node *np, +struct fwnode_handle *fwnode,struct gpio_chip *chip,struct pinctrl_gpio_range *range) {const char *list_name ="gpio-ranges" ; -struct of_phandle_args of_args; +struct fwnode_reference_args args;unsigned int gpioport;u32 pinctrl_base;int ret; - ret =of_parse_phandle_with_fixed_args (np, list_name,3 ,0 , &of_args); + ret =fwnode_property_get_reference_args (fwnode, list_name,NULL ,3 ,0 , &args);if (ret) {dev_err (rza1_pctl->dev,"Unable to parse %s list property\n" , list_name);
@@ -1187,7 +1188,7 @@ static int rza1_parse_gpiochip(struct rza1_pinctrl *rza1_pctl,* Find out on which port this gpio-chip maps to by inspecting the * second argument of the "gpio-ranges" property. */ - pinctrl_base = of_args.args[1 ]; + pinctrl_base = args.args[1 ]; gpioport =RZA1_PIN_ID_TO_PORT (pinctrl_base);if (gpioport >=RZA1_NPORTS ) { dev_err(rza1_pctl->dev,
@@ -1197,19 +1198,18 @@ static int rza1_parse_gpiochip(struct rza1_pinctrl *rza1_pctl, *chip = rza1_gpiochip_template; chip->base =-1 ; - chip->label =devm_kasprintf (rza1_pctl->dev,GFP_KERNEL ,"%pOFn" , - np); + chip->ngpio = args.args[2 ]; + chip->label =devm_kasprintf (rza1_pctl->dev,GFP_KERNEL ,"%pfwP" , fwnode);if (!chip->label)return -ENOMEM ; - chip->ngpio = of_args.args[2 ]; - chip->of_node = np; + chip->fwnode = fwnode; chip->parent = rza1_pctl->dev; range->id = gpioport; range->name = chip->label; range->pin_base = range->base = pinctrl_base; - range->npins = of_args.args[2 ]; + range->npins = args.args[2 ]; range->gc = chip; ret = devm_gpiochip_add_data(rza1_pctl->dev, chip,
@@ -1232,10 +1232,9 @@ static int rza1_parse_gpiochip(struct rza1_pinctrl *rza1_pctl,*/ static int rza1_gpio_register (struct rza1_pinctrl *rza1_pctl) { -struct device_node *np = rza1_pctl->dev->of_node;struct pinctrl_gpio_range *gpio_ranges;struct gpio_chip *gpio_chips; -struct device_node *child; +struct fwnode_handle *child;unsigned int ngpiochips;unsigned int i;int ret;
@@ -1254,14 +1253,11 @@ static int rza1_gpio_register(struct rza1_pinctrl *rza1_pctl)return -ENOMEM ; i =0 ; -for_each_child_of_node (np, child) { -if (!of_property_read_bool (child,"gpio-controller" )) -continue ; - +for_each_gpiochip_node (rza1_pctl->dev, child) { ret =rza1_parse_gpiochip (rza1_pctl, child, &gpio_chips[i], &gpio_ranges[i]);if (ret) { -of_node_put (child); +fwnode_handle_put (child);return ret; }
Signature · 1 line
2.35.1
PATCH v4 8/13 pinctrl: npcm7xx: Switch to use for_each_gpiochip_node() helper
In reply to Andy ShevchenkoSwitch the code to use for_each_gpiochip_node() helper.
While at it, in order to avoid additional churn in the future, do the following:
- use a temporary variable for struct device pointer to shorten a few lines
- get rid of a temporary variable for vIRQ number, assign it directly
- switch to fwnode APIs where it makes sense
--- drivers/pinctrl/nuvoton/pinctrl-npcm7xx.c | 142 ++++++++++------------ 1 file changed, 62 insertions(+), 80 deletions(-)
drivers/pinctrl/nuvoton/pinctrl-npcm7xx.c +62 -80
@@ -17,6 +17,7 @@#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinmux.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/regmap.h> /* GCR registers */
@@ -1862,88 +1863,69 @@ static int npcm7xx_gpio_of(struct npcm7xx_pinctrl *pctrl) {int ret = -ENXIO ;struct resource res; -int id =0 , irq; -struct device_node *np; -struct of_phandle_args pinspec; - -for_each_available_child_of_node (pctrl->dev->of_node, np) -if (of_find_property (np,"gpio-controller" ,NULL )) { - ret =of_address_to_resource (np,0 , &res); -if (ret <0 ) { -dev_err (pctrl->dev, -"Resource fail for GPIO bank %u\n" , id); -return ret; - } - - pctrl->gpio_bank[id].base = -ioremap (res.start,resource_size (&res)); - - irq =irq_of_parse_and_map (np,0 ); -if (irq <0 ) { -dev_err (pctrl->dev, -"No IRQ for GPIO bank %u\n" , id); - ret = irq; -return ret; - } - - ret =bgpio_init (&pctrl->gpio_bank[id].gc, - pctrl->dev,4 , - pctrl->gpio_bank[id].base + -NPCM7XX_GP_N_DIN , - pctrl->gpio_bank[id].base + -NPCM7XX_GP_N_DOUT , -NULL , -NULL , - pctrl->gpio_bank[id].base + -NPCM7XX_GP_N_IEM , -BGPIOF_READ_OUTPUT_REG_SET ); -if (ret) { -dev_err (pctrl->dev,"bgpio_init() failed\n" ); -return ret; - } - - ret =of_parse_phandle_with_fixed_args (np, -"gpio-ranges" ,3 , -0 , &pinspec); -if (ret <0 ) { -dev_err (pctrl->dev, -"gpio-ranges fail for GPIO bank %u\n" , - id); -return ret; - } - - pctrl->gpio_bank[id].irq = irq; - pctrl->gpio_bank[id].irq_chip = npcmgpio_irqchip; - pctrl->gpio_bank[id].gc.parent = pctrl->dev; - pctrl->gpio_bank[id].irqbase = - id *NPCM7XX_GPIO_PER_BANK ; - pctrl->gpio_bank[id].pinctrl_id = pinspec.args[0 ]; - pctrl->gpio_bank[id].gc.base = pinspec.args[1 ]; - pctrl->gpio_bank[id].gc.ngpio = pinspec.args[2 ]; - pctrl->gpio_bank[id].gc.owner =THIS_MODULE ; - pctrl->gpio_bank[id].gc.label = -devm_kasprintf (pctrl->dev,GFP_KERNEL ,"%pOF" , - np); -if (pctrl->gpio_bank[id].gc.label ==NULL ) -return -ENOMEM ; - - pctrl->gpio_bank[id].gc.dbg_show = npcmgpio_dbg_show; - pctrl->gpio_bank[id].direction_input = - pctrl->gpio_bank[id].gc.direction_input; - pctrl->gpio_bank[id].gc.direction_input = - npcmgpio_direction_input; - pctrl->gpio_bank[id].direction_output = - pctrl->gpio_bank[id].gc.direction_output; - pctrl->gpio_bank[id].gc.direction_output = - npcmgpio_direction_output; - pctrl->gpio_bank[id].request = - pctrl->gpio_bank[id].gc.request; - pctrl->gpio_bank[id].gc.request = npcmgpio_gpio_request; - pctrl->gpio_bank[id].gc.free = npcmgpio_gpio_free; - pctrl->gpio_bank[id].gc.of_node = np; - id++; +struct device *dev = pctrl->dev; +struct fwnode_reference_args args; +struct fwnode_handle *child; +int id =0 ; + +for_each_gpiochip_node (dev, child) { +struct device_node *np =to_of_node (child); + + ret =of_address_to_resource (np,0 , &res); +if (ret <0 ) { +dev_err (dev,"Resource fail for GPIO bank %u\n" , id); +return ret; + } + + pctrl->gpio_bank[id].base =ioremap (res.start,resource_size (&res)); + + ret =bgpio_init (&pctrl->gpio_bank[id].gc, dev,4 , + pctrl->gpio_bank[id].base +NPCM7XX_GP_N_DIN , + pctrl->gpio_bank[id].base +NPCM7XX_GP_N_DOUT , +NULL , +NULL , + pctrl->gpio_bank[id].base +NPCM7XX_GP_N_IEM , +BGPIOF_READ_OUTPUT_REG_SET ); +if (ret) { +dev_err (dev,"bgpio_init() failed\n" ); +return ret; } + ret =fwnode_property_get_reference_args (child,"gpio-ranges" ,NULL ,3 ,0 , &args); +if (ret <0 ) { +dev_err (dev,"gpio-ranges fail for GPIO bank %u\n" , id); +return ret; + } + + ret =irq_of_parse_and_map (np,0 ); +if (ret <0 ) { +dev_err (dev,"No IRQ for GPIO bank %u\n" , id); +return ret; + } + pctrl->gpio_bank[id].irq = ret; + pctrl->gpio_bank[id].irq_chip = npcmgpio_irqchip; + pctrl->gpio_bank[id].irqbase = id *NPCM7XX_GPIO_PER_BANK ; + pctrl->gpio_bank[id].pinctrl_id = args.args[0 ]; + pctrl->gpio_bank[id].gc.base = args.args[1 ]; + pctrl->gpio_bank[id].gc.ngpio = args.args[2 ]; + pctrl->gpio_bank[id].gc.owner =THIS_MODULE ; + pctrl->gpio_bank[id].gc.parent = dev; + pctrl->gpio_bank[id].gc.fwnode = child; + pctrl->gpio_bank[id].gc.label =devm_kasprintf (dev,GFP_KERNEL ,"%pfw" , child); +if (pctrl->gpio_bank[id].gc.label ==NULL ) +return -ENOMEM ; + + pctrl->gpio_bank[id].gc.dbg_show = npcmgpio_dbg_show; + pctrl->gpio_bank[id].direction_input = pctrl->gpio_bank[id].gc.direction_input; + pctrl->gpio_bank[id].gc.direction_input = npcmgpio_direction_input; + pctrl->gpio_bank[id].direction_output = pctrl->gpio_bank[id].gc.direction_output; + pctrl->gpio_bank[id].gc.direction_output = npcmgpio_direction_output; + pctrl->gpio_bank[id].request = pctrl->gpio_bank[id].gc.request; + pctrl->gpio_bank[id].gc.request = npcmgpio_gpio_request; + pctrl->gpio_bank[id].gc.free = npcmgpio_gpio_free; + id++; + } + pctrl->bank_num = id;return ret; }
Signature · 7 lines
2.35.1 _______________________________________________ linux-amlogic mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-amlogic
PATCH v4 9/13 pinctrl: meson: Rename REG_* to MESON_REG_*
In reply to Andy ShevchenkoCurrently compilation test fails on x86 due to name collision. The usual way to fix that is to move both conflicting parts to their own namespaces.
Rename REG_* to MESON_REG_* as a prerequisite for enabling COMPILE_TEST.
--- drivers/pinctrl/meson/pinctrl-meson.c | 24 ++++++++++++------------ drivers/pinctrl/meson/pinctrl-meson.h | 24 ++++++++++++------------ 2 files changed, 24 insertions(+), 24 deletions(-)
drivers/pinctrl/meson/pinctrl-meson.c +12 -12
@@ -218,13 +218,13 @@ static int meson_pinconf_set_output(struct meson_pinctrl *pc, unsigned int pin, bool out) { -return meson_pinconf_set_gpio_bit (pc, pin,REG_DIR , !out); +return meson_pinconf_set_gpio_bit (pc, pin,MESON_REG_DIR , !out); }static int meson_pinconf_get_output (struct meson_pinctrl *pc,unsigned int pin) { -int ret =meson_pinconf_get_gpio_bit (pc, pin,REG_DIR ); +int ret =meson_pinconf_get_gpio_bit (pc, pin,MESON_REG_DIR );if (ret <0 )return ret;
@@ -236,13 +236,13 @@ static int meson_pinconf_set_drive(struct meson_pinctrl *pc,unsigned int pin, bool high) { - return meson_pinconf_set_gpio_bit(pc, pin, REG_OUT, high); + return meson_pinconf_set_gpio_bit(pc, pin, MESON_REG_OUT, high); }static int meson_pinconf_get_drive (struct meson_pinctrl *pc,unsigned int pin) { -return meson_pinconf_get_gpio_bit (pc, pin,REG_OUT ); +return meson_pinconf_get_gpio_bit (pc, pin,MESON_REG_OUT ); } static int meson_pinconf_set_output_drive(struct meson_pinctrl *pc,
@@ -269,7 +269,7 @@ static int meson_pinconf_disable_bias(struct meson_pinctrl *pc,if (ret)return ret; -meson_calc_reg_and_bit (bank, pin,REG_PULLEN , ®, &bit); +meson_calc_reg_and_bit (bank, pin,MESON_REG_PULLEN , ®, &bit); ret =regmap_update_bits (pc->reg_pullen, reg,BIT (bit),0 );if (ret)return ret;
@@ -288,7 +288,7 @@ static int meson_pinconf_enable_bias(struct meson_pinctrl *pc, unsigned int pin,if (ret)return ret; -meson_calc_reg_and_bit (bank, pin,REG_PULL , ®, &bit); +meson_calc_reg_and_bit (bank, pin,MESON_REG_PULL , ®, &bit);if (pull_up) val =BIT (bit);
@@ -296,7 +296,7 @@ static int meson_pinconf_enable_bias(struct meson_pinctrl *pc, unsigned int pin,if (ret)return ret; -meson_calc_reg_and_bit (bank, pin,REG_PULLEN , ®, &bit); +meson_calc_reg_and_bit (bank, pin,MESON_REG_PULLEN , ®, &bit); ret =regmap_update_bits (pc->reg_pullen, reg,BIT (bit),BIT (bit));if (ret)return ret;
@@ -321,7 +321,7 @@ static int meson_pinconf_set_drive_strength(struct meson_pinctrl *pc,if (ret)return ret; -meson_calc_reg_and_bit (bank, pin,REG_DS , ®, &bit); +meson_calc_reg_and_bit (bank, pin,MESON_REG_DS , ®, &bit);if (drive_strength_ua <=500 ) { ds_val =MESON_PINCONF_DRV_500UA ;
@@ -407,7 +407,7 @@ static int meson_pinconf_get_pull(struct meson_pinctrl *pc, unsigned int pin)if (ret)return ret; -meson_calc_reg_and_bit (bank, pin,REG_PULLEN , ®, &bit); +meson_calc_reg_and_bit (bank, pin,MESON_REG_PULLEN , ®, &bit); ret =regmap_read (pc->reg_pullen, reg, &val);if (ret)
@@ -416,7 +416,7 @@ static int meson_pinconf_get_pull(struct meson_pinctrl *pc, unsigned int pin)if (!(val &BIT (bit))) { conf =PIN_CONFIG_BIAS_DISABLE ; }else { -meson_calc_reg_and_bit (bank, pin,REG_PULL , ®, &bit); +meson_calc_reg_and_bit (bank, pin,MESON_REG_PULL , ®, &bit); ret =regmap_read (pc->reg_pull, reg, &val);if (ret)
@@ -447,7 +447,7 @@ static int meson_pinconf_get_drive_strength(struct meson_pinctrl *pc,if (ret)return ret; -meson_calc_reg_and_bit (bank, pin,REG_DS , ®, &bit); +meson_calc_reg_and_bit (bank, pin,MESON_REG_DS , ®, &bit); ret =regmap_read (pc->reg_ds, reg, &val);if (ret)
@@ -595,7 +595,7 @@ static int meson_gpio_get(struct gpio_chip *chip, unsigned gpio)if (ret)return ret; -meson_calc_reg_and_bit (bank, gpio,REG_IN , ®, &bit); +meson_calc_reg_and_bit (bank, gpio,MESON_REG_IN , ®, &bit);regmap_read (pc->reg_gpio, reg, &val);return !!(val &BIT (bit));
drivers/pinctrl/meson/pinctrl-meson.h +12 -12
@@ -63,12 +63,12 @@ struct meson_reg_desc {* enum meson_reg_type - type of registers encoded in @meson_reg_desc */ enum meson_reg_type { -REG_PULLEN , -REG_PULL , -REG_DIR , -REG_OUT , -REG_IN , -REG_DS , +MESON_REG_PULLEN , +MESON_REG_PULL , +MESON_REG_DIR , +MESON_REG_OUT , +MESON_REG_IN , +MESON_REG_DS ,NUM_REG , };
@@ -150,12 +150,12 @@ struct meson_pinctrl { .irq_first = fi, \ .irq_last = li, \ .regs = { \ - [REG_PULLEN] = { per, peb }, \ - [REG_PULL] = { pr, pb }, \ - [REG_DIR] = { dr, db }, \ - [REG_OUT] = { or, ob }, \ - [REG_IN] = { ir, ib }, \ - [REG_DS] = { dsr, dsb }, \ + [MESON_REG_PULLEN] = { per, peb }, \ + [MESON_REG_PULL] = { pr, pb }, \ + [MESON_REG_DIR] = { dr, db }, \ + [MESON_REG_OUT] = { or, ob }, \ + [MESON_REG_IN] = { ir, ib }, \ + [MESON_REG_DS] = { dsr, dsb }, \ }, \ }
Signature · 1 line
2.35.1
Re: [PATCH v4 09/13] pinctrl: meson: Rename REG_* to MESON_REG_*
Hi Andy,
Quoted 6 lines · Andy Shevchenko
Currently compilation test fails on x86 due to name collision. The usual way to fix that is to move both conflicting parts to their own namespaces.
Rename REG_* to MESON_REG_* as a prerequisite for enabling
COMPILE_TEST.Signed-off-by Andy Shevchenko <[email protected]>
Thanks for your patch!
Quoted 9 lines
drivers/pinctrl/meson/pinctrl-meson.h +0
-3@@ -63,12 +63,12 @@ struct meson_reg_desc {* enum meson_reg_type - type of registers encoded in @meson_reg_desc */ enum meson_reg_type { -REG_PULLEN , -REG_PULL , -REG_DIR ,
drivers/pinctrl/meson/pinctrl-meson.h struct meson_reg_desc { · line 72
Quoted 10 lines
drivers/pinctrl/meson/pinctrl-meson.h +6
-3-REG_OUT , -REG_IN , -REG_DS , +MESON_REG_PULLEN , +MESON_REG_PULL , +MESON_REG_DIR , +MESON_REG_OUT , +MESON_REG_IN , +MESON_REG_DS , NUM_REG,
MESON_NUM_REG?
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Re: [PATCH v4 09/13] pinctrl: meson: Rename REG_* to MESON_REG_*
Quoted 10 lines · Geert Uytterhoeven
Quoted 6 lines · Andy Shevchenko
Currently compilation test fails on x86 due to name collision. The usual way to fix that is to move both conflicting parts to their own namespaces.
Rename REG_* to MESON_REG_* as a prerequisite for enabling
COMPILE_TEST.
NUM_REG,
MESON_NUM_REG?
Hmm... Only one place where it's defined and used, but I can do it, sure.
$ git grep -n -w NUM_REG drivers/pinctrl/meson/pinctrl-meson.h:72: NUM_REG, drivers/pinctrl/meson/pinctrl-meson.h:105: struct meson_reg_desc regs[NUM_REG];
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH v4 09/13] pinctrl: meson: Rename REG_* to MESON_REG_*
Quoted 3 lines · Andy Shevchenko
Quoted 2 lines · Geert Uytterhoeven
On Fri, Apr 1, 2022 at 12:36 PM Andy Shevchenko
<[email protected]> wrote:
...
Quoted 5 lines
Quoted 3 lines
Quoted 1 line
NUM_REG,
MESON_NUM_REG?Hmm... Only one place where it's defined and used, but I can do it, sure.
Updated locally.
Signature · 9 lines
With Best Regards, Andy Shevchenko _______________________________________________ linux-amlogic mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-amlogic
PATCH v4 10/13 pinctrl: meson: Enable COMPILE_TEST
In reply to Andy ShevchenkoEnable COMPILE_TEST for a better test coverage.
--- drivers/pinctrl/meson/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/meson/Kconfig +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only menuconfig PINCTRL_MESON tristate "Amlogic SoC pinctrl drivers" - depends on ARCH_MESON + depends on ARCH_MESON || COMPILE_TEST depends on OF default y select PINMUX
Signature · 1 line
2.35.1
PATCH v4 11/13 pinctrl: meson: Replace custom code by gpiochip_node_count() call
In reply to Andy ShevchenkoSince we have generic function to count GPIO controller nodes under a given device, there is no need to open code it. Replace custom code by gpiochip_node_count() call.
--- drivers/pinctrl/meson/pinctrl-meson.c | 28 ++++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-)
drivers/pinctrl/meson/pinctrl-meson.c +12 -16
@@ -49,6 +49,7 @@#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinmux.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/regmap.h> #include <linux/seq_file.h>
@@ -662,27 +663,22 @@ static struct regmap *meson_map_resource(struct meson_pinctrl *pc,return devm_regmap_init_mmio (pc->dev, base, &meson_regmap_config); } -static int meson_pinctrl_parse_dt (struct meson_pinctrl *pc, -struct device_node *node) +static int meson_pinctrl_parse_dt (struct meson_pinctrl *pc) { -struct device_node *np, *gpio_np =NULL ; +struct device_node *gpio_np; +unsigned int chips; -for_each_child_of_node (node, np) { -if (!of_find_property (np,"gpio-controller" ,NULL )) -continue ; -if (gpio_np) { -dev_err (pc->dev,"multiple gpio nodes\n" ); -of_node_put (np); -return -EINVAL ; - } - gpio_np = np; - } - -if (!gpio_np) { + chips =gpiochip_node_count (pc->dev); +if (!chips) {dev_err (pc->dev,"no gpio node found\n" );return -EINVAL ; } +if (chips >1 ) { +dev_err (pc->dev,"multiple gpio nodes\n" ); +return -EINVAL ; + } + gpio_np =to_of_node (device_get_named_child_node (pc->dev,"gpio-controller" )); pc->of_node = gpio_np; pc->reg_mux =meson_map_resource (pc, gpio_np,"mux" );
@@ -751,7 +747,7 @@ int meson_pinctrl_probe(struct platform_device *pdev) pc->dev = dev; pc->data = (struct meson_pinctrl_data *)of_device_get_match_data (dev); - ret =meson_pinctrl_parse_dt (pc, dev->of_node); + ret =meson_pinctrl_parse_dt (pc);if (ret)return ret;
Signature · 1 line
2.35.1
Re: [PATCH v4 11/13] pinctrl: meson: Replace custom code by gpiochip_node_count() call
Hi
Quoted 6 lines · Andy Shevchenko
Since we have generic function to count GPIO controller nodes under a given device, there is no need to open code it. Replace custom code by
gpiochip_node_count()call.Signed-off-by Andy Shevchenko <[email protected]>Reviewed-by Neil Armstrong <[email protected]>
This patch landed in linux next-20220413 as commit 88834c75cae5 ("pinctrl: meson: Replace custom code by gpiochip_node_count() call"). Unfortunately it breaks booting of all my Amlogic-based test boards (Odroid C4, N2, Khadas VIM3, VIM3l). MMC driver is no longer probed and boards are unable to mount rootfs. Reverting this patch on top of linux-next fixes the issue.
Quoted 55 lines
--- drivers/pinctrl/meson/pinctrl-meson.c | 28 ++++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-)drivers/pinctrl/meson/pinctrl-meson.c +11
-15@@ -49,6 +49,7 @@#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinmux.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/regmap.h> #include <linux/seq_file.h> @@ -662,27 +663,22 @@ static struct regmap *meson_map_resource(struct meson_pinctrl *pc,return devm_regmap_init_mmio (pc->dev, base, &meson_regmap_config); } -static int meson_pinctrl_parse_dt (struct meson_pinctrl *pc, -struct device_node *node) +static int meson_pinctrl_parse_dt (struct meson_pinctrl *pc) { -struct device_node *np, *gpio_np =NULL ; +struct device_node *gpio_np; +unsigned int chips; -for_each_child_of_node (node, np) { -if (!of_find_property (np,"gpio-controller" ,NULL )) -continue ; -if (gpio_np) { -dev_err (pc->dev,"multiple gpio nodes\n" ); -of_node_put (np); -return -EINVAL ; - } - gpio_np = np; - } - -if (!gpio_np) { + chips =gpiochip_node_count (pc->dev); +if (!chips) {dev_err (pc->dev,"no gpio node found\n" );return -EINVAL ; } +if (chips >1 ) { +dev_err (pc->dev,"multiple gpio nodes\n" ); +return -EINVAL ; + } + gpio_np =to_of_node (device_get_named_child_node (pc->dev,"gpio-controller" )); pc->of_node = gpio_np; pc->reg_mux =meson_map_resource (pc, gpio_np,"mux" );
drivers/pinctrl/meson/pinctrl-meson.c int meson_pinctrl_probe(struct platform_device *pdev) · line 753
Quoted 8 lines
drivers/pinctrl/meson/pinctrl-meson.c +1
-1@@ -751,7 +747,7 @@ int meson_pinctrl_probe(struct platform_device *pdev) pc->dev = dev; pc->data = (struct meson_pinctrl_data *)of_device_get_match_data (dev); - ret =meson_pinctrl_parse_dt (pc, dev->of_node); + ret =meson_pinctrl_parse_dt (pc);if (ret)return ret;
Best regards
Signature · 2 lines
Marek Szyprowski, PhD Samsung R&D Institute Poland
Re: [PATCH v4 11/13] pinctrl: meson: Replace custom code by gpiochip_node_count() call
Quoted 4 lines · Marek Szyprowski
Quoted 3 lines · Andy Shevchenko
Since we have generic function to count GPIO controller nodes under a given device, there is no need to open code it. Replace custom code by
gpiochip_node_count()call.
...
Quoted 6 lines
This patch landed in linux next-20220413 as commit
88834c75cae5("pinctrl: meson: Replace custom code bygpiochip_node_count()call"). Unfortunately it breaks booting of all my Amlogic-based test boards (Odroid C4, N2, Khadas VIM3, VIM3l). MMC driver is no longer probed and boards are unable to mount rootfs. Reverting this patch on top of linux-next fixes the issue.
Thank you for letting me know, I'll withdraw it and investigate.
Signature · 7 lines
With Best Regards, Andy Shevchenko _______________________________________________ linux-amlogic mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-amlogic
Martin Blumenstingl
reviewerRe: [PATCH v4 11/13] pinctrl: meson: Replace custom code by gpiochip_node_count() call
Hi Andy,
On Thu, Apr 14, 2022 at 3:51 PM Andy Shevchenko
<[email protected]> wrote:
[...]
Quoted 8 lines
Quoted 6 lines
This patch landed in linux next-20220413 as commit
88834c75cae5("pinctrl: meson: Replace custom code bygpiochip_node_count()call"). Unfortunately it breaks booting of all my Amlogic-based test boards (Odroid C4, N2, Khadas VIM3, VIM3l). MMC driver is no longer probed and boards are unable to mount rootfs. Reverting this patch on top of linux-next fixes the issue.Thank you for letting me know, I'll withdraw it and investigate.
If needed I can investigate further later today/tomorrow. I think the problem is that our node name doesn't follow the .dts recommendation.
For GXL (arch/arm64/boot/dts/amlogic/meson-gxl.dtsi) the GPIO controller nodes are for example:
gpio: bank@4b0 {
...
}
and
gpio_ao: bank@14 {
...}
See also:
$ git grep -C6 gpio-controller arch/arm64/boot/dts/amlogic/*.dtsi
Marek did not state which error he's getting but I suspect it fails with "no gpio node found".
Best regards,
Martin
_______________________________________________
linux-amlogic mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-amlogic
Re: [PATCH v4 11/13] pinctrl: meson: Replace custom code by gpiochip_node_count() call
Quoted 22 lines · Martin Blumenstingl
On Thu, Apr 14, 2022 at 3:51 PM Andy Shevchenko
<[email protected]> wrote:
[...]Quoted 8 lines
Quoted 6 lines
This patch landed in linux next-20220413 as commit
88834c75cae5("pinctrl: meson: Replace custom code bygpiochip_node_count()call"). Unfortunately it breaks booting of all my Amlogic-based test boards (Odroid C4, N2, Khadas VIM3, VIM3l). MMC driver is no longer probed and boards are unable to mount rootfs. Reverting this patch on top of linux-next fixes the issue.Thank you for letting me know, I'll withdraw it and investigate.
If needed I can investigate further later today/tomorrow. I think the problem is that our node name doesn't follow the .dts recommendation.
For GXL (
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi) the GPIO controller nodes are for example:gpio: bank@4b0 { ... } and gpio_ao: bank@14 { ...
Quoted 7 lines
}
See also:
$ git grep -C6 gpio-controller arch/arm64/boot/dts/amlogic/*.dtsiMarek did not state which error he's getting but I suspect it fails with "no gpio node found".
Would be interesting to know that, yeah.
The subtle difference between the patched and unpatched version is that the former uses only available nodes, it means that node is not available by some reason and then the error would be the one you guessed.
Signature · 7 lines
With Best Regards, Andy Shevchenko _______________________________________________ linux-amlogic mailing list [email protected] http://lists.infradead.org/mailman/listinfo/linux-amlogic
Re: [PATCH v4 11/13] pinctrl: meson: Replace custom code by gpiochip_node_count() call
Quoted 32 lines · Andy Shevchenko
Quoted 22 lines · Martin Blumenstingl
On Thu, Apr 14, 2022 at 3:51 PM Andy Shevchenko
<[email protected]> wrote:
[...]Quoted 8 lines
Quoted 6 lines
This patch landed in linux next-20220413 as commit
88834c75cae5("pinctrl: meson: Replace custom code bygpiochip_node_count()call"). Unfortunately it breaks booting of all my Amlogic-based test boards (Odroid C4, N2, Khadas VIM3, VIM3l). MMC driver is no longer probed and boards are unable to mount rootfs. Reverting this patch on top of linux-next fixes the issue.Thank you for letting me know, I'll withdraw it and investigate.
If needed I can investigate further later today/tomorrow. I think the problem is that our node name doesn't follow the .dts recommendation.
For GXL (
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi) the GPIO controller nodes are for example:gpio: bank@4b0 { ... } and gpio_ao: bank@14 { ...Quoted 7 lines
}
See also:
$ git grep -C6 gpio-controller arch/arm64/boot/dts/amlogic/*.dtsiMarek did not state which error he's getting but I suspect it fails with "no gpio node found".
Quoted 6 lines
Would be interesting to know that, yeah.
The subtle difference between the patched and unpatched version is that the former uses only available nodes, it means that node is not available by some reason and then the error would be the one you guessed.
Looking into the difference between iterating via available nodes I have found nothing suspicious. Your DTSes do not have status property, so it assumes the node is available.
I'm quite puzzled what's going on there. Because I can't see what the logical difference the patch brought in.
P.S. In any case it's withdrawn now and shouldn't appear in the next Linux Next. But I would really appreciate more input on this.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH v4 11/13] pinctrl: meson: Replace custom code by gpiochip_node_count() call
Quoted 44 lines · Andy Shevchenko
Quoted 32 lines · Andy Shevchenko
Quoted 22 lines · Martin Blumenstingl
On Thu, Apr 14, 2022 at 3:51 PM Andy Shevchenko
<[email protected]> wrote:
[...]Quoted 8 lines
Quoted 6 lines
This patch landed in linux next-20220413 as commit
88834c75cae5("pinctrl: meson: Replace custom code bygpiochip_node_count()call"). Unfortunately it breaks booting of all my Amlogic-based test boards (Odroid C4, N2, Khadas VIM3, VIM3l). MMC driver is no longer probed and boards are unable to mount rootfs. Reverting this patch on top of linux-next fixes the issue.Thank you for letting me know, I'll withdraw it and investigate.
If needed I can investigate further later today/tomorrow. I think the problem is that our node name doesn't follow the .dts recommendation.
For GXL (
arch/arm64/boot/dts/amlogic/meson-gxl.dtsi) the GPIO controller nodes are for example:gpio: bank@4b0 { ... } and gpio_ao: bank@14 { ...Quoted 7 lines
}
See also:
$ git grep -C6 gpio-controller arch/arm64/boot/dts/amlogic/*.dtsiMarek did not state which error he's getting but I suspect it fails with "no gpio node found".
Quoted 6 lines
Would be interesting to know that, yeah.
The subtle difference between the patched and unpatched version is that the former uses only available nodes, it means that node is not available by some reason and then the error would be the one you guessed.
Looking into the difference between iterating via available nodes I have found nothing suspicious. Your DTSes do not have status property, so it assumes the node is available.
Quoted 5 lines
I'm quite puzzled what's going on there. Because I can't see what the logical difference the patch brought in.
P.S. In any case it's withdrawn now and shouldn't appear in the next Linux Next. But I would really appreciate more input on this.
Okay, now I got it. The "name" of the node is not the same as containing the property with a given name. So, the faulting line of the code is this one:
gpio_np = to_of_node(device_get_named_child_node(pc->dev, "gpio-controller"));
Signature · 2 lines
With Best Regards, Andy Shevchenko
PATCH v4 12/13 pinctrl: armada-37xx: Switch to use fwnode instead of of_node
In reply to Andy ShevchenkoGPIO library now accepts fwnode as a firmware node, so switch the driver to use it.
--- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-)
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +7 -11
@@ -21,6 +21,7 @@#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinmux.h> #include <linux/platform_device.h> +#include <linux/property.h> #include <linux/regmap.h> #include <linux/slab.h> #include <linux/string_helpers.h>
@@ -787,18 +788,13 @@ static int armada_37xx_gpiochip_register(struct platform_device *pdev, struct armada_37xx_pinctrl *info) {struct device *dev = &pdev->dev; -struct device_node *np; +struct fwnode_handle *fwnode;struct gpio_chip *gc; -int ret = -ENODEV ; +int ret; -for_each_child_of_node (dev->of_node, np) { -if (of_find_property (np,"gpio-controller" ,NULL )) { - ret =0 ; -break ; - } - } -if (ret) -return ret; + fwnode =device_get_named_child_node (dev,"gpio-controller" ); +if (!fwnode) +return -ENODEV ; info->gpio_chip = armada_37xx_gpiolib_chip;
@@ -806,7 +802,7 @@ static int armada_37xx_gpiochip_register(struct platform_device *pdev, gc->ngpio = info->data->nr_pins; gc->parent = dev; gc->base =-1 ; - gc->of_node = np; + gc->fwnode = fwnode; gc->label = info->data->name; ret =armada_37xx_irqchip_register (pdev, info);
Signature · 1 line
2.35.1
PATCH v4 13/13 pinctrl: armada-37xx: Reuse GPIO fwnode in armada_37xx_irqchip_register()
In reply to Andy ShevchenkoSince we have fwnode of the first found GPIO controller assigned to the struct gpio_chip, we may reuse it in the armada_37xx_irqchip_register().
--- drivers/pinctrl/mvebu/pinctrl-armada-37xx.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-)
drivers/pinctrl/mvebu/pinctrl-armada-37xx.c +3 -13
@@ -727,23 +727,13 @@ static int armada_37xx_irqchip_register(struct platform_device *pdev,struct gpio_chip *gc = &info->gpio_chip;struct irq_chip *irqchip = &info->irq_chip;struct gpio_irq_chip *girq = &gc->irq; +struct device_node *np =to_of_node (gc->fwnode);struct device *dev = &pdev->dev; -struct device_node *np; -int ret = -ENODEV , i, nr_irq_parent; - -/* Check if we have at least one gpio-controller child node */ -for_each_child_of_node (dev->of_node, np) { -if (of_property_read_bool (np,"gpio-controller" )) { - ret =0 ; -break ; - } - } -if (ret) -return dev_err_probe (dev, ret,"no gpio-controller child node\n" ); +unsigned int i, nr_irq_parent; - nr_irq_parent =of_irq_count (np);spin_lock_init (&info->irq_lock); + nr_irq_parent =of_irq_count (np);if (!nr_irq_parent) {dev_err (dev,"invalid or no IRQ\n" );return 0 ;
Signature · 1 line
2.35.1
Quoted 8 lines · Andy Shevchenko
This is a spin-off of the previous work of switching GPIO library to use fwnode instead of
of_node. Here we introduce a couple of a new macro helpers, which allows to switch some of the drivers to use fwnode and partially fwnode APIs. As a result of this cleanup a few drivers switched to use GPIO fwnode instead ofof_node.Bart, Linus, I can take it thru my tree with an immutable branch if it's the way you prefer, otherwise please suggest on how to proceed.
I'm going to push this, without samsung patch(es), but addresing latest Geert's comment, to my for-next branch pending for PR to GPIO subsystem.
Please inform me within a few hours, if something should be postponed / dropped / etc.
Thanks!
Signature · 2 lines
With Best Regards, Andy Shevchenko