[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240513075901.2030293-1-liudingyuan@huawei.com>
Date: Mon, 13 May 2024 15:59:01 +0800
From: Devyn Liu <liudingyuan@...wei.com>
To: <linus.walleij@...aro.org>, <brgl@...ev.pl>
CC: <f.fangjian@...wei.com>, <linux-gpio@...r.kernel.org>,
<linux-kernel@...r.kernel.org>, <mika.westerberg@...ux.intel.com>,
<andriy.shevchenko@...ux.intel.com>, <linux-acpi@...r.kernel.org>,
<jonathan.cameron@...wei.com>, <yangyicong@...wei.com>,
<yisen.zhuang@...wei.com>, <kong.kongxinwei@...ilicon.com>,
<liudingyuan@...wei.com>
Subject: [PATCH] gpiolib: acpi: Fix failed in acpi_gpiochip_find() by adding parent node match
Previous patch modified the standard used by acpi_gpiochip_find()
to match device nodes. Using the device node set in gc->gpiodev->d-
ev instead of gc->parent.
However, there is a situation in gpio-dwapb where the GPIO device
driver will set gc->fwnode for each port corresponding to a child
node under a GPIO device, so gc->gpiodev->dev will be assigned the
value of each child node in gpiochip_add_data().
gpio-dwapb.c:
128,31 static int dwapb_gpio_add_port(struct dwapb_gpio *gpio,
struct dwapb_port_property *pp,
unsigned int offs);
port->gc.fwnode = pp->fwnode;
693,39 static int dwapb_gpio_probe;
err = dwapb_gpio_add_port(gpio, &pdata->properties[i], i);
When other drivers request GPIO pin resources through the GPIO device
node provided by ACPI (corresponding to the parent node), the change
of the matching object to gc->gpiodev->dev in acpi_gpiochip_find()
only allows finding the value of each port (child node), resulting
in a failed request.
Reapply the condition of using gc->parent for match in acpi_gpio-
chip_find() in the code can compatible with the problem of gpio-dwapb,
and will not affect the two cases mentioned in the patch:
1. There is no setting for gc->fwnode.
2. The case that depends on using gc->fwnode for match.
Fixes: 5062e4c14b75 ("gpiolib: acpi: use the fwnode in acpi_gpiochip_find()")
Fixes: 067dbc1ea5ce ("gpiolib: acpi: Don't use GPIO chip fwnode in acpi_gpiochip_find()")
Signed-off-by: Devyn Liu <liudingyuan@...wei.com>
---
drivers/gpio/gpiolib-acpi.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
index 7f140df40f35..6078fea3e021 100644
--- a/drivers/gpio/gpiolib-acpi.c
+++ b/drivers/gpio/gpiolib-acpi.c
@@ -128,7 +128,8 @@ static bool acpi_gpio_deferred_req_irqs_done;
static int acpi_gpiochip_find(struct gpio_chip *gc, const void *data)
{
- return device_match_acpi_handle(&gc->gpiodev->dev, data);
+ return device_match_acpi_handle(&gc->gpiodev->dev, data) ||
+ (gc->parent && device_match_acpi_handle(gc->parent, data));
}
/**
--
2.30.0
Powered by blists - more mailing lists