Re: [PATCH] pinctrl: st: stop abusing of_get_named_gpio()

From: Patrice CHOTARD
Date: Thu Sep 29 2022 - 04:50:11 EST


Hi Dmitry

On 9/28/22 22:20, Dmitry Torokhov wrote:
> Pin descriptions for this chip only look like standard GPIO device tree
> descriptions, while in fact they contain additional data (in excess of
> number of cells specified in description of gpio controllers). They also
> refer to only pins/gpios belonging to the driver and not to arbitrary
> gpio in the system.
>
> Because we want to stop exporting OF-specific handlers from gpiolib-of,
> let's parse the pin reference ourself instead of trying to call
> of_get_named_gpio().
>
> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx>
> ---
>
> Just compiled, not tested on real hardware.
>
> drivers/pinctrl/pinctrl-st.c | 34 ++++++++++++++++++++++++++++++----
> 1 file changed, 30 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
> index 0fea71fd9a00..cf7f9cbe6044 100644
> --- a/drivers/pinctrl/pinctrl-st.c
> +++ b/drivers/pinctrl/pinctrl-st.c
> @@ -12,7 +12,6 @@
> #include <linux/io.h>
> #include <linux/of.h>
> #include <linux/of_irq.h>
> -#include <linux/of_gpio.h> /* of_get_named_gpio() */
> #include <linux/of_address.h>
> #include <linux/gpio/driver.h>
> #include <linux/regmap.h>
> @@ -1162,6 +1161,31 @@ static void st_parse_syscfgs(struct st_pinctrl *info, int bank,
> return;
> }
>
> +static int st_pctl_dt_calculate_pin(struct st_pinctrl *info,
> + phandle bank, unsigned int offset)
> +{
> + struct device_node *np;
> + struct gpio_chip *chip;
> + int retval = -EINVAL;
> + int i;
> +
> + np = of_find_node_by_phandle(bank);
> + if (!np)
> + return -EINVAL;
> +
> + for (i = 0; i < info->nbanks; i++) {
> + chip = &info->banks[i].gpio_chip;
> + if (chip->of_node == np) {
> + if (offset < chip->ngpio)
> + retval = chip->base + offset;
> + break;
> + }
> + }
> +
> + of_node_put(np);
> + return retval;
> +}
> +
> /*
> * Each pin is represented in of the below forms.
> * <bank offset mux direction rt_type rt_delay rt_clk>
> @@ -1175,6 +1199,8 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
> struct device *dev = info->dev;
> struct st_pinconf *conf;
> struct device_node *pins;
> + phandle bank;
> + unsigned int offset;
> int i = 0, npins = 0, nr_props, ret = 0;
>
> pins = of_get_child_by_name(np, "st,pins");
> @@ -1214,9 +1240,9 @@ static int st_pctl_dt_parse_groups(struct device_node *np,
> conf = &grp->pin_conf[i];
>
> /* bank & offset */
> - be32_to_cpup(list++);
> - be32_to_cpup(list++);
> - conf->pin = of_get_named_gpio(pins, pp->name, 0);
> + bank = be32_to_cpup(list++);
> + offset = be32_to_cpup(list++);
> + conf->pin = st_pctl_dt_calculate_pin(info, bank, offset);
> conf->name = pp->name;
> grp->pins[i] = conf->pin;
> /* mux */

I tested it on stih410-b2260 board

Tested-by: Patrice Chotard <patrice.chotard@xxxxxxxxxxx>
Reviewed-by: Patrice Chotard <patrice.chotard@xxxxxxxxxxx>

Thanks
Patrice