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

Commit 210dd1bb authored by Max Filippov's avatar Max Filippov Committed by John W. Linville
Browse files

p54spi: fix incorrect access sequence to DMA_WRITE_CTRL in p54spi_spi_write_dma



Host is not allowed to modify DMA_WRITE_CTRL register
if bit HOST_ALLOWED in it is not set. Wait for HOST_ALLOWED first.

Also get rid of timeout in p54spi_wait_bit as it's been playing
a role of workaround for such an incorrect register access.

Signed-off-by: default avatarMax Filippov <jcmvbkbc@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 4eaf16bc
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -172,8 +172,6 @@ static int p54spi_wait_bit(struct p54s_priv *priv, u16 reg, __le32 bits)
		__le32 buffer = p54spi_read32(priv, reg);
		if ((buffer & bits) == bits)
			return 1;

		msleep(0);
	}
	return 0;
}
@@ -181,9 +179,6 @@ static int p54spi_wait_bit(struct p54s_priv *priv, u16 reg, __le32 bits)
static int p54spi_spi_write_dma(struct p54s_priv *priv, __le32 base,
				const void *buf, size_t len)
{
	p54spi_write16(priv, SPI_ADRS_DMA_WRITE_CTRL,
		       cpu_to_le16(SPI_DMA_WRITE_CTRL_ENABLE));

	if (!p54spi_wait_bit(priv, SPI_ADRS_DMA_WRITE_CTRL,
			     cpu_to_le32(HOST_ALLOWED))) {
		dev_err(&priv->spi->dev, "spi_write_dma not allowed "
@@ -191,6 +186,9 @@ static int p54spi_spi_write_dma(struct p54s_priv *priv, __le32 base,
		return -EAGAIN;
	}

	p54spi_write16(priv, SPI_ADRS_DMA_WRITE_CTRL,
		       cpu_to_le16(SPI_DMA_WRITE_CTRL_ENABLE));

	p54spi_write16(priv, SPI_ADRS_DMA_WRITE_LEN, cpu_to_le16(len));
	p54spi_write32(priv, SPI_ADRS_DMA_WRITE_BASE, base);
	p54spi_spi_write(priv, SPI_ADRS_DMA_DATA, buf, len);