| From be4e3c737eebd75815633f4b8fd766defaf0f1fc Mon Sep 17 00:00:00 2001 |
| From: Tony Lindgren <tony@atomide.com> |
| Date: Sun, 15 Sep 2019 13:15:52 -0700 |
| Subject: phy: mapphone-mdm6600: Fix timeouts by adding wake-up handling |
| |
| From: Tony Lindgren <tony@atomide.com> |
| |
| commit be4e3c737eebd75815633f4b8fd766defaf0f1fc upstream. |
| |
| We have an interrupt handler for the wake-up GPIO pin, but we're missing |
| the code to wake-up the system. This can cause timeouts receiving data |
| for the UART that shares the wake-up GPIO pin with the USB PHY. |
| |
| All we need to do is just wake the system and kick the autosuspend |
| timeout to fix the issue. |
| |
| Fixes: 5d1ebbda0318 ("phy: mapphone-mdm6600: Add USB PHY driver for MDM6600 on Droid 4") |
| Cc: Marcel Partap <mpartap@gmx.net> |
| Cc: Merlijn Wajer <merlijn@wizzup.org> |
| Cc: Michael Scott <hashcode0f@gmail.com> |
| Cc: NeKit <nekit1000@gmail.com> |
| Cc: Pavel Machek <pavel@ucw.cz> |
| Cc: Sebastian Reichel <sre@kernel.org> |
| Signed-off-by: Tony Lindgren <tony@atomide.com> |
| Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/phy/motorola/phy-mapphone-mdm6600.c | 18 ++++++++++++++++-- |
| 1 file changed, 16 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/phy/motorola/phy-mapphone-mdm6600.c |
| +++ b/drivers/phy/motorola/phy-mapphone-mdm6600.c |
| @@ -243,10 +243,24 @@ static irqreturn_t phy_mdm6600_wakeirq_t |
| { |
| struct phy_mdm6600 *ddata = data; |
| struct gpio_desc *mode_gpio1; |
| + int error, wakeup; |
| |
| mode_gpio1 = ddata->mode_gpios->desc[PHY_MDM6600_MODE1]; |
| - dev_dbg(ddata->dev, "OOB wake on mode_gpio1: %i\n", |
| - gpiod_get_value(mode_gpio1)); |
| + wakeup = gpiod_get_value(mode_gpio1); |
| + if (!wakeup) |
| + return IRQ_NONE; |
| + |
| + dev_dbg(ddata->dev, "OOB wake on mode_gpio1: %i\n", wakeup); |
| + error = pm_runtime_get_sync(ddata->dev); |
| + if (error < 0) { |
| + pm_runtime_put_noidle(ddata->dev); |
| + |
| + return IRQ_NONE; |
| + } |
| + |
| + /* Just wake-up and kick the autosuspend timer */ |
| + pm_runtime_mark_last_busy(ddata->dev); |
| + pm_runtime_put_autosuspend(ddata->dev); |
| |
| return IRQ_HANDLED; |
| } |