From nobody Mon Apr 6 12:17:07 2026 Received: from relmlie6.idc.renesas.com (relmlor2.renesas.com [210.160.252.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BBA0B3E3165; Thu, 19 Mar 2026 15:55:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.160.252.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773935734; cv=none; b=oz87tAfLu7RxgDsCoMz3Yuz+fwueeq2bYNboS90ILhOPeEIOzyisMZ+57xRiGkBDiZGusY/iypv22PYlC/ml6/Mxsfwnwhy/OMqylIe37GSpwaIVFqNbyLiyc2PKpcFUVQ1uHZHJdAwrh2fAQGD0u4wqqHazyFlNYZTpdJ85MTM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773935734; c=relaxed/simple; bh=D1SxVx/NovE4mVqL7CRPWG12P1m0PWzlzknGr5qNHPY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GwS3pAiqNn74kkTTEFWF96/r+4ope7Yj+yNfYtCSA4VEpXDZ+VCNpZBlkDSyK9AbBFTi9mEJhDk9P2Fyk7ioFb2yePu7XDczXwFNat2q2rNLY4k63okQRn/hz+zXpjI5Y2wJm+QZVTKxo1XcDEddATEq6LNmtr291C8RdYc858E= 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.172 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: qTtFXDT6SN6Efg7qGNScTQ== X-CSE-MsgGUID: gS+yZpz/TEmdxvkqMknL3g== Received: from unknown (HELO relmlir6.idc.renesas.com) ([10.200.68.152]) by relmlie6.idc.renesas.com with ESMTP; 20 Mar 2026 00:55:31 +0900 Received: from ubuntu.adwin.renesas.com (unknown [10.226.93.35]) by relmlir6.idc.renesas.com (Postfix) with ESMTP id 8CB44401B2FD; Fri, 20 Mar 2026 00:55:23 +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 05/22] irqchip/renesas-rzv2h: Add DMA ACK signal routing support Date: Thu, 19 Mar 2026 16:53:17 +0100 Message-ID: <20260319155334.51278-6-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 audio module) found on RZ/G3E SoCs require explicit ACK signal routing through the ICU via the ICU_DMACKSELk registers. Add rzv2h_icu_register_dma_ack() to configure this routing. Signed-off-by: John Madieu --- drivers/irqchip/irq-renesas-rzv2h.c | 36 +++++++++++++++++++++++ include/linux/irqchip/irq-renesas-rzv2h.h | 5 ++++ 2 files changed, 41 insertions(+) diff --git a/drivers/irqchip/irq-renesas-rzv2h.c b/drivers/irqchip/irq-rene= sas-rzv2h.c index ce790590f7ca..4d10b19f7e09 100644 --- a/drivers/irqchip/irq-renesas-rzv2h.c +++ b/drivers/irqchip/irq-renesas-rzv2h.c @@ -151,6 +151,12 @@ struct rzv2h_hw_info { #define ICU_DMAC_PREP_DMAREQ(sel, up) (FIELD_PREP(ICU_DMAC_DkRQ_SEL_MASK,= (sel)) \ << ICU_DMAC_DMAREQ_SHIFT(up)) =20 +/* DMAC ACK routing - 4 x 7-bit fields per 32-bit register, 8-bit spacing = */ +#define ICU_DMAC_DACK_SEL_MASK GENMASK(6, 0) +#define ICU_DMAC_DACK_SHIFT(n) ((n) * 8) +#define ICU_DMAC_DACK_FIELD_MASK(n) (ICU_DMAC_DACK_SEL_MASK << ICU_DMAC_D= ACK_SHIFT(n)) +#define ICU_DMAC_PREP_DACK(val, n) (((val) & ICU_DMAC_DACK_SEL_MASK) << I= CU_DMAC_DACK_SHIFT(n)) + /** * struct rzv2h_icu_priv - Interrupt Control Unit controller private data = structure. * @base: Controller's base address @@ -188,6 +194,36 @@ void rzv2h_icu_register_dma_req(struct platform_device= *icu_dev, u8 dmac_index, } EXPORT_SYMBOL_GPL(rzv2h_icu_register_dma_req); =20 +/** + * rzv2h_icu_register_dma_ack - Configure DMA ACK signal routing + * @icu_dev: ICU platform device + * @dmac_index: DMAC instance index (0-4) + * @dmac_channel: DMAC channel number (0-15), or RZV2H_ICU_DMAC_ACK_NO_DEF= AULT to clear + * @ack_no: Peripheral ACK number (0-88), used as index into ICU_DMACKSELk + * + * Routes the DMAC channel's ACK signal to the peripheral specified by ack= _no, + * or clears the entry when dmac_channel is RZV2H_ICU_DMAC_ACK_NO_DEFAULT. + */ +void rzv2h_icu_register_dma_ack(struct platform_device *icu_dev, u8 dmac_i= ndex, + u8 dmac_channel, u16 ack_no) +{ + struct rzv2h_icu_priv *priv =3D platform_get_drvdata(icu_dev); + u8 reg_idx =3D ack_no / 4; + u8 field_idx =3D ack_no & 0x3; + u8 dmac_ack_src =3D (dmac_channel =3D=3D RZV2H_ICU_DMAC_ACK_NO_DEFAULT) ? + RZV2H_ICU_DMAC_ACK_NO_DEFAULT : + (dmac_index * 16 + dmac_channel); + u32 val; + + guard(raw_spinlock_irqsave)(&priv->lock); + + val =3D readl(priv->base + ICU_DMACKSELk(reg_idx)); + val &=3D ~ICU_DMAC_DACK_FIELD_MASK(field_idx); + val |=3D ICU_DMAC_PREP_DACK(dmac_ack_src, field_idx); + writel(val, priv->base + ICU_DMACKSELk(reg_idx)); +} +EXPORT_SYMBOL_GPL(rzv2h_icu_register_dma_ack); + static inline struct rzv2h_icu_priv *irq_data_to_priv(struct irq_data *dat= a) { return data->domain->host_data; diff --git a/include/linux/irqchip/irq-renesas-rzv2h.h b/include/linux/irqc= hip/irq-renesas-rzv2h.h index 618a60d2eac0..4ffa898eaaf2 100644 --- a/include/linux/irqchip/irq-renesas-rzv2h.h +++ b/include/linux/irqchip/irq-renesas-rzv2h.h @@ -11,13 +11,18 @@ #include =20 #define RZV2H_ICU_DMAC_REQ_NO_DEFAULT 0x3ff +#define RZV2H_ICU_DMAC_ACK_NO_DEFAULT 0x7f =20 #ifdef CONFIG_RENESAS_RZV2H_ICU void rzv2h_icu_register_dma_req(struct platform_device *icu_dev, u8 dmac_i= ndex, u8 dmac_channel, u16 req_no); +void rzv2h_icu_register_dma_ack(struct platform_device *icu_dev, u8 dmac_i= ndex, + u8 dmac_channel, u16 ack_no); #else static inline void rzv2h_icu_register_dma_req(struct platform_device *icu_= dev, u8 dmac_index, u8 dmac_channel, u16 req_no) { } +static inline void rzv2h_icu_register_dma_ack(struct platform_device *icu_= dev, u8 dmac_index, + u8 dmac_channel, u16 ack_no) { } #endif =20 #endif /* __LINUX_IRQ_RENESAS_RZV2H */ --=20 2.25.1