mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
spi: Create a helper to derive adaptive timeouts
Big transfers might take a bit of time, too constraining timeouts might lead to false positives. In order to simplify the drivers work and with the goal of factorizing code in mind, let's add a helper that can be used by any spi controller driver to derive a relevant per-transfer timeout value. The logic is simple: we know how much time it would take to transfer a byte, we can easily derive the total theoretical amount of time involved for each transfer. We multiply it by two to have a bit of margin and enforce a minimum of 500ms. Suggested-by: Mark Brown <broonie@kernel.org> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Link: https://lore.kernel.org/r/Message-Id: <20230622090634.3411468-2-miquel.raynal@bootlin.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
e6afe03351
commit
d8e4ebf870
@ -1261,6 +1261,23 @@ static inline bool spi_is_bpw_supported(struct spi_device *spi, u32 bpw)
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* spi_controller_xfer_timeout - Compute a suitable timeout value
|
||||
* @ctlr: SPI device
|
||||
* @xfer: Transfer descriptor
|
||||
*
|
||||
* Compute a relevant timeout value for the given transfer. We derive the time
|
||||
* that it would take on a single data line and take twice this amount of time
|
||||
* with a minimum of 500ms to avoid false positives on loaded systems.
|
||||
*
|
||||
* Returns: Transfer timeout value in milliseconds.
|
||||
*/
|
||||
static inline unsigned int spi_controller_xfer_timeout(struct spi_controller *ctlr,
|
||||
struct spi_transfer *xfer)
|
||||
{
|
||||
return max(xfer->len * 8 * 2 / (xfer->speed_hz / 1000), 500U);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
/* SPI transfer replacement methods which make use of spi_res */
|
||||
|
Loading…
Reference in New Issue
Block a user