From df128b7feabfe9bf587f18fde89ea35427546b58 Mon Sep 17 00:00:00 2001 From: mb Date: Wed, 11 Feb 2009 18:02:59 +0000 Subject: spi-gpio: Support busses without chipselect (only one device on the bus) git-svn-id: svn://svn.openwrt.org/openwrt/trunk@14476 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../920-02-spi-gpio-without-cs.patch | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 target/linux/generic-2.6/patches-2.6.28/920-02-spi-gpio-without-cs.patch diff --git a/target/linux/generic-2.6/patches-2.6.28/920-02-spi-gpio-without-cs.patch b/target/linux/generic-2.6/patches-2.6.28/920-02-spi-gpio-without-cs.patch new file mode 100644 index 000000000..a67ec5953 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.28/920-02-spi-gpio-without-cs.patch @@ -0,0 +1,77 @@ +Optionally omit the CS signal, if there's only one device on the bus. + +--mb + + + +Index: linux-2.6.28.2/drivers/spi/spi_gpio.c +=================================================================== +--- linux-2.6.28.2.orig/drivers/spi/spi_gpio.c 2009-02-11 18:48:23.000000000 +0100 ++++ linux-2.6.28.2/drivers/spi/spi_gpio.c 2009-02-11 18:48:50.000000000 +0100 +@@ -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); + } + +Index: linux-2.6.28.2/include/linux/spi/spi_gpio.h +=================================================================== +--- linux-2.6.28.2.orig/include/linux/spi/spi_gpio.h 2009-02-11 18:48:23.000000000 +0100 ++++ linux-2.6.28.2/include/linux/spi/spi_gpio.h 2009-02-11 18:58:31.000000000 +0100 +@@ -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 -- cgit v1.2.3