linux/include/linux/spi/spi_bitbang.h
<<
>>
Prefs
   1#ifndef __SPI_BITBANG_H
   2#define __SPI_BITBANG_H
   3
   4/*
   5 * Mix this utility code with some glue code to get one of several types of
   6 * simple SPI master driver.  Two do polled word-at-a-time I/O:
   7 *
   8 *   -  GPIO/parport bitbangers.  Provide chipselect() and txrx_word[](),
   9 *      expanding the per-word routines from the inline templates below.
  10 *
  11 *   -  Drivers for controllers resembling bare shift registers.  Provide
  12 *      chipselect() and txrx_word[](), with custom setup()/cleanup() methods
  13 *      that use your controller's clock and chipselect registers.
  14 *
  15 * Some hardware works well with requests at spi_transfer scope:
  16 *
  17 *   -  Drivers leveraging smarter hardware, with fifos or DMA; or for half
  18 *      duplex (MicroWire) controllers.  Provide chipslect() and txrx_bufs(),
  19 *      and custom setup()/cleanup() methods.
  20 */
  21
  22#include <linux/workqueue.h>
  23
  24struct spi_bitbang {
  25        struct workqueue_struct *workqueue;
  26        struct work_struct      work;
  27
  28        spinlock_t              lock;
  29        struct list_head        queue;
  30        u8                      busy;
  31        u8                      use_dma;
  32        u8                      flags;          /* extra spi->mode support */
  33
  34        struct spi_master       *master;
  35
  36        /* setup_transfer() changes clock and/or wordsize to match settings
  37         * for this transfer; zeroes restore defaults from spi_device.
  38         */
  39        int     (*setup_transfer)(struct spi_device *spi,
  40                        struct spi_transfer *t);
  41
  42        void    (*chipselect)(struct spi_device *spi, int is_on);
  43#define BITBANG_CS_ACTIVE       1       /* normally nCS, active low */
  44#define BITBANG_CS_INACTIVE     0
  45
  46        /* txrx_bufs() may handle dma mapping for transfers that don't
  47         * already have one (transfer.{tx,rx}_dma is zero), or use PIO
  48         */
  49        int     (*txrx_bufs)(struct spi_device *spi, struct spi_transfer *t);
  50
  51        /* txrx_word[SPI_MODE_*]() just looks like a shift register */
  52        u32     (*txrx_word[4])(struct spi_device *spi,
  53                        unsigned nsecs,
  54                        u32 word, u8 bits);
  55};
  56
  57/* you can call these default bitbang->master methods from your custom
  58 * methods, if you like.
  59 */
  60extern int spi_bitbang_setup(struct spi_device *spi);
  61extern void spi_bitbang_cleanup(struct spi_device *spi);
  62extern int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m);
  63extern int spi_bitbang_setup_transfer(struct spi_device *spi,
  64                                      struct spi_transfer *t);
  65
  66/* start or stop queue processing */
  67extern int spi_bitbang_start(struct spi_bitbang *spi);
  68extern int spi_bitbang_stop(struct spi_bitbang *spi);
  69
  70#endif  /* __SPI_BITBANG_H */
  71
  72/*-------------------------------------------------------------------------*/
  73
  74#ifdef  EXPAND_BITBANG_TXRX
  75
  76/*
  77 * The code that knows what GPIO pins do what should have declared four
  78 * functions, ideally as inlines, before #defining EXPAND_BITBANG_TXRX
  79 * and including this header:
  80 *
  81 *  void setsck(struct spi_device *, int is_on);
  82 *  void setmosi(struct spi_device *, int is_on);
  83 *  int getmiso(struct spi_device *);
  84 *  void spidelay(unsigned);
  85 *
  86 * setsck()'s is_on parameter is a zero/nonzero boolean.
  87 *
  88 * setmosi()'s is_on parameter is a zero/nonzero boolean.
  89 *
  90 * getmiso() is required to return 0 or 1 only. Any other value is invalid
  91 * and will result in improper operation.
  92 *
  93 * A non-inlined routine would call bitbang_txrx_*() routines.  The
  94 * main loop could easily compile down to a handful of instructions,
  95 * especially if the delay is a NOP (to run at peak speed).
  96 *
  97 * Since this is software, the timings may not be exactly what your board's
  98 * chips need ... there may be several reasons you'd need to tweak timings
  99 * in these routines, not just make to make it faster or slower to match a
 100 * particular CPU clock rate.
 101 */
 102
 103static inline u32
 104bitbang_txrx_be_cpha0(struct spi_device *spi,
 105                unsigned nsecs, unsigned cpol,
 106                u32 word, u8 bits)
 107{
 108        /* if (cpol == 0) this is SPI_MODE_0; else this is SPI_MODE_2 */
 109
 110        /* clock starts at inactive polarity */
 111        for (word <<= (32 - bits); likely(bits); bits--) {
 112
 113                /* setup MSB (to slave) on trailing edge */
 114                setmosi(spi, word & (1 << 31));
 115                spidelay(nsecs);        /* T(setup) */
 116
 117                setsck(spi, !cpol);
 118                spidelay(nsecs);
 119
 120                /* sample MSB (from slave) on leading edge */
 121                word <<= 1;
 122                word |= getmiso(spi);
 123                setsck(spi, cpol);
 124        }
 125        return word;
 126}
 127
 128static inline u32
 129bitbang_txrx_be_cpha1(struct spi_device *spi,
 130                unsigned nsecs, unsigned cpol,
 131                u32 word, u8 bits)
 132{
 133        /* if (cpol == 0) this is SPI_MODE_1; else this is SPI_MODE_3 */
 134
 135        /* clock starts at inactive polarity */
 136        for (word <<= (32 - bits); likely(bits); bits--) {
 137
 138                /* setup MSB (to slave) on leading edge */
 139                setsck(spi, !cpol);
 140                setmosi(spi, word & (1 << 31));
 141                spidelay(nsecs); /* T(setup) */
 142
 143                setsck(spi, cpol);
 144                spidelay(nsecs);
 145
 146                /* sample MSB (from slave) on trailing edge */
 147                word <<= 1;
 148                word |= getmiso(spi);
 149        }
 150        return word;
 151}
 152
 153#endif  /* EXPAND_BITBANG_TXRX */
 154