diff options
| author | David Brownell <dbrownell@users.sourceforge.net> | 2009-01-06 17:41:41 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 18:59:19 -0500 |
| commit | d29389de0b0ee1715333bafc6ac3f22a75aa4313 (patch) | |
| tree | 6c4321359bd10231532d6cb2141f06070d8ddfd6 /include/linux/spi | |
| parent | c2bacfc44f4b8d03dbaad5d2dca2fb4161e81975 (diff) | |
spi_gpio driver
Generalize the old at91rm9200 "bootstrap" bitbanging SPI master driver as
"spi_gpio", so it works with arbitrary GPIOs and can be configured through
platform_data. Such SPI masters support:
- any number of bus instances (bus_num is the platform_device.id)
- any number of chipselects (one GPIO per spi_device)
- all four SPI_MODE values, and SPI_CS_HIGH
- i/o word sizes from 1 to 32 bits;
- devices configured as with any other spi_master controller
When configured using platform_data, this provides relatively low clock
rates. On platforms that support inlined GPIO calls, significantly
improved transfer speeds are also possible with a semi-custom driver.
(It's still painful when accessing flash memory, but less so.)
Sanity checked by using this version to replace both native controllers on
a board with six different SPI slaves, relying on three different
SPI_MODE_* values and both SPI_CS_HIGH settings for correct operation.
[akpm@linux-foundation.org: cleanups]
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
Acked-by: Magnus Damm <damm@igel.co.jp>
Tested-by: Magnus Damm <damm@igel.co.jp>
Cc: Torgil Svensson <torgil.svensson@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux/spi')
| -rw-r--r-- | include/linux/spi/spi_gpio.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/include/linux/spi/spi_gpio.h b/include/linux/spi/spi_gpio.h new file mode 100644 index 000000000000..0f01a0f1f40c --- /dev/null +++ b/include/linux/spi/spi_gpio.h | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | #ifndef __LINUX_SPI_GPIO_H | ||
| 2 | #define __LINUX_SPI_GPIO_H | ||
| 3 | |||
| 4 | /* | ||
| 5 | * For each bitbanged SPI bus, set up a platform_device node with: | ||
| 6 | * - name "spi_gpio" | ||
| 7 | * - id the same as the SPI bus number it implements | ||
| 8 | * - dev.platform data pointing to a struct spi_gpio_platform_data | ||
| 9 | * | ||
| 10 | * Or, see the driver code for information about speedups that are | ||
| 11 | * possible on platforms that support inlined access for GPIOs (no | ||
| 12 | * spi_gpio_platform_data is used). | ||
| 13 | * | ||
| 14 | * Use spi_board_info with these busses in the usual way, being sure | ||
| 15 | * that the controller_data being the GPIO used for each device's | ||
| 16 | * chipselect: | ||
| 17 | * | ||
| 18 | * static struct spi_board_info ... [] = { | ||
| 19 | * ... | ||
| 20 | * // this slave uses GPIO 42 for its chipselect | ||
| 21 | * .controller_data = (void *) 42, | ||
| 22 | * ... | ||
| 23 | * // this one uses GPIO 86 for its chipselect | ||
| 24 | * .controller_data = (void *) 86, | ||
| 25 | * ... | ||
| 26 | * }; | ||
| 27 | * | ||
| 28 | * If the bitbanged bus is later switched to a "native" controller, | ||
| 29 | * that platform_device and controller_data should be removed. | ||
| 30 | */ | ||
| 31 | |||
| 32 | /** | ||
| 33 | * struct spi_gpio_platform_data - parameter for bitbanged SPI master | ||
| 34 | * @sck: number of the GPIO used for clock output | ||
| 35 | * @mosi: number of the GPIO used for Master Output, Slave In (MOSI) data | ||
| 36 | * @miso: number of the GPIO used for Master Input, Slave Output (MISO) data | ||
| 37 | * @num_chipselect: how many slaves to allow | ||
| 38 | * | ||
| 39 | * All GPIO signals used with the SPI bus managed through this driver | ||
| 40 | * (chipselects, MOSI, MISO, SCK) must be configured as GPIOs, instead | ||
| 41 | * of some alternate function. | ||
| 42 | * | ||
| 43 | * It can be convenient to use this driver with pins that have alternate | ||
| 44 | * functions associated with a "native" SPI controller if a driver for that | ||
| 45 | * controller is not available, or is missing important functionality. | ||
| 46 | * | ||
| 47 | * On platforms which can do so, configure MISO with a weak pullup unless | ||
| 48 | * there's an external pullup on that signal. That saves power by avoiding | ||
| 49 | * floating signals. (A weak pulldown would save power too, but many | ||
| 50 | * drivers expect to see all-ones data as the no slave "response".) | ||
| 51 | */ | ||
| 52 | struct spi_gpio_platform_data { | ||
| 53 | unsigned sck; | ||
| 54 | unsigned mosi; | ||
| 55 | unsigned miso; | ||
| 56 | |||
| 57 | u16 num_chipselect; | ||
| 58 | }; | ||
| 59 | |||
| 60 | #endif /* __LINUX_SPI_GPIO_H */ | ||
