spi: bcm2835: enabling polling mode for transfers shorter than 30us
authorMartin Sperl <kernel@martin.sperl.org>
Mon, 6 Apr 2015 17:16:30 +0000 (17:16 +0000)
committerMark Brown <broonie@kernel.org>
Fri, 10 Apr 2015 18:50:52 +0000 (19:50 +0100)
commit704f32d48af221fd6d6ffcafe679f04ddcf5e7f6
tree1c9854a3b250b9fe1783a3c7a866eba7a2d2185d
parenta30a555d7435a440fab06fe5960cf3448d8cedd3
spi: bcm2835: enabling polling mode for transfers shorter than 30us

In cases of short transfer times the CPU is spending lots of time
in the interrupt handler and scheduler to reschedule the worker thread.

Measurements show that we have times where it takes 29.32us to between
the last clock change and the time that the worker-thread is running again
returning from wait_for_completion_timeout().

During this time the interrupt-handler is running calling complete()
and then also the scheduler is rescheduling the worker thread.

This time can vary depending on how much of the code is still in
CPU-caches, when there is a burst of spi transfers the subsequent delays
are in the order of 25us, so the value of 30us seems reasonable.

With polling the whole transfer of 4 bytes at 10MHz finishes after 6.16us
(CS down to up) with the real transfer (clock running) taking 3.56us.
So the efficiency has much improved and is also freeing CPU cycles,
reducing interrupts and context switches.

Because of the above 30us seems to be a reasonable limit for polling.

Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi-bcm2835.c