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

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.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 6c613f68
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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;
		}
	}

+18 −0
Original line number Diff line number Diff line
@@ -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