spi: dw: Fix dynamic speed change.
authorThor Thayer <tthayer@opensource.altera.com>
Thu, 6 Nov 2014 19:54:27 +0000 (13:54 -0600)
committerMark Brown <broonie@kernel.org>
Fri, 7 Nov 2014 10:14:59 +0000 (10:14 +0000)
commit0a8727e69778683495058852f783eeda141a754e
tree5bfa5e723e4ec3ce687da01386136db8b3b57cb5
parentf114040e3ea6e07372334ade75d1ee0775c355e1
spi: dw: Fix dynamic speed change.

An IOCTL call that calls spi_setup() and then dw_spi_setup() will
overwrite the persisted last transfer speed. On each transfer, the
SPI speed is compared to the last transfer speed to determine if the
clock divider registers need to be updated (did the speed change?).
This bug was observed with the spidev driver using spi-config to
update the max transfer speed.

This fix: Don't overwrite the persisted last transaction clock speed
when updating the SPI parameters in dw_spi_setup(). On the next
transaction, the new speed won't match the persisted last speed
and the hardware registers will be updated.
On initialization, the persisted last transaction clock
speed will be 0 but will be updated after the first SPI
transaction.

Move zeroed clock divider check into clock change test because
chip->clk_div is zero on startup and would cause a divide-by-zero
error. The calculation was wrong as well (can't support odd #).

Reported-by: Vlastimil Setka <setka@vsis.cz>
Signed-off-by: Vlastimil Setka <setka@vsis.cz>
Signed-off-by: Thor Thayer <tthayer@opensource.altera.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Cc: stable@vger.kernel.org
drivers/spi/spi-dw.c