Merge branch 'fix/rcar' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[linux-2.6-microblaze.git] / sound / soc / sh / rcar / adg.c
index 85a33ac..214a9ce 100644 (file)
@@ -537,16 +537,14 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
                        clk = clk_register_fixed_rate(dev, clkout_name[i],
                                                      parent_clk_name, 0,
                                                      req_rate);
-                       if (!IS_ERR(clk)) {
-                               adg->onecell.clks       = adg->clkout;
-                               adg->onecell.clk_num    = CLKOUTMAX;
-
+                       adg->clkout[i] = ERR_PTR(-ENOENT);
+                       if (!IS_ERR(clk))
                                adg->clkout[i] = clk;
-
-                               of_clk_add_provider(np, of_clk_src_onecell_get,
-                                                   &adg->onecell);
-                       }
                }
+               adg->onecell.clks       = adg->clkout;
+               adg->onecell.clk_num    = CLKOUTMAX;
+               of_clk_add_provider(np, of_clk_src_onecell_get,
+                                   &adg->onecell);
        }
 
        adg->ckr = ckr;
@@ -564,6 +562,7 @@ int rsnd_adg_probe(struct rsnd_priv *priv)
        struct rsnd_adg *adg;
        struct device *dev = rsnd_priv_to_dev(priv);
        struct device_node *np = dev->of_node;
+       int ret;
 
        adg = devm_kzalloc(dev, sizeof(*adg), GFP_KERNEL);
        if (!adg) {
@@ -571,8 +570,10 @@ int rsnd_adg_probe(struct rsnd_priv *priv)
                return -ENOMEM;
        }
 
-       rsnd_mod_init(priv, &adg->mod, &adg_ops,
+       ret = rsnd_mod_init(priv, &adg->mod, &adg_ops,
                      NULL, NULL, 0, 0);
+       if (ret)
+               return ret;
 
        rsnd_adg_get_clkin(priv, adg);
        rsnd_adg_get_clkout(priv, adg);
@@ -589,5 +590,10 @@ int rsnd_adg_probe(struct rsnd_priv *priv)
 
 void rsnd_adg_remove(struct rsnd_priv *priv)
 {
+       struct device *dev = rsnd_priv_to_dev(priv);
+       struct device_node *np = dev->of_node;
+
+       of_clk_del_provider(np);
+
        rsnd_adg_clk_disable(priv);
 }