diff options
Diffstat (limited to 'drivers/mtd/spi/sf_probe.c')
| -rw-r--r-- | drivers/mtd/spi/sf_probe.c | 28 | 
1 files changed, 28 insertions, 0 deletions
| diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index 3fa7363da..8b2972c7a 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -165,6 +165,25 @@ static u8 spi_read_cmds_array[] = {  	CMD_READ_QUAD_OUTPUT_FAST,  }; +static int spi_flash_set_qeb(struct spi_flash *flash, u8 idcode0) +{ +	switch (idcode0) { +#if defined(CONFIG_SPI_FLASH_SPANSION) || defined(CONFIG_SPI_FLASH_WINBOND) +	case SPI_FLASH_CFI_MFR_SPANSION: +	case SPI_FLASH_CFI_MFR_WINBOND: +		return spi_flash_set_qeb_winspan(flash); +#endif +#ifdef CONFIG_SPI_FLASH_STMICRO +	case SPI_FLASH_CFI_MFR_STMICRO: +		debug("SF: QEB is volatile for %02x flash\n", idcode0); +		return 0; +#endif +	default: +		printf("SF: Need set QEB func for %02x flash\n", idcode0); +		return -1; +	} +} +  static struct spi_flash *spi_flash_validate_params(struct spi_slave *spi,  		u8 *idcode)  { @@ -250,6 +269,15 @@ static struct spi_flash *spi_flash_validate_params(struct spi_slave *spi,  		/* Go for default supported write cmd */  		flash->write_cmd = CMD_PAGE_PROGRAM; +	/* Set the quad enable bit - only for quad commands */ +	if ((flash->read_cmd == CMD_READ_QUAD_OUTPUT_FAST) || +	    (flash->write_cmd == CMD_QUAD_PAGE_PROGRAM)) { +		if (spi_flash_set_qeb(flash, idcode[0])) { +			debug("SF: Fail to set QEB for %02x\n", idcode[0]); +			return NULL; +		} +	} +  	/* Poll cmd seclection */  	flash->poll_cmd = CMD_READ_STATUS;  #ifdef CONFIG_SPI_FLASH_STMICRO |