diff options
author | Mark Brown <broonie@kernel.org> | 2023-12-04 12:31:42 +0000 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2023-12-04 12:31:42 +0000 |
commit | 06891af2709b5dfa4081ff1f07b9f4c2743834b7 (patch) | |
tree | 672f337b94d3af79268a54b5307af1392f708a1a /include/linux/spi | |
parent | 7a030abc0185b30a3fd19a7431347c6f5a82c588 (diff) | |
parent | 9b2ef250b31d46f7ef522bd1bd84942f998bb3f9 (diff) | |
download | linux-06891af2709b5dfa4081ff1f07b9f4c2743834b7.tar.gz linux-06891af2709b5dfa4081ff1f07b9f4c2743834b7.tar.bz2 linux-06891af2709b5dfa4081ff1f07b9f4c2743834b7.zip |
spi: spl022: fix sleeping in interrupt context
Merge series from Nam Cao <namcao@linutronix.de>:
While running the spl022, I got the following warning:
BUG: sleeping function called from invalid context at drivers/spi/spi.c:1428
This is because between spi transfers, spi_transfer_delay_exec() (who
may sleep if the delay is >10us) is called in interrupt context. This is
a problem for anyone who runs this driver and need more than 10us delay.
Patch 1 adds an error reporting mechanism, needed by patch 2 who switch
to use the default spi_transfer_one_message(), which fix the problem.
The series is tested with polling transfer mode and interrupt transfer
mode. I can't test the DMA mode, so some help testing here is very
appreciated.
Diffstat (limited to 'include/linux/spi')
-rw-r--r-- | include/linux/spi/spi.h | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 7b4baff63c5c..5d65a6273dcf 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -461,10 +461,13 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch * - return 1 if the transfer is still in progress. When * the driver is finished with this transfer it must * call spi_finalize_current_transfer() so the subsystem - * can issue the next transfer. Note: transfer_one and - * transfer_one_message are mutually exclusive; when both - * are set, the generic subsystem does not call your - * transfer_one callback. + * can issue the next transfer. If the transfer fails, the + * driver must set the flag SPI_TRANS_FAIL_IO to + * spi_transfer->error first, before calling + * spi_finalize_current_transfer(). + * Note: transfer_one and transfer_one_message are mutually + * exclusive; when both are set, the generic subsystem does + * not call your transfer_one callback. * @handle_err: the subsystem calls the driver to handle an error that occurs * in the generic implementation of transfer_one_message(). * @mem_ops: optimized/dedicated operations for interactions with SPI memory. @@ -1040,6 +1043,7 @@ struct spi_transfer { unsigned len; #define SPI_TRANS_FAIL_NO_START BIT(0) +#define SPI_TRANS_FAIL_IO BIT(1) u16 error; dma_addr_t tx_dma; |