Patch "gpiolib: acpi: Fix failed in acpi_gpiochip_find() by adding parent node match" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    gpiolib: acpi: Fix failed in acpi_gpiochip_find() by adding parent node match

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     gpiolib-acpi-fix-failed-in-acpi_gpiochip_find-by-add.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 810e398346357c1a41f45b7d8f1d240c8046c9b8
Author: Devyn Liu <liudingyuan@xxxxxxxxxx>
Date:   Mon May 13 15:59:01 2024 +0800

    gpiolib: acpi: Fix failed in acpi_gpiochip_find() by adding parent node match
    
    [ Upstream commit adbc49a5a8c6fcf7be154c2e30213bbf472940da ]
    
    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@xxxxxxxxxx>
    Reviewed-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx>
    Tested-by: Benjamin Tissoires <bentiss@xxxxxxxxxx>
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
index 7f140df40f35b..c1e190d3ea244 100644
--- a/drivers/gpio/gpiolib-acpi.c
+++ b/drivers/gpio/gpiolib-acpi.c
@@ -128,7 +128,24 @@ 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);
+	/* First check the actual GPIO device */
+	if (device_match_acpi_handle(&gc->gpiodev->dev, data))
+		return true;
+
+	/*
+	 * When the ACPI device is artificially split to the banks of GPIOs,
+	 * where each of them is represented by a separate GPIO device,
+	 * the firmware node of the physical device may not be shared among
+	 * the banks as they may require different values for the same property,
+	 * e.g., number of GPIOs in a certain bank. In such case the ACPI handle
+	 * of a GPIO device is NULL and can not be used. Hence we have to check
+	 * the parent device to be sure that there is no match before bailing
+	 * out.
+	 */
+	if (gc->parent)
+		return device_match_acpi_handle(gc->parent, data);
+
+	return false;
 }
 
 /**




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux