From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f51.google.com (mail-wm1-f51.google.com [209.85.128.51]) (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 073ED37BE96 for ; Wed, 15 Apr 2026 12:47:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776257274; cv=none; b=jFgh0WotHoDZd9L4tx9cDFHwbTCjVdscPdETJE37zlkjoCMoNm2ad8OuyG9hgEXfYIF1zluE0s3766VtE3JSXHRhjdCicy51+Uc6YkD0/v4sC3OGSPP2mnJ21L1tFIDBZOOsW5js5Hyyd1lgbs+71Ty28K+oYXVrUqMgVyOsBuc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776257274; c=relaxed/simple; bh=o7cX6xYLyuos94ZpDZbf8yhOnasEgZX1AkNvoBGmzKg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=D96w4NAUP5NtxumOtB5zwCFgCiG3Z1CuBq7DHJ53z/b1DvA+xzxVkEIyrSid9WF5M2yaeiAttbmg5XxoVAMCbTly32xMzo4cilAUameAxL5E6JiHZGgyupYtEDDKtBDQcRIvLP4mwz2tUgl+gZ+/UCD+R9v5ItEvV5ZmHIDR0kM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mAFGxp2/; arc=none smtp.client-ip=209.85.128.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mAFGxp2/" Received: by mail-wm1-f51.google.com with SMTP id 5b1f17b1804b1-488b3f8fa2bso68628015e9.1 for ; Wed, 15 Apr 2026 05:47:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776257269; x=1776862069; 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=c9HiyLdpQmGO7ARO5mYvJF04K3eGYiJQbh378YAjq5M=; b=mAFGxp2/a8iG/tmvifpQW35BASlyMVMoZpVFABz07/on262/GKHAbEw5ar1MJ0AFQ/ toiOqFXWbzeRjgmLgTFC4DMuWC51Yk2kHdawEzbBnVKUBlNdYz+qG4FtlHASXK9N+V5f U35XR9WgLy8cPXYVOF+nbr5yQFn15fRreosHXnI4Ab8VhhCupKJfo+y5AgAHulf1WTPt FfHz+NBHAOfnTNm+u6xruMD7DWLWOC9wrzJeJp86XLtEZw/KcaA61iyvJ0XA4BoOx6BK CX0PeGt0BLWXCixeOZJQRmLcu3xOB0UwCa4hUoke7oRuGPI+Ye43eaMFOciOmmpAkJn6 FOAw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776257269; x=1776862069; 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=c9HiyLdpQmGO7ARO5mYvJF04K3eGYiJQbh378YAjq5M=; b=l9qg00h4F2Ws/IZrLAgjUZFwAlQVYxY14b7XhpOitK+07JIEzr+dPNtZKr3McK0I2t KvleRnZJ7uJ7XimY8bqHwpTpNWOsFeNnMNZ+Lpno3EuIp6Y3sndnCCI7cwxKTvT8rEz1 vNxFbFM+3K+CB4c1NAZRwTlADIi5UtGe8iovbjXq2T4tB7P054MkDJrZi9L6GZ2GPKKt ZJyDye47gx+m6PoZjuatftkLQu0CPBU42MuXNFRVuA0xWCeNqpU8sFyaSQZA9I3ty8n+ HT1kKfVh+m8QwWcQ55JbpCXQypLHuZqOgL2ZuJlx1iN5tpBBk0ECTddASc2i8Iopu8gm 7GNA== X-Forwarded-Encrypted: i=1; AFNElJ+NyJ/RSvl6yMLUwglaZpdAiupUBkKLrQnM0yoxe76HGMfve/GiwH2twZJ2gssVxiaCRFxrPdE34zd2@vger.kernel.org X-Gm-Message-State: AOJu0YwV3E2Ph1CrBBw1oVqvnxDl3n2V0JL8fbsocJioYQOxd2IOq8+a ZSexkso+irH3t/IN9FC4gTgVTO3xEzeYnAafSPGBahk1GMHWz7CTA9dR X-Gm-Gg: AeBDieuFpV03fyXsa8ppeOU+p0CCTIgxA8BR+J9AOB78jgjtyLbrTyCO8+8yRut1Qh4 UzkeZ1iypRHI+O4o1yq078HVNoPoGbBG3PGuXmB/0hedAR2fKfJmy5ItDKepIB2WihE1y+ZGhEa hG8Pz9vjUuqnO2bEA3cwgzcJcRiWuQMk0xyvfHbwyMCwpPkl0/IsspjJOJ/DQgRLM+BrTxGlTnj sVpXdlUycRdKCbxgy+911IHlInjNN43qEHv4KFkO3mHgjQggWgHXI4p1whqe4RpONfbiOJbcM4j s59A5cRRm4Ifz68V4Wx5EYTCy8EwCblkkY4A49PAQELJoUprCBSEWrAIBiZS5USja+HFnwvIovd C6DxS2Lv5DG6l12xNLbJWxyMVLrE5sQn3s6k59cwfR//6Uxwo4TvkkDdvr8qOf9tXOYU/8TO1+0 6VYuzB0Y7PbJhQrsTC5SjCXW2tOvoi3oA+jon1yA== X-Received: by 2002:a05:600c:c08b:b0:485:3c2e:60d5 with SMTP id 5b1f17b1804b1-488d6816f66mr207396055e9.2.1776257268742; Wed, 15 Apr 2026 05:47:48 -0700 (PDT) Received: from localhost.localdomain ([2001:41d0:406:c100::]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-43ead356616sm5123319f8f.13.2026.04.15.05.47.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 15 Apr 2026 05:47:48 -0700 (PDT) From: John Madieu X-Google-Original-From: John Madieu To: Kuninori Morimoto , Mark Brown , Liam Girdwood Cc: Rob Herring , Krzysztof Kozlowski , Conor Dooley , Jaroslav Kysela , Takashi Iwai , Geert Uytterhoeven , Magnus Damm , Philipp Zabel , Claudiu Beznea , Biju Das , john.madieu@gmail.com, linux-sound@vger.kernel.org, linux-renesas-soc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, John Madieu Subject: [PATCH v5 12/14] ASoC: rsnd: src: Add SRC reset and clock support for RZ/G3E Date: Wed, 15 Apr 2026 12:47:29 +0000 Message-Id: <20260415124731.3684773-13-john.madieu.xa@bp.renesas.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20260415124731.3684773-1-john.madieu.xa@bp.renesas.com> References: <20260415124731.3684773-1-john.madieu.xa@bp.renesas.com> Precedence: bulk X-Mailing-List: devicetree@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The RZ/G3E SoC requires explicit SCU (Sampling Rate Converter Unit) reset and clock management unlike previous R-Car generations: - scu_clk: SCU module clock - scu_clkx2: SCU double-rate clock - scu_supply_clk: SCU supply clock Without these clocks enabled, the SRC module cannot operate on RZ/G3E. Add support for the shared SCU reset controller used by the SRC modules on the Renesas RZ/G3E SoC. All SRC instances are gated by the same "scu" reset line. Signed-off-by: John Madieu --- Changes: v5: No changes v4: - Move shared SCU clocks (scu, scu_x2, scu_supply) from rsnd_priv variables into new struct rsnd_src_ctrl, following the rsnd_dma_ctrl pattern for shared non-per-instance module resources - Keep original declaration order for struct device_node *node v3: No changes v2: No changes sound/soc/renesas/rcar/rsnd.h | 1 + sound/soc/renesas/rcar/src.c | 59 ++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/sound/soc/renesas/rcar/rsnd.h b/sound/soc/renesas/rcar/rsnd.h index 953a2d998a03..70e395d3c6ef 100644 --- a/sound/soc/renesas/rcar/rsnd.h +++ b/sound/soc/renesas/rcar/rsnd.h @@ -679,6 +679,7 @@ struct rsnd_priv { /* * below value will be filled on rsnd_src_probe() */ + void *src_ctrl; void *src; int src_nr; diff --git a/sound/soc/renesas/rcar/src.c b/sound/soc/renesas/rcar/src.c index 8b58cc20e7a8..651ed378c4f7 100644 --- a/sound/soc/renesas/rcar/src.c +++ b/sound/soc/renesas/rcar/src.c @@ -54,6 +54,14 @@ struct rsnd_src { ((pos) = (struct rsnd_src *)(priv)->src + i); \ i++) +struct rsnd_src_ctrl { + struct clk *scu; + struct clk *scu_x2; + struct clk *scu_supply; +}; + +#define rsnd_priv_to_src_ctrl(priv) \ + ((struct rsnd_src_ctrl *)(priv)->src_ctrl) /* * image of SRC (Sampling Rate Converter) @@ -516,6 +524,7 @@ static int rsnd_src_init(struct rsnd_mod *mod, struct rsnd_priv *priv) { struct rsnd_src *src = rsnd_mod_to_src(mod); + struct device *dev = rsnd_priv_to_dev(priv); int ret; /* reset sync convert_rate */ @@ -526,6 +535,12 @@ static int rsnd_src_init(struct rsnd_mod *mod, if (ret < 0) return ret; + ret = clk_prepare_enable(rsnd_priv_to_src_ctrl(priv)->scu_supply); + if (ret) { + dev_err(dev, "Cannot enable scu_supply_clk\n"); + return ret; + } + rsnd_src_activation(mod); rsnd_src_init_convert_rate(io, mod); @@ -549,6 +564,8 @@ static int rsnd_src_quit(struct rsnd_mod *mod, src->sync.val = src->current_sync_rate = 0; + clk_disable_unprepare(rsnd_priv_to_src_ctrl(priv)->scu_supply); + return 0; } @@ -713,6 +730,8 @@ int rsnd_src_probe(struct rsnd_priv *priv) { struct device_node *node; struct device *dev = rsnd_priv_to_dev(priv); + struct reset_control *rstc; + struct rsnd_src_ctrl *src_ctrl; struct rsnd_src *src; struct clk *clk; char name[RSND_SRC_NAME_SIZE]; @@ -728,6 +747,12 @@ int rsnd_src_probe(struct rsnd_priv *priv) goto rsnd_src_probe_done; } + src_ctrl = devm_kzalloc(dev, sizeof(*src_ctrl), GFP_KERNEL); + if (!src_ctrl) { + ret = -ENOMEM; + goto rsnd_src_probe_done; + } + src = devm_kcalloc(dev, nr, sizeof(*src), GFP_KERNEL); if (!src) { ret = -ENOMEM; @@ -736,6 +761,28 @@ int rsnd_src_probe(struct rsnd_priv *priv) priv->src_nr = nr; priv->src = src; + priv->src_ctrl = src_ctrl; + + src_ctrl->scu = devm_clk_get_optional_enabled(dev, "scu"); + if (IS_ERR(src_ctrl->scu)) { + ret = dev_err_probe(dev, PTR_ERR(src_ctrl->scu), + "failed to get scu clock\n"); + goto rsnd_src_probe_done; + } + + src_ctrl->scu_x2 = devm_clk_get_optional_enabled(dev, "scu_x2"); + if (IS_ERR(src_ctrl->scu_x2)) { + ret = dev_err_probe(dev, PTR_ERR(src_ctrl->scu_x2), + "failed to get scu_x2 clock\n"); + goto rsnd_src_probe_done; + } + + src_ctrl->scu_supply = devm_clk_get_optional(dev, "scu_supply"); + if (IS_ERR(src_ctrl->scu_supply)) { + ret = dev_err_probe(dev, PTR_ERR(src_ctrl->scu_supply), + "failed to get scu_supply clock\n"); + goto rsnd_src_probe_done; + } i = 0; for_each_child_of_node_scoped(node, np) { @@ -759,6 +806,16 @@ int rsnd_src_probe(struct rsnd_priv *priv) goto rsnd_src_probe_done; } + /* + * RZ/G3E uses a shared SCU reset controller for all SRC modules. + * R-Car platforms typically don't have SRC reset controls. + */ + rstc = devm_reset_control_get_optional_shared(dev, "scu"); + if (IS_ERR(rstc)) { + ret = PTR_ERR(rstc); + goto rsnd_src_probe_done; + } + clk = devm_clk_get(dev, name); if (IS_ERR(clk)) { ret = PTR_ERR(clk); @@ -766,7 +823,7 @@ int rsnd_src_probe(struct rsnd_priv *priv) } ret = rsnd_mod_init(priv, rsnd_mod_get(src), - &rsnd_src_ops, clk, NULL, RSND_MOD_SRC, i); + &rsnd_src_ops, clk, rstc, RSND_MOD_SRC, i); if (ret) goto rsnd_src_probe_done; -- 2.25.1