diff options
author | Chris Blair <chris.blair@stericsson.com> | 2012-01-04 16:19:01 +0000 |
---|---|---|
committer | Philippe Langlais <philippe.langlais@linaro.org> | 2012-03-19 09:02:46 +0100 |
commit | 575081a711374d8913635c8deeb7882151c1ebac (patch) | |
tree | 360146e0616bbc0e5d4c289fda561cb92cf3cb0d /drivers/modem/m6718_spi/modem_driver.c | |
parent | 4e8e4ffe6b2a493bcf167a22ebfa07809b6c412f (diff) |
modem m6718: Handle modem irq before resume
Handles the scenario where the modem wakes up the APE and the modem
irq is serviced before the IPC driver is resumed. The event is
regsitered and serviced later when the driver resume hook is called.
ST-Ericsson ID: 405458
ST-Ericsson FOSS-OUT ID: Trivial
ST-Ericsson Linux next: NA
Change-Id: I441decea1cbc657e8dc13ca63a3116f50581c6a7
Signed-off-by: Chris Blair <chris.blair@stericsson.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/44410
Reviewed-by: QATOOLS
Reviewed-by: QABUILD
Reviewed-by: Rickard EVERTSSON <rickard.evertsson@stericsson.com>
Reviewed-by: Linus WALLEIJ <linus.walleij@stericsson.com>
Diffstat (limited to 'drivers/modem/m6718_spi/modem_driver.c')
-rw-r--r-- | drivers/modem/m6718_spi/modem_driver.c | 34 |
1 files changed, 29 insertions, 5 deletions
diff --git a/drivers/modem/m6718_spi/modem_driver.c b/drivers/modem/m6718_spi/modem_driver.c index 623a9191d27..8086e97aa7c 100644 --- a/drivers/modem/m6718_spi/modem_driver.c +++ b/drivers/modem/m6718_spi/modem_driver.c @@ -214,13 +214,25 @@ static int __exit spi_remove(struct spi_device *sdev) static int spi_suspend(struct spi_device *sdev, pm_message_t mesg) { bool busy; + int ret = -EBUSY; + dev_dbg(&sdev->dev, "suspend called\n"); busy = modem_protocol_is_busy(sdev); - dev_dbg(&sdev->dev, "suspend called, protocol busy:%d\n", busy); - if (!busy) - return modem_net_suspend(modem_driver_data.ndev); - else + if (busy) { + dev_warn(&sdev->dev, "suspend failed (protocol busy)\n"); return -EBUSY; + } + ret = modem_protocol_suspend(sdev); + if (ret) { + dev_warn(&sdev->dev, "suspend failed, (protocol suspend))\n"); + return ret; + } + ret = modem_net_suspend(modem_driver_data.ndev); + if (ret) { + dev_warn(&sdev->dev, "suspend failed, (netdev suspend)\n"); + return ret; + } + return 0; } /** @@ -229,8 +241,20 @@ static int spi_suspend(struct spi_device *sdev, pm_message_t mesg) */ static int spi_resume(struct spi_device *sdev) { + int ret; + dev_dbg(&sdev->dev, "resume called\n"); - return modem_net_resume(modem_driver_data.ndev); + ret = modem_protocol_resume(sdev); + if (ret) { + dev_warn(&sdev->dev, "resume failed, (protocol resume))\n"); + return ret; + } + ret = modem_net_resume(modem_driver_data.ndev); + if (ret) { + dev_warn(&sdev->dev, "resume failed, (netdev resume))\n"); + return ret; + } + return 0; } #endif /* CONFIG_PM */ |