| #ifndef __INCLUDE_SPI_H |
| #define __INCLUDE_SPI_H |
| |
| #ifndef DOXYGEN_SHOULD_SKIP_THIS |
| |
| #include <driver.h> |
| #include <linux/string.h> |
| |
| struct spi_board_info { |
| char *name; |
| int max_speed_hz; |
| int bus_num; |
| int chip_select; |
| |
| /* mode becomes spi_device.mode, and is essential for chips |
| * where the default of SPI_CS_HIGH = 0 is wrong. |
| */ |
| u8 mode; |
| |
| }; |
| |
| /** |
| * struct spi_device - Master side proxy for an SPI slave device |
| * @dev: Driver model representation of the device. |
| * @master: SPI controller used with the device. |
| * @max_speed_hz: Maximum clock rate to be used with this chip |
| * (on this board); may be changed by the device's driver. |
| * The spi_transfer.speed_hz can override this for each transfer. |
| * @chip_select: Chipselect, distinguishing chips handled by @master. |
| * @mode: The spi mode defines how data is clocked out and in. |
| * This may be changed by the device's driver. |
| * The "active low" default for chipselect mode can be overridden |
| * (by specifying SPI_CS_HIGH) as can the "MSB first" default for |
| * each word in a transfer (by specifying SPI_LSB_FIRST). |
| * @bits_per_word: Data transfers involve one or more words; word sizes |
| * like eight or 12 bits are common. In-memory wordsizes are |
| * powers of two bytes (e.g. 20 bit samples use 32 bits). |
| * This may be changed by the device's driver, or left at the |
| * default (0) indicating protocol words are eight bit bytes. |
| * The spi_transfer.bits_per_word can override this for each transfer. |
| * @irq: Negative, or the number passed to request_irq() to receive |
| * interrupts from this device. |
| * @controller_state: Controller's runtime state |
| * @controller_data: Board-specific definitions for controller, such as |
| * FIFO initialization parameters; from board_info.controller_data |
| * @modalias: Name of the driver to use with this device, or an alias |
| * for that name. This appears in the sysfs "modalias" attribute |
| * for driver coldplugging, and in uevents used for hotplugging |
| * |
| * A @spi_device is used to interchange data between an SPI slave |
| * (usually a discrete chip) and CPU memory. |
| * |
| * In @dev, the platform_data is used to hold information about this |
| * device that's meaningful to the device's protocol driver, but not |
| * to its controller. One example might be an identifier for a chip |
| * variant with slightly different functionality; another might be |
| * information about how this particular board wires the chip's pins. |
| */ |
| struct spi_device { |
| struct device_d dev; |
| struct spi_master *master; |
| u32 max_speed_hz; |
| u8 chip_select; |
| u8 mode; |
| #define SPI_CPHA 0x01 /* clock phase */ |
| #define SPI_CPOL 0x02 /* clock polarity */ |
| #define SPI_MODE_0 (0|0) /* (original MicroWire) */ |
| #define SPI_MODE_1 (0|SPI_CPHA) |
| #define SPI_MODE_2 (SPI_CPOL|0) |
| #define SPI_MODE_3 (SPI_CPOL|SPI_CPHA) |
| #define SPI_CS_HIGH 0x04 /* chipselect active high? */ |
| #define SPI_LSB_FIRST 0x08 /* per-word bits-on-wire */ |
| #define SPI_3WIRE 0x10 /* SI/SO signals shared */ |
| #define SPI_LOOP 0x20 /* loopback mode */ |
| u8 bits_per_word; |
| int irq; |
| void *controller_state; |
| void *controller_data; |
| const char *modalias; |
| |
| /* |
| * likely need more hooks for more protocol options affecting how |
| * the controller talks to each chip, like: |
| * - memory packing (12 bit samples into low bits, others zeroed) |
| * - priority |
| * - drop chipselect after each word |
| * - chipselect delays |
| * - ... |
| */ |
| }; |
| |
| struct spi_message; |
| |
| /** |
| * struct spi_master - interface to SPI master controller |
| * @dev: device interface to this driver |
| * @bus_num: board-specific (and often SOC-specific) identifier for a |
| * given SPI controller. |
| * @num_chipselect: chipselects are used to distinguish individual |
| * SPI slaves, and are numbered from zero to num_chipselects. |
| * each slave has a chipselect signal, but it's common that not |
| * every chipselect is connected to a slave. |
| * @setup: updates the device mode and clocking records used by a |
| * device's SPI controller; protocol code may call this. This |
| * must fail if an unrecognized or unsupported mode is requested. |
| * It's always safe to call this unless transfers are pending on |
| * the device whose settings are being modified. |
| * @transfer: adds a message to the controller's transfer queue. |
| * @cleanup: frees controller-specific state |
| * |
| * Each SPI master controller can communicate with one or more @spi_device |
| * children. These make a small bus, sharing MOSI, MISO and SCK signals |
| * but not chip select signals. Each device may be configured to use a |
| * different clock rate, since those shared signals are ignored unless |
| * the chip is selected. |
| * |
| * The driver for an SPI controller manages access to those devices through |
| * a queue of spi_message transactions, copying data between CPU memory and |
| * an SPI slave device. For each such message it queues, it calls the |
| * message's completion function when the transaction completes. |
| */ |
| struct spi_master { |
| struct device_d *dev; |
| |
| /* other than negative (== assign one dynamically), bus_num is fully |
| * board-specific. usually that simplifies to being SOC-specific. |
| * example: one SOC has three SPI controllers, numbered 0..2, |
| * and one board's schematics might show it using SPI-2. software |
| * would normally use bus_num=2 for that controller. |
| */ |
| s16 bus_num; |
| |
| /* chipselects will be integral to many controllers; some others |
| * might use board-specific GPIOs. |
| */ |
| u16 num_chipselect; |
| |
| /* setup mode and clock, etc (spi driver may call many times) */ |
| int (*setup)(struct spi_device *spi); |
| |
| /* bidirectional bulk transfers |
| * |
| * + The transfer() method may not sleep; its main role is |
| * just to add the message to the queue. |
| * + For now there's no remove-from-queue operation, or |
| * any other request management |
| * + To a given spi_device, message queueing is pure fifo |
| * |
| * + The master's main job is to process its message queue, |
| * selecting a chip then transferring data |
| * + If there are multiple spi_device children, the i/o queue |
| * arbitration algorithm is unspecified (round robin, fifo, |
| * priority, reservations, preemption, etc) |
| * |
| * + Chipselect stays active during the entire message |
| * (unless modified by spi_transfer.cs_change != 0). |
| * + The message transfers use clock and SPI mode parameters |
| * previously established by setup() for this device |
| */ |
| int (*transfer)(struct spi_device *spi, |
| struct spi_message *mesg); |
| |
| /* called on release() to free memory provided by spi_master */ |
| void (*cleanup)(struct spi_device *spi); |
| }; |
| |
| /*---------------------------------------------------------------------------*/ |
| |
| /* |
| * I/O INTERFACE between SPI controller and protocol drivers |
| * |
| * Protocol drivers use a queue of spi_messages, each transferring data |
| * between the controller and memory buffers. |
| * |
| * The spi_messages themselves consist of a series of read+write transfer |
| * segments. Those segments always read the same number of bits as they |
| * write; but one or the other is easily ignored by passing a null buffer |
| * pointer. (This is unlike most types of I/O API, because SPI hardware |
| * is full duplex.) |
| * |
| * NOTE: Allocation of spi_transfer and spi_message memory is entirely |
| * up to the protocol driver, which guarantees the integrity of both (as |
| * well as the data buffers) for as long as the message is queued. |
| */ |
| |
| /** |
| * struct spi_transfer - a read/write buffer pair |
| * @tx_buf: data to be written (dma-safe memory), or NULL |
| * @rx_buf: data to be read (dma-safe memory), or NULL |
| * @len: size of rx and tx buffers (in bytes) |
| * @speed_hz: Select a speed other then the device default for this |
| * transfer. If 0 the default (from @spi_device) is used. |
| * @bits_per_word: select a bits_per_word other then the device default |
| * for this transfer. If 0 the default (from @spi_device) is used. |
| * @cs_change: affects chipselect after this transfer completes |
| * @delay_usecs: microseconds to delay after this transfer before |
| * (optionally) changing the chipselect status, then starting |
| * the next transfer or completing this @spi_message. |
| * @transfer_list: transfers are sequenced through @spi_message.transfers |
| * |
| * SPI transfers always write the same number of bytes as they read. |
| * Protocol drivers should always provide @rx_buf and/or @tx_buf. |
| * |
| * If the transmit buffer is null, zeroes will be shifted out |
| * while filling @rx_buf. If the receive buffer is null, the data |
| * shifted in will be discarded. Only "len" bytes shift out (or in). |
| * It's an error to try to shift out a partial word. (For example, by |
| * shifting out three bytes with word size of sixteen or twenty bits; |
| * the former uses two bytes per word, the latter uses four bytes.) |
| * |
| * In-memory data values are always in native CPU byte order, translated |
| * from the wire byte order (big-endian except with SPI_LSB_FIRST). So |
| * for example when bits_per_word is sixteen, buffers are 2N bytes long |
| * (@len = 2N) and hold N sixteen bit words in CPU byte order. |
| * |
| * When the word size of the SPI transfer is not a power-of-two multiple |
| * of eight bits, those in-memory words include extra bits. In-memory |
| * words are always seen by protocol drivers as right-justified, so the |
| * undefined (rx) or unused (tx) bits are always the most significant bits. |
| * |
| * All SPI transfers start with the relevant chipselect active. Normally |
| * it stays selected until after the last transfer in a message. Drivers |
| * can affect the chipselect signal using cs_change. |
| * |
| * (i) If the transfer isn't the last one in the message, this flag is |
| * used to make the chipselect briefly go inactive in the middle of the |
| * message. Toggling chipselect in this way may be needed to terminate |
| * a chip command, letting a single spi_message perform all of group of |
| * chip transactions together. |
| * |
| * (ii) When the transfer is the last one in the message, the chip may |
| * stay selected until the next transfer. On multi-device SPI busses |
| * with nothing blocking messages going to other devices, this is just |
| * a performance hint; starting a message to another device deselects |
| * this one. But in other cases, this can be used to ensure correctness. |
| * Some devices need protocol transactions to be built from a series of |
| * spi_message submissions, where the content of one message is determined |
| * by the results of previous messages and where the whole transaction |
| * ends when the chipselect goes intactive. |
| * |
| * The code that submits an spi_message (and its spi_transfers) |
| * to the lower layers is responsible for managing its memory. |
| * Zero-initialize every field you don't set up explicitly, to |
| * insulate against future API updates. After you submit a message |
| * and its transfers, ignore them until its completion callback. |
| */ |
| struct spi_transfer { |
| /* it's ok if tx_buf == rx_buf (right?) |
| * for MicroWire, one buffer must be null |
| * buffers must work with dma_*map_single() calls, unless |
| * spi_message.is_dma_mapped reports a pre-existing mapping |
| */ |
| const void *tx_buf; |
| void *rx_buf; |
| unsigned len; |
| |
| unsigned cs_change:1; |
| u8 bits_per_word; |
| u16 delay_usecs; |
| u32 speed_hz; |
| |
| struct list_head transfer_list; |
| }; |
| |
| /** |
| * struct spi_message - one multi-segment SPI transaction |
| * @transfers: list of transfer segments in this transaction |
| * @spi: SPI device to which the transaction is queued |
| * @actual_length: the total number of bytes that were transferred in all |
| * successful segments |
| * @status: zero for success, else negative errno |
| * @queue: for use by whichever driver currently owns the message |
| * @state: for use by whichever driver currently owns the message |
| * |
| * A @spi_message is used to execute an atomic sequence of data transfers, |
| * each represented by a struct spi_transfer. The sequence is "atomic" |
| * in the sense that no other spi_message may use that SPI bus until that |
| * sequence completes. On some systems, many such sequences can execute as |
| * as single programmed DMA transfer. On all systems, these messages are |
| * queued, and might complete after transactions to other devices. Messages |
| * sent to a given spi_device are alway executed in FIFO order. |
| * |
| * The code that submits an spi_message (and its spi_transfers) |
| * to the lower layers is responsible for managing its memory. |
| * Zero-initialize every field you don't set up explicitly, to |
| * insulate against future API updates. After you submit a message |
| * and its transfers, ignore them until its completion callback. |
| */ |
| struct spi_message { |
| struct list_head transfers; |
| |
| struct spi_device *spi; |
| |
| /* REVISIT: we might want a flag affecting the behavior of the |
| * last transfer ... allowing things like "read 16 bit length L" |
| * immediately followed by "read L bytes". Basically imposing |
| * a specific message scheduling algorithm. |
| * |
| * Some controller drivers (message-at-a-time queue processing) |
| * could provide that as their default scheduling algorithm. But |
| * others (with multi-message pipelines) could need a flag to |
| * tell them about such special cases. |
| */ |
| |
| unsigned actual_length; |
| int status; |
| |
| /* for optional use by whatever driver currently owns the |
| * spi_message ... between calls to spi_async and then later |
| * complete(), that's the spi_master controller driver. |
| */ |
| struct list_head queue; |
| void *state; |
| }; |
| |
| static inline void spi_message_init(struct spi_message *m) |
| { |
| memset(m, 0, sizeof *m); |
| INIT_LIST_HEAD(&m->transfers); |
| } |
| |
| static inline void |
| spi_message_add_tail(struct spi_transfer *t, struct spi_message *m) |
| { |
| list_add_tail(&t->transfer_list, &m->transfers); |
| } |
| |
| static inline void |
| spi_transfer_del(struct spi_transfer *t) |
| { |
| list_del(&t->transfer_list); |
| } |
| |
| /* All these synchronous SPI transfer routines are utilities layered |
| * over the core async transfer primitive. Here, "synchronous" means |
| * they will sleep uninterruptibly until the async transfer completes. |
| */ |
| |
| int spi_sync(struct spi_device *spi, struct spi_message *message); |
| |
| int spi_register_master(struct spi_master *master); |
| |
| #ifdef CONFIG_SPI |
| int spi_register_board_info(struct spi_board_info const *info, int num); |
| #else |
| static inline int spi_register_board_info(struct spi_board_info const *info, |
| int num) |
| { |
| return 0; |
| } |
| #endif |
| |
| #endif /* DOXYGEN_SHOULD_SKIP_THIS */ |
| |
| #endif /* __INCLUDE_SPI_H */ |