kernel: Add support for Winbond w25q128jv SPI NOR flash
Newer batches of several Mikrotik boards contain this yet-unsupported flash chip, for instance: - rb941-2nd (hAP lite) - rb952ui-5ac2nd (hAP ac lite) - RBM33G and probably other Mikrotik boards need this patch as well. The patch was submitted upstream by Robert Marko: https://patchwork.ozlabs.org/patch/934181/ Closes: FS#1715 Signed-off-by: Baptiste Jonglez <git@bitsofnetworks.org> Cc: Robert Marko <robimarko@gmail.com>
This commit is contained in:
		 Baptiste Jonglez
					Baptiste Jonglez
				
			
				
					committed by
					
						 Hauke Mehrtens
						Hauke Mehrtens
					
				
			
			
				
	
			
			
			 Hauke Mehrtens
						Hauke Mehrtens
					
				
			
						parent
						
							d27d87c910
						
					
				
				
					commit
					b2c68ceea7
				
			| @@ -0,0 +1,34 @@ | |||||||
|  | From: Robert Marko <robimarko@gmail.com> | ||||||
|  | To: linux-mtd@lists.infradead.org | ||||||
|  | Subject: mtd: spi-nor: Add Winbond w25q128jv support | ||||||
|  | Date: Mon, 25 Jun 2018 13:17:48 +0200 | ||||||
|  |  | ||||||
|  | Datasheet: | ||||||
|  | http://www.winbond.com/resource-files/w25q128jv%20revf%2003272018%20plus.pdf | ||||||
|  |  | ||||||
|  | Testing done on Mikrotik Routerboard  wAP R board. | ||||||
|  | It does not support Dual or Quad modes. | ||||||
|  |  | ||||||
|  | Signed-off-by: Robert Marko <robimarko@gmail.com> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | Changes in v2: | ||||||
|  | 	- Correct the title | ||||||
|  | --- | ||||||
|  |  drivers/mtd/spi-nor/spi-nor.c | 5 +++++ | ||||||
|  |  1 file changed, 5 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/drivers/mtd/spi-nor/spi-nor.c | ||||||
|  | +++ b/drivers/mtd/spi-nor/spi-nor.c | ||||||
|  | @@ -1159,6 +1159,11 @@ static const struct flash_info spi_nor_i | ||||||
|  |  			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | | ||||||
|  |  			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) | ||||||
|  |  	}, | ||||||
|  | +	{ | ||||||
|  | +		"w25q128jv", INFO(0xef7018, 0, 64 * 1024, 256, | ||||||
|  | +			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | | ||||||
|  | +			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) | ||||||
|  | +	}, | ||||||
|  |  	{ "w25q80", INFO(0xef5014, 0, 64 * 1024,  16, SECT_4K) }, | ||||||
|  |  	{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16, SECT_4K) }, | ||||||
|  |  	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) }, | ||||||
| @@ -17,7 +17,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> | |||||||
|  |  | ||||||
| --- a/drivers/mtd/spi-nor/spi-nor.c | --- a/drivers/mtd/spi-nor/spi-nor.c | ||||||
| +++ b/drivers/mtd/spi-nor/spi-nor.c | +++ b/drivers/mtd/spi-nor/spi-nor.c | ||||||
| @@ -1181,6 +1181,10 @@ static const struct flash_info spi_nor_i | @@ -1186,6 +1186,10 @@ static const struct flash_info spi_nor_i | ||||||
|  	{ "3S400AN", S3AN_INFO(0x1f2400, 256, 264) }, |  	{ "3S400AN", S3AN_INFO(0x1f2400, 256, 264) }, | ||||||
|  	{ "3S700AN", S3AN_INFO(0x1f2500, 512, 264) }, |  	{ "3S700AN", S3AN_INFO(0x1f2500, 512, 264) }, | ||||||
|  	{ "3S1400AN", S3AN_INFO(0x1f2600, 512, 528) }, |  	{ "3S1400AN", S3AN_INFO(0x1f2600, 512, 528) }, | ||||||
|   | |||||||
| @@ -0,0 +1,34 @@ | |||||||
|  | From: Robert Marko <robimarko@gmail.com> | ||||||
|  | To: linux-mtd@lists.infradead.org | ||||||
|  | Subject: mtd: spi-nor: Add Winbond w25q128jv support | ||||||
|  | Date: Mon, 25 Jun 2018 13:17:48 +0200 | ||||||
|  |  | ||||||
|  | Datasheet: | ||||||
|  | http://www.winbond.com/resource-files/w25q128jv%20revf%2003272018%20plus.pdf | ||||||
|  |  | ||||||
|  | Testing done on Mikrotik Routerboard  wAP R board. | ||||||
|  | It does not support Dual or Quad modes. | ||||||
|  |  | ||||||
|  | Signed-off-by: Robert Marko <robimarko@gmail.com> | ||||||
|  | --- | ||||||
|  |  | ||||||
|  | Changes in v2: | ||||||
|  | 	- Correct the title | ||||||
|  | --- | ||||||
|  |  drivers/mtd/spi-nor/spi-nor.c | 5 +++++ | ||||||
|  |  1 file changed, 5 insertions(+) | ||||||
|  |  | ||||||
|  | --- a/drivers/mtd/spi-nor/spi-nor.c | ||||||
|  | +++ b/drivers/mtd/spi-nor/spi-nor.c | ||||||
|  | @@ -1146,6 +1146,11 @@ static const struct flash_info spi_nor_i | ||||||
|  |  			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | | ||||||
|  |  			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) | ||||||
|  |  	}, | ||||||
|  | +	{ | ||||||
|  | +		"w25q128jv", INFO(0xef7018, 0, 64 * 1024, 256, | ||||||
|  | +			SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ | | ||||||
|  | +			SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) | ||||||
|  | +	}, | ||||||
|  |  	{ "w25q80", INFO(0xef5014, 0, 64 * 1024,  16, SECT_4K) }, | ||||||
|  |  	{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16, SECT_4K) }, | ||||||
|  |  	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) }, | ||||||
| @@ -17,7 +17,7 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> | |||||||
|  |  | ||||||
| --- a/drivers/mtd/spi-nor/spi-nor.c | --- a/drivers/mtd/spi-nor/spi-nor.c | ||||||
| +++ b/drivers/mtd/spi-nor/spi-nor.c | +++ b/drivers/mtd/spi-nor/spi-nor.c | ||||||
| @@ -1166,6 +1166,10 @@ static const struct flash_info spi_nor_i | @@ -1171,6 +1171,10 @@ static const struct flash_info spi_nor_i | ||||||
|  	{ "3S400AN", S3AN_INFO(0x1f2400, 256, 264) }, |  	{ "3S400AN", S3AN_INFO(0x1f2400, 256, 264) }, | ||||||
|  	{ "3S700AN", S3AN_INFO(0x1f2500, 512, 264) }, |  	{ "3S700AN", S3AN_INFO(0x1f2500, 512, 264) }, | ||||||
|  	{ "3S1400AN", S3AN_INFO(0x1f2600, 512, 528) }, |  	{ "3S1400AN", S3AN_INFO(0x1f2600, 512, 528) }, | ||||||
|   | |||||||
| @@ -116,7 +116,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|   |   | ||||||
|  	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_LOCK); |  	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_LOCK); | ||||||
|  	return ret; |  	return ret; | ||||||
| @@ -1165,7 +1217,7 @@ static const struct flash_info spi_nor_i | @@ -1170,7 +1222,7 @@ static const struct flash_info spi_nor_i | ||||||
|  	{ "w25q80", INFO(0xef5014, 0, 64 * 1024,  16, SECT_4K) }, |  	{ "w25q80", INFO(0xef5014, 0, 64 * 1024,  16, SECT_4K) }, | ||||||
|  	{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16, SECT_4K) }, |  	{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024,  16, SECT_4K) }, | ||||||
|  	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) }, |  	{ "w25q128", INFO(0xef4018, 0, 64 * 1024, 256, SECT_4K) }, | ||||||
| @@ -125,7 +125,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	{ "w25m512jv", INFO(0xef7119, 0, 64 * 1024, 1024, |  	{ "w25m512jv", INFO(0xef7119, 0, 64 * 1024, 1024, | ||||||
|  			SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_DUAL_READ) }, |  			SECT_4K | SPI_NOR_QUAD_READ | SPI_NOR_DUAL_READ) }, | ||||||
|   |   | ||||||
| @@ -1225,6 +1277,9 @@ static int spi_nor_read(struct mtd_info | @@ -1230,6 +1282,9 @@ static int spi_nor_read(struct mtd_info | ||||||
|  	if (ret) |  	if (ret) | ||||||
|  		return ret; |  		return ret; | ||||||
|   |   | ||||||
| @@ -135,7 +135,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	while (len) { |  	while (len) { | ||||||
|  		loff_t addr = from; |  		loff_t addr = from; | ||||||
|   |   | ||||||
| @@ -1249,6 +1304,18 @@ static int spi_nor_read(struct mtd_info | @@ -1254,6 +1309,18 @@ static int spi_nor_read(struct mtd_info | ||||||
|  	ret = 0; |  	ret = 0; | ||||||
|   |   | ||||||
|  read_err: |  read_err: | ||||||
| @@ -154,7 +154,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); |  	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); | ||||||
|  	return ret; |  	return ret; | ||||||
|  } |  } | ||||||
| @@ -1350,6 +1417,10 @@ static int spi_nor_write(struct mtd_info | @@ -1355,6 +1422,10 @@ static int spi_nor_write(struct mtd_info | ||||||
|  	if (ret) |  	if (ret) | ||||||
|  		return ret; |  		return ret; | ||||||
|   |   | ||||||
| @@ -165,7 +165,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	for (i = 0; i < len; ) { |  	for (i = 0; i < len; ) { | ||||||
|  		ssize_t written; |  		ssize_t written; | ||||||
|  		loff_t addr = to + i; |  		loff_t addr = to + i; | ||||||
| @@ -1390,6 +1461,7 @@ static int spi_nor_write(struct mtd_info | @@ -1395,6 +1466,7 @@ static int spi_nor_write(struct mtd_info | ||||||
|  	} |  	} | ||||||
|   |   | ||||||
|  write_err: |  write_err: | ||||||
| @@ -173,7 +173,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name> | |||||||
|  	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE); |  	spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE); | ||||||
|  	return ret; |  	return ret; | ||||||
|  } |  } | ||||||
| @@ -2806,8 +2878,10 @@ int spi_nor_scan(struct spi_nor *nor, co | @@ -2811,8 +2883,10 @@ int spi_nor_scan(struct spi_nor *nor, co | ||||||
|  	} else if (mtd->size > 0x1000000) { |  	} else if (mtd->size > 0x1000000) { | ||||||
|  		/* enable 4-byte addressing if the device exceeds 16MiB */ |  		/* enable 4-byte addressing if the device exceeds 16MiB */ | ||||||
|  		nor->addr_width = 4; |  		nor->addr_width = 4; | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ | |||||||
|  /* |  /* | ||||||
|   * Write status register 1 byte |   * Write status register 1 byte | ||||||
|   * Returns negative if error occurred. |   * Returns negative if error occurred. | ||||||
| @@ -2878,9 +2887,16 @@ int spi_nor_scan(struct spi_nor *nor, co | @@ -2883,9 +2892,16 @@ int spi_nor_scan(struct spi_nor *nor, co | ||||||
|  	} else if (mtd->size > 0x1000000) { |  	} else if (mtd->size > 0x1000000) { | ||||||
|  		/* enable 4-byte addressing if the device exceeds 16MiB */ |  		/* enable 4-byte addressing if the device exceeds 16MiB */ | ||||||
|  		nor->addr_width = 4; |  		nor->addr_width = 4; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user