aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMika Westerberg <mika.westerberg@linux.intel.com>2015-06-10 09:05:05 -0400
committerLinus Walleij <linus.walleij@linaro.org>2015-06-11 04:17:32 -0400
commitf35bbf61ab772cc312f64dddd1c89ab161893cee (patch)
tree89ba98840b4d1afcc131f479225a54d2f624d517
parent2b528fff0905497c96566d671d47f2bbf3ae295c (diff)
gpio / ACPI: Return -EPROBE_DEFER if the gpiochip was not found
If a driver requests a GPIO described in its _CRS but the GPIO host controller (gpiochip) driver providing the GPIO has not been loaded yet acpi_get_gpiod() returns -ENODEV which causes the calling driver to fail. If the gpiochip driver is loaded afterwards the driver requesting the GPIO will not notice this. Better approach is to return -EPROBE_DEFER in such case. Then when the gpiochip driver appears the driver requesting the GPIO will be probed again. This also aligns ACPI GPIO lookup code closer to DT as it does pretty much the same when no gpiochip driver was found. Reported-by: Tobias Diedrich <tobiasdiedrich@gmail.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Tobias Diedrich <ranma+kernel@tdiedrich.de> Reviewed-by: Amos Kong <kongjianjun@gmail.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-rw-r--r--drivers/gpio/gpiolib-acpi.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
index 980a996d0169..533fe5dbe6f8 100644
--- a/drivers/gpio/gpiolib-acpi.c
+++ b/drivers/gpio/gpiolib-acpi.c
@@ -114,10 +114,11 @@ static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_chip *chip,
114 * @path: ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1") 114 * @path: ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
115 * @pin: ACPI GPIO pin number (0-based, controller-relative) 115 * @pin: ACPI GPIO pin number (0-based, controller-relative)
116 * 116 *
117 * Returns GPIO descriptor to use with Linux generic GPIO API, or ERR_PTR 117 * Return: GPIO descriptor to use with Linux generic GPIO API, or ERR_PTR
118 * error value 118 * error value. Specifically returns %-EPROBE_DEFER if the referenced GPIO
119 * controller does not have gpiochip registered at the moment. This is to
120 * support probe deferral.
119 */ 121 */
120
121static struct gpio_desc *acpi_get_gpiod(char *path, int pin) 122static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
122{ 123{
123 struct gpio_chip *chip; 124 struct gpio_chip *chip;
@@ -131,7 +132,7 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
131 132
132 chip = gpiochip_find(handle, acpi_gpiochip_find); 133 chip = gpiochip_find(handle, acpi_gpiochip_find);
133 if (!chip) 134 if (!chip)
134 return ERR_PTR(-ENODEV); 135 return ERR_PTR(-EPROBE_DEFER);
135 136
136 offset = acpi_gpiochip_pin_to_gpio_offset(chip, pin); 137 offset = acpi_gpiochip_pin_to_gpio_offset(chip, pin);
137 if (offset < 0) 138 if (offset < 0)