From nobody Tue Apr 7 20:31:45 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DB403B892B for ; Tue, 7 Apr 2026 13:35:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568951; cv=none; b=oq20E8Ns2zU5ij27t8e6JaClX0vFW8u99+jrWM8myiLfwy1zozp6+04GrXfDTmMKzwsn9J/Zpjl6RMa3bL+Ivy7EVdZPgRMOH53KhZ58PNz8sZaNH4GTaKFIDbn5xODKzCiD3d/Jk7WSHO+rGomdr2bINJvIzq3lzHIFOhxpwFo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775568951; c=relaxed/simple; bh=OGJy16GF9/KuOlAbPYY8Arool4o4HNHbnVB+AWCFgco=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Fr1lRm0GSSY3OsCl+DIG6NEJN71NYE814EFf/XDf1UsWzOpiGUBbjSZPoyuAbDiu+jIaOtak0nl6pOwgZEazsuBmN4SS7l3BAPzw/UZAQ5pHfYdUI0y6DaCFFqaGofz7VHMhhmX8XtetgkmMhKpAdhZtz8PSsYgMQ1aaqq0YSMg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev; spf=pass smtp.mailfrom=tuxon.dev; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b=LZyB3MU3; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=tuxon.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=tuxon.dev header.i=@tuxon.dev header.b="LZyB3MU3" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-488b150559bso15802415e9.1 for ; Tue, 07 Apr 2026 06:35:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tuxon.dev; s=google; t=1775568943; x=1776173743; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=RfbZ4006aH4p+LsSEhfwyxhxCu3KeHA6cjylUZwq+3Q=; b=LZyB3MU3pC4OXVXzjPLhXW47vYRjeqGKG/CnbOB09MRF3Pv3MxMQle8VRDUnT/Snh3 KJEgne75u3Bv09pPLS0KFnotv7BpXoXUuOSGbulESZXCsUjaJn9i5/vCJDG/ps92GcPS l4BOJhc87AIaoPqPIf6GOOnt2p5qHrgu2MsCJaJuXMDHOPU22tHgjrTphsgeKc8qM+12 K1AW/hhlgwid3d7w9f/SA15WlEW+LONvfrhuoZfjBeYZPdldEdsJiUkn6scfVx3T/jBs tcTXpQiIigg9//DJJ4NHPJ12WK8bWZWtjo7Ola1RLtKh8icFXAUmn/lAcrNgkjWLnfc4 OJSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775568943; x=1776173743; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=RfbZ4006aH4p+LsSEhfwyxhxCu3KeHA6cjylUZwq+3Q=; b=tAW5oYdL5QmhGU217wQG9xXSrZQGJqp7G0Vj7M3q43VDJvteOArdPCR8s8mDFKxXZq QEVlHL1/xA825lZKuZLEkj8AB4r6Y7WX4ZTe0EA3by9aziGr1PswJAO5Ae6JMV94vP/a /DM6XJxPN3ERLOA7+ff2D234qVxPVm1TUzTQjNOhqCDxNrOLSpxCExkZ/xd0u6ryfh+x K+I1sgGyvuXqzNaPzuaObQ0i08u2pMl/5+xwX9yrZfGghUpUjZg3RudDFLJn5lDAhpcR 1vSqiSj6+K0QDyjXB76/Dgxwa2PtSphmnap9kiPpHteq3ItBirfp3wU5yaYXvGcZr+nn 543A== X-Forwarded-Encrypted: i=1; AJvYcCXW3Ktf1JWnf21pJT8pwbBNCImYu2ytw1aIXimee/fkBawXiuqzF8ZhyfQte1bXL6wNUlO+wMbo3LheJjg=@vger.kernel.org X-Gm-Message-State: AOJu0YwyYJVtAjxCePeU3GCz11RSaI1tWd+CfefpxcJ2MEGmVUpa2Nhe snmc6unXthBWG4/PAcsUNHSAn8C0th33Vq+4ENbNxQabMpTGBdNL8LMESyHzBNWp0Rs= X-Gm-Gg: AeBDiesxAQXQmbibbWBbfZOMpOd0Kyh9wEj0Op+0aRAExZso5COnE5GbblYofPhEjg0 ZAown4WJVXZS2uTkMUOuYt5UR/oJvYUtzQWZrqw2uHiofTNVr6QYKp9mT4mSbwkfVCPKbq3+dOE uSsFcGIgfnhkGOlt/jcWlVOEiQHrcrUl2pKouZErFZBkoc/ON5y5/FWpU6QER3s9imfqkrtvstv 7N6Av278PXqwkI1Io2+LYtbdQjoCWLP101p1QKmjlzau6rbIregDcwZ9fJxoX1qTyEQ8n1aRyrJ fyRw3gjQvBHcLscMzSLPk2dN4+IkIsaq0Y4GFn4YHvkzKONSYPvcbe+sdZWrbfBVMiwgIV0sU/n r/VKaVR2Hu8aqHSOz+2sZWdDzwM3S5zQdKsfyqvbloDbas970qkDh4PnrBSdzlSptahJWvyfC8R KSA8tJRpYgjPvrfI8LxqLN7ImLsKxS1zW1jKPffCOjTp6bsc1sVrRY X-Received: by 2002:a05:600c:5251:b0:488:c257:a73b with SMTP id 5b1f17b1804b1-488c257a952mr14542955e9.9.1775568942953; Tue, 07 Apr 2026 06:35:42 -0700 (PDT) Received: from claudiu-X670E-Pro-RS.. ([82.78.167.248]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-488a91686f9sm285777675e9.10.2026.04.07.06.35.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 06:35:42 -0700 (PDT) From: Claudiu X-Google-Original-From: Claudiu To: vkoul@kernel.org, Frank.Li@kernel.org, lgirdwood@gmail.com, broonie@kernel.org, perex@perex.cz, tiwai@suse.com, biju.das.jz@bp.renesas.com, prabhakar.mahadev-lad.rj@bp.renesas.com, p.zabel@pengutronix.de, geert+renesas@glider.be, fabrizio.castro.jz@renesas.com Cc: claudiu.beznea@tuxon.dev, dmaengine@vger.kernel.org, linux-kernel@vger.kernel.org, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, Claudiu Beznea Subject: [PATCH v3 09/15] dmaengine: sh: rz-dmac: Refactor pause/resume code Date: Tue, 7 Apr 2026 16:35:01 +0300 Message-ID: <20260407133507.887404-10-claudiu.beznea.uj@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> References: <20260407133507.887404-1-claudiu.beznea.uj@bp.renesas.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Claudiu Beznea Subsequent patches will add suspend/resume and cyclic DMA support to the rz-dmac driver. This support needs to work on SoCs where power to most components (including DMA) is turned off during system suspend. For this, some channels (for example cyclic ones) may need to be paused and resumed manually by the DMA driver during system suspend/resume. Refactor the pause/resume support so the same code can be reused in the system suspend/resume path. Signed-off-by: Claudiu Beznea --- Changes in v3: - none, this patch new new drivers/dma/sh/rz-dmac.c | 68 +++++++++++++++++++++++++++++++++------- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index d47c7601907f..bacde5e28616 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -63,6 +64,14 @@ struct rz_dmac_desc { =20 #define to_rz_dmac_desc(d) container_of(d, struct rz_dmac_desc, vd) =20 +/** + * enum rz_dmac_chan_status: RZ DMAC channel status + * @RZ_DMAC_CHAN_STATUS_PAUSED: Channel is paused though DMA engine callba= cks + */ +enum rz_dmac_chan_status { + RZ_DMAC_CHAN_STATUS_PAUSED, +}; + struct rz_dmac_chan { struct virt_dma_chan vc; void __iomem *ch_base; @@ -74,6 +83,8 @@ struct rz_dmac_chan { dma_addr_t src_per_address; dma_addr_t dst_per_address; =20 + unsigned long status; + u32 chcfg; u32 chctrl; int mid_rid; @@ -792,35 +803,70 @@ static enum dma_status rz_dmac_tx_status(struct dma_c= han *chan, return status; } =20 -static int rz_dmac_device_pause(struct dma_chan *chan) +static int rz_dmac_device_pause_set(struct rz_dmac_chan *channel, + unsigned long set_bitmask) { - struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); + int ret =3D 0; u32 val; =20 - guard(spinlock_irqsave)(&channel->vc.lock); + lockdep_assert_held(&channel->vc.lock); =20 if (!rz_dmac_chan_is_enabled(channel)) return 0; =20 + if (rz_dmac_chan_is_paused(channel)) + goto set_bit; + rz_dmac_ch_writel(channel, CHCTRL_SETSUS, CHCTRL, 1); - return read_poll_timeout_atomic(rz_dmac_ch_readl, val, - (val & CHSTAT_SUS), 1, 1024, - false, channel, CHSTAT, 1); + ret =3D read_poll_timeout_atomic(rz_dmac_ch_readl, val, + (val & CHSTAT_SUS), 1, 1024, false, + channel, CHSTAT, 1); + +set_bit: + channel->status |=3D set_bitmask; + + return ret; } =20 -static int rz_dmac_device_resume(struct dma_chan *chan) +static int rz_dmac_device_pause(struct dma_chan *chan) { struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); - u32 val; =20 guard(spinlock_irqsave)(&channel->vc.lock); =20 + return rz_dmac_device_pause_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED)); +} + +static int rz_dmac_device_resume_set(struct rz_dmac_chan *channel, + unsigned long clear_bitmask) +{ + int ret =3D 0; + u32 val; + + lockdep_assert_held(&channel->vc.lock); + /* Do not check CHSTAT_SUS but rely on HW capabilities. */ =20 rz_dmac_ch_writel(channel, CHCTRL_CLRSUS, CHCTRL, 1); - return read_poll_timeout_atomic(rz_dmac_ch_readl, val, - !(val & CHSTAT_SUS), 1, 1024, - false, channel, CHSTAT, 1); + ret =3D read_poll_timeout_atomic(rz_dmac_ch_readl, val, + !(val & CHSTAT_SUS), 1, 1024, false, + channel, CHSTAT, 1); + + channel->status &=3D ~clear_bitmask; + + return ret; +} + +static int rz_dmac_device_resume(struct dma_chan *chan) +{ + struct rz_dmac_chan *channel =3D to_rz_dmac_chan(chan); + + guard(spinlock_irqsave)(&channel->vc.lock); + + if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_PAUSED))) + return 0; + + return rz_dmac_device_resume_set(channel, BIT(RZ_DMAC_CHAN_STATUS_PAUSED)= ); } =20 /* --=20 2.43.0