Skip to content

Commit bebcfd2

Browse files
commodobroonie
authored andcommitted
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 <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 6c613f6 commit bebcfd2

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

drivers/spi/spi.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,8 +1248,7 @@ static int spi_transfer_one_message(struct spi_controller *ctlr,
12481248
if (msg->status != -EINPROGRESS)
12491249
goto out;
12501250

1251-
if (xfer->delay_usecs)
1252-
_spi_transfer_delay_ns(xfer->delay_usecs * 1000);
1251+
spi_transfer_delay_exec(xfer);
12531252

12541253
if (xfer->cs_change) {
12551254
if (list_is_last(&xfer->transfer_list,
@@ -3026,10 +3025,11 @@ struct spi_replaced_transfers *spi_replace_transfers(
30263025
/* add to list */
30273026
list_add(&xfer->transfer_list, rxfer->replaced_after);
30283027

3029-
/* clear cs_change and delay_usecs for all but the last */
3028+
/* clear cs_change and delay for all but the last */
30303029
if (i) {
30313030
xfer->cs_change = false;
30323031
xfer->delay_usecs = 0;
3032+
xfer->delay.value = 0;
30333033
}
30343034
}
30353035

include/linux/spi/spi.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -778,6 +778,9 @@ extern void spi_res_release(struct spi_controller *ctlr,
778778
* @cs_change: affects chipselect after this transfer completes
779779
* @cs_change_delay: delay between cs deassert and assert when
780780
* @cs_change is set and @spi_transfer is not the last in @spi_message
781+
* @delay: delay to be introduced after this transfer before
782+
* (optionally) changing the chipselect status, then starting
783+
* the next transfer or completing this @spi_message.
781784
* @delay_usecs: microseconds to delay after this transfer before
782785
* (optionally) changing the chipselect status, then starting
783786
* the next transfer or completing this @spi_message.
@@ -896,6 +899,7 @@ struct spi_transfer {
896899
#define SPI_NBITS_QUAD 0x04 /* 4bits transfer */
897900
u8 bits_per_word;
898901
u16 delay_usecs;
902+
struct spi_delay delay;
899903
struct spi_delay cs_change_delay;
900904
struct spi_delay word_delay;
901905
u32 speed_hz;
@@ -1003,6 +1007,20 @@ spi_transfer_del(struct spi_transfer *t)
10031007
list_del(&t->transfer_list);
10041008
}
10051009

1010+
static inline int
1011+
spi_transfer_delay_exec(struct spi_transfer *t)
1012+
{
1013+
struct spi_delay d;
1014+
1015+
if (t->delay_usecs) {
1016+
d.value = t->delay_usecs;
1017+
d.unit = SPI_DELAY_UNIT_USECS;
1018+
return spi_delay_exec(&d, NULL);
1019+
}
1020+
1021+
return spi_delay_exec(&t->delay, t);
1022+
}
1023+
10061024
/**
10071025
* spi_message_init_with_transfers - Initialize spi_message and append transfers
10081026
* @m: spi_message to be initialized

0 commit comments

Comments
 (0)