Root/target/linux/ar71xx/patches-3.3/406-mtd-m25p80-allow-to-specify-max-read-size.patch

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

Archive Download this file



interactive