Message ID | 20231029170053.82146-1-povik+lin@cutebit.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | dmaengine: apple-admac: Keep upper bits of REG_BUS_WIDTH | expand |
> 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 --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: