ramips: add missing patch to spi-nor backport to fix mt7621 support

This commit is contained in:
Matthias Schiffer 2016-07-01 13:23:31 +02:00
parent e678ab140e
commit f1570cacb0
No known key found for this signature in database
GPG Key ID: 16EF3F64CB201D9C
1 changed files with 122 additions and 51 deletions

View File

@ -1915,11 +1915,10 @@ index 2beb39c..21f823d 100644
spi-max-frequency = <25000000>;
diff --git a/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch b/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch
deleted file mode 100644
index 1716e1c..0000000
index 1716e1c..8dc181a 100644
--- a/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch
+++ /dev/null
@@ -1,103 +0,0 @@
+++ b/target/linux/ramips/patches-3.18/0044-mtd-add-chunked-read-io-to-m25p80.patch
@@ -1,33 +1,18 @@
---- a/drivers/mtd/devices/m25p80.c
-+++ b/drivers/mtd/devices/m25p80.c
-@@ -19,6 +19,7 @@
@ -1940,65 +1939,86 @@ index 1716e1c..0000000
-
-@@ -157,6 +159,61 @@ static int m25p80_read(struct spi_nor *n
- return 0;
- }
-
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -1016,6 +1016,66 @@ write_err:
+ return ret;
}
-+static void m25p80_chunked_write(struct spi_nor *nor, loff_t _from, size_t _len,
-+ size_t *_retlen, const u_char *_buf)
-+{
++static int spi_nor_chunked_write(struct mtd_info *mtd, loff_t _to, size_t _len,
++ size_t *_retlen, const u_char *_buf)
+{
-+ struct m25p *flash = nor->priv;
-+ int chunk_size;
-+ int retlen = 0;
-+
++ struct spi_nor *nor = mtd_to_spi_nor(mtd);
+ int chunk_size;
+ int retlen = 0;
++ int ret;
+
-+ chunk_size = flash->chunk_size;
-+ if (!chunk_size)
-+ chunk_size = _len;
-+
-+ if (nor->addr_width > 3)
-+ chunk_size -= nor->addr_width - 3;
-+
-+ while (retlen < _len) {
-+ size_t len = min_t(int, chunk_size, _len - retlen);
-+ const u_char *buf = _buf + retlen;
++ chunk_size = nor->chunk_size;
+ if (!chunk_size)
+ chunk_size = _len;
+
@@ -37,35 +22,39 @@
+ while (retlen < _len) {
+ size_t len = min_t(int, chunk_size, _len - retlen);
+ const u_char *buf = _buf + retlen;
-+ loff_t from = _from + retlen;
-+
-+ nor->wait_till_ready(nor);
-+ nor->write_reg(nor, SPINOR_OP_WREN, NULL, 0, 0);
-+
++ loff_t to = _to + retlen;
+
-+ m25p80_write(nor, from, len, &retlen, buf);
-+ }
-+ *_retlen += retlen;
-+}
-+
++ if (nor->flags & SNOR_F_SST)
++ ret = sst_write(mtd, to, len, &retlen, buf);
++ else
++ ret = spi_nor_write(mtd, to, len, &retlen, buf);
++ if (ret)
++ return ret;
+ }
++
+ *_retlen += retlen;
++ return 0;
+}
+
-+static int m25p80_chunked_read(struct spi_nor *nor, loff_t _from, size_t _len,
-+ size_t *_retlen, u_char *_buf)
-+{
++static int spi_nor_chunked_read(struct mtd_info *mtd, loff_t _from, size_t _len,
++ size_t *_retlen, u_char *_buf)
+{
-+ struct m25p *flash = nor->priv;
-+ int chunk_size;
-+
++ struct spi_nor *nor = mtd_to_spi_nor(mtd);
+ int chunk_size;
++ int ret;
+
-+ chunk_size = flash->chunk_size;
-+ if (!chunk_size)
-+ chunk_size = _len;
++ chunk_size = nor->chunk_size;
+ if (!chunk_size)
+ chunk_size = _len;
+
+ *_retlen = 0;
-+
-+ *_retlen = 0;
-+
-+ while (*_retlen < _len) {
-+ size_t len = min_t(int, chunk_size, _len - *_retlen);
-+ u_char *buf = _buf + *_retlen;
-+ loff_t from = _from + *_retlen;
-+ int retlen = 0;
+ while (*_retlen < _len) {
+ size_t len = min_t(int, chunk_size, _len - *_retlen);
+ u_char *buf = _buf + *_retlen;
+ loff_t from = _from + *_retlen;
+ int retlen = 0;
-+ int ret = m25p80_read(nor, from, len, &retlen, buf);
-+
-+ if (ret)
-+ return ret;
-+
-+ *_retlen += retlen;
-+ }
-+
-+ return 0;
-+}
-+
+
++ ret = spi_nor_read(mtd, from, len, &retlen, buf);
+ if (ret)
+ return ret;
+
@@ -75,29 +64,60 @@
+ return 0;
+}
+
- static int m25p80_erase(struct spi_nor *nor, loff_t offset)
- {
+ static int macronix_quad_enable(struct spi_nor *nor)
{
- struct m25p *flash = nor->priv;
-@@ -197,6 +254,7 @@ static int m25p_probe(struct spi_device
- struct spi_nor *nor;
@ -2011,15 +2031,66 @@ index 1716e1c..0000000
-@@ -244,6 +302,14 @@ static int m25p_probe(struct spi_device
- if (ret)
- return ret;
-
+ int ret, val;
+@@ -1197,10 +1257,12 @@ int spi_nor_scan(struct spi_nor *nor, co
+ }
-+ if (spi->dev.of_node &&
-+ !of_property_read_u32(spi->dev.of_node, "m25p,chunked-io", &val)) {
-+ dev_warn(&spi->dev, "using chunked io\n");
-+ nor->read = m25p80_chunked_read;
-+ nor->write = m25p80_chunked_write;
-+ flash->chunk_size = val;
-+ }
-+
+ /* sst nor chips use AAI word program */
+- if (info->flags & SST_WRITE)
++ if (info->flags & SST_WRITE) {
+ mtd->_write = sst_write;
+- else
++ nor->flags |= SNOR_F_SST;
++ } else {
+ mtd->_write = spi_nor_write;
+ }
+
+ if (info->flags & USE_FSR)
+ nor->flags |= SNOR_F_USE_FSR;
+@@ -1228,11 +1290,20 @@ int spi_nor_scan(struct spi_nor *nor, co
+ mtd->writebufsize = nor->page_size;
+
+ if (np) {
++ u32 val;
+
- ppdata.of_node = spi->dev.of_node;
-
+ /* If we were instantiated by DT, use it */
+ if (of_property_read_bool(np, "m25p,fast-read"))
+ nor->flash_read = SPI_NOR_FAST;
+ else
+ nor->flash_read = SPI_NOR_NORMAL;
++
++ if (!of_property_read_u32(np, "m25p,chunked-io", &val)) {
++ dev_info(dev, "using chunked io (size=%d)\n", val);
++ mtd->_read = spi_nor_chunked_read;
++ mtd->_write = spi_nor_chunked_write;
++ nor->chunk_size = val;
++ }
+ } else {
+ /* If we weren't instantiated by DT, default to fast-read */
+ nor->flash_read = SPI_NOR_FAST;
+--- a/include/linux/mtd/spi-nor.h
++++ b/include/linux/mtd/spi-nor.h
+@@ -115,6 +115,7 @@ enum spi_nor_ops {
+
+ enum spi_nor_option_flags {
+ SNOR_F_USE_FSR = BIT(0),
++ SNOR_F_SST = BIT(1),
+ };
- return mtd_device_parse_register(&flash->mtd, NULL, &ppdata,
+ struct mtd_info;
+@@ -157,6 +158,7 @@ struct spi_nor {
+ struct device *dev;
+ struct device_node *flash_node;
+ u32 page_size;
++ u16 chunk_size;
+ u8 addr_width;
+ u8 erase_opcode;
+ u8 read_opcode;