X-Git-Url: https://git.archive.openwrt.org/?a=blobdiff_plain;f=target%2Flinux%2Fgeneric%2Fpatches-3.10%2F861-04_spi_gpio_implement_spi_delay.patch;fp=target%2Flinux%2Fgeneric%2Fpatches-3.10%2F861-04_spi_gpio_implement_spi_delay.patch;h=4be08956d71dae4689bd48124204e9f402629eac;hb=f6ad0fc9373a736f9640d698e557c86dc6074edd;hp=0000000000000000000000000000000000000000;hpb=8c9642e945c54e21f0a0522bc76ada78d6017eb8;p=openwrt.git diff --git a/target/linux/generic/patches-3.10/861-04_spi_gpio_implement_spi_delay.patch b/target/linux/generic/patches-3.10/861-04_spi_gpio_implement_spi_delay.patch new file mode 100644 index 0000000000..4be08956d7 --- /dev/null +++ b/target/linux/generic/patches-3.10/861-04_spi_gpio_implement_spi_delay.patch @@ -0,0 +1,58 @@ +Implement the SPI-GPIO delay function for busses that need speed limitation. + +--mb + + + +--- a/drivers/spi/spi-gpio.c ++++ b/drivers/spi/spi-gpio.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + #include + #include + +@@ -73,6 +74,7 @@ struct spi_gpio { + * #define SPI_MOSI_GPIO 120 + * #define SPI_SCK_GPIO 121 + * #define SPI_N_CHIPSEL 4 ++ * #undef NEED_SPIDELAY + * #include "spi-gpio.c" + */ + +@@ -80,6 +82,7 @@ struct spi_gpio { + #define DRIVER_NAME "spi_gpio" + + #define GENERIC_BITBANG /* vs tight inlines */ ++#define NEED_SPIDELAY 1 + + /* all functions referencing these symbols must define pdata */ + #define SPI_MISO_GPIO ((pdata)->miso) +@@ -130,12 +133,20 @@ static inline int getmiso(const struct s + #undef pdata + + /* +- * NOTE: this clocks "as fast as we can". It "should" be a function of the +- * requested device clock. Software overhead means we usually have trouble +- * reaching even one Mbit/sec (except when we can inline bitops), so for now +- * we'll just assume we never need additional per-bit slowdowns. ++ * NOTE: to clock "as fast as we can", set spi_device.max_speed_hz ++ * and spi_transfer.speed_hz to 0. ++ * Otherwise this is a function of the requested device clock. ++ * Software overhead means we usually have trouble ++ * reaching even one Mbit/sec (except when we can inline bitops). So on small ++ * embedded devices with fast SPI slaves you usually don't need a delay. + */ +-#define spidelay(nsecs) do {} while (0) ++static inline void spidelay(unsigned nsecs) ++{ ++#ifdef NEED_SPIDELAY ++ if (unlikely(nsecs)) ++ ndelay(nsecs); ++#endif /* NEED_SPIDELAY */ ++} + + #include "spi-bitbang-txrx.h" +