spi/bfin_spi: save/restore state when suspending/resuming
authorBarry Song <barry.song@analog.com>
Wed, 18 Nov 2009 09:43:21 +0000 (09:43 +0000)
committerMike Frysinger <vapier@gentoo.org>
Mon, 18 Oct 2010 06:49:37 +0000 (02:49 -0400)
We can't rely on the SPI_CTL/SPI_FLG registers retaining their state when
suspending, so save/restore their entire values.

Signed-off-by: Barry Song <barry.song@analog.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
drivers/spi/spi_bfin5xx.c

index 278fe0a..c23ac3b 100644 (file)
@@ -101,6 +101,9 @@ struct master_data {
        size_t rx_map_len;
        size_t tx_map_len;
        u8 n_bytes;
+       u16 ctrl_reg;
+       u16 flag_reg;
+
        int cs_change;
        const struct transfer_ops *ops;
 };
@@ -1426,8 +1429,14 @@ static int bfin_spi_suspend(struct platform_device *pdev, pm_message_t state)
        if (status != 0)
                return status;
 
-       /* stop hardware */
-       bfin_spi_disable(drv_data);
+       drv_data->ctrl_reg = read_CTRL(drv_data);
+       drv_data->flag_reg = read_FLAG(drv_data);
+
+       /*
+        * reset SPI_CTL and SPI_FLG registers
+        */
+       write_CTRL(drv_data, BIT_CTL_CPHA | BIT_CTL_MASTER);
+       write_FLAG(drv_data, 0xFF00);
 
        return 0;
 }
@@ -1437,8 +1446,8 @@ static int bfin_spi_resume(struct platform_device *pdev)
        struct master_data *drv_data = platform_get_drvdata(pdev);
        int status = 0;
 
-       /* Enable the SPI interface */
-       bfin_spi_enable(drv_data);
+       write_CTRL(drv_data, drv_data->ctrl_reg);
+       write_FLAG(drv_data, drv_data->flag_reg);
 
        /* Start the queue running */
        status = bfin_spi_start_queue(drv_data);