mtd: m25p80: restore the status of SPI flash when exiting
authorHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Wed, 6 Dec 2017 02:53:42 +0000 (10:53 +0800)
committerCyrille Pitchen <cyrille.pitchen@wedev4u.fr>
Tue, 12 Dec 2017 23:36:00 +0000 (00:36 +0100)
Restore the status to be compatible with legacy devices.
Take Freescale eSPI boot for example, it copies (in 3 Byte
addressing mode) the RCW and bootloader images from SPI flash
without firing a reset signal previously, so the reboot command
will fail without resetting the addressing mode of SPI flash.
This patch implements .shutdown function to restore the status
in reboot process, and add the same operation to the .remove
function.

Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Signed-off-by: Cyrille Pitchen <cyrille.pitchen@wedev4u.fr>
drivers/mtd/devices/m25p80.c

index dbe6a1de2bb822fda74d0af92a9d08ebc7eb30ea..a4e18f6aaa338aade4e9ddde35157a95c4a3e201 100644 (file)
@@ -307,10 +307,18 @@ static int m25p_remove(struct spi_device *spi)
 {
        struct m25p     *flash = spi_get_drvdata(spi);
 
+       spi_nor_restore(&flash->spi_nor);
+
        /* Clean up MTD stuff. */
        return mtd_device_unregister(&flash->spi_nor.mtd);
 }
 
+static void m25p_shutdown(struct spi_device *spi)
+{
+       struct m25p *flash = spi_get_drvdata(spi);
+
+       spi_nor_restore(&flash->spi_nor);
+}
 /*
  * Do NOT add to this array without reading the following:
  *
@@ -386,6 +394,7 @@ static struct spi_driver m25p80_driver = {
        .id_table       = m25p_ids,
        .probe  = m25p_probe,
        .remove = m25p_remove,
+       .shutdown       = m25p_shutdown,
 
        /* REVISIT: many of these chips have deep power-down modes, which
         * should clearly be entered on suspend() to minimize power use.