lkml.org 
[lkml]   [2018]   [Dec]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 202/328] spi: rspi: Fix invalid SPI use during system suspend
    3.16.62-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Geert Uytterhoeven <geert+renesas@glider.be>

    commit c1ca59c22c56930b377a665fdd1b43351887830b upstream.

    If the SPI queue is running during system suspend, the system may lock
    up.

    Fix this by stopping/restarting the queue during system suspend/resume,
    by calling spi_master_suspend()/spi_master_resume() from the PM
    callbacks. In-kernel users will receive an -ESHUTDOWN error while
    system suspend/resume is in progress.

    Based on a patch for sh-msiof by Gaku Inami.

    Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/spi/spi-rspi.c | 24 ++++++++++++++++++++++++
    1 file changed, 24 insertions(+)

    --- a/drivers/spi/spi-rspi.c
    +++ b/drivers/spi/spi-rspi.c
    @@ -1158,6 +1158,29 @@ static struct platform_device_id spi_dri

    MODULE_DEVICE_TABLE(platform, spi_driver_ids);

    +#ifdef CONFIG_PM_SLEEP
    +static int rspi_suspend(struct device *dev)
    +{
    + struct platform_device *pdev = to_platform_device(dev);
    + struct rspi_data *rspi = platform_get_drvdata(pdev);
    +
    + return spi_master_suspend(rspi->master);
    +}
    +
    +static int rspi_resume(struct device *dev)
    +{
    + struct platform_device *pdev = to_platform_device(dev);
    + struct rspi_data *rspi = platform_get_drvdata(pdev);
    +
    + return spi_master_resume(rspi->master);
    +}
    +
    +static SIMPLE_DEV_PM_OPS(rspi_pm_ops, rspi_suspend, rspi_resume);
    +#define DEV_PM_OPS &rspi_pm_ops
    +#else
    +#define DEV_PM_OPS NULL
    +#endif /* CONFIG_PM_SLEEP */
    +
    static struct platform_driver rspi_driver = {
    .probe = rspi_probe,
    .remove = rspi_remove,
    @@ -1165,6 +1188,7 @@ static struct platform_driver rspi_drive
    .driver = {
    .name = "renesas_spi",
    .owner = THIS_MODULE,
    + .pm = DEV_PM_OPS,
    .of_match_table = of_match_ptr(rspi_of_match),
    },
    };
    \
     
     \ /
      Last update: 2018-12-09 23:18    [W:2.716 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site