| 1 | --- a/drivers/mtd/devices/m25p80.c |
| 2 | +++ b/drivers/mtd/devices/m25p80.c |
| 3 | @@ -100,6 +100,7 @@ struct m25p { |
| 4 | u16 addr_width; |
| 5 | u8 erase_opcode; |
| 6 | u8 *command; |
| 7 | + size_t max_read_len; |
| 8 | }; |
| 9 | |
| 10 | static inline struct m25p *mtd_to_m25p(struct mtd_info *mtd) |
| 11 | @@ -352,6 +353,7 @@ static int m25p80_read(struct mtd_info * |
| 12 | struct m25p *flash = mtd_to_m25p(mtd); |
| 13 | struct spi_transfer t[2]; |
| 14 | struct spi_message m; |
| 15 | + loff_t ofs; |
| 16 | |
| 17 | pr_debug("%s: %s from 0x%08x, len %zd\n", dev_name(&flash->spi->dev), |
| 18 | __func__, (u32)from, len); |
| 19 | @@ -374,8 +376,6 @@ static int m25p80_read(struct mtd_info * |
| 20 | t[0].len = m25p_cmdsz(flash) + FAST_READ_DUMMY_BYTE; |
| 21 | spi_message_add_tail(&t[0], &m); |
| 22 | |
| 23 | - t[1].rx_buf = buf; |
| 24 | - t[1].len = len; |
| 25 | spi_message_add_tail(&t[1], &m); |
| 26 | |
| 27 | /* Byte count starts at zero. */ |
| 28 | @@ -383,13 +383,6 @@ static int m25p80_read(struct mtd_info * |
| 29 | |
| 30 | mutex_lock(&flash->lock); |
| 31 | |
| 32 | - /* Wait till previous write/erase is done. */ |
| 33 | - if (wait_till_ready(flash)) { |
| 34 | - /* REVISIT status return?? */ |
| 35 | - mutex_unlock(&flash->lock); |
| 36 | - return 1; |
| 37 | - } |
| 38 | - |
| 39 | /* FIXME switch to OPCODE_FAST_READ. It's required for higher |
| 40 | * clocks; and at this writing, every chip this driver handles |
| 41 | * supports that opcode. |
| 42 | @@ -397,11 +390,44 @@ static int m25p80_read(struct mtd_info * |
| 43 | |
| 44 | /* Set up the write data buffer. */ |
| 45 | flash->command[0] = OPCODE_READ; |
| 46 | - m25p_addr2cmd(flash, from, flash->command); |
| 47 | |
| 48 | - spi_sync(flash->spi, &m); |
| 49 | + ofs = 0; |
| 50 | + while (len) { |
| 51 | + size_t readlen; |
| 52 | + size_t done; |
| 53 | + int ret; |
| 54 | + |
| 55 | + ret = wait_till_ready(flash); |
| 56 | + if (ret) { |
| 57 | + mutex_unlock(&flash->lock); |
| 58 | + return 1; |
| 59 | + } |
| 60 | + |
| 61 | + if (flash->max_read_len > 0 && |
| 62 | + flash->max_read_len < len) |
| 63 | + readlen = flash->max_read_len; |
| 64 | + else |
| 65 | + readlen = len; |
| 66 | + |
| 67 | + t[1].rx_buf = buf + ofs; |
| 68 | + t[1].len = readlen; |
| 69 | + |
| 70 | + m25p_addr2cmd(flash, from + ofs, flash->command); |
| 71 | + |
| 72 | + spi_sync(flash->spi, &m); |
| 73 | |
| 74 | - *retlen = m.actual_length - m25p_cmdsz(flash) - FAST_READ_DUMMY_BYTE; |
| 75 | + done = m.actual_length - m25p_cmdsz(flash) - |
| 76 | + FAST_READ_DUMMY_BYTE; |
| 77 | + if (done != readlen) { |
| 78 | + mutex_unlock(&flash->lock); |
| 79 | + return 1; |
| 80 | + } |
| 81 | + |
| 82 | + ofs += done; |
| 83 | + len -= done; |
| 84 | + } |
| 85 | + |
| 86 | + *retlen = ofs; |
| 87 | |
| 88 | mutex_unlock(&flash->lock); |
| 89 | |
| 90 | @@ -924,6 +950,12 @@ static int __devinit m25p_probe(struct s |
| 91 | flash->mtd.erase = m25p80_erase; |
| 92 | flash->mtd.read = m25p80_read; |
| 93 | |
| 94 | + if (data && data->max_read_len) { |
| 95 | + flash->max_read_len = data->max_read_len; |
| 96 | + dev_warn(&spi->dev, "max_read_len set to %d bytes\n", |
| 97 | + flash->max_read_len); |
| 98 | + } |
| 99 | + |
| 100 | /* sst flash chips use AAI word program */ |
| 101 | if (JEDEC_MFR(info->jedec_id) == CFI_MFR_SST) |
| 102 | flash->mtd.write = sst_write; |
| 103 | --- a/include/linux/spi/flash.h |
| 104 | +++ b/include/linux/spi/flash.h |
| 105 | @@ -25,6 +25,7 @@ struct flash_platform_data { |
| 106 | |
| 107 | char *type; |
| 108 | |
| 109 | + size_t max_read_len; |
| 110 | /* we'll likely add more ... use JEDEC IDs, etc */ |
| 111 | }; |
| 112 | |
| 113 | |