[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,
 
        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);
+       }
+}
 
 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,