diff options
author | Hubert Feurstein <h.feurstein@gmail.com> | 2011-06-20 23:46:33 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2011-06-21 13:56:49 +0200 |
commit | c0b962986773539ec059f1cb4d47506a7c8f6077 (patch) | |
tree | 6e32b6ad5081ca89acd92e3201f253764376e25c /include/spi | |
parent | 76f46b561974865b1a3abc553ec56c95ee34f9fb (diff) | |
download | barebox-c0b962986773539ec059f1cb4d47506a7c8f6077.tar.gz barebox-c0b962986773539ec059f1cb4d47506a7c8f6077.tar.xz |
spi: add more spi transfer functions
This commit adds the following spi transfer functions:
- spi_write
- spi_read
- spi_write_then_read
- spi_w8r8
The code has been ported from the linux kernel.
Signed-off-by: Hubert Feurstein <h.feurstein@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'include/spi')
-rw-r--r-- | include/spi/spi.h | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/include/spi/spi.h b/include/spi/spi.h index c76f3b7922..ac2013ad51 100644 --- a/include/spi/spi.h +++ b/include/spi/spi.h @@ -349,6 +349,80 @@ static inline int spi_register_board_info(struct spi_board_info const *info, } #endif +/** + * spi_write - SPI synchronous write + * @spi: device to which data will be written + * @buf: data buffer + * @len: data buffer size + * Context: can sleep + * + * This writes the buffer and returns zero or a negative error code. + * Callable only from contexts that can sleep. + */ +static inline int +spi_write(struct spi_device *spi, const void *buf, size_t len) +{ + struct spi_transfer t = { + .tx_buf = buf, + .len = len, + }; + struct spi_message m; + + spi_message_init(&m); + spi_message_add_tail(&t, &m); + return spi_sync(spi, &m); +} + +/** + * spi_read - SPI synchronous read + * @spi: device from which data will be read + * @buf: data buffer + * @len: data buffer size + * Context: can sleep + * + * This reads the buffer and returns zero or a negative error code. + * Callable only from contexts that can sleep. + */ +static inline int +spi_read(struct spi_device *spi, void *buf, size_t len) +{ + struct spi_transfer t = { + .rx_buf = buf, + .len = len, + }; + struct spi_message m; + + spi_message_init(&m); + spi_message_add_tail(&t, &m); + return spi_sync(spi, &m); +} + +/* 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, + void *rxbuf, unsigned n_rx); + +/** + * spi_w8r8 - SPI synchronous 8 bit write followed by 8 bit read + * @spi: device with which data will be exchanged + * @cmd: command to be written before data is read back + * Context: can sleep + * + * This returns the (unsigned) eight bit number returned by the + * device, or else a negative error code. Callable only from + * contexts that can sleep. + */ +static inline ssize_t spi_w8r8(struct spi_device *spi, u8 cmd) +{ + ssize_t status; + u8 result; + + status = spi_write_then_read(spi, &cmd, 1, &result, 1); + + /* return negative errno or unsigned value */ + return (status < 0) ? status : result; +} + #endif /* DOXYGEN_SHOULD_SKIP_THIS */ #endif /* __INCLUDE_SPI_H */ |