From patchwork Sun Oct 29 17:07:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Martin_Povi=C5=A1er?= X-Patchwork-Id: 13439844 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 32E31C4332F for ; Sun, 29 Oct 2023 17:08:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=ihs2MlV6mIAfaXB6TSuAjdfVpvI+Ta0Mf5Y7Py6xWZM=; b=1jy7FwGf1UsYev 5wqlOcF4XAr0K/FsDiuGmRtagVPZJh0WiWyhtasORei/BlX9siq7+6Uc54Zugr+mIMRxZv2sb6J5Y 7PYyopkOdyE9tJYrLbXXe8scQqMU8/dLJw/iJ+Ksllhn8f8eEMud4t5gjKqiTSFqAK5CTGzgQSiOu 3z7c6/CWyIVBL5aDb5TzM9zbrbVOUnD6cfRsQZh5xkSbwCLWjmtrI9aZlYVA9hcM2j01MTgxje9HK IlSOxVDWTgf+NMgK8EBR+E0iG1rALEr1ij2bJ3d1C1fSPDOEEtUCztU5vVaOl2fA3OZLjkPAA8Myx 12+flQu9M/Mxgym8i1Jw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qx9GG-001x0M-2d; Sun, 29 Oct 2023 17:07:40 +0000 Received: from hutie.ust.cz ([2a03:3b40:fe:f0::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qx9GD-001wzd-27 for linux-arm-kernel@lists.infradead.org; Sun, 29 Oct 2023 17:07:39 +0000 From: =?utf-8?q?Martin_Povi=C5=A1er?= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cutebit.org; s=mail; t=1698599255; bh=ks4YNEeD+10vbFjJV7lXcOdJALOf9YJioNyXbYuueZ4=; h=From:To:Cc:Subject:Date; b=WhNR04b0rix8q+fydz8QLE8l0Jbg9vV0oQmSEQPk3WQDkG90trynJCdKo6ZO1P9kF mWIuTT0iOqMEGjftybZIoAwKvoS71TxwNuzHQUVP3K+/H+RxksYhmcaaftRFlyyy9u /Q1wcgc4Uv3cK0NVPqE8Fx8Dxe0BKa/1jCEKR4+4= To: Hector Martin , Sven Peter , Vinod Koul Cc: Alyssa Rosenzweig , asahi@lists.linux.dev, linux-arm-kernel@lists.infradead.org, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, =?utf-8?q?Martin_Povi=C5=A1er?= Subject: [PATCH v2] dmaengine: apple-admac: Keep upper bits of REG_BUS_WIDTH Date: Sun, 29 Oct 2023 18:07:04 +0100 Message-Id: <20231029170704.82238-1-povik+lin@cutebit.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231029_100737_841584_0960AF62 X-CRM114-Status: GOOD ( 10.79 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org From: Hector Martin 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 Reviewed-by: Martin Povišer Signed-off-by: Martin Povišer --- Change in v2: fixed my (Martin's) address drivers/dma/apple-admac.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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: