ASoC: rsnd: call clk_prepare()/clk_enable() for AUDIO_CLKx
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Thu, 5 Nov 2015 08:51:15 +0000 (08:51 +0000)
committerMark Brown <broonie@kernel.org>
Mon, 16 Nov 2015 10:09:29 +0000 (10:09 +0000)
ADG can output AUDIO_CLKOUTx, and these are generated from
AUDIO_CLKx. Thus we need to call clk_prepare()/clk_enable()
for AUDIO_CLKx.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/adg.c
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/rsnd.h

index b123734f9fbdabd98bcd76996629de1b00b8e3fd..1946ce8baf2e92fbb97bbdc3a14c2af349fe0080 100644 (file)
@@ -418,15 +418,20 @@ static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
                [CLKC]  = "clk_c",
                [CLKI]  = "clk_i",
        };
-       int i;
+       int i, ret;
 
        for (i = 0; i < CLKMAX; i++) {
                clk = devm_clk_get(dev, clk_name[i]);
                adg->clk[i] = IS_ERR(clk) ? NULL : clk;
        }
 
-       for_each_rsnd_clk(clk, adg, i)
+       for_each_rsnd_clk(clk, adg, i) {
+               ret = clk_prepare_enable(clk);
+               if (ret < 0)
+                       dev_warn(dev, "can't use clk %d\n", i);
+
                dev_dbg(dev, "clk %d : %p : %ld\n", i, clk, clk_get_rate(clk));
+       }
 }
 
 static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
@@ -600,3 +605,15 @@ int rsnd_adg_probe(struct platform_device *pdev,
 
        return 0;
 }
+
+void rsnd_adg_remove(struct platform_device *pdev,
+                    struct rsnd_priv *priv)
+{
+       struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
+       struct clk *clk;
+       int i;
+
+       for_each_rsnd_clk(clk, adg, i) {
+               clk_disable_unprepare(clk);
+       }
+}
index 1363966fa9578390f0459943ef28bca169878fc0..81250cf6788d032e501de050a7487e8b0378f2d5 100644 (file)
@@ -1227,6 +1227,7 @@ static int rsnd_remove(struct platform_device *pdev)
                rsnd_mix_remove,
                rsnd_dvc_remove,
                rsnd_cmd_remove,
+               rsnd_adg_remove,
        };
        int ret = 0, i;
 
index 599dfb69555a155eb14b17c2407782a85a5ddaa3..8efa19fa2b6eefaccc8235b67a6b614fe6e6d6ce 100644 (file)
@@ -405,6 +405,8 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 int rsnd_adg_probe(struct platform_device *pdev,
                   const struct rsnd_of_data *of_data,
                   struct rsnd_priv *priv);
+void rsnd_adg_remove(struct platform_device *pdev,
+                    struct rsnd_priv *priv);
 int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
                                  struct rsnd_mod *mod,
                                  unsigned int src_rate,