diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-07-31 13:55:30 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-07-31 16:31:17 +0200 |
commit | 8895e7512eeda1edb04e9e7942db60077e6828a7 (patch) | |
tree | aa279890c50926a864378ade95b9998c1c4632ae /drivers/nor | |
parent | 85bdbb1c52ca84d08989d383ade8705cb22dd12b (diff) | |
download | barebox-8895e7512eeda1edb04e9e7942db60077e6828a7.tar.gz barebox-8895e7512eeda1edb04e9e7942db60077e6828a7.tar.xz |
nor m25p80: implement fast read
The fast read command is needed for spi speeds > 25MHz, so use it for
higher speeds.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/nor')
-rw-r--r-- | drivers/nor/m25p80.c | 12 | ||||
-rw-r--r-- | drivers/nor/m25p80.h | 10 |
2 files changed, 9 insertions, 13 deletions
diff --git a/drivers/nor/m25p80.c b/drivers/nor/m25p80.c index 4b62e93f5e..daaf60c321 100644 --- a/drivers/nor/m25p80.c +++ b/drivers/nor/m25p80.c @@ -267,6 +267,7 @@ ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, struct spi_transfer t[2]; struct spi_message m; ssize_t retlen; + int fast_read = 0; /* sanity checks */ if (!count) @@ -275,6 +276,9 @@ ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, if (offset + count > flash->size) return -EINVAL; + if (flash->spi->max_speed_hz >= 25000000) + fast_read = 1; + spi_message_init(&m); memset(t, 0, (sizeof t)); @@ -283,7 +287,7 @@ ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, * Should add 1 byte DUMMY_BYTE. */ t[0].tx_buf = flash->command; - t[0].len = m25p_cmdsz(flash) + FAST_READ_DUMMY_BYTE; + t[0].len = m25p_cmdsz(flash) + fast_read; spi_message_add_tail(&t[0], &m); t[1].rx_buf = buf; @@ -303,12 +307,12 @@ ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, */ /* Set up the write data buffer. */ - flash->command[0] = OPCODE_READ; + flash->command[0] = fast_read ? OPCODE_FAST_READ : OPCODE_NORM_READ; m25p_addr2cmd(flash, offset, flash->command); spi_sync(flash->spi, &m); - retlen = m.actual_length - m25p_cmdsz(flash) - FAST_READ_DUMMY_BYTE; + retlen = m.actual_length - m25p_cmdsz(flash) - fast_read; return retlen; } @@ -756,7 +760,7 @@ static int m25p_probe(struct device_d *dev) } flash = xzalloc(sizeof *flash); - flash->command = xmalloc(MAX_CMD_SIZE + FAST_READ_DUMMY_BYTE); + flash->command = xmalloc(MAX_CMD_SIZE); flash->spi = spi; dev->priv = (void *)flash; diff --git a/drivers/nor/m25p80.h b/drivers/nor/m25p80.h index ce48ba71f6..34bf2e259a 100644 --- a/drivers/nor/m25p80.h +++ b/drivers/nor/m25p80.h @@ -34,15 +34,7 @@ /* Define max times to check status register before we give up. */ #define MAX_READY_WAIT 40 /* M25P16 specs 40s max chip erase */ -#define MAX_CMD_SIZE 5 - -#ifdef CONFIG_M25PXX_USE_FAST_READ -#define OPCODE_READ OPCODE_FAST_READ -#define FAST_READ_DUMMY_BYTE 1 -#else -#define OPCODE_READ OPCODE_NORM_READ -#define FAST_READ_DUMMY_BYTE 0 -#endif +#define MAX_CMD_SIZE 6 #define SPI_NAME_SIZE 32 |