Re: [OpenWrt-Devel] [PATCH v3] Add SPI over GPIO driver

2008-10-17 Thread Michael Buesch
On Friday 17 October 2008 05:14:26 Magnus Damm wrote:
> On Mon, Jul 21, 2008 at 4:46 AM, Michael Buesch <[EMAIL PROTECTED]> wrote:
> > This adds a driver that lets you drive an SPI bus over
> > generic GPIO pins.
> >
> > Signed-off-by: Michael Buesch <[EMAIL PROTECTED]>
> 
> Very useful. Fits my shiny new GPIO implementation for SuperH like a glove.
> 
> Michael, as you know, I have some SuperH board code that makes use of
> this driver. Are there any outstanding issues with this driver that I
> can help resolving?

bool cs_activelow should probably be removed from struct spi_gpio_platform_data.

I think cs always is activelow, so we can simply hardcode this in 
spi_gpio_chipselect()

If you want to do this, please feel free to do so.
I currently don't have the time for this.
The rest of the driver is fine with me.

-- 
Greetings Michael.
___
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
http://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel


[OpenWrt-Devel] [PATCH v3] Add SPI over GPIO driver

2008-07-20 Thread Michael Buesch
This adds a driver that lets you drive an SPI bus over
generic GPIO pins.

Signed-off-by: Michael Buesch <[EMAIL PROTECTED]>

---

This driver is used in OpenWrt since quite some time, so please
consider for inclusion in mainline.

Simple spelling fixes since v2.

Index: linux-next/include/linux/spi/spi_gpio.h
===
--- /dev/null   1970-01-01 00:00:00.0 +
+++ linux-next/include/linux/spi/spi_gpio.h 2008-07-20 21:40:38.0 
+0200
@@ -0,0 +1,73 @@
+/*
+ * spi_gpio interface to platform code
+ *
+ * Copyright (c) 2008 Piotr Skamruk
+ * Copyright (c) 2008 Michael Buesch
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#ifndef _LINUX_SPI_SPI_GPIO
+#define _LINUX_SPI_SPI_GPIO
+
+#include 
+#include 
+
+
+/**
+ * struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device.
+ *
+ * This structure holds information about a GPIO-based SPI device.
+ *
+ * @pin_clk: The GPIO pin number of the CLOCK pin.
+ *
+ * @pin_miso: The GPIO pin number of the MISO pin.
+ *
+ * @pin_mosi: The GPIO pin number of the MOSI pin.
+ *
+ * @pin_cs: The GPIO pin number of the CHIPSELECT pin.
+ *
+ * @cs_activelow: If true, the chip is selected when the CS line is low.
+ *
+ * @no_spi_delay: If true, no delay is done in the lowlevel bitbanging.
+ *Note that doing no delay is not standards compliant,
+ *but it might be needed to speed up transfers on some
+ *slow embedded machines.
+ *
+ * @boardinfo_setup: This callback is called after the
+ *   SPI master device was registered, but before the
+ *   device is registered.
+ * @boardinfo_setup_data: Data argument passed to boardinfo_setup().
+ */
+struct spi_gpio_platform_data {
+   unsigned int pin_clk;
+   unsigned int pin_miso;
+   unsigned int pin_mosi;
+   unsigned int pin_cs;
+   bool cs_activelow;
+   bool no_spi_delay;
+   int (*boardinfo_setup)(struct spi_board_info *bi,
+  struct spi_master *master,
+  void *data);
+   void *boardinfo_setup_data;
+};
+
+/**
+ * SPI_GPIO_PLATDEV_NAME - The platform device name string.
+ *
+ * The name string that has to be used for platform_device_alloc
+ * when allocating a spi-gpio device.
+ */
+#define SPI_GPIO_PLATDEV_NAME  "spi-gpio"
+
+/**
+ * spi_gpio_next_id - Get another platform device ID number.
+ *
+ * This returns the next platform device ID number that has to be used
+ * for platform_device_alloc. The ID is opaque and should not be used for
+ * anything else.
+ */
+int spi_gpio_next_id(void);
+
+#endif /* _LINUX_SPI_SPI_GPIO */
Index: linux-next/drivers/spi/spi_gpio.c
===
--- /dev/null   1970-01-01 00:00:00.0 +
+++ linux-next/drivers/spi/spi_gpio.c   2008-07-20 21:40:38.0 +0200
@@ -0,0 +1,251 @@
+/*
+ * Bitbanging SPI bus driver using GPIO API
+ *
+ * Copyright (c) 2008 Piotr Skamruk
+ * Copyright (c) 2008 Michael Buesch
+ *
+ * based on spi_s3c2410_gpio.c
+ *   Copyright (c) 2006 Ben Dooks
+ *   Copyright (c) 2006 Simtec Electronics
+ * and on i2c-gpio.c
+ *   Copyright (C) 2007 Atmel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+
+struct spi_gpio {
+   struct spi_bitbang bitbang;
+   struct spi_gpio_platform_data *info;
+   struct platform_device *pdev;
+   struct spi_board_info bi;
+};
+
+
+static inline struct spi_gpio *spidev_to_sg(struct spi_device *dev)
+{
+   return dev->controller_data;
+}
+
+static inline void setsck(struct spi_device *dev, int val)
+{
+   struct spi_gpio *sp = spidev_to_sg(dev);
+   gpio_set_value(sp->info->pin_clk, val ? 1 : 0);
+}
+
+static inline void setmosi(struct spi_device *dev, int val)
+{
+   struct spi_gpio *sp = spidev_to_sg(dev);
+   gpio_set_value(sp->info->pin_mosi, val ? 1 : 0);
+}
+
+static inline u32 getmiso(struct spi_device *dev)
+{
+   struct spi_gpio *sp = spidev_to_sg(dev);
+   return gpio_get_value(sp->info->pin_miso) ? 1 : 0;
+}
+
+static inline void do_spidelay(struct spi_device *dev, unsigned nsecs)
+{
+   struct spi_gpio *sp = spidev_to_sg(dev);
+
+   if (!sp->info->no_spi_delay)
+   ndelay(nsecs);
+}
+
+#define spidelay(nsecs) do {   \
+   /* Steal the spi_device pointer from our caller.\
+* The bitbang-API should probably get fixed here... */ \
+   do_spidelay(spi, nsecs);