ASoC: rsnd: control kctrl items acceptance anytime/runtime
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Wed, 7 Jun 2017 00:11:48 +0000 (00:11 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 13 Jun 2017 20:38:45 +0000 (21:38 +0100)
Current SRC/DVC/CTU adds kctrl for each device,
and SRC can adjust its sampling rate during playback,
thus, this feature should be enabled only *during* playback.
This patch controls it more clearly

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

index 1bf261d677b7818f32140426f2b88a14c23430a0..0bb99aa70e2909beee34032293a29e5d0d2117a0 100644 (file)
@@ -1065,6 +1065,9 @@ static int rsnd_kctrl_put(struct snd_kcontrol *kctrl,
        struct rsnd_kctrl_cfg *cfg = kcontrol_to_cfg(kctrl);
        int i, change = 0;
 
+       if (!cfg->accept(cfg->io))
+               return 0;
+
        for (i = 0; i < cfg->size; i++) {
                if (cfg->texts) {
                        change |= (uc->value.enumerated.item[i] != cfg->val[i]);
@@ -1081,6 +1084,18 @@ static int rsnd_kctrl_put(struct snd_kcontrol *kctrl,
        return change;
 }
 
+int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io)
+{
+       return 1;
+}
+
+int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io)
+{
+       struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+
+       return !!runtime;
+}
+
 struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg)
 {
        cfg->cfg.val = cfg->val;
@@ -1099,6 +1114,7 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
                   struct rsnd_dai_stream *io,
                   struct snd_soc_pcm_runtime *rtd,
                   const unsigned char *name,
+                  int (*accept)(struct rsnd_dai_stream *io),
                   void (*update)(struct rsnd_dai_stream *io,
                                  struct rsnd_mod *mod),
                   struct rsnd_kctrl_cfg *cfg,
@@ -1133,6 +1149,7 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
        cfg->texts      = texts;
        cfg->max        = max;
        cfg->size       = size;
+       cfg->accept     = accept;
        cfg->update     = update;
        cfg->card       = card;
        cfg->kctrl      = kctrl;
index 9dcc1f9db026f6b76d7849ff3108ac3335543116..4ba8f2fe7a4c47f08f046de4062e8ff7e9279cc4 100644 (file)
@@ -279,12 +279,14 @@ static int rsnd_ctu_pcm_new(struct rsnd_mod *mod,
 
        /* CTU Pass */
        ret = rsnd_kctrl_new_m(mod, io, rtd, "CTU Pass",
+                              rsnd_kctrl_accept_anytime,
                               NULL,
                               &ctu->pass, RSND_MAX_CHANNELS,
                               0xC);
 
        /* ROW0 */
        ret = rsnd_kctrl_new_m(mod, io, rtd, "CTU SV0",
+                              rsnd_kctrl_accept_anytime,
                               NULL,
                               &ctu->sv0, RSND_MAX_CHANNELS,
                               0x00FFFFFF);
@@ -293,6 +295,7 @@ static int rsnd_ctu_pcm_new(struct rsnd_mod *mod,
 
        /* ROW1 */
        ret = rsnd_kctrl_new_m(mod, io, rtd, "CTU SV1",
+                              rsnd_kctrl_accept_anytime,
                               NULL,
                               &ctu->sv1, RSND_MAX_CHANNELS,
                               0x00FFFFFF);
@@ -301,6 +304,7 @@ static int rsnd_ctu_pcm_new(struct rsnd_mod *mod,
 
        /* ROW2 */
        ret = rsnd_kctrl_new_m(mod, io, rtd, "CTU SV2",
+                              rsnd_kctrl_accept_anytime,
                               NULL,
                               &ctu->sv2, RSND_MAX_CHANNELS,
                               0x00FFFFFF);
@@ -309,6 +313,7 @@ static int rsnd_ctu_pcm_new(struct rsnd_mod *mod,
 
        /* ROW3 */
        ret = rsnd_kctrl_new_m(mod, io, rtd, "CTU SV3",
+                              rsnd_kctrl_accept_anytime,
                               NULL,
                               &ctu->sv3, RSND_MAX_CHANNELS,
                               0x00FFFFFF);
@@ -317,6 +322,7 @@ static int rsnd_ctu_pcm_new(struct rsnd_mod *mod,
 
        /* Reset */
        ret = rsnd_kctrl_new_s(mod, io, rtd, "CTU Reset",
+                              rsnd_kctrl_accept_anytime,
                               rsnd_ctu_value_reset,
                               &ctu->reset, 1);
 
index 463de8360985c5518f90f6f102a2ccccd560ff0b..75af6e742328c465a50dca3dfb31a5812791ea3a 100644 (file)
@@ -257,6 +257,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
        ret = rsnd_kctrl_new_m(mod, io, rtd,
                        is_play ?
                        "DVC Out Playback Volume" : "DVC In Capture Volume",
+                       rsnd_kctrl_accept_anytime,
                        rsnd_dvc_volume_update,
                        &dvc->volume, slots,
                        0x00800000 - 1);
@@ -267,6 +268,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
        ret = rsnd_kctrl_new_m(mod, io, rtd,
                        is_play ?
                        "DVC Out Mute Switch" : "DVC In Mute Switch",
+                       rsnd_kctrl_accept_anytime,
                        rsnd_dvc_volume_update,
                        &dvc->mute,  slots,
                        1);
@@ -277,6 +279,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
        ret = rsnd_kctrl_new_s(mod, io, rtd,
                        is_play ?
                        "DVC Out Ramp Switch" : "DVC In Ramp Switch",
+                       rsnd_kctrl_accept_anytime,
                        rsnd_dvc_volume_update,
                        &dvc->ren, 1);
        if (ret < 0)
@@ -285,6 +288,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
        ret = rsnd_kctrl_new_e(mod, io, rtd,
                        is_play ?
                        "DVC Out Ramp Up Rate" : "DVC In Ramp Up Rate",
+                       rsnd_kctrl_accept_anytime,
                        rsnd_dvc_volume_update,
                        &dvc->rup,
                        dvc_ramp_rate);
@@ -294,6 +298,7 @@ static int rsnd_dvc_pcm_new(struct rsnd_mod *mod,
        ret = rsnd_kctrl_new_e(mod, io, rtd,
                        is_play ?
                        "DVC Out Ramp Down Rate" : "DVC In Ramp Down Rate",
+                       rsnd_kctrl_accept_anytime,
                        rsnd_dvc_volume_update,
                        &dvc->rdown,
                        dvc_ramp_rate);
index 6de5f7ec6464263d7b50ba517cbe9e79bf7d8119..ac4d50d118d197390d69825de4a41a510c644b60 100644 (file)
@@ -598,6 +598,7 @@ struct rsnd_kctrl_cfg {
        unsigned int size;
        u32 *val;
        const char * const *texts;
+       int (*accept)(struct rsnd_dai_stream *io);
        void (*update)(struct rsnd_dai_stream *io, struct rsnd_mod *mod);
        struct rsnd_dai_stream *io;
        struct snd_card *card;
@@ -615,12 +616,15 @@ struct rsnd_kctrl_cfg_s {
        u32 val;
 };
 
+int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io);
+int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io);
 struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg);
 struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg);
 int rsnd_kctrl_new(struct rsnd_mod *mod,
                   struct rsnd_dai_stream *io,
                   struct snd_soc_pcm_runtime *rtd,
                   const unsigned char *name,
+                  int (*accept)(struct rsnd_dai_stream *io),
                   void (*update)(struct rsnd_dai_stream *io,
                                  struct rsnd_mod *mod),
                   struct rsnd_kctrl_cfg *cfg,
@@ -628,16 +632,16 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
                   int size,
                   u32 max);
 
-#define rsnd_kctrl_new_m(mod, io, rtd, name, update, cfg, size, max) \
-       rsnd_kctrl_new(mod, io, rtd, name, update, rsnd_kctrl_init_m(cfg), \
+#define rsnd_kctrl_new_m(mod, io, rtd, name, accept, update, cfg, size, max) \
+       rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_m(cfg), \
                       NULL, size, max)
 
-#define rsnd_kctrl_new_s(mod, io, rtd, name, update, cfg, max) \
-       rsnd_kctrl_new(mod, io, rtd, name, update, rsnd_kctrl_init_s(cfg), \
+#define rsnd_kctrl_new_s(mod, io, rtd, name, accept, update, cfg, max) \
+       rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \
                       NULL, 1, max)
 
-#define rsnd_kctrl_new_e(mod, io, rtd, name, update, cfg, texts)       \
-       rsnd_kctrl_new(mod, io, rtd, name, update, rsnd_kctrl_init_s(cfg), \
+#define rsnd_kctrl_new_e(mod, io, rtd, name, accept, update, cfg, texts)       \
+       rsnd_kctrl_new(mod, io, rtd, name, accept, update, rsnd_kctrl_init_s(cfg), \
                       texts, 1, ARRAY_SIZE(texts))
 
 /*
index 8dbe9ebcbff12b9400bc82c7615e698bb4d07222..7aa239e28491525053d4dd957bf2cc4d2f4b056c 100644 (file)
@@ -497,6 +497,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
                               rsnd_io_is_play(io) ?
                               "SRC Out Rate Switch" :
                               "SRC In Rate Switch",
+                              rsnd_kctrl_accept_anytime,
                               rsnd_src_set_convert_rate,
                               &src->sen, 1);
        if (ret < 0)
@@ -506,6 +507,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
                               rsnd_io_is_play(io) ?
                               "SRC Out Rate" :
                               "SRC In Rate",
+                              rsnd_kctrl_accept_runtime,
                               rsnd_src_set_convert_rate,
                               &src->sync, 192000);