Skip to content

Commit 407c301

Browse files
committed
dmaengine: apple-admac: Keep upper bits of REG_BUS_WIDTH
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>
1 parent a066226 commit 407c301

1 file changed

Lines changed: 4 additions & 1 deletion

File tree

drivers/dma/apple-admac.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@
5757

5858
#define REG_BUS_WIDTH(ch) (0x8040 + (ch) * 0x200)
5959

60+
#define BUS_WIDTH_WORD_SIZE GENMASK(3, 0)
61+
#define BUS_WIDTH_FRAME_SIZE GENMASK(7, 4)
6062
#define BUS_WIDTH_8BIT 0x00
6163
#define BUS_WIDTH_16BIT 0x01
6264
#define BUS_WIDTH_32BIT 0x02
@@ -740,7 +742,8 @@ static int admac_device_config(struct dma_chan *chan,
740742
struct admac_data *ad = adchan->host;
741743
bool is_tx = admac_chan_direction(adchan->no) == DMA_MEM_TO_DEV;
742744
int wordsize = 0;
743-
u32 bus_width = 0;
745+
u32 bus_width = readl_relaxed(ad->base + REG_BUS_WIDTH(adchan->no)) &
746+
~(BUS_WIDTH_WORD_SIZE | BUS_WIDTH_FRAME_SIZE);
744747

745748
switch (is_tx ? config->dst_addr_width : config->src_addr_width) {
746749
case DMA_SLAVE_BUSWIDTH_1_BYTE:

0 commit comments

Comments
 (0)