diff options
author | Matthias Seidel <kernel@mseidel.net> | 2016-09-04 02:04:49 +0200 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2016-09-06 11:53:50 +0100 |
commit | 13b10301b858e355613bfc6dc297580bf34d3fb5 (patch) | |
tree | be671ff360bb3c0f4c88982f6c64ed8a36193692 | |
parent | 29b4817d4018df78086157ea3a55c1d9424a7cfc (diff) | |
download | blackbird-op-linux-13b10301b858e355613bfc6dc297580bf34d3fb5.tar.gz blackbird-op-linux-13b10301b858e355613bfc6dc297580bf34d3fb5.zip |
spi: dw: fix multiple slaves with different baudrates
Add current master clock to dws struct and compare it against the
requestedtransfer speed. Update clock divider only if necessary.
Signed-off-by: Matthias Seidel <kernel@mseidel.net>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | drivers/spi/spi-dw.c | 15 | ||||
-rw-r--r-- | drivers/spi/spi-dw.h | 1 |
2 files changed, 8 insertions, 8 deletions
diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index c09bb745693a..c85e4b327a4a 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c @@ -283,7 +283,6 @@ static int dw_spi_transfer_one(struct spi_master *master, struct chip_data *chip = spi_get_ctldata(spi); u8 imask = 0; u16 txlevel = 0; - u16 clk_div; u32 cr0; int ret; @@ -298,13 +297,13 @@ static int dw_spi_transfer_one(struct spi_master *master, spi_enable_chip(dws, 0); /* Handle per transfer options for bpw and speed */ - if (transfer->speed_hz != chip->speed_hz) { - /* clk_div doesn't support odd number */ - clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe; - - chip->speed_hz = transfer->speed_hz; - chip->clk_div = clk_div; - + if (transfer->speed_hz != dws->current_freq) { + if (transfer->speed_hz != chip->speed_hz) { + /* clk_div doesn't support odd number */ + chip->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe; + chip->speed_hz = transfer->speed_hz; + } + dws->current_freq = transfer->speed_hz; spi_set_clk(dws, chip->clk_div); } if (transfer->bits_per_word == 8) { diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h index 61bc3cbab38d..c21ca02f8ec5 100644 --- a/drivers/spi/spi-dw.h +++ b/drivers/spi/spi-dw.h @@ -123,6 +123,7 @@ struct dw_spi { u8 n_bytes; /* current is a 1/2 bytes op */ u32 dma_width; irqreturn_t (*transfer_handler)(struct dw_spi *dws); + u32 current_freq; /* frequency in hz */ /* DMA info */ int dma_inited; |