linux/Documentation/spi/ep93xx_spi
<<
>>
Prefs
   1Cirrus EP93xx SPI controller driver HOWTO
   2=========================================
   3
   4ep93xx_spi driver brings SPI master support for EP93xx SPI controller.  Chip
   5selects are implemented with GPIO lines.
   6
   7NOTE: If possible, don't use SFRMOUT (SFRM1) signal as a chip select. It will
   8not work correctly (it cannot be controlled by software). Use GPIO lines
   9instead.
  10
  11Sample configuration
  12====================
  13
  14Typically driver configuration is done in platform board files (the files under
  15arch/arm/mach-ep93xx/*.c). In this example we configure MMC over SPI through
  16this driver on TS-7260 board. You can adapt the code to suit your needs.
  17
  18This example uses EGPIO9 as SD/MMC card chip select (this is wired in DIO1
  19header on the board).
  20
  21You need to select CONFIG_MMC_SPI to use mmc_spi driver.
  22
  23arch/arm/mach-ep93xx/ts72xx.c:
  24
  25...
  26#include <linux/gpio.h>
  27#include <linux/spi/spi.h>
  28
  29#include <linux/platform_data/spi-ep93xx.h>
  30
  31/* this is our GPIO line used for chip select */
  32#define MMC_CHIP_SELECT_GPIO EP93XX_GPIO_LINE_EGPIO9
  33
  34static int ts72xx_mmc_spi_setup(struct spi_device *spi)
  35{
  36        int err;
  37
  38        err = gpio_request(MMC_CHIP_SELECT_GPIO, spi->modalias);
  39        if (err)
  40                return err;
  41
  42        gpio_direction_output(MMC_CHIP_SELECT_GPIO, 1);
  43
  44        return 0;
  45}
  46
  47static void ts72xx_mmc_spi_cleanup(struct spi_device *spi)
  48{
  49        gpio_set_value(MMC_CHIP_SELECT_GPIO, 1);
  50        gpio_direction_input(MMC_CHIP_SELECT_GPIO);
  51        gpio_free(MMC_CHIP_SELECT_GPIO);
  52}
  53
  54static void ts72xx_mmc_spi_cs_control(struct spi_device *spi, int value)
  55{
  56        gpio_set_value(MMC_CHIP_SELECT_GPIO, value);
  57}
  58
  59static struct ep93xx_spi_chip_ops ts72xx_mmc_spi_ops = {
  60        .setup          = ts72xx_mmc_spi_setup,
  61        .cleanup        = ts72xx_mmc_spi_cleanup,
  62        .cs_control     = ts72xx_mmc_spi_cs_control,
  63};
  64
  65static struct spi_board_info ts72xx_spi_devices[] __initdata = {
  66        {
  67                .modalias               = "mmc_spi",
  68                .controller_data        = &ts72xx_mmc_spi_ops,
  69                /*
  70                 * We use 10 MHz even though the maximum is 7.4 MHz. The driver
  71                 * will limit it automatically to max. frequency.
  72                 */
  73                .max_speed_hz           = 10 * 1000 * 1000,
  74                .bus_num                = 0,
  75                .chip_select            = 0,
  76                .mode                   = SPI_MODE_0,
  77        },
  78};
  79
  80static struct ep93xx_spi_info ts72xx_spi_info = {
  81        .num_chipselect = ARRAY_SIZE(ts72xx_spi_devices),
  82};
  83
  84static void __init ts72xx_init_machine(void)
  85{
  86        ...
  87        ep93xx_register_spi(&ts72xx_spi_info, ts72xx_spi_devices,
  88                            ARRAY_SIZE(ts72xx_spi_devices));
  89}
  90
  91The driver can use DMA for the transfers also. In this case ts72xx_spi_info
  92becomes:
  93
  94static struct ep93xx_spi_info ts72xx_spi_info = {
  95        .num_chipselect = ARRAY_SIZE(ts72xx_spi_devices),
  96        .use_dma        = true;
  97};
  98
  99Note that CONFIG_EP93XX_DMA should be enabled as well.
 100
 101Thanks to
 102=========
 103Martin Guy, H. Hartley Sweeten and others who helped me during development of
 104the driver. Simplemachines.it donated me a Sim.One board which I used testing
 105the driver on EP9307.
 106