gpio: pxa: handle corner case of unprobed device
In the corner case where the gpio driver probe fails, for whatever reason, the suspend and resume handlers will still be called as they have to be registered as syscore operations. This applies as well when no probe was called while the driver has been built in the kernel. Nicolas tracked this in : https://bugzilla.kernel.org/show_bug.cgi?id=200905 Therefore, add a failsafe in these function, and test if a proper probe succeeded and the driver is functional. Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr> Reported-by: Nicolas Chauvet <kwizart@gmail.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
28123791dd
commit
9ce3ebe973
@ -776,6 +776,9 @@ static int pxa_gpio_suspend(void)
|
|||||||
struct pxa_gpio_bank *c;
|
struct pxa_gpio_bank *c;
|
||||||
int gpio;
|
int gpio;
|
||||||
|
|
||||||
|
if (!pchip)
|
||||||
|
return 0;
|
||||||
|
|
||||||
for_each_gpio_bank(gpio, c, pchip) {
|
for_each_gpio_bank(gpio, c, pchip) {
|
||||||
c->saved_gplr = readl_relaxed(c->regbase + GPLR_OFFSET);
|
c->saved_gplr = readl_relaxed(c->regbase + GPLR_OFFSET);
|
||||||
c->saved_gpdr = readl_relaxed(c->regbase + GPDR_OFFSET);
|
c->saved_gpdr = readl_relaxed(c->regbase + GPDR_OFFSET);
|
||||||
@ -794,6 +797,9 @@ static void pxa_gpio_resume(void)
|
|||||||
struct pxa_gpio_bank *c;
|
struct pxa_gpio_bank *c;
|
||||||
int gpio;
|
int gpio;
|
||||||
|
|
||||||
|
if (!pchip)
|
||||||
|
return;
|
||||||
|
|
||||||
for_each_gpio_bank(gpio, c, pchip) {
|
for_each_gpio_bank(gpio, c, pchip) {
|
||||||
/* restore level with set/clear */
|
/* restore level with set/clear */
|
||||||
writel_relaxed(c->saved_gplr, c->regbase + GPSR_OFFSET);
|
writel_relaxed(c->saved_gplr, c->regbase + GPSR_OFFSET);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user