aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHeiner Kallweit <hkallweit1@gmail.com>2016-04-23 16:47:08 -0400
committerMark Brown <broonie@kernel.org>2016-04-25 13:51:31 -0400
commit7ba2f2757d84eae533679306f03c93c118437a87 (patch)
tree7a93f8c7fd162b853dd009fd66e1b71326fbb871
parentf55532a0c0b8bb6148f4e07853b876ef73bc69ca (diff)
spi: core: add hook flash_read_supported to spi_master
If hook spi_flash_read is implemented the fast flash read feature is enabled for all devices attached to the respective master. In most cases there is just one flash chip, however there are also devices with more than one flash chip, namely some WiFi routers. Then the fast flash read feature can be used for the first chip only. OpenWRT implemented an own handling of this case, using controller_data element of spi_device to hold the information whether fast flash read can be used for a device. This patch adds hook flash_read_supported to spi_master which is used to extend spi_flash_read_supported() by checking whether the fast flash read feature can be used for a specific spi_device. If the hook is not implemented the default behavior is to allow fast flash read for all devices (if spi_flash_read is implemented). Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--include/linux/spi/spi.h6
1 files changed, 5 insertions, 1 deletions
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
index 857a9a1d82b5..1f03483f61e5 100644
--- a/include/linux/spi/spi.h
+++ b/include/linux/spi/spi.h
@@ -372,6 +372,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)
372 * @unprepare_message: undo any work done by prepare_message(). 372 * @unprepare_message: undo any work done by prepare_message().
373 * @spi_flash_read: to support spi-controller hardwares that provide 373 * @spi_flash_read: to support spi-controller hardwares that provide
374 * accelerated interface to read from flash devices. 374 * accelerated interface to read from flash devices.
375 * @flash_read_supported: spi device supports flash read
375 * @cs_gpios: Array of GPIOs to use as chip select lines; one per CS 376 * @cs_gpios: Array of GPIOs to use as chip select lines; one per CS
376 * number. Any individual value may be -ENOENT for CS lines that 377 * number. Any individual value may be -ENOENT for CS lines that
377 * are not GPIOs (driven by the SPI controller itself). 378 * are not GPIOs (driven by the SPI controller itself).
@@ -529,6 +530,7 @@ struct spi_master {
529 struct spi_message *message); 530 struct spi_message *message);
530 int (*spi_flash_read)(struct spi_device *spi, 531 int (*spi_flash_read)(struct spi_device *spi,
531 struct spi_flash_read_message *msg); 532 struct spi_flash_read_message *msg);
533 bool (*flash_read_supported)(struct spi_device *spi);
532 534
533 /* 535 /*
534 * These hooks are for drivers that use a generic implementation 536 * These hooks are for drivers that use a generic implementation
@@ -1158,7 +1160,9 @@ struct spi_flash_read_message {
1158/* SPI core interface for flash read support */ 1160/* SPI core interface for flash read support */
1159static inline bool spi_flash_read_supported(struct spi_device *spi) 1161static inline bool spi_flash_read_supported(struct spi_device *spi)
1160{ 1162{
1161 return spi->master->spi_flash_read ? true : false; 1163 return spi->master->spi_flash_read &&
1164 (!spi->master->flash_read_supported ||
1165 spi->master->flash_read_supported(spi));
1162} 1166}
1163 1167
1164int spi_flash_read(struct spi_device *spi, 1168int spi_flash_read(struct spi_device *spi,