Message ID | 20190424210818.25205-1-han.xu@nxp.com |
---|---|
State | New, archived |
Delegated to: | Ambarus Tudor |
Headers | show |
Series | mtd: spi-nor: Add prep/unprep for spi_nor_resume | expand |
Hi, Han, On 04/25/2019 12:08 AM, Han Xu wrote: > External E-Mail > > > In the new implemented spi_nor_resume function, the spi_nor_init() > should be braced by prep/unprep functions._ > Would you please explain why this is needed? Have you tried a suspend/resume cycle while a write was in progress and it failed? Thanks, ta
> -----Original Message----- > From: Tudor.Ambarus@microchip.com <Tudor.Ambarus@microchip.com> > Sent: Thursday, June 6, 2019 12:46 AM > To: Han Xu <han.xu@nxp.com>; cyrille.pitchen@wedev4u.fr; > marek.vasut@gmail.com > Cc: boris.brezillon@free-electrons.com; f.fainelli@gmail.com; > kdasu.kdev@gmail.com; richard@nod.at; linux-kernel@vger.kernel.org; > linux-mtd@lists.infradead.org; dl-linux-imx <linux-imx@nxp.com>; > computersforpeace@gmail.com > Subject: [EXT] Re: [PATCH] mtd: spi-nor: Add prep/unprep for > spi_nor_resume > > Caution: EXT Email > > Hi, Han, > > On 04/25/2019 12:08 AM, Han Xu wrote: > > External E-Mail > > > > > > In the new implemented spi_nor_resume function, the spi_nor_init() > > should be braced by prep/unprep functions._ > > > > Would you please explain why this is needed? Have you tried a > suspend/resume cycle while a write was in progress and it failed? Same as all other functions that hooked up with mtd ops, such as _read/_write/_lock/_unlock, the _resume function also need to call the lower level controller's prep/unprep functions to properly handle runtime pm and mutex. I didn't try suspend/resume during writing, but found accessing registers without enabling clock when system resumed. > > Thanks, > ta
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c index 73172d7f512b..f6491885fa4f 100644 --- a/drivers/mtd/spi-nor/spi-nor.c +++ b/drivers/mtd/spi-nor/spi-nor.c @@ -3956,10 +3956,18 @@ static void spi_nor_resume(struct mtd_info *mtd) struct device *dev = nor->dev; int ret; + ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_RESUME); + if (ret) { + dev_err(dev, "prepare() failed\n"); + return; + } + /* re-initialize the nor chip */ ret = spi_nor_init(nor); if (ret) dev_err(dev, "resume() failed\n"); + + spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_RESUME); } void spi_nor_restore(struct spi_nor *nor) diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h index b3d360b0ee3d..50cf71dd7e9e 100644 --- a/include/linux/mtd/spi-nor.h +++ b/include/linux/mtd/spi-nor.h @@ -231,6 +231,7 @@ enum spi_nor_ops { SPI_NOR_OPS_ERASE, SPI_NOR_OPS_LOCK, SPI_NOR_OPS_UNLOCK, + SPI_NOR_OPS_RESUME, }; enum spi_nor_option_flags {
In the new implemented spi_nor_resume function, the spi_nor_init() should be braced by prep/unprep functions._ Signed-off-by: Han Xu <han.xu@nxp.com> --- drivers/mtd/spi-nor/spi-nor.c | 8 ++++++++ include/linux/mtd/spi-nor.h | 1 + 2 files changed, 9 insertions(+)