Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Heiner Kallweit and committed by
Mark Brown
7ba2f275 f55532a0

+5 -1
+5 -1
include/linux/spi/spi.h
··· 372 372 * @unprepare_message: undo any work done by prepare_message(). 373 373 * @spi_flash_read: to support spi-controller hardwares that provide 374 374 * accelerated interface to read from flash devices. 375 + * @flash_read_supported: spi device supports flash read 375 376 * @cs_gpios: Array of GPIOs to use as chip select lines; one per CS 376 377 * number. Any individual value may be -ENOENT for CS lines that 377 378 * are not GPIOs (driven by the SPI controller itself). ··· 530 529 struct spi_message *message); 531 530 int (*spi_flash_read)(struct spi_device *spi, 532 531 struct spi_flash_read_message *msg); 532 + bool (*flash_read_supported)(struct spi_device *spi); 533 533 534 534 /* 535 535 * These hooks are for drivers that use a generic implementation ··· 1160 1158 /* SPI core interface for flash read support */ 1161 1159 static inline bool spi_flash_read_supported(struct spi_device *spi) 1162 1160 { 1163 - return spi->master->spi_flash_read ? true : false; 1161 + return spi->master->spi_flash_read && 1162 + (!spi->master->flash_read_supported || 1163 + spi->master->flash_read_supported(spi)); 1164 1164 } 1165 1165 1166 1166 int spi_flash_read(struct spi_device *spi,