diff mbox series

dmaengine: apple-admac: Keep upper bits of REG_BUS_WIDTH

Message ID 20231029170053.82146-1-povik+lin@cutebit.org (mailing list archive)
State Superseded
Headers show
Series dmaengine: apple-admac: Keep upper bits of REG_BUS_WIDTH | expand

Commit Message

Martin Povišer Oct. 29, 2023, 5 p.m. UTC
From: Hector Martin <marcan@marcan.st>

For RX channels, REG_BUS_WIDTH seems to default to a value of 0xf00, and
macOS preserves the upper bits when setting the configuration in the
lower ones. If we reset the upper bits to 0, this causes framing errors
on suspend/resume (the data stream "tears" and channels get swapped
around). Keeping the upper bits untouched, like the macOS driver does,
fixes this issue.

Signed-off-by: Hector Martin <marcan@marcan.st>
Reviewed-by: Martin Povišer <povik@cutebit.org>
Signed-off-by: Martin Povišer <povik@cutebit.org>
---
 drivers/dma/apple-admac.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Martin Povišer Oct. 29, 2023, 5:10 p.m. UTC | #1
> On 29. 10. 2023, at 18:00, Martin Povišer <povik+lin@cutebit.org> wrote:
> 
> From: Hector Martin <marcan@marcan.st>
> 
> For RX channels, REG_BUS_WIDTH seems to default to a value of 0xf00, and
> macOS preserves the upper bits when setting the configuration in the
> lower ones. If we reset the upper bits to 0, this causes framing errors
> on suspend/resume (the data stream "tears" and channels get swapped
> around). Keeping the upper bits untouched, like the macOS driver does,
> fixes this issue.
> 
> Signed-off-by: Hector Martin <marcan@marcan.st>
> Reviewed-by: Martin Povišer <povik@cutebit.org>
> Signed-off-by: Martin Povišer <povik@cutebit.org>
> ---

Please take up v2 instead. I slipped in the wrong email address in here,
which I don’t want to subscribe for kernel spam with.

https://lore.kernel.org/dmaengine/20231029170704.82238-1-povik+lin@cutebit.org/T/#u

Thanks!

Kind regards,
Martin
diff mbox series

Patch

diff --git a/drivers/dma/apple-admac.c b/drivers/dma/apple-admac.c
index 5b63996640d9..9588773dd2eb 100644
--- a/drivers/dma/apple-admac.c
+++ b/drivers/dma/apple-admac.c
@@ -57,6 +57,8 @@ 
 
 #define REG_BUS_WIDTH(ch)	(0x8040 + (ch) * 0x200)
 
+#define BUS_WIDTH_WORD_SIZE	GENMASK(3, 0)
+#define BUS_WIDTH_FRAME_SIZE	GENMASK(7, 4)
 #define BUS_WIDTH_8BIT		0x00
 #define BUS_WIDTH_16BIT		0x01
 #define BUS_WIDTH_32BIT		0x02
@@ -740,7 +742,8 @@  static int admac_device_config(struct dma_chan *chan,
 	struct admac_data *ad = adchan->host;
 	bool is_tx = admac_chan_direction(adchan->no) == DMA_MEM_TO_DEV;
 	int wordsize = 0;
-	u32 bus_width = 0;
+	u32 bus_width = readl_relaxed(ad->base + REG_BUS_WIDTH(adchan->no)) &
+		~(BUS_WIDTH_WORD_SIZE | BUS_WIDTH_FRAME_SIZE);
 
 	switch (is_tx ? config->dst_addr_width : config->src_addr_width) {
 	case DMA_SLAVE_BUSWIDTH_1_BYTE: