All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] spi-gpio: Allow operation without CS signal
@ 2009-02-21 21:01 Michael Buesch
  0 siblings, 0 replies; only message in thread
From: Michael Buesch @ 2009-02-21 21:01 UTC (permalink / raw)
  To: David Brownell; +Cc: Andrew Morton, linux-kernel

This patch changes spi-gpio so that it is possible to drive SPI
communications over GPIO without the need for a chipselect signal.

This is useful in very small setups where there's only one slave device
on the bus.

This patch does not affect existing setups.

Signed-off-by: Michael Buesch <mb@bu3sch.de>

---

I use this for a tiny communication channel between an embedded device
and a microcontroller. There are not enough GPIOs available for chipselect
and it's not needed anyway in this case.

PS: Dave, please give me some hint on how to fixup the spi-delay patch
    that I sent recently. Should I add a member to the spi-gpio pdata that
    tells whether to use the delay? This way existing setups would continue
    to work unchanged and the max_bus_speed=0 issue would be resolved.


Index: linux-2.6/drivers/spi/spi_gpio.c
===================================================================
--- linux-2.6.orig/drivers/spi/spi_gpio.c	2009-02-21 21:57:03.000000000 +0100
+++ linux-2.6/drivers/spi/spi_gpio.c	2009-02-21 21:57:58.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/include/linux/spi/spi_gpio.h
===================================================================
--- linux-2.6.orig/include/linux/spi/spi_gpio.h	2009-02-21 21:48:36.000000000 +0100
+++ linux-2.6/include/linux/spi/spi_gpio.h	2009-02-21 21:57:58.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


-- 
Greetings, Michael.

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-02-21 21:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-21 21:01 [PATCH] spi-gpio: Allow operation without CS signal Michael Buesch

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.