diff options
Diffstat (limited to 'target/linux/generic-2.6/patches-2.6.29/920-02-spi-gpio-without-cs.patch')
-rw-r--r-- | target/linux/generic-2.6/patches-2.6.29/920-02-spi-gpio-without-cs.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.29/920-02-spi-gpio-without-cs.patch b/target/linux/generic-2.6/patches-2.6.29/920-02-spi-gpio-without-cs.patch new file mode 100644 index 0000000000..8b2198ef14 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.29/920-02-spi-gpio-without-cs.patch @@ -0,0 +1,73 @@ +Optionally omit the CS signal, if there's only one device on the bus. + +--mb + + + +--- a/drivers/spi/spi_gpio.c ++++ b/drivers/spi/spi_gpio.c +@@ -178,8 +178,10 @@ static void spi_gpio_chipselect(struct s + if (is_active) + setsck(spi, spi->mode & SPI_CPOL); + +- /* SPI is normally active-low */ +- gpio_set_value(cs, (spi->mode & SPI_CS_HIGH) ? is_active : !is_active); ++ if (cs != SPI_GPIO_NO_CHIPSELECT) { ++ /* SPI is normally active-low */ ++ gpio_set_value(cs, (spi->mode & SPI_CS_HIGH) ? is_active : !is_active); ++ } + } + + static int spi_gpio_setup(struct spi_device *spi) +@@ -191,15 +193,17 @@ static int spi_gpio_setup(struct spi_dev + return -EINVAL; + + if (!spi->controller_state) { +- status = gpio_request(cs, spi->dev.bus_id); +- if (status) +- return status; +- status = gpio_direction_output(cs, spi->mode & SPI_CS_HIGH); ++ if (cs != SPI_GPIO_NO_CHIPSELECT) { ++ status = gpio_request(cs, spi->dev.bus_id); ++ if (status) ++ return status; ++ status = gpio_direction_output(cs, spi->mode & SPI_CS_HIGH); ++ } + } + if (!status) + status = spi_bitbang_setup(spi); + if (status) { +- if (!spi->controller_state) ++ if (!spi->controller_state && cs != SPI_GPIO_NO_CHIPSELECT) + gpio_free(cs); + } + return status; +@@ -209,7 +213,8 @@ static void spi_gpio_cleanup(struct spi_ + { + unsigned long cs = (unsigned long) spi->controller_data; + +- gpio_free(cs); ++ if (cs != SPI_GPIO_NO_CHIPSELECT) ++ gpio_free(cs); + spi_bitbang_cleanup(spi); + } + +--- a/include/linux/spi/spi_gpio.h ++++ b/include/linux/spi/spi_gpio.h +@@ -25,10 +25,16 @@ + * ... + * }; + * ++ * If chipselect is not used (there's only one device on the bus), assign ++ * SPI_GPIO_NO_CHIPSELECT to the controller_data: ++ * .controller_data = (void *) SPI_GPIO_NO_CHIPSELECT; ++ * + * If the bitbanged bus is later switched to a "native" controller, + * that platform_device and controller_data should be removed. + */ + ++#define SPI_GPIO_NO_CHIPSELECT ((unsigned long)-1l) ++ + /** + * struct spi_gpio_platform_data - parameter for bitbanged SPI master + * @sck: number of the GPIO used for clock output |