]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ASoC: rsnd: Add audmapp clock and reset support for RZ/G3E
authorJohn Madieu <john.madieu.xa@bp.renesas.com>
Mon, 25 May 2026 11:02:18 +0000 (11:02 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 1 Jun 2026 14:30:16 +0000 (15:30 +0100)
RZ/G3E requires additional audmapp clock and reset lines for
Audio DMA-PP operation.

Add global audmapp clock/reset management in rsnd_dma_probe()
using optional APIs to remain transparent to other platforms.

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-7-john.madieu.xa@bp.renesas.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/renesas/rcar/dma.c

index 68c859897e6831c0a24fde84c11fea48a052acab..d52cada711e509a80fe16fec7efe25ef8e6243c5 100644 (file)
@@ -47,6 +47,9 @@ struct rsnd_dma_ctrl {
        phys_addr_t ppres;
        int dmaen_num;
        int dmapp_num;
+       /* RZ/G3E: Audio DMAC peri-peri clock and reset */
+       struct clk *audmapp_clk;
+       struct reset_control *audmapp_rstc;
 };
 
 #define rsnd_priv_to_dmac(p)   ((struct rsnd_dma_ctrl *)(p)->dma)
@@ -870,6 +873,25 @@ int rsnd_dma_probe(struct rsnd_priv *priv)
                return 0; /* it will be PIO mode */
        }
 
+       /*
+        * Audio DMAC peri-peri clock and reset for RZ/G3E.
+        * These use optional APIs, so they gracefully return NULL
+        * (no error) on platforms whose DT does not provide them.
+        *
+        * Enable the clock first so the block sees a stable clock on
+        * the way out of reset, then deassert the reset line.
+        */
+       dmac->audmapp_clk = devm_clk_get_optional_enabled(dev, "audmapp");
+       if (IS_ERR(dmac->audmapp_clk))
+               return dev_err_probe(dev, PTR_ERR(dmac->audmapp_clk),
+                                    "failed to get audmapp clock\n");
+
+       dmac->audmapp_rstc =
+               devm_reset_control_get_optional_exclusive_deasserted(dev, "audmapp");
+       if (IS_ERR(dmac->audmapp_rstc))
+               return dev_err_probe(dev, PTR_ERR(dmac->audmapp_rstc),
+                                    "failed to get audmapp reset\n");
+
        dmac->dmapp_num = 0;
        dmac->ppres  = res->start;
        dmac->ppbase = devm_ioremap_resource(dev, res);