Message ID | 20190423201513.8073-6-kernel@martin.sperl.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | spi: bcm2835: improvements | expand |
On Wed, Apr 24, 2019 at 09:07:12AM +0200, Lukas Wunner wrote: > Indeed I'd prefer if another bit is added to "mode" in struct device > to represent the need for another clock cycle in-between bytes. > The SPI core could then reduce the clock speed based on this flag > and the problem would be solved for everyone. > Influencing this behavior with a module parameter feels a bit like a > kludge and I fear may stay indefinitely even if a better solution > is implemented later. This does feel like we know enough to have a more advanced function in the driver given a bit of information about the client device requireemnts. Though it's going to be complex to express them, especially with the ATMega case where we want fast individual clocks but lots of dead space in between bytes (is the controller capable of adding that dead space itself in DMA mode BTW?).
> On 08.05.2019, at 10:42, Mark Brown <broonie@kernel.org> wrote: > > especially with the ATMega case where we want fast individual clocks but > lots of dead space in between bytes (is the controller capable of adding > that dead space itself in DMA mode BTW?). No it is not - at least not so far as I know of (and I just went over the available documentation again). Martin
diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c index 2d702db8689c..755e1e6d2252 100644 --- a/drivers/spi/spi-bcm2835.c +++ b/drivers/spi/spi-bcm2835.c @@ -73,7 +73,6 @@ #define BCM2835_SPI_FIFO_SIZE 64 #define BCM2835_SPI_FIFO_SIZE_3_4 48 -#define BCM2835_SPI_DMA_MIN_LENGTH 96 #define BCM2835_SPI_MODE_BITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH \ | SPI_NO_CS | SPI_3WIRE) @@ -85,6 +84,12 @@ module_param(polling_limit_us, uint, 0664); MODULE_PARM_DESC(polling_limit_us, "time in us to run a transfer in polling mode\n"); +/* define minimum transfer length for which we may use DMA */ +unsigned int dma_min_bytes_limit = 96; +module_param(dma_min_bytes_limit, uint, 0664); +MODULE_PARM_DESC(dma_min_bytes_limit, + "minimum number of bytes to run a transfer in dma mode - 0 disables dma-mode completely\n"); + /** * struct bcm2835_spi - BCM2835 SPI controller * @regs: base address of register map @@ -631,7 +636,7 @@ static bool bcm2835_spi_can_dma(struct spi_master *master, struct spi_transfer *tfr) { /* we start DMA efforts only on bigger transfers */ - if (tfr->len < BCM2835_SPI_DMA_MIN_LENGTH) + if (!dma_min_bytes_limit || tfr->len < dma_min_bytes_limit) return false; /* BCM2835_SPI_DLEN has defined a max transfer size as