--- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c
-@@ -192,6 +192,7 @@ static ssize_t m25p80_read(struct spi_no
+@@ -194,6 +194,7 @@ static ssize_t m25p80_read(struct spi_no
*/
static int m25p_probe(struct spi_device *spi)
{
struct flash_platform_data *data;
struct m25p *flash;
struct spi_nor *nor;
-@@ -244,8 +245,11 @@ static int m25p_probe(struct spi_device
+@@ -246,8 +247,11 @@ static int m25p_probe(struct spi_device
if (ret)
return ret;
--- a/drivers/mtd/devices/m25p80.c
+++ b/drivers/mtd/devices/m25p80.c
-@@ -172,7 +172,8 @@ static ssize_t m25p80_read(struct spi_no
+@@ -174,7 +174,8 @@ static ssize_t m25p80_read(struct spi_no
t[1].rx_buf = buf;
t[1].rx_nbits = m25p80_rx_nbits(nor);
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 23 Feb 2018 17:12:16 +0100
+Subject: [PATCH] mtd: m25p80: allow fallback from spi_flash_read to regular
+ SPI transfer
+
+Some flash controllers, e.g. on the ath79 platform can support a fast
+flash read via memory mapping, but only if the flash chip is in
+3-byte address mode.
+
+Since spi_flash_read_supported does not have access to the same data as
+spi_flash_read, the driver can't detect an unsupported call until m25p80
+has decided to use spi_flash_read.
+
+Allow the driver to indicate a fallback to a regular SPI transfer by
+returning -EOPNOTSUPP
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/mtd/devices/m25p80.c
++++ b/drivers/mtd/devices/m25p80.c
+@@ -170,9 +170,11 @@ static ssize_t m25p80_read(struct spi_no
+ msg.data_nbits = data_nbits;
+
+ ret = spi_flash_read(spi, &msg);
+- if (ret < 0)
+- return ret;
+- return msg.retlen;
++ if (ret != -EOPNOTSUPP) {
++ if (ret < 0)
++ return ret;
++ return msg.retlen;
++ }
+ }
+
+ spi_message_init(&m);
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 23 Feb 2018 17:12:16 +0100
+Subject: [PATCH] mtd: m25p80: allow fallback from spi_flash_read to regular
+ SPI transfer
+
+Some flash controllers, e.g. on the ath79 platform can support a fast
+flash read via memory mapping, but only if the flash chip is in
+3-byte address mode.
+
+Since spi_flash_read_supported does not have access to the same data as
+spi_flash_read, the driver can't detect an unsupported call until m25p80
+has decided to use spi_flash_read.
+
+Allow the driver to indicate a fallback to a regular SPI transfer by
+returning -EOPNOTSUPP
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+
+--- a/drivers/mtd/devices/m25p80.c
++++ b/drivers/mtd/devices/m25p80.c
+@@ -155,9 +155,11 @@ static ssize_t m25p80_read(struct spi_no
+ msg.data_nbits = m25p80_rx_nbits(nor);
+
+ ret = spi_flash_read(spi, &msg);
+- if (ret < 0)
+- return ret;
+- return msg.retlen;
++ if (ret != -EOPNOTSUPP) {
++ if (ret < 0)
++ return ret;
++ return msg.retlen;
++ }
+ }
+
+ spi_message_init(&m);
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
-@@ -243,6 +244,10 @@ static int m25p_probe(struct spi_device
+@@ -245,6 +246,10 @@ static int m25p_probe(struct spi_device
};
char *flash_name;
int ret;
data = dev_get_platdata(&spi->dev);
-@@ -281,6 +286,8 @@ static int m25p_probe(struct spi_device
+@@ -283,6 +288,8 @@ static int m25p_probe(struct spi_device
if (data && data->name)
nor->mtd.name = data->name;
#include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h>
-@@ -198,6 +199,10 @@ static int m25p_probe(struct spi_device
+@@ -200,6 +201,10 @@ static int m25p_probe(struct spi_device
enum read_mode mode = SPI_NOR_NORMAL;
char *flash_name;
int ret;
data = dev_get_platdata(&spi->dev);
-@@ -227,6 +232,8 @@ static int m25p_probe(struct spi_device
+@@ -229,6 +234,8 @@ static int m25p_probe(struct spi_device
if (data && data->name)
nor->mtd.name = data->name;