Merge branch 'master' of git://git.denx.de/u-boot-spi
This commit is contained in:
@@ -97,10 +97,6 @@ enum {
|
||||
#define STATUS_QEB_MXIC (1 << 6)
|
||||
#define STATUS_PEC (1 << 7)
|
||||
|
||||
#ifdef CONFIG_SYS_SPI_ST_ENABLE_WP_PIN
|
||||
#define STATUS_SRWD (1 << 7) /* SR write protect */
|
||||
#endif
|
||||
|
||||
/* Flash timeout values */
|
||||
#define SPI_FLASH_PROG_TIMEOUT (2 * CONFIG_SYS_HZ)
|
||||
#define SPI_FLASH_PAGE_ERASE_TIMEOUT (5 * CONFIG_SYS_HZ)
|
||||
@@ -123,7 +119,8 @@ int sst_write_bp(struct spi_flash *flash, u32 offset, size_t len,
|
||||
* @name: Device name ([MANUFLETTER][DEVTYPE][DENSITY][EXTRAINFO])
|
||||
* @jedec: Device jedec ID (0x[1byte_manuf_id][2byte_dev_id])
|
||||
* @ext_jedec: Device ext_jedec ID
|
||||
* @sector_size: Sector size of this device
|
||||
* @sector_size: Isn't necessarily a sector size from vendor,
|
||||
* the size listed here is what works with CMD_ERASE_64K
|
||||
* @nr_sectors: No.of sectors on this device
|
||||
* @e_rd_cmd: Enum list for read commands
|
||||
* @flags: Important param, for flash specific behaviour
|
||||
|
||||
@@ -154,21 +154,17 @@ static void spi_flash_dual_flash(struct spi_flash *flash, u32 *addr)
|
||||
}
|
||||
#endif
|
||||
|
||||
int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
|
||||
static int spi_flash_poll_status(struct spi_slave *spi, unsigned long timeout,
|
||||
u8 cmd, u8 poll_bit)
|
||||
{
|
||||
struct spi_slave *spi = flash->spi;
|
||||
unsigned long timebase;
|
||||
unsigned long flags = SPI_XFER_BEGIN;
|
||||
int ret;
|
||||
u8 status;
|
||||
u8 check_status = 0x0;
|
||||
u8 poll_bit = STATUS_WIP;
|
||||
u8 cmd = flash->poll_cmd;
|
||||
|
||||
if (cmd == CMD_FLAG_STATUS) {
|
||||
poll_bit = STATUS_PEC;
|
||||
if (cmd == CMD_FLAG_STATUS)
|
||||
check_status = poll_bit;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SF_DUAL_FLASH
|
||||
if (spi->flags & SPI_XFER_U_PAGE)
|
||||
@@ -204,6 +200,28 @@ int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int spi_flash_cmd_wait_ready(struct spi_flash *flash, unsigned long timeout)
|
||||
{
|
||||
struct spi_slave *spi = flash->spi;
|
||||
int ret;
|
||||
u8 poll_bit = STATUS_WIP;
|
||||
u8 cmd = CMD_READ_STATUS;
|
||||
|
||||
ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (flash->poll_cmd == CMD_FLAG_STATUS) {
|
||||
poll_bit = STATUS_PEC;
|
||||
cmd = CMD_FLAG_STATUS;
|
||||
ret = spi_flash_poll_status(spi, timeout, cmd, poll_bit);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int spi_flash_write_common(struct spi_flash *flash, const u8 *cmd,
|
||||
size_t cmd_len, const void *buf, size_t buf_len)
|
||||
{
|
||||
|
||||
@@ -132,6 +132,9 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
|
||||
flash->name = params->name;
|
||||
flash->memory_map = spi->memory_map;
|
||||
flash->dual_flash = flash->spi->option;
|
||||
#ifdef CONFIG_DM_SPI_FLASH
|
||||
flash->flags = params->flags;
|
||||
#endif
|
||||
|
||||
/* Assign spi_flash ops */
|
||||
#ifndef CONFIG_DM_SPI_FLASH
|
||||
@@ -184,6 +187,9 @@ static int spi_flash_validate_params(struct spi_slave *spi, u8 *idcode,
|
||||
flash->erase_size = flash->sector_size;
|
||||
}
|
||||
|
||||
/* Now erase size becomes valid sector size */
|
||||
flash->sector_size = flash->erase_size;
|
||||
|
||||
/* Look for the fastest read cmd */
|
||||
cmd = fls(params->e_rd_cmd & flash->spi->op_mode_rx);
|
||||
if (cmd) {
|
||||
@@ -288,34 +294,6 @@ int spi_flash_decode_fdt(const void *blob, struct spi_flash *flash)
|
||||
}
|
||||
#endif /* CONFIG_OF_CONTROL */
|
||||
|
||||
#ifdef CONFIG_SYS_SPI_ST_ENABLE_WP_PIN
|
||||
/* enable the W#/Vpp signal to disable writing to the status register */
|
||||
static int spi_enable_wp_pin(struct spi_flash *flash)
|
||||
{
|
||||
u8 status;
|
||||
int ret;
|
||||
|
||||
ret = spi_flash_cmd_read_status(flash, &status);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = spi_flash_cmd_write_status(flash, STATUS_SRWD);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = spi_flash_cmd_write_disable(flash);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int spi_enable_wp_pin(struct spi_flash *flash)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* spi_flash_probe_slave() - Probe for a SPI flash device on a bus
|
||||
*
|
||||
@@ -394,8 +372,6 @@ int spi_flash_probe_slave(struct spi_slave *spi, struct spi_flash *flash)
|
||||
puts(" Full access #define CONFIG_SPI_FLASH_BAR\n");
|
||||
}
|
||||
#endif
|
||||
if (spi_enable_wp_pin(flash))
|
||||
puts("Enable WP pin failed\n");
|
||||
|
||||
/* Release spi bus */
|
||||
spi_release_bus(spi);
|
||||
@@ -434,6 +410,8 @@ struct spi_flash *spi_flash_probe(unsigned int busnum, unsigned int cs,
|
||||
struct spi_slave *bus;
|
||||
|
||||
bus = spi_setup_slave(busnum, cs, max_hz, spi_mode);
|
||||
if (!bus)
|
||||
return NULL;
|
||||
return spi_flash_probe_tail(bus);
|
||||
}
|
||||
|
||||
@@ -444,6 +422,8 @@ struct spi_flash *spi_flash_probe_fdt(const void *blob, int slave_node,
|
||||
struct spi_slave *bus;
|
||||
|
||||
bus = spi_setup_slave_fdt(blob, slave_node, spi_node);
|
||||
if (!bus)
|
||||
return NULL;
|
||||
return spi_flash_probe_tail(bus);
|
||||
}
|
||||
#endif
|
||||
@@ -469,6 +449,15 @@ int spi_flash_std_write(struct udevice *dev, u32 offset, size_t len,
|
||||
{
|
||||
struct spi_flash *flash = dev_get_uclass_priv(dev);
|
||||
|
||||
#if defined(CONFIG_SPI_FLASH_SST)
|
||||
if (flash->flags & SST_WR) {
|
||||
if (flash->spi->op_mode_tx & SPI_OPM_TX_BP)
|
||||
return sst_write_bp(flash, offset, len, buf);
|
||||
else
|
||||
return sst_write_wp(flash, offset, len, buf);
|
||||
}
|
||||
#endif
|
||||
|
||||
return spi_flash_cmd_write_ops(flash, offset, len, buf);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user