diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2014-06-07 23:24:07 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2014-06-07 23:24:07 -0700 | 
| commit | a292241cccb7e20e8b997a9a44177e7c98141859 (patch) | |
| tree | a0b0bb95e7dce3233a2d8b203f9e326cdec7a00e /include/linux/spi/spi.h | |
| parent | d49cb7aeebb974713f9f7ab2991352d3050b095b (diff) | |
| parent | 68807a0c2015cb40df4869e16651f0ce5cc14d52 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 3.16.
Diffstat (limited to 'include/linux/spi/spi.h')
| -rw-r--r-- | include/linux/spi/spi.h | 39 | 
1 files changed, 35 insertions, 4 deletions
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 4203c66d8803..e713543336f1 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -24,6 +24,9 @@  #include <linux/slab.h>  #include <linux/kthread.h>  #include <linux/completion.h> +#include <linux/scatterlist.h> + +struct dma_chan;  /*   * INTERFACES between SPI master-side drivers and SPI infrastructure. @@ -234,7 +237,7 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   * @mode_bits: flags understood by this controller driver   * @bits_per_word_mask: A mask indicating which values of bits_per_word are   *	supported by the driver. Bit n indicates that a bits_per_word n+1 is - *	suported. If set, the SPI core will reject any transfer with an + *	supported. If set, the SPI core will reject any transfer with an   *	unsupported bits_per_word. If not set, this value is simply ignored,   *	and it's up to the individual driver to perform any validation.   * @min_speed_hz: Lowest supported transfer speed @@ -259,13 +262,14 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   * @cur_msg: the currently in-flight message   * @cur_msg_prepared: spi_prepare_message was called for the currently   *                    in-flight message - * @xfer_completion: used by core tranfer_one_message() + * @xfer_completion: used by core transfer_one_message()   * @busy: message pump is busy   * @running: message pump is running   * @rt: whether this queue is set to run as a realtime task   * @auto_runtime_pm: the core should ensure a runtime PM reference is held   *                   while the hardware is prepared, using the parent   *                   device for the spidev + * @max_dma_len: Maximum length of a DMA transfer for the device.   * @prepare_transfer_hardware: a message will soon arrive from the queue   *	so the subsystem requests the driver to prepare the transfer hardware   *	by issuing this call @@ -348,6 +352,8 @@ struct spi_master {  #define SPI_MASTER_HALF_DUPLEX	BIT(0)		/* can't do full duplex */  #define SPI_MASTER_NO_RX	BIT(1)		/* can't do buffer read */  #define SPI_MASTER_NO_TX	BIT(2)		/* can't do buffer write */ +#define SPI_MASTER_MUST_RX      BIT(3)		/* requires rx */ +#define SPI_MASTER_MUST_TX      BIT(4)		/* requires tx */  	/* lock and mutex for SPI bus locking */  	spinlock_t		bus_lock_spinlock; @@ -390,6 +396,17 @@ struct spi_master {  	void			(*cleanup)(struct spi_device *spi);  	/* +	 * Used to enable core support for DMA handling, if can_dma() +	 * exists and returns true then the transfer will be mapped +	 * prior to transfer_one() being called.  The driver should +	 * not modify or store xfer and dma_tx and dma_rx must be set +	 * while the device is prepared. +	 */ +	bool			(*can_dma)(struct spi_master *master, +					   struct spi_device *spi, +					   struct spi_transfer *xfer); + +	/*  	 * These hooks are for drivers that want to use the generic  	 * master transfer queueing mechanism. If these are used, the  	 * transfer() function above must NOT be specified by the driver. @@ -407,7 +424,9 @@ struct spi_master {  	bool				rt;  	bool				auto_runtime_pm;  	bool                            cur_msg_prepared; +	bool				cur_msg_mapped;  	struct completion               xfer_completion; +	size_t				max_dma_len;  	int (*prepare_transfer_hardware)(struct spi_master *master);  	int (*transfer_one_message)(struct spi_master *master, @@ -428,6 +447,14 @@ struct spi_master {  	/* gpio chip select */  	int			*cs_gpios; + +	/* DMA channels for use with core dmaengine helpers */ +	struct dma_chan		*dma_tx; +	struct dma_chan		*dma_rx; + +	/* dummy data for full duplex devices */ +	void			*dummy_rx; +	void			*dummy_tx;  };  static inline void *spi_master_get_devdata(struct spi_master *master) @@ -498,7 +525,7 @@ extern struct spi_master *spi_busnum_to_master(u16 busnum);   * @rx_buf: data to be read (dma-safe memory), or NULL   * @tx_dma: DMA address of tx_buf, if @spi_message.is_dma_mapped   * @rx_dma: DMA address of rx_buf, if @spi_message.is_dma_mapped - * @tx_nbits: number of bits used for writting. If 0 the default + * @tx_nbits: number of bits used for writing. If 0 the default   *      (SPI_NBITS_SINGLE) is used.   * @rx_nbits: number of bits used for reading. If 0 the default   *      (SPI_NBITS_SINGLE) is used. @@ -512,6 +539,8 @@ extern struct spi_master *spi_busnum_to_master(u16 busnum);   *	(optionally) changing the chipselect status, then starting   *	the next transfer or completing this @spi_message.   * @transfer_list: transfers are sequenced through @spi_message.transfers + * @tx_sg: Scatterlist for transmit, currently not for client use + * @rx_sg: Scatterlist for receive, currently not for client use   *   * SPI transfers always write the same number of bytes as they read.   * Protocol drivers should always provide @rx_buf and/or @tx_buf. @@ -556,7 +585,7 @@ extern struct spi_master *spi_busnum_to_master(u16 busnum);   * by the results of previous messages and where the whole transaction   * ends when the chipselect goes intactive.   * - * When SPI can transfer in 1x,2x or 4x. It can get this tranfer information + * When SPI can transfer in 1x,2x or 4x. It can get this transfer information   * from device through @tx_nbits and @rx_nbits. In Bi-direction, these   * two should both be set. User can set transfer mode with SPI_NBITS_SINGLE(1x)   * SPI_NBITS_DUAL(2x) and SPI_NBITS_QUAD(4x) to support these three transfer. @@ -579,6 +608,8 @@ struct spi_transfer {  	dma_addr_t	tx_dma;  	dma_addr_t	rx_dma; +	struct sg_table tx_sg; +	struct sg_table rx_sg;  	unsigned	cs_change:1;  	unsigned	tx_nbits:3;  | 
