Message ID | 1459238640-29243-1-git-send-email-robert.jarzmik@free.fr |
---|---|
State | New |
Headers | show |
On Tue, Mar 29, 2016 at 10:04 AM, Robert Jarzmik <robert.jarzmik@free.fr> wrote: > In legacy pxa builds, ie. non device-tree and platform-data only builds, > pinctrl is not yet available. As a consequence, the pinctrl gpio > direction change function is a stub, returning always success. > > In the current state, the gpio driver direction function believes the > pinctrl direction change was successful, and exits without actually > changing the gpio direction. > > This patch changes the logic : > - if the pinctrl direction function fails, gpio direction will report > that failure > - if the pinctrl direction function succeeds, gpio direction is changed > by the gpio driver anyway. > This is sub optimal in the pinctrl aware case, as the gpio direction > will be changed twice: once by pinctrl function and another time by > the gpio direction function. > > Yet it should be acceptable in this form, as this is functional for all > pxa platforms (device-tree and platform-data), and moreover changing a > gpio direction is very very seldom, usually in machine initialization, > seldom in drivers probe, and an exception for ac97 reset bug. > > Fixes: a770d946371e ("gpio: pxa: add pin control gpio direction and request") > Reported-by: Guenter Roeck <guenter@roeck-us.net> > Tested-by: Guenter Roeck <guenter@roeck-us.net> > Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr> Patch applied for fixes. 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/gpio-pxa.c b/drivers/gpio/gpio-pxa.c index 20267d8ff858..4d54e56fbb6a 100644 --- a/drivers/gpio/gpio-pxa.c +++ b/drivers/gpio/gpio-pxa.c @@ -283,8 +283,8 @@ static int pxa_gpio_direction_output(struct gpio_chip *chip, writel_relaxed(mask, base + (value ? GPSR_OFFSET : GPCR_OFFSET)); ret = pinctrl_gpio_direction_output(chip->base + offset); - if (!ret) - return 0; + if (ret) + return ret; spin_lock_irqsave(&gpio_lock, flags);