Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13b10301 authored by Matthias Seidel's avatar Matthias Seidel Committed by Mark Brown
Browse files

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: default avatarMatthias Seidel <kernel@mseidel.net>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 29b4817d
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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 != dws->current_freq) {
		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->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe;
			chip->speed_hz = transfer->speed_hz;
		chip->clk_div = clk_div;

		}
		dws->current_freq = transfer->speed_hz;
		spi_set_clk(dws, chip->clk_div);
	}
	if (transfer->bits_per_word == 8) {
+1 −0
Original line number Diff line number Diff line
@@ -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;