diff options
author | Lars-Peter Clausen <lars@metafoo.de> | 2013-01-09 12:31:00 -0500 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2013-02-09 06:02:07 -0500 |
commit | 6d9eecd418afb2c12e5db5be3d72f0f1df43bdd9 (patch) | |
tree | 6c9fc5330e8e6970ab08f1c1220d612caeb44344 /include/linux/spi | |
parent | ad76fda78318821fe8823b4b7c587a46a268eecf (diff) |
spi: Add helper functions for setting up transfers
Quite often the pattern used for setting up and transferring a synchronous SPI
transaction looks very much like the following:
struct spi_message msg;
struct spi_transfer xfers[] = {
...
};
spi_message_init(&msg);
spi_message_add_tail(&xfers[0], &msg);
...
spi_message_add_tail(&xfers[ARRAY_SIZE(xfers) - 1], &msg);
ret = spi_sync(&msg);
This patch adds two new helper functions for handling this case. The first
helper function spi_message_init_with_transfers() takes a spi_message and an
array of spi_transfers. It will initialize the message and then call
spi_message_add_tail() for each transfer in the array. E.g. the following
spi_message_init(&msg);
spi_message_add_tail(&xfers[0], &msg);
...
spi_message_add_tail(&xfers[ARRAY_SIZE(xfers) - 1], &msg);
can be rewritten as
spi_message_init_with_transfers(&msg, xfers, ARRAY_SIZE(xfers));
The second function spi_sync_transfer() takes a SPI device and an array of
spi_transfers. It will allocate a new spi_message (on the stack) and add all
transfers in the array to the message. Finally it will call spi_sync() on the
message.
E.g. the follwing
struct spi_message msg;
struct spi_transfer xfers[] = {
...
};
spi_message_init(&msg);
spi_message_add_tail(&xfers[0], &msg);
...
spi_message_add_tail(&xfers[ARRAY_SIZE(xfers) - 1], &msg);
ret = spi_sync(spi, &msg);
can be rewritten as
struct spi_transfer xfers[] = {
...
};
ret = spi_sync_transfer(spi, xfers, ARRAY_SIZE(xfers));
A coccinelle script to find such instances will follow.
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Reviewed-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'include/linux/spi')
-rw-r--r-- | include/linux/spi/spi.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index f62918946d86..7dbe58642525 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h | |||
@@ -591,6 +591,26 @@ spi_transfer_del(struct spi_transfer *t) | |||
591 | list_del(&t->transfer_list); | 591 | list_del(&t->transfer_list); |
592 | } | 592 | } |
593 | 593 | ||
594 | /** | ||
595 | * spi_message_init_with_transfers - Initialize spi_message and append transfers | ||
596 | * @m: spi_message to be initialized | ||
597 | * @xfers: An array of spi transfers | ||
598 | * @num_xfers: Number of items in the xfer array | ||
599 | * | ||
600 | * This function initializes the given spi_message and adds each spi_transfer in | ||
601 | * the given array to the message. | ||
602 | */ | ||
603 | static inline void | ||
604 | spi_message_init_with_transfers(struct spi_message *m, | ||
605 | struct spi_transfer *xfers, unsigned int num_xfers) | ||
606 | { | ||
607 | unsigned int i; | ||
608 | |||
609 | spi_message_init(m); | ||
610 | for (i = 0; i < num_xfers; ++i) | ||
611 | spi_message_add_tail(&xfers[i], m); | ||
612 | } | ||
613 | |||
594 | /* It's fine to embed message and transaction structures in other data | 614 | /* It's fine to embed message and transaction structures in other data |
595 | * structures so long as you don't free them while they're in use. | 615 | * structures so long as you don't free them while they're in use. |
596 | */ | 616 | */ |
@@ -683,6 +703,30 @@ spi_read(struct spi_device *spi, void *buf, size_t len) | |||
683 | return spi_sync(spi, &m); | 703 | return spi_sync(spi, &m); |
684 | } | 704 | } |
685 | 705 | ||
706 | /** | ||
707 | * spi_sync_transfer - synchronous SPI data transfer | ||
708 | * @spi: device with which data will be exchanged | ||
709 | * @xfers: An array of spi_transfers | ||
710 | * @num_xfers: Number of items in the xfer array | ||
711 | * Context: can sleep | ||
712 | * | ||
713 | * Does a synchronous SPI data transfer of the given spi_transfer array. | ||
714 | * | ||
715 | * For more specific semantics see spi_sync(). | ||
716 | * | ||
717 | * It returns zero on success, else a negative error code. | ||
718 | */ | ||
719 | static inline int | ||
720 | spi_sync_transfer(struct spi_device *spi, struct spi_transfer *xfers, | ||
721 | unsigned int num_xfers) | ||
722 | { | ||
723 | struct spi_message msg; | ||
724 | |||
725 | spi_message_init_with_transfers(&msg, xfers, num_xfers); | ||
726 | |||
727 | return spi_sync(spi, &msg); | ||
728 | } | ||
729 | |||
686 | /* this copies txbuf and rxbuf data; for small transfers only! */ | 730 | /* this copies txbuf and rxbuf data; for small transfers only! */ |
687 | extern int spi_write_then_read(struct spi_device *spi, | 731 | extern int spi_write_then_read(struct spi_device *spi, |
688 | const void *txbuf, unsigned n_tx, | 732 | const void *txbuf, unsigned n_tx, |