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: Alexandru Ardelean <alexandru.ardelean@analog.com> Link: https://lore.kernel.org/r/20190926105147.7839-9-alexandru.ardelean@analog.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
6c613f68aa
commit
bebcfd272d
@ -1248,8 +1248,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
|
||||
if (msg->status != -EINPROGRESS)
|
||||
goto out;
|
||||
|
||||
if (xfer->delay_usecs)
|
||||
_spi_transfer_delay_ns(xfer->delay_usecs * 1000);
|
||||
spi_transfer_delay_exec(xfer);
|
||||
|
||||
if (xfer->cs_change) {
|
||||
if (list_is_last(&xfer->transfer_list,
|
||||
@ -3026,10 +3025,11 @@ struct spi_replaced_transfers *spi_replace_transfers(
|
||||
/* add to list */
|
||||
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) {
|
||||
xfer->cs_change = false;
|
||||
xfer->delay_usecs = 0;
|
||||
xfer->delay.value = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -778,6 +778,9 @@ extern void spi_res_release(struct spi_controller *ctlr,
|
||||
* @cs_change: affects chipselect after this transfer completes
|
||||
* @cs_change_delay: delay between cs deassert and assert when
|
||||
* @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
|
||||
* (optionally) changing the chipselect status, then starting
|
||||
* the next transfer or completing this @spi_message.
|
||||
@ -896,6 +899,7 @@ struct spi_transfer {
|
||||
#define SPI_NBITS_QUAD 0x04 /* 4bits transfer */
|
||||
u8 bits_per_word;
|
||||
u16 delay_usecs;
|
||||
struct spi_delay delay;
|
||||
struct spi_delay cs_change_delay;
|
||||
struct spi_delay word_delay;
|
||||
u32 speed_hz;
|
||||
@ -1003,6 +1007,20 @@ spi_transfer_del(struct spi_transfer *t)
|
||||
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
|
||||
* @m: spi_message to be initialized
|
||||
|
Loading…
Reference in New Issue
Block a user