Merge remote-tracking branches 'asoc/topic/txx9', 'asoc/topic/wm8750', 'asoc/topic...
[cascardo/linux.git] / sound / soc / sh / rcar / dvc.c
index 5380a48..d7f9ed9 100644 (file)
@@ -17,7 +17,6 @@
 struct rsnd_dvc {
        struct rsnd_dvc_platform_info *info; /* rcar_snd.h */
        struct rsnd_mod mod;
-       struct clk *clk;
        struct rsnd_kctrl_cfg_m volume;
        struct rsnd_kctrl_cfg_m mute;
        struct rsnd_kctrl_cfg_s ren;    /* Ramp Enable */
@@ -118,9 +117,8 @@ static void rsnd_dvc_volume_update(struct rsnd_mod *mod)
 }
 
 static int rsnd_dvc_probe_gen2(struct rsnd_mod *mod,
-                              struct rsnd_dai *rdai)
+                              struct rsnd_priv *priv)
 {
-       struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
        struct device *dev = rsnd_priv_to_dev(priv);
 
        dev_dbg(dev, "%s[%d] (Gen2) is probed\n",
@@ -129,12 +127,24 @@ static int rsnd_dvc_probe_gen2(struct rsnd_mod *mod,
        return 0;
 }
 
+static int rsnd_dvc_remove_gen2(struct rsnd_mod *mod,
+                               struct rsnd_priv *priv)
+{
+       struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
+
+       rsnd_kctrl_remove(dvc->volume);
+       rsnd_kctrl_remove(dvc->mute);
+       rsnd_kctrl_remove(dvc->ren);
+       rsnd_kctrl_remove(dvc->rup);
+       rsnd_kctrl_remove(dvc->rdown);
+
+       return 0;
+}
+
 static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
-                        struct rsnd_dai *rdai)
+                        struct rsnd_priv *priv)
 {
-       struct rsnd_dvc *dvc = rsnd_mod_to_dvc(dvc_mod);
        struct rsnd_dai_stream *io = rsnd_mod_to_io(dvc_mod);
-       struct rsnd_priv *priv = rsnd_mod_to_priv(dvc_mod);
        struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
        struct device *dev = rsnd_priv_to_dev(priv);
        int dvc_id = rsnd_mod_id(dvc_mod);
@@ -153,7 +163,7 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
                return -EINVAL;
        }
 
-       clk_prepare_enable(dvc->clk);
+       rsnd_mod_hw_start(dvc_mod);
 
        /*
         * fixme
@@ -173,23 +183,21 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
 
        rsnd_mod_write(dvc_mod, DVC_DVUIR, 0);
 
-       rsnd_adg_set_cmd_timsel_gen2(rdai, dvc_mod, io);
+       rsnd_adg_set_cmd_timsel_gen2(dvc_mod, io);
 
        return 0;
 }
 
 static int rsnd_dvc_quit(struct rsnd_mod *mod,
-                        struct rsnd_dai *rdai)
+                        struct rsnd_priv *priv)
 {
-       struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
-
-       clk_disable_unprepare(dvc->clk);
+       rsnd_mod_hw_stop(mod);
 
        return 0;
 }
 
 static int rsnd_dvc_start(struct rsnd_mod *mod,
-                         struct rsnd_dai *rdai)
+                         struct rsnd_priv *priv)
 {
        rsnd_mod_write(mod, CMD_CTRL, 0x10);
 
@@ -197,7 +205,7 @@ static int rsnd_dvc_start(struct rsnd_mod *mod,
 }
 
 static int rsnd_dvc_stop(struct rsnd_mod *mod,
-                        struct rsnd_dai *rdai)
+                        struct rsnd_priv *priv)
 {
        rsnd_mod_write(mod, CMD_CTRL, 0);
 
@@ -205,16 +213,16 @@ static int rsnd_dvc_stop(struct rsnd_mod *mod,
 }
 
 static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
-                           struct rsnd_dai *rdai,
                            struct snd_soc_pcm_runtime *rtd)
 {
        struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
        struct rsnd_dvc *dvc = rsnd_mod_to_dvc(mod);
+       int is_play = rsnd_io_is_play(io);
        int ret;
 
        /* Volume */
-       ret = rsnd_kctrl_new_m(mod, rdai, rtd,
-                       rsnd_dai_is_play(rdai, io) ?
+       ret = rsnd_kctrl_new_m(mod, rtd,
+                       is_play ?
                        "DVC Out Playback Volume" : "DVC In Capture Volume",
                        rsnd_dvc_volume_update,
                        &dvc->volume, 0x00800000 - 1);
@@ -222,8 +230,8 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
                return ret;
 
        /* Mute */
-       ret = rsnd_kctrl_new_m(mod, rdai, rtd,
-                       rsnd_dai_is_play(rdai, io) ?
+       ret = rsnd_kctrl_new_m(mod, rtd,
+                       is_play ?
                        "DVC Out Mute Switch" : "DVC In Mute Switch",
                        rsnd_dvc_volume_update,
                        &dvc->mute, 1);
@@ -231,16 +239,16 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
                return ret;
 
        /* Ramp */
-       ret = rsnd_kctrl_new_s(mod, rdai, rtd,
-                       rsnd_dai_is_play(rdai, io) ?
+       ret = rsnd_kctrl_new_s(mod, rtd,
+                       is_play ?
                        "DVC Out Ramp Switch" : "DVC In Ramp Switch",
                        rsnd_dvc_volume_update,
                        &dvc->ren, 1);
        if (ret < 0)
                return ret;
 
-       ret = rsnd_kctrl_new_e(mod, rdai, rtd,
-                       rsnd_dai_is_play(rdai, io) ?
+       ret = rsnd_kctrl_new_e(mod, rtd,
+                       is_play ?
                        "DVC Out Ramp Up Rate" : "DVC In Ramp Up Rate",
                        &dvc->rup,
                        rsnd_dvc_volume_update,
@@ -248,8 +256,8 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
        if (ret < 0)
                return ret;
 
-       ret = rsnd_kctrl_new_e(mod, rdai, rtd,
-                       rsnd_dai_is_play(rdai, io) ?
+       ret = rsnd_kctrl_new_e(mod, rtd,
+                       is_play ?
                        "DVC Out Ramp Down Rate" : "DVC In Ramp Down Rate",
                        &dvc->rdown,
                        rsnd_dvc_volume_update,
@@ -264,6 +272,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
 static struct rsnd_mod_ops rsnd_dvc_ops = {
        .name           = DVC_NAME,
        .probe          = rsnd_dvc_probe_gen2,
+       .remove         = rsnd_dvc_remove_gen2,
        .init           = rsnd_dvc_init,
        .quit           = rsnd_dvc_quit,
        .start          = rsnd_dvc_start,
@@ -356,9 +365,9 @@ int rsnd_dvc_probe(struct platform_device *pdev,
                        return PTR_ERR(clk);
 
                dvc->info = &info->dvc_info[i];
-               dvc->clk  = clk;
 
-               rsnd_mod_init(priv, &dvc->mod, &rsnd_dvc_ops, RSND_MOD_DVC, i);
+               rsnd_mod_init(&dvc->mod, &rsnd_dvc_ops,
+                             clk, RSND_MOD_DVC, i);
 
                dev_dbg(dev, "CMD%d probed\n", i);
        }