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>
This commit is contained in:
Matthias Seidel 2016-09-04 02:04:49 +02:00 коммит произвёл Mark Brown
Родитель 29b4817d40
Коммит 13b10301b8
2 изменённых файлов: 8 добавлений и 8 удалений

Просмотреть файл

@ -283,7 +283,6 @@ static int dw_spi_transfer_one(struct spi_master *master,
struct chip_data *chip = spi_get_ctldata(spi); struct chip_data *chip = spi_get_ctldata(spi);
u8 imask = 0; u8 imask = 0;
u16 txlevel = 0; u16 txlevel = 0;
u16 clk_div;
u32 cr0; u32 cr0;
int ret; int ret;
@ -298,13 +297,13 @@ static int dw_spi_transfer_one(struct spi_master *master,
spi_enable_chip(dws, 0); spi_enable_chip(dws, 0);
/* Handle per transfer options for bpw and speed */ /* Handle per transfer options for bpw and speed */
if (transfer->speed_hz != chip->speed_hz) { if (transfer->speed_hz != dws->current_freq) {
/* clk_div doesn't support odd number */ if (transfer->speed_hz != chip->speed_hz) {
clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe; /* clk_div doesn't support odd number */
chip->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe;
chip->speed_hz = transfer->speed_hz; chip->speed_hz = transfer->speed_hz;
chip->clk_div = clk_div; }
dws->current_freq = transfer->speed_hz;
spi_set_clk(dws, chip->clk_div); spi_set_clk(dws, chip->clk_div);
} }
if (transfer->bits_per_word == 8) { if (transfer->bits_per_word == 8) {

Просмотреть файл

@ -123,6 +123,7 @@ struct dw_spi {
u8 n_bytes; /* current is a 1/2 bytes op */ u8 n_bytes; /* current is a 1/2 bytes op */
u32 dma_width; u32 dma_width;
irqreturn_t (*transfer_handler)(struct dw_spi *dws); irqreturn_t (*transfer_handler)(struct dw_spi *dws);
u32 current_freq; /* frequency in hz */
/* DMA info */ /* DMA info */
int dma_inited; int dma_inited;