Commit bebcfd27 authored by Alexandru Ardelean's avatar Alexandru Ardelean Committed by Mark Brown

spi: introduce `delay` field for `spi_transfer` + spi_transfer_delay_exec()

The change introduces the `delay` field to the `spi_transfer` struct as an
`struct spi_delay` type.
This intends to eventually replace `delay_usecs`.

But, since there are many users of `delay_usecs`, this needs some
intermediate work.
A helper called `spi_transfer_delay_exec()` is also added, which maintains
backwards compatibility with `delay_usecs`, by assigning the value to
`delay` if non-zero.
This should maintain backwards compatibility with current users of
`udelay_usecs`.
Signed-off-by: default avatarAlexandru Ardelean <alexandru.ardelean@analog.com>
Link: https://lore.kernel.org/r/20190926105147.7839-9-alexandru.ardelean@analog.comSigned-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6c613f68
...@@ -1248,8 +1248,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr, ...@@ -1248,8 +1248,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
if (msg->status != -EINPROGRESS) if (msg->status != -EINPROGRESS)
goto out; goto out;
if (xfer->delay_usecs) spi_transfer_delay_exec(xfer);
_spi_transfer_delay_ns(xfer->delay_usecs * 1000);
if (xfer->cs_change) { if (xfer->cs_change) {
if (list_is_last(&xfer->transfer_list, if (list_is_last(&xfer->transfer_list,
...@@ -3026,10 +3025,11 @@ struct spi_replaced_transfers *spi_replace_transfers( ...@@ -3026,10 +3025,11 @@ struct spi_replaced_transfers *spi_replace_transfers(
/* add to list */ /* add to list */
list_add(&xfer->transfer_list, rxfer->replaced_after); list_add(&xfer->transfer_list, rxfer->replaced_after);
/* clear cs_change and delay_usecs for all but the last */ /* clear cs_change and delay for all but the last */
if (i) { if (i) {
xfer->cs_change = false; xfer->cs_change = false;
xfer->delay_usecs = 0; xfer->delay_usecs = 0;
xfer->delay.value = 0;
} }
} }
......
...@@ -778,6 +778,9 @@ extern void spi_res_release(struct spi_controller *ctlr, ...@@ -778,6 +778,9 @@ extern void spi_res_release(struct spi_controller *ctlr,
* @cs_change: affects chipselect after this transfer completes * @cs_change: affects chipselect after this transfer completes
* @cs_change_delay: delay between cs deassert and assert when * @cs_change_delay: delay between cs deassert and assert when
* @cs_change is set and @spi_transfer is not the last in @spi_message * @cs_change is set and @spi_transfer is not the last in @spi_message
* @delay: delay to be introduced after this transfer before
* (optionally) changing the chipselect status, then starting
* the next transfer or completing this @spi_message.
* @delay_usecs: microseconds to delay after this transfer before * @delay_usecs: microseconds to delay after this transfer before
* (optionally) changing the chipselect status, then starting * (optionally) changing the chipselect status, then starting
* the next transfer or completing this @spi_message. * the next transfer or completing this @spi_message.
...@@ -896,6 +899,7 @@ struct spi_transfer { ...@@ -896,6 +899,7 @@ struct spi_transfer {
#define SPI_NBITS_QUAD 0x04 /* 4bits transfer */ #define SPI_NBITS_QUAD 0x04 /* 4bits transfer */
u8 bits_per_word; u8 bits_per_word;
u16 delay_usecs; u16 delay_usecs;
struct spi_delay delay;
struct spi_delay cs_change_delay; struct spi_delay cs_change_delay;
struct spi_delay word_delay; struct spi_delay word_delay;
u32 speed_hz; u32 speed_hz;
...@@ -1003,6 +1007,20 @@ spi_transfer_del(struct spi_transfer *t) ...@@ -1003,6 +1007,20 @@ spi_transfer_del(struct spi_transfer *t)
list_del(&t->transfer_list); list_del(&t->transfer_list);
} }
static inline int
spi_transfer_delay_exec(struct spi_transfer *t)
{
struct spi_delay d;
if (t->delay_usecs) {
d.value = t->delay_usecs;
d.unit = SPI_DELAY_UNIT_USECS;
return spi_delay_exec(&d, NULL);
}
return spi_delay_exec(&t->delay, t);
}
/** /**
* spi_message_init_with_transfers - Initialize spi_message and append transfers * spi_message_init_with_transfers - Initialize spi_message and append transfers
* @m: spi_message to be initialized * @m: spi_message to be initialized
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment