mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 07:04:24 +00:00
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
2 changed files with 21 additions and 3 deletions
|
@ -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(
|
||||||
/* 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,
|
||||||
* @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 {
|
||||||
#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)
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue