[PATCH v2 2/2] gpio: fix request of PMIC GPIO child
Svyatoslav Ryhel
clamor95 at gmail.com
Mon Dec 9 11:42:12 CET 2024
пн, 9 груд. 2024 р. о 12:11 Jonas Karlman <jonas at kwiboo.se> пише:
>
> Hi Svyatoslav,
>
> On 2024-12-09 07:44, Svyatoslav Ryhel wrote:
> > If correct PMIC child was found it should be requested as well.
> >
> > Signed-off-by: Svyatoslav Ryhel <clamor95 at gmail.com>
> > ---
> > drivers/gpio/gpio-uclass.c | 8 ++++++++
> > 1 file changed, 8 insertions(+)
> >
> > diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c
> > index e776906fe73..e6c00c48722 100644
> > --- a/drivers/gpio/gpio-uclass.c
> > +++ b/drivers/gpio/gpio-uclass.c
> > @@ -1160,6 +1160,14 @@ static int gpio_request_tail(int ret, const char *nodename,
> > /* if loop exits without GPIO device return error */
> > if (device_get_uclass_id(desc->dev) != UCLASS_GPIO)
> > goto err;
> > +
> > + ret = uclass_get_device_by_name(UCLASS_GPIO, desc->dev->name,
> > + &desc->dev);
> > + if (ret) {
> > + log_debug("%s: getting GPIO device failed %d\n",
> > + __func__, ret);
> > + goto err;
> > + }
> > #else
> > debug("%s: uclass_get_device_by_ofnode failed\n",
> > __func__);
>
> Instead of extending this PMIC/GPIO workaround maybe it is better to fix
> the issue at bind time? Look like the max77663 pmic driver use
> device_bind_driver() instead of device_bind_driver_to_node().
>
Actually this is a valid point. Thank you for this suggestion.
> Also palmas gpio driver should not need to be bind, the DTs I can find
> in tree all have a gpio node with compatible = ti,palmas-gpio. Do not
> really understand why the palmas driver should need this workaround
> the gpios props seem to bind to &palmas_gpio node in the DTs I checked.
This, on the other hand, will not work since pmic drivers do not
automatically bind all child nodes, I have checked and gpio driver was
not bound.
> Maybe something like following diff could work for your boards? I.e.
> revert c03cd98d1a16 ("drivers: gpio-uclass: support PMIC GPIO children")
> and bind gpio dirver to the pmic node.
>
> Binding to pmic node should probably only happen if the pmic node has
> the gpio-controller prop.
>
> Regards,
> Jonas
>
> diff --git a/drivers/gpio/gpio-uclass.c b/drivers/gpio/gpio-uclass.c
> index 0213271e3a69..67fc776cada2 100644
> --- a/drivers/gpio/gpio-uclass.c
> +++ b/drivers/gpio/gpio-uclass.c
> @@ -1142,29 +1142,9 @@ static int gpio_request_tail(int ret, const char *nodename,
> ret = uclass_get_device_by_ofnode(UCLASS_GPIO, args->node,
> &desc->dev);
> if (ret) {
> -#if CONFIG_IS_ENABLED(MAX77663_GPIO) || CONFIG_IS_ENABLED(PALMAS_GPIO)
> - struct udevice *pmic;
> - ret = uclass_get_device_by_ofnode(UCLASS_PMIC, args->node,
> - &pmic);
> - if (ret) {
> - log_debug("%s: PMIC device get failed, err %d\n",
> - __func__, ret);
> - goto err;
> - }
> -
> - device_foreach_child(desc->dev, pmic) {
> - if (device_get_uclass_id(desc->dev) == UCLASS_GPIO)
> - break;
> - }
> -
> - /* if loop exits without GPIO device return error */
> - if (device_get_uclass_id(desc->dev) != UCLASS_GPIO)
> - goto err;
> -#else
> debug("%s: uclass_get_device_by_ofnode failed\n",
> __func__);
> goto err;
> -#endif
> }
> }
> ret = gpio_find_and_xlate(desc, args);
> diff --git a/drivers/power/pmic/max77663.c b/drivers/power/pmic/max77663.c
> index cf08b6a7e1df..838eae50740d 100644
> --- a/drivers/power/pmic/max77663.c
> +++ b/drivers/power/pmic/max77663.c
> @@ -56,8 +56,8 @@ static int max77663_bind(struct udevice *dev)
> }
>
> if (IS_ENABLED(CONFIG_MAX77663_GPIO)) {
> - ret = device_bind_driver(dev, MAX77663_GPIO_DRIVER,
> - "gpio", NULL);
> + ret = device_bind_driver_to_node(dev, MAX77663_GPIO_DRIVER,
> + "gpio", dev_ofnode(dev), NULL);
> if (ret) {
> log_err("cannot bind GPIOs (ret = %d)\n", ret);
> return ret;
> diff --git a/drivers/power/pmic/palmas.c b/drivers/power/pmic/palmas.c
> index f676bf641694..faa876f4e73d 100644
> --- a/drivers/power/pmic/palmas.c
> +++ b/drivers/power/pmic/palmas.c
> @@ -45,7 +45,6 @@ static int palmas_read(struct udevice *dev, uint reg, uint8_t *buff, int len)
> static int palmas_bind(struct udevice *dev)
> {
> ofnode pmic_node = ofnode_null(), regulators_node;
> - ofnode subnode, gpio_node;
> int children, ret;
>
> if (IS_ENABLED(CONFIG_SYSRESET_PALMAS)) {
> @@ -57,14 +56,6 @@ static int palmas_bind(struct udevice *dev)
> }
> }
>
> - gpio_node = ofnode_find_subnode(dev_ofnode(dev), "gpio");
> - if (ofnode_valid(gpio_node)) {
> - ret = device_bind_driver_to_node(dev, PALMAS_GPIO_DRIVER,
> - "gpio", gpio_node, NULL);
> - if (ret)
> - log_err("cannot bind GPIOs (ret = %d)\n", ret);
> - }
> -
> dev_for_each_subnode(subnode, dev) {
> const char *name;
> char *temp;
>
>
More information about the U-Boot
mailing list