Message ID | 1426007738-119736-1-git-send-email-qipeng.zha@intel.com |
---|---|
State | New |
Headers | show |
On Wed, Mar 11, 2015 at 01:15:38AM +0800, qipeng.zha wrote: > From: "qipeng.zha" <qipeng.zha@intel.com> > > If GPIO driver use pin mapping, need to translate pin number > between ACPI table and GPIO driver. > > This issue is found on one platform with Cherryview gpio > controller, kernel is hang when executed _PS0 method of > one ACPI device, since without this translation, it access > invalid gpiodesc array. > > Verified it works again with this patch. > > Signed-off-by: qipeng.zha <qipeng.zha@intel.com> Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Mar 10, 2015 at 6:15 PM, qipeng.zha <qipeng.zha@intel.com> wrote: > From: "qipeng.zha" <qipeng.zha@intel.com> > > If GPIO driver use pin mapping, need to translate pin number > between ACPI table and GPIO driver. > > This issue is found on one platform with Cherryview gpio > controller, kernel is hang when executed _PS0 method of > one ACPI device, since without this translation, it access > invalid gpiodesc array. > > Verified it works again with this patch. > > Signed-off-by: qipeng.zha <qipeng.zha@intel.com> Patch applied with Mika's ACK. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c index c0929d9..df990f2 100644 --- a/drivers/gpio/gpiolib-acpi.c +++ b/drivers/gpio/gpiolib-acpi.c @@ -201,6 +201,10 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, if (!handler) return AE_BAD_PARAMETER; + pin = acpi_gpiochip_pin_to_gpio_offset(chip, pin); + if (pin < 0) + return AE_BAD_PARAMETER; + desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event"); if (IS_ERR(desc)) { dev_err(chip->dev, "Failed to request GPIO\n"); @@ -551,6 +555,12 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address, struct gpio_desc *desc; bool found; + pin = acpi_gpiochip_pin_to_gpio_offset(chip, pin); + if (pin < 0) { + status = AE_BAD_PARAMETER; + goto out; + } + mutex_lock(&achip->conn_lock); found = false;