diff options
Diffstat (limited to 'target')
| -rw-r--r-- | target/linux/generic-2.6/patches-2.6.28/920-02-spi-gpio-without-cs.patch | 77 | 
1 files changed, 77 insertions, 0 deletions
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  | 
