diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/mtd/spi/sf_internal.h | 5 | ||||
| -rw-r--r-- | drivers/mtd/spi/sf_ops.c | 26 | ||||
| -rw-r--r-- | drivers/mtd/spi/sf_probe.c | 4 | 
3 files changed, 35 insertions, 0 deletions
| diff --git a/drivers/mtd/spi/sf_internal.h b/drivers/mtd/spi/sf_internal.h index a9f5a8111..c69b53de1 100644 --- a/drivers/mtd/spi/sf_internal.h +++ b/drivers/mtd/spi/sf_internal.h @@ -17,6 +17,7 @@  /* CFI Manufacture ID's */  #define SPI_FLASH_CFI_MFR_SPANSION	0x01  #define SPI_FLASH_CFI_MFR_STMICRO	0x20 +#define SPI_FLASH_CFI_MFR_MACRONIX	0xc2  #define SPI_FLASH_CFI_MFR_WINBOND	0xef  /* SECT flags */ @@ -61,6 +62,7 @@  /* Common status */  #define STATUS_WIP			0x01  #define STATUS_QEB_WINSPAN		(1 << 1) +#define STATUS_QEB_MXIC			(1 << 6)  #define STATUS_PEC			0x80  /* Flash timeout values */ @@ -102,6 +104,9 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len);  /* Program the status register */  int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr); +/* Set quad enbale bit for macronix flashes */ +int spi_flash_set_qeb_mxic(struct spi_flash *flash); +  /* Set quad enbale bit for winbond and spansion flashes */  int spi_flash_set_qeb_winspan(struct spi_flash *flash); diff --git a/drivers/mtd/spi/sf_ops.c b/drivers/mtd/spi/sf_ops.c index 6adee325c..05fbcbd43 100644 --- a/drivers/mtd/spi/sf_ops.c +++ b/drivers/mtd/spi/sf_ops.c @@ -39,6 +39,32 @@ int spi_flash_cmd_write_status(struct spi_flash *flash, u8 sr)  	return 0;  } +#ifdef CONFIG_SPI_FLASH_MACRONIX +int spi_flash_set_qeb_mxic(struct spi_flash *flash) +{ +	u8 qeb_status; +	u8 cmd; +	int ret; + +	cmd = CMD_READ_STATUS; +	ret = spi_flash_read_common(flash, &cmd, 1, &qeb_status, 1); +	if (ret < 0) { +		debug("SF: fail to read status register\n"); +		return ret; +	} + +	if (qeb_status & STATUS_QEB_MXIC) { +		debug("SF: Quad enable bit is already set\n"); +	} else { +		ret = spi_flash_cmd_write_status(flash, STATUS_QEB_MXIC); +		if (ret < 0) +			return ret; +	} + +	return ret; +} +#endif +  #if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)  static int spi_flash_cmd_write_config(struct spi_flash *flash, u8 cr)  { diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 8bd06eea6..88d1d0a88 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -31,6 +31,10 @@ static u8 spi_read_cmds_array[] = {  static int spi_flash_set_qeb(struct spi_flash *flash, u8 idcode0)  {  	switch (idcode0) { +#ifdef CONFIG_SPI_FLASH_MACRONIX +	case SPI_FLASH_CFI_MFR_MACRONIX: +		return spi_flash_set_qeb_mxic(flash); +#endif  #if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND)  	case SPI_FLASH_CFI_MFR_SPANSION:  	case SPI_FLASH_CFI_MFR_WINBOND: |