From 2e22e0f58777c055d1d5ceb373499c35dfac1124 Mon Sep 17 00:00:00 2001 From: Matthias Seidel Date: Thu, 18 Aug 2016 15:48:25 +0200 Subject: [PATCH 1/2] Added support for multiple slaves with different baud rates. Also eliminated variables speed and clk_div. --- drivers/spi/spi-dw.c | 21 ++++++++------------- drivers/spi/spi-dw.h | 1 + 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 4fbfcdc5cb244..9d55200132e42 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c @@ -289,8 +289,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 = 0; - u32 speed = 0; u32 cr0 = 0; int ret; @@ -310,17 +308,14 @@ static int dw_spi_transfer_one(struct spi_master *master, /* Handle per transfer options for bpw and speed */ if (transfer->speed_hz) { - speed = chip->speed_hz; - - if ((transfer->speed_hz != speed) || !chip->clk_div) { - speed = transfer->speed_hz; - - /* clk_div doesn't support odd number */ - clk_div = (dws->max_freq / speed + 1) & 0xfffe; - - chip->speed_hz = speed; - chip->clk_div = clk_div; - + if (transfer->speed_hz != dws->cur_freq) { + if (transfer->speed_hz != chip->speed_hz) { + /* clk_div doesn't support odd number, round up so we won't + * exceed requested speed_hz */ + chip->clk_div = ((dws->max_freq + (transfer->speed_hz>>1)) / transfer->speed_hz + 1) & 0xfffe; + chip->speed_hz = transfer->speed_hz; + } + dws->cur_freq = transfer->speed_hz; spi_set_clk(dws, chip->clk_div); } } diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h index b75ed327d5a29..62936a9627211 100644 --- a/drivers/spi/spi-dw.h +++ b/drivers/spi/spi-dw.h @@ -108,6 +108,7 @@ struct dw_spi { int irq; u32 fifo_len; /* depth of the FIFO buffer */ u32 max_freq; /* max bus freq supported */ + u32 cur_freq; /* current bus frequency */ u32 reg_io_width; /* DR I/O width in bytes */ u16 bus_num; From 70f33b9d5d02917cc0238016d4a6c7d18c24d6db Mon Sep 17 00:00:00 2001 From: Matthias Seidel Date: Thu, 18 Aug 2016 15:56:53 +0200 Subject: [PATCH 2/2] Remove needless if statements see 0ed36990a93b23c4873c77cdc1423429e40ed469 --- drivers/spi/spi-dw.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c index 9d55200132e42..f327f95dee289 100644 --- a/drivers/spi/spi-dw.c +++ b/drivers/spi/spi-dw.c @@ -307,31 +307,27 @@ static int dw_spi_transfer_one(struct spi_master *master, cr0 = chip->cr0; /* Handle per transfer options for bpw and speed */ - if (transfer->speed_hz) { - if (transfer->speed_hz != dws->cur_freq) { - if (transfer->speed_hz != chip->speed_hz) { - /* clk_div doesn't support odd number, round up so we won't - * exceed requested speed_hz */ - chip->clk_div = ((dws->max_freq + (transfer->speed_hz>>1)) / transfer->speed_hz + 1) & 0xfffe; - chip->speed_hz = transfer->speed_hz; - } - dws->cur_freq = transfer->speed_hz; - spi_set_clk(dws, chip->clk_div); + if (transfer->speed_hz != dws->cur_freq) { + if (transfer->speed_hz != chip->speed_hz) { + /* clk_div doesn't support odd number, round up so we won't + * exceed requested speed_hz */ + chip->clk_div = ((dws->max_freq + (transfer->speed_hz>>1)) / transfer->speed_hz + 1) & 0xfffe; + chip->speed_hz = transfer->speed_hz; } + dws->cur_freq = transfer->speed_hz; + spi_set_clk(dws, chip->clk_div); } - if (transfer->bits_per_word) { - if (transfer->bits_per_word == 8) { - dws->n_bytes = 1; - dws->dma_width = 1; - } else if (transfer->bits_per_word == 16) { - dws->n_bytes = 2; - dws->dma_width = 2; - } - cr0 = (transfer->bits_per_word - 1) - | (chip->type << SPI_FRF_OFFSET) - | (spi->mode << SPI_MODE_OFFSET) - | (chip->tmode << SPI_TMOD_OFFSET); + if (transfer->bits_per_word == 8) { + dws->n_bytes = 1; + dws->dma_width = 1; + } else if (transfer->bits_per_word == 16) { + dws->n_bytes = 2; + dws->dma_width = 2; } + cr0 = (transfer->bits_per_word - 1) + | (chip->type << SPI_FRF_OFFSET) + | (spi->mode << SPI_MODE_OFFSET) + | (chip->tmode << SPI_TMOD_OFFSET); /* * Adjust transfer mode if necessary. Requires platform dependent