[U-Boot] [PATCH V6] sf: Add clear flag status register operation support
Jagan Teki
jteki at openedev.com
Tue Aug 18 11:45:37 CEST 2015
On 18 August 2015 at 14:31, Zhiqiang Hou <B48286 at freescale.com> wrote:
> From: Hou Zhiqiang <B48286 at freescale.com>
>
> The clear flag status register operation was required by Micron
> SPI flash chips, which support FSR. And if an error bit of FSR
> have been set, it must be cleared by the clear FSR operation.
>
> Signed-off-by: Hou Zhiqiang <B48286 at freescale.com>
> Signed-off-by: Mingkai.Hu <Mingkai.Hu at freescale.com>
Reviewed-by: Jagan Teki <jteki at openedev.com>
> ---
> Tested on T1042RDB board.
> V6:
> Generate the patch based on the latest wait ready logic.
> Depend on patch http://patchwork.ozlabs.org/patch/508166/
> V5:
> 1. Removed #ifdef for STMICRO.
> 2. Add checking Protection and Voltage error bits.
> 3. Only if there is any error bit set, issue the clear FSR command.
> V4:
> Split the the patch to 2 patches for clear FSR and SPI flash address mode.
> V3:
> Generate the patch based on the latest tree git://git.denx.de/u-boot.git.
> V2:
> Add the operation of enter 3 Byte address mode in probe.
> V1:
> Based on git://git.denx.de/u-boot.git.
> drivers/mtd/spi/sf_internal.h | 15 +++++++++++++++
> drivers/mtd/spi/sf_ops.c | 7 +++++++
> 2 files changed, 22 insertions(+)
>
> diff --git a/drivers/mtd/spi/sf_internal.h b/drivers/mtd/spi/sf_internal.h
> index 8a3e5ec..fc6d751 100644
> --- a/drivers/mtd/spi/sf_internal.h
> +++ b/drivers/mtd/spi/sf_internal.h
> @@ -82,6 +82,7 @@ enum spi_nor_option_flags {
> #define CMD_WRITE_ENABLE 0x06
> #define CMD_READ_CONFIG 0x35
> #define CMD_FLAG_STATUS 0x70
> +#define CMD_CLEAR_FLAG_STATUS 0x50
>
> /* Read commands */
> #define CMD_READ_ARRAY_SLOW 0x03
> @@ -104,7 +105,15 @@ enum spi_nor_option_flags {
> #define STATUS_WIP (1 << 0)
> #define STATUS_QEB_WINSPAN (1 << 1)
> #define STATUS_QEB_MXIC (1 << 6)
> +
> +/* Flag status for STMICRO */
> +#define STATUS_PROT_ERR (1 << 1)
> +#define STATUS_VOLT_ERR (1 << 3)
> +#define STATUS_PROG_ERR (1 << 4)
> +#define STATUS_ERASE_ERR (1 << 5)
> #define STATUS_PEC (1 << 7)
> +#define FLAG_ERR_MASK (STATUS_PROT_ERR | STATUS_VOLT_ERR | \
> + STATUS_PROG_ERR | STATUS_ERASE_ERR)
>
> /* Flash timeout values */
> #define SPI_FLASH_PROG_TIMEOUT (2 * CONFIG_SYS_HZ)
> @@ -191,6 +200,12 @@ static inline int spi_flash_cmd_write_disable(struct spi_flash *flash)
> return spi_flash_cmd(flash->spi, CMD_WRITE_DISABLE, NULL, 0);
> }
>
> +/* Clear flag status register */
> +static inline int spi_flash_cmd_clear_flag_status(struct spi_flash *flash)
> +{
> + return spi_flash_cmd(flash->spi, CMD_CLEAR_FLAG_STATUS, NULL, 0);
> +}
> +
> /*
> * Send the read status command to the device and wait for the wip
> * (write-in-progress) bit to clear itself.
> diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c
> index ba5ff0c..78ef08b 100644
> --- a/drivers/mtd/spi/sf_ops.c
> +++ b/drivers/mtd/spi/sf_ops.c
> @@ -174,6 +174,13 @@ static inline int spi_flash_fsr_ready(struct spi_flash *flash)
> if (ret < 0)
> return ret;
>
> + if (fsr & FLAG_ERR_MASK) {
> + printf("SF: flag status(0x%x) error occured\n", fsr);
> + ret = spi_flash_cmd_clear_flag_status(flash);
> + if (ret < 0)
> + printf("SF: clear flag status failed\n");
> + return -1;
> + }
> return fsr & STATUS_PEC;
> }
>
> --
> 2.1.0.27.g96db324
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
thanks!
--
Jagan | openedev.
More information about the U-Boot
mailing list