From nobody Mon Apr 6 12:11:30 2026 Received: from relmlie5.idc.renesas.com (relmlor1.renesas.com [210.160.252.171]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7322D3E9F69; Thu, 19 Mar 2026 15:55:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773935744; cv=none; b=dtysFWSYQREJue/kgduF0qLo3/FqOPdFISddFxQSuYXkF+1XkHUNy6XOsPVVZmtqe3Euq2RXhdU6QkOnTu7uvq/g5UyvG70vmURH7ooMqULyzM268CMuxbUMVcFyE1rKkxJyh6xDoCkgynFT+7GntK248yxHNycMIH8/B+VMMWI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773935744; c=relaxed/simple; bh=8Zc6OScGYb+5AvQgNfZdnReDdkm0l7MnThx/FKQQlXE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kCi/ZFkw8wxr6Dq6tugnFnoH5XLXAyo7IAScv2EaCw8JH07KZ8LdYYL31kjWYVYA3gpeal2Qrr5/LdTxRHh2bilRrnUeFxRVgRZblNfa2ugZ5Egjdm9q1nj4mZCmua6njJ61Fo8ZTC8GV7IV/oEy3U0Y+I98nd26bj6Tl0z3YiI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=bp.renesas.com; spf=pass smtp.mailfrom=bp.renesas.com; arc=none smtp.client-ip=210.160.252.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=bp.renesas.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bp.renesas.com X-CSE-ConnectionGUID: iKDvIp6eQS6mGUie7p6U6A== X-CSE-MsgGUID: gjoqKmIDTFSnk/wIw57Zwg== Received: from unknown (HELO relmlir6.idc.renesas.com) ([10.200.68.152]) by relmlie5.idc.renesas.com with ESMTP; 20 Mar 2026 00:55:41 +0900 Received: from ubuntu.adwin.renesas.com (unknown [10.226.93.35]) by relmlir6.idc.renesas.com (Postfix) with ESMTP id 90E41401B2E9; Fri, 20 Mar 2026 00:55:32 +0900 (JST) From: John Madieu To: Geert Uytterhoeven , Kuninori Morimoto , Vinod Koul , Mark Brown , Rob Herring , Krzysztof Kozlowski Cc: Michael Turquette , Stephen Boyd , Conor Dooley , Frank Li , Liam Girdwood , Magnus Damm , Thomas Gleixner , Jaroslav Kysela , Takashi Iwai , Philipp Zabel , Claudiu Beznea , Biju Das , Fabrizio Castro , Lad Prabhakar , John Madieu , linux-renesas-soc@vger.kernel.org, linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, dmaengine@vger.kernel.org, linux-sound@vger.kernel.org, John Madieu Subject: [PATCH 06/22] dma: sh: rz-dmac: Add DMA ACK signal routing support Date: Thu, 19 Mar 2026 16:53:18 +0100 Message-ID: <20260319155334.51278-7-john.madieu.xa@bp.renesas.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260319155334.51278-1-john.madieu.xa@bp.renesas.com> References: <20260319155334.51278-1-john.madieu.xa@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" Some peripherals, mainly from the audio subsystem, on RZ/V2H and RZ/G3E SoCs require explicit ACK signal routing through the ICU. Extend the driver to support an optional second DMA specifier cell that contains the ACK signal number. When present, program the ICU accordingly during channel configuration. This maintains backward compatibility with single-cell DMA specifiers. Signed-off-by: John Madieu --- drivers/dma/sh/rz-dmac.c | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/drivers/dma/sh/rz-dmac.c b/drivers/dma/sh/rz-dmac.c index 240c318b5753..d4a8cc95b871 100644 --- a/drivers/dma/sh/rz-dmac.c +++ b/drivers/dma/sh/rz-dmac.c @@ -97,6 +97,7 @@ struct rz_dmac_chan { u32 chcfg; u32 chctrl; int mid_rid; + int dmac_ack; =20 struct { u32 nxla; @@ -124,6 +125,9 @@ struct rz_dmac_icu { struct rz_dmac_info { void (*icu_register_dma_req)(struct platform_device *icu_dev, u8 dmac_index, u8 dmac_channel, u16 req_no); + void (*icu_register_dma_ack)(struct platform_device *icu_dev, u8 dmac_ind= ex, + u8 dmac_channel, u16 ack_no); + u16 default_dma_ack_no; u16 default_dma_req_no; }; =20 @@ -362,6 +366,25 @@ static void rz_dmac_set_dma_req_no(struct rz_dmac *dma= c, unsigned int index, rz_dmac_set_dmars_register(dmac, index, req_no); } =20 +static void rz_dmac_set_dma_ack_no(struct rz_dmac *dmac, unsigned int inde= x, + u16 ack_no) +{ + if (!dmac->info->icu_register_dma_ack) + return; + + dmac->info->icu_register_dma_ack(dmac->icu.pdev, dmac->icu.dmac_index, + index, ack_no); +} + +static void rz_dmac_reset_dma_ack_no(struct rz_dmac *dmac, int ack_no) +{ + if (ack_no < 0 || !dmac->info->icu_register_dma_ack) + return; + + dmac->info->icu_register_dma_ack(dmac->icu.pdev, dmac->icu.dmac_index, + dmac->info->default_dma_ack_no, ack_no); +} + static void rz_dmac_prepare_desc_for_memcpy(struct rz_dmac_chan *channel) { struct dma_chan *chan =3D &channel->vc.chan; @@ -431,6 +454,7 @@ static void rz_dmac_prepare_descs_for_slave_sg(struct r= z_dmac_chan *channel) channel->lmdesc.tail =3D lmdesc; =20 rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid); + rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack); } =20 static void rz_dmac_prepare_descs_for_cyclic(struct rz_dmac_chan *channel) @@ -485,6 +509,7 @@ static void rz_dmac_prepare_descs_for_cyclic(struct rz_= dmac_chan *channel) channel->lmdesc.tail =3D lmdesc; =20 rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid); + rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack); } =20 static int rz_dmac_xfer_desc(struct rz_dmac_chan *chan) @@ -567,6 +592,9 @@ static void rz_dmac_free_chan_resources(struct dma_chan= *chan) channel->mid_rid =3D -EINVAL; } =20 + rz_dmac_reset_dma_ack_no(dmac, channel->dmac_ack); + channel->dmac_ack =3D -EINVAL; + spin_unlock_irqrestore(&channel->vc.lock, flags); =20 list_for_each_entry_safe(desc, _desc, &channel->ld_free, node) { @@ -814,6 +842,7 @@ static void rz_dmac_device_synchronize(struct dma_chan = *chan) dev_warn(dmac->dev, "DMA Timeout"); =20 rz_dmac_set_dma_req_no(dmac, channel->index, dmac->info->default_dma_req_= no); + rz_dmac_reset_dma_ack_no(dmac, channel->dmac_ack); } =20 static struct rz_lmdesc * @@ -1164,6 +1193,10 @@ static bool rz_dmac_chan_filter(struct dma_chan *cha= n, void *arg) channel->chcfg =3D CHCFG_FILL_TM(ch_cfg) | CHCFG_FILL_AM(ch_cfg) | CHCFG_FILL_LVL(ch_cfg) | CHCFG_FILL_HIEN(ch_cfg); =20 + /* ACK signal number from optional second cell */ + if (dma_spec->args_count =3D=3D 2 && dmac->info->icu_register_dma_ack) + channel->dmac_ack =3D FIELD_GET(GENMASK(6, 0), dma_spec->args[1]); + return !test_and_set_bit(channel->mid_rid, dmac->modules); } =20 @@ -1172,7 +1205,8 @@ static struct dma_chan *rz_dmac_of_xlate(struct of_ph= andle_args *dma_spec, { dma_cap_mask_t mask; =20 - if (dma_spec->args_count !=3D 1) + /* Accept 1 cell (basic) or 2 cells (with ACK signal) */ + if (dma_spec->args_count < 1 || dma_spec->args_count > 2) return NULL; =20 /* Only slave DMA channels can be allocated via DT */ @@ -1200,6 +1234,7 @@ static int rz_dmac_chan_probe(struct rz_dmac *dmac, =20 channel->index =3D index; channel->mid_rid =3D -EINVAL; + channel->dmac_ack =3D -EINVAL; =20 /* Request the channel interrupt. */ scnprintf(pdev_irqname, sizeof(pdev_irqname), "ch%u", index); @@ -1568,6 +1603,7 @@ static int rz_dmac_resume(struct device *dev) guard(spinlock_irqsave)(&channel->vc.lock); =20 rz_dmac_set_dma_req_no(dmac, channel->index, channel->mid_rid); + rz_dmac_set_dma_ack_no(dmac, channel->index, channel->dmac_ack); =20 if (!(channel->status & BIT(RZ_DMAC_CHAN_STATUS_CYCLIC))) { rz_dmac_ch_writel(&dmac->channels[i], CHCTRL_DEFAULT, CHCTRL, 1); @@ -1599,6 +1635,8 @@ static const struct dev_pm_ops rz_dmac_pm_ops =3D { =20 static const struct rz_dmac_info rz_dmac_v2h_info =3D { .icu_register_dma_req =3D rzv2h_icu_register_dma_req, + .icu_register_dma_ack =3D rzv2h_icu_register_dma_ack, + .default_dma_ack_no =3D RZV2H_ICU_DMAC_ACK_NO_DEFAULT, .default_dma_req_no =3D RZV2H_ICU_DMAC_REQ_NO_DEFAULT, }; =20 --=20 2.25.1