]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ASoC: rsnd: src: Acquire shared SCU clocks for RZ/G3E
authorJohn Madieu <john.madieu.xa@bp.renesas.com>
Mon, 25 May 2026 11:02:27 +0000 (11:02 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 1 Jun 2026 14:30:24 +0000 (15:30 +0100)
The RZ/G3E SoC requires explicit SCU (Sampling Rate Converter Unit)
clock management:

 - scu:        SCU top-level module clock (CPG_CLKON_15.CLK6_ON)
 - scu_x2:     SCU top-level double-rate clock (CPG_CLKON_15.CLK7_ON)
 - scu_supply: SCU register-access / housekeeping clock
               (CPG_CLKON_23.CLK14_ON)

Without every one of them enabled, no SCU register is reachable.

Hold these in a new struct rsnd_src_ctrl and acquire them with
devm_clk_get_optional_enabled(). scu_supply is intentionally left
untouched by the system suspend/resume path added later in the
series, so SCU registers stay reachable across PM transitions.

Signed-off-by: John Madieu <john.madieu.xa@bp.renesas.com>
Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Link: https://patch.msgid.link/20260525110230.4014435-16-john.madieu.xa@bp.renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/renesas/rcar/rsnd.h
sound/soc/renesas/rcar/src.c

index 95843a20c43cc916275ac615120b93368dd91d0c..7d7da6cecf091462aa66a20f228fe8f51b0c819a 100644 (file)
@@ -698,6 +698,7 @@ struct rsnd_priv {
        /*
         * below value will be filled on rsnd_src_probe()
         */
+       void *src_ctrl;
        void *src;
        int src_nr;
 
index 43abe13137bfd7960294daae3f9b89e10caea67f..88ea9aad5caef2dcc8ad9f65c00340756e09bea3 100644 (file)
@@ -53,6 +53,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)
@@ -712,6 +720,7 @@ int rsnd_src_probe(struct rsnd_priv *priv)
 {
        struct device_node *node;
        struct device *dev = rsnd_priv_to_dev(priv);
+       struct rsnd_src_ctrl *src_ctrl;
        struct rsnd_src *src;
        struct clk *clk;
        int i, nr, ret;
@@ -726,6 +735,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;
@@ -734,6 +749,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_enabled(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) {