From: Michael Riesch <michael.riesch@wolfvision.net> We've so far relied on GPIO controllers being named "gpioX", while the binding mandates gpio controllers being just called "gpio". This already broke rk3288 support and rk3568.dtsi upstream also differs from the version in barebox' arch/arm/dts in that regard. Instead, do like Linux does and use the alias to match the controllers to the GPIO banks with a fallback to probe order. Fixes: 3f2f5980d517 ("dts: update to v5.16-rc1") Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> [afa: drop strncmp in favor of id comparison, reword commit message] Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- drivers/pinctrl/pinctrl-rockchip.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index 5cf77c58b218..ea748b600419 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c @@ -877,18 +877,24 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data( struct rockchip_pin_bank *bank; char *name; int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; + int gpio = 0; match = of_match_node(rockchip_pinctrl_dt_match, node); ctrl = (struct rockchip_pin_ctrl *)match->data; for_each_child_of_node(node, np) { + int id; + if (!of_find_property(np, "gpio-controller", NULL)) continue; + id = of_alias_get_id(np, "gpio"); + if (id < 0) + id = gpio++; + bank = ctrl->pin_banks; for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { - name = bank->name; - if (!strncmp(name, np->name, strlen(name))) { + if (bank->bank_num == id) { bank->of_node = np; if (!rockchip_get_bank_data(bank, dev)) bank->valid = true; -- 2.30.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
&{/aliases} { gpio120 = &gpio1; } so far led to an out-of-bounds read when probing &gpio1. Fix this. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- drivers/pinctrl/pinctrl-rockchip.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c index ea748b600419..869cce198239 100644 --- a/drivers/pinctrl/pinctrl-rockchip.c +++ b/drivers/pinctrl/pinctrl-rockchip.c @@ -334,6 +334,8 @@ static int rockchip_gpio_probe(struct device_d *dev) int ret, bankno; bankno = of_alias_get_id(dev->device_node, "gpio"); + if (bankno >= ctrl->nr_banks) + bankno = -EINVAL; if (bankno < 0) return bankno; -- 2.30.2 _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
On 14.01.22 09:47, Ahmad Fatoum wrote: > From: Michael Riesch <michael.riesch@wolfvision.net> > > We've so far relied on GPIO controllers being named "gpioX", while the > binding mandates gpio controllers being just called "gpio". This already > broke rk3288 support and rk3568.dtsi upstream also differs from the > version in barebox' arch/arm/dts in that regard. > > Instead, do like Linux does and use the alias to match the controllers to > the GPIO banks with a fallback to probe order. > > Fixes: 3f2f5980d517 ("dts: update to v5.16-rc1") > Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> > [afa: drop strncmp in favor of id comparison, reword commit message] > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> @Sascha, can this go into a master? V7 Rockchip boards should be broken without this. > --- > drivers/pinctrl/pinctrl-rockchip.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c > index 5cf77c58b218..ea748b600419 100644 > --- a/drivers/pinctrl/pinctrl-rockchip.c > +++ b/drivers/pinctrl/pinctrl-rockchip.c > @@ -877,18 +877,24 @@ static struct rockchip_pin_ctrl *rockchip_pinctrl_get_soc_data( > struct rockchip_pin_bank *bank; > char *name; > int grf_offs, pmu_offs, drv_grf_offs, drv_pmu_offs, i, j; > + int gpio = 0; > > match = of_match_node(rockchip_pinctrl_dt_match, node); > ctrl = (struct rockchip_pin_ctrl *)match->data; > > for_each_child_of_node(node, np) { > + int id; > + > if (!of_find_property(np, "gpio-controller", NULL)) > continue; > > + id = of_alias_get_id(np, "gpio"); > + if (id < 0) > + id = gpio++; > + > bank = ctrl->pin_banks; > for (i = 0; i < ctrl->nr_banks; ++i, ++bank) { > - name = bank->name; > - if (!strncmp(name, np->name, strlen(name))) { > + if (bank->bank_num == id) { > bank->of_node = np; > if (!rockchip_get_bank_data(bank, dev)) > bank->valid = true; > -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox
On Fri, Jan 14, 2022 at 09:47:56AM +0100, Ahmad Fatoum wrote: > From: Michael Riesch <michael.riesch@wolfvision.net> > > We've so far relied on GPIO controllers being named "gpioX", while the > binding mandates gpio controllers being just called "gpio". This already > broke rk3288 support and rk3568.dtsi upstream also differs from the > version in barebox' arch/arm/dts in that regard. > > Instead, do like Linux does and use the alias to match the controllers to > the GPIO banks with a fallback to probe order. > > Fixes: 3f2f5980d517 ("dts: update to v5.16-rc1") > Signed-off-by: Michael Riesch <michael.riesch@wolfvision.net> > [afa: drop strncmp in favor of id comparison, reword commit message] > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > --- > drivers/pinctrl/pinctrl-rockchip.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) Applied to master, thanks Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@lists.infradead.org http://lists.infradead.org/mailman/listinfo/barebox