[PATCH v2 1/2] mtd: spi-nor: Add SPI NOR layer PM support
Hou Zhiqiang
B48286 at freescale.com
Fri Jan 15 02:06:34 PST 2016
Hi Brian,
Thanks for your comments!
>On Fri, Dec 25, 2015 at 04:55:06PM +0800, Zhiqiang Hou wrote:
>> From: Hou Zhiqiang <Zhiqiang.Hou at freescale.com>
>>
>> Add the Power Management API in SPI NOR framework.
>> The Power Management system will turn off power supply to SPI flash
>> when system suspending, and then the SPI flash will be in the reset
>> state after system resuming. As a result, the status&configurations
>> of SPI flash driver will mismatch with its current hardware state.
>> So reinitialize SPI flash to make sure it is resumed to the correct
>> state.
>> And the SPI NOR layer just do common configuration depending on the
>> records in structure spi_nor.
>>
>> Signed-off-by: Hou Zhiqiang <Zhiqiang.Hou at freescale.com>
>> ---
>> V2:
>> - New patch
>>
>> drivers/mtd/spi-nor/spi-nor.c | 44 +++++++++++++++++++++++++++++++++++++++++++
>> include/linux/mtd/spi-nor.h | 9 +++++++++
>> 2 files changed, 53 insertions(+)
>>
>> diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
>> index 4988390..4030d37c 100644
>> --- a/drivers/mtd/spi-nor/spi-nor.c
>> +++ b/drivers/mtd/spi-nor/spi-nor.c
>> @@ -1365,6 +1365,50 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
>> }
>> EXPORT_SYMBOL_GPL(spi_nor_scan);
>>
>> +#ifdef CONFIG_PM_SLEEP
>> +static int spi_nor_hw_reinit(struct spi_nor *nor)
>> +{
>> + const struct flash_info *info = NULL;
>> + struct device *dev = nor->dev;
>> + int ret;
>> +
>> + info = spi_nor_read_id(nor);
>> + if (JEDEC_MFR(info) == SNOR_MFR_ATMEL ||
>> + JEDEC_MFR(info) == SNOR_MFR_INTEL ||
>> + JEDEC_MFR(info) == SNOR_MFR_SST ||
>> + JEDEC_MFR(info) == SNOR_MFR_WINBOND) {
>> + write_enable(nor);
>> + write_sr(nor, 0);
>> + }
>> +
>> + if (nor->flash_read == SPI_NOR_QUAD) {
>> + ret = set_quad_mode(nor, info);
>> + if (ret) {
>> + dev_err(dev, "quad mode not supported\n");
>> + return ret;
>> + }
>> + }
>> +
>> + if (nor->addr_width == 4 && !info->addr_width &&
>> + JEDEC_MFR(info) != SNOR_MFR_SPANSION)
>> + set_4byte(nor, info, 1);
>
>You're duplicating a bunch of code from spi_nor_scan(). Please don't do
>that. Find a good way to share it.
>
This will be arranged in next version.
>> + return 0;
>> +}
>> +
>> +int spi_nor_suspend(struct spi_nor *nor)
>> +{
>> + return 0;
>> +}
>> +EXPORT_SYMBOL_GPL(spi_nor_suspend);
>> +
>> +int spi_nor_resume(struct spi_nor *nor)
>> +{
>> + return spi_nor_hw_reinit(nor);
>> +}
>> +EXPORT_SYMBOL_GPL(spi_nor_resume);
>> +#endif /* CONFIG_PM_SLEEP */
>
>What happens if a driver wants this with !CONFIG_PM_SLEEP? I think it's
>best if you just unconditionally add spi_nor_{suspend,resume}().
>
Ok, will remove the condition.
Thanks,
Zhiqiang
More information about the linux-mtd
mailing list