diff options
Diffstat (limited to 'include/linux/spi/spi.h')
| -rw-r--r-- | include/linux/spi/spi.h | 49 | 
1 files changed, 49 insertions, 0 deletions
| diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index f62918946d86..38c2b925923d 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -57,6 +57,8 @@ extern struct bus_type spi_bus_type;   * @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 + * @cs_gpio: gpio number of the chipselect line (optional, -EINVAL when + *	when not using a GPIO line)   *   * A @spi_device is used to interchange data between an SPI slave   * (usually a discrete chip) and CPU memory. @@ -258,6 +260,9 @@ static inline void spi_unregister_driver(struct spi_driver *sdrv)   * @unprepare_transfer_hardware: there are currently no more messages on the   *	queue so the subsystem notifies the driver that it may relax the   *	hardware by issuing this call + * @cs_gpios: Array of GPIOs to use as chip select lines; one per CS + *	number. Any individual value may be -EINVAL for CS lines that + *	are not GPIOs (driven by the SPI controller itself).   *   * Each SPI master controller can communicate with one or more @spi_device   * children.  These make a small bus, sharing MOSI, MISO and SCK signals @@ -591,6 +596,26 @@ spi_transfer_del(struct spi_transfer *t)  	list_del(&t->transfer_list);  } +/** + * spi_message_init_with_transfers - Initialize spi_message and append transfers + * @m: spi_message to be initialized + * @xfers: An array of spi transfers + * @num_xfers: Number of items in the xfer array + * + * This function initializes the given spi_message and adds each spi_transfer in + * the given array to the message. + */ +static inline void +spi_message_init_with_transfers(struct spi_message *m, +struct spi_transfer *xfers, unsigned int num_xfers) +{ +	unsigned int i; + +	spi_message_init(m); +	for (i = 0; i < num_xfers; ++i) +		spi_message_add_tail(&xfers[i], m); +} +  /* It's fine to embed message and transaction structures in other data   * structures so long as you don't free them while they're in use.   */ @@ -683,6 +708,30 @@ spi_read(struct spi_device *spi, void *buf, size_t len)  	return spi_sync(spi, &m);  } +/** + * spi_sync_transfer - synchronous SPI data transfer + * @spi: device with which data will be exchanged + * @xfers: An array of spi_transfers + * @num_xfers: Number of items in the xfer array + * Context: can sleep + * + * Does a synchronous SPI data transfer of the given spi_transfer array. + * + * For more specific semantics see spi_sync(). + * + * It returns zero on success, else a negative error code. + */ +static inline int +spi_sync_transfer(struct spi_device *spi, struct spi_transfer *xfers, +	unsigned int num_xfers) +{ +	struct spi_message msg; + +	spi_message_init_with_transfers(&msg, xfers, num_xfers); + +	return spi_sync(spi, &msg); +} +  /* this copies txbuf and rxbuf data; for small transfers only! */  extern int spi_write_then_read(struct spi_device *spi,  		const void *txbuf, unsigned n_tx, |