summaryrefslogtreecommitdiffstats
path: root/drivers/gpio
diff options
context:
space:
mode:
authorRobert Jarzmik <robert.jarzmik@free.fr>2018-08-25 10:44:17 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-04-20 09:07:51 +0200
commite3f3cab9e10a0859bfa5374b40e2cdebc3b94cb7 (patch)
tree37355fca75783c9dee145e32e4e49277c8fc48a7 /drivers/gpio
parent7e8000676e93d4aec02b8fd8b5003187a662cc42 (diff)
downloadlinux-stable-e3f3cab9e10a0859bfa5374b40e2cdebc3b94cb7.tar.gz
linux-stable-e3f3cab9e10a0859bfa5374b40e2cdebc3b94cb7.tar.bz2
linux-stable-e3f3cab9e10a0859bfa5374b40e2cdebc3b94cb7.zip
gpio: pxa: handle corner case of unprobed device
[ Upstream commit 9ce3ebe973bf4073426f35f282c6b955ed802765 ] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'drivers/gpio')
-rw-r--r--drivers/gpio/gpio-pxa.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-pxa.c b/drivers/gpio/gpio-pxa.c
index 7a6305884f97..32d22bdf7164 100644
--- a/drivers/gpio/gpio-pxa.c
+++ b/drivers/gpio/gpio-pxa.c
@@ -774,6 +774,9 @@ static int pxa_gpio_suspend(void)
struct pxa_gpio_bank *c;
int gpio;
+ if (!pchip)
+ return 0;
+
for_each_gpio_bank(gpio, c, pchip) {
c->saved_gplr = readl_relaxed(c->regbase + GPLR_OFFSET);
c->saved_gpdr = readl_relaxed(c->regbase + GPDR_OFFSET);
@@ -792,6 +795,9 @@ static void pxa_gpio_resume(void)
struct pxa_gpio_bank *c;
int gpio;
+ if (!pchip)
+ return;
+
for_each_gpio_bank(gpio, c, pchip) {
/* restore level with set/clear */
writel_relaxed(c->saved_gplr, c->regbase + GPSR_OFFSET);