]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ASoC: renesas: fsi: Add SPU clock control in hw_startup/shutdown
authorbui duc phuc <phucduc.bui@gmail.com>
Tue, 9 Jun 2026 11:38:36 +0000 (18:38 +0700)
committerMark Brown <broonie@kernel.org>
Tue, 9 Jun 2026 23:33:53 +0000 (00:33 +0100)
Enable and disable the SPU clock in fsi_hw_startup() and
fsi_hw_shutdown() to ensure the clock is active while the
driver accesses hardware registers.

Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Suggested-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
Link: https://patch.msgid.link/20260609113836.45079-12-phucduc.bui@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/renesas/fsi.c

index e26f39dfe05988b11ac4bd60a262f846061ba0e9..b72396b5de7dc8f997ad5cf64a7e579ca366adf4 100644 (file)
@@ -1560,6 +1560,11 @@ static int fsi_hw_startup(struct fsi_priv *fsi,
                          struct device *dev)
 {
        u32 data = 0;
+       int ret;
+       /* enable spu bus bridge clock */
+       ret = clk_enable(fsi->master->clk_spu);
+       if (ret)
+               return ret;
 
        /* clock setting */
        if (fsi_is_clk_master(fsi))
@@ -1605,8 +1610,13 @@ static int fsi_hw_startup(struct fsi_priv *fsi,
        fsi_fifo_init(fsi, io, dev);
 
        /* start master clock */
-       if (fsi_is_clk_master(fsi))
-               return fsi_clk_enable(dev, fsi);
+       if (fsi_is_clk_master(fsi)) {
+               ret = fsi_clk_enable(dev, fsi);
+               if (ret) {
+                       clk_disable(fsi->master->clk_spu);
+                       return ret;
+               }
+       }
 
        return 0;
 }
@@ -1614,9 +1624,15 @@ static int fsi_hw_startup(struct fsi_priv *fsi,
 static int fsi_hw_shutdown(struct fsi_priv *fsi,
                            struct device *dev)
 {
+       int ret;
        /* stop master clock */
-       if (fsi_is_clk_master(fsi))
-               return fsi_clk_disable(dev, fsi);
+       if (fsi_is_clk_master(fsi)) {
+               ret = fsi_clk_disable(dev, fsi);
+               if (ret)
+                       return ret;
+       }
+       /* stop spu bus bridge clock */
+       clk_disable(fsi->master->clk_spu);
 
        return 0;
 }