Merge branch 'fix/rcar' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
authorMark Brown <broonie@kernel.org>
Thu, 10 Aug 2017 14:51:05 +0000 (15:51 +0100)
committerMark Brown <broonie@kernel.org>
Thu, 10 Aug 2017 14:51:05 +0000 (15:51 +0100)
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/ctu.c
sound/soc/sh/rcar/dvc.c
sound/soc/sh/rcar/mix.c
sound/soc/sh/rcar/rsnd.h
sound/soc/sh/rcar/src.c
sound/soc/sh/rcar/ssi.c
sound/soc/sh/rcar/ssiu.c

index 7fa40fcad59e03135c44677ff2678dc66a1c73b1..2c12ad2b2b3484c973766745238d3ba9dc0b1458 100644 (file)
@@ -843,12 +843,28 @@ static int rsnd_soc_hw_rule_channels(struct snd_pcm_hw_params *params,
                                ir, &ic);
 }
 
-static void rsnd_soc_hw_constraint(struct snd_pcm_runtime *runtime,
-                                  struct snd_soc_dai *dai)
+static struct snd_pcm_hardware rsnd_pcm_hardware = {
+       .info =         SNDRV_PCM_INFO_INTERLEAVED      |
+                       SNDRV_PCM_INFO_MMAP             |
+                       SNDRV_PCM_INFO_MMAP_VALID,
+       .buffer_bytes_max       = 64 * 1024,
+       .period_bytes_min       = 32,
+       .period_bytes_max       = 8192,
+       .periods_min            = 1,
+       .periods_max            = 32,
+       .fifo_size              = 256,
+};
+
+static int rsnd_soc_dai_startup(struct snd_pcm_substream *substream,
+                               struct snd_soc_dai *dai)
 {
        struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+       struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
+       struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
        struct snd_pcm_hw_constraint_list *constraint = &rdai->constraint;
+       struct snd_pcm_runtime *runtime = substream->runtime;
        unsigned int max_channels = rsnd_rdai_channels_get(rdai);
+       int ret;
        int i;
 
        /*
@@ -865,34 +881,26 @@ static void rsnd_soc_hw_constraint(struct snd_pcm_runtime *runtime,
                constraint->count = i + 1;
        }
 
+       snd_soc_set_runtime_hwparams(substream, &rsnd_pcm_hardware);
+
        snd_pcm_hw_constraint_list(runtime, 0,
                                   SNDRV_PCM_HW_PARAM_CHANNELS, constraint);
 
+       snd_pcm_hw_constraint_integer(runtime,
+                                     SNDRV_PCM_HW_PARAM_PERIODS);
+
        /*
         * Sampling Rate / Channel Limitation
         * It depends on Clock Master Mode
         */
-       if (!rsnd_rdai_is_clk_master(rdai))
-               return;
-
-       snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
-                           rsnd_soc_hw_rule_rate, dai,
-                           SNDRV_PCM_HW_PARAM_CHANNELS, -1);
-       snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
-                           rsnd_soc_hw_rule_channels, dai,
-                           SNDRV_PCM_HW_PARAM_RATE, -1);
-}
-
-static int rsnd_soc_dai_startup(struct snd_pcm_substream *substream,
-                               struct snd_soc_dai *dai)
-{
-       struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
-       struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
-       struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
-       int ret;
-
-       /* rsnd_io_to_runtime() is not yet enabled here */
-       rsnd_soc_hw_constraint(substream->runtime, dai);
+       if (rsnd_rdai_is_clk_master(rdai)) {
+               snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
+                                   rsnd_soc_hw_rule_rate, dai,
+                                   SNDRV_PCM_HW_PARAM_CHANNELS, -1);
+               snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
+                                   rsnd_soc_hw_rule_channels, dai,
+                                   SNDRV_PCM_HW_PARAM_RATE, -1);
+       }
 
        /*
         * call rsnd_dai_call without spinlock
@@ -1104,31 +1112,6 @@ static int rsnd_dai_probe(struct rsnd_priv *priv)
 /*
  *             pcm ops
  */
-static struct snd_pcm_hardware rsnd_pcm_hardware = {
-       .info =         SNDRV_PCM_INFO_INTERLEAVED      |
-                       SNDRV_PCM_INFO_MMAP             |
-                       SNDRV_PCM_INFO_MMAP_VALID,
-       .buffer_bytes_max       = 64 * 1024,
-       .period_bytes_min       = 32,
-       .period_bytes_max       = 8192,
-       .periods_min            = 1,
-       .periods_max            = 32,
-       .fifo_size              = 256,
-};
-
-static int rsnd_pcm_open(struct snd_pcm_substream *substream)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       int ret = 0;
-
-       snd_soc_set_runtime_hwparams(substream, &rsnd_pcm_hardware);
-
-       ret = snd_pcm_hw_constraint_integer(runtime,
-                                           SNDRV_PCM_HW_PARAM_PERIODS);
-
-       return ret;
-}
-
 static int rsnd_hw_params(struct snd_pcm_substream *substream,
                         struct snd_pcm_hw_params *hw_params)
 {
@@ -1158,7 +1141,6 @@ static snd_pcm_uframes_t rsnd_pointer(struct snd_pcm_substream *substream)
 }
 
 static struct snd_pcm_ops rsnd_pcm_ops = {
-       .open           = rsnd_pcm_open,
        .ioctl          = snd_pcm_lib_ioctl,
        .hw_params      = rsnd_hw_params,
        .hw_free        = snd_pcm_lib_free_pages,
@@ -1168,11 +1150,10 @@ static struct snd_pcm_ops rsnd_pcm_ops = {
 /*
  *             snd_kcontrol
  */
-#define kcontrol_to_cfg(kctrl) ((struct rsnd_kctrl_cfg *)kctrl->private_value)
 static int rsnd_kctrl_info(struct snd_kcontrol *kctrl,
                           struct snd_ctl_elem_info *uinfo)
 {
-       struct rsnd_kctrl_cfg *cfg = kcontrol_to_cfg(kctrl);
+       struct rsnd_kctrl_cfg *cfg = snd_kcontrol_chip(kctrl);
 
        if (cfg->texts) {
                uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
@@ -1198,7 +1179,7 @@ static int rsnd_kctrl_info(struct snd_kcontrol *kctrl,
 static int rsnd_kctrl_get(struct snd_kcontrol *kctrl,
                          struct snd_ctl_elem_value *uc)
 {
-       struct rsnd_kctrl_cfg *cfg = kcontrol_to_cfg(kctrl);
+       struct rsnd_kctrl_cfg *cfg = snd_kcontrol_chip(kctrl);
        int i;
 
        for (i = 0; i < cfg->size; i++)
@@ -1213,8 +1194,7 @@ static int rsnd_kctrl_get(struct snd_kcontrol *kctrl,
 static int rsnd_kctrl_put(struct snd_kcontrol *kctrl,
                          struct snd_ctl_elem_value *uc)
 {
-       struct rsnd_mod *mod = snd_kcontrol_chip(kctrl);
-       struct rsnd_kctrl_cfg *cfg = kcontrol_to_cfg(kctrl);
+       struct rsnd_kctrl_cfg *cfg = snd_kcontrol_chip(kctrl);
        int i, change = 0;
 
        if (!cfg->accept(cfg->io))
@@ -1231,7 +1211,7 @@ static int rsnd_kctrl_put(struct snd_kcontrol *kctrl,
        }
 
        if (change && cfg->update)
-               cfg->update(cfg->io, mod);
+               cfg->update(cfg->io, cfg->mod);
 
        return change;
 }
@@ -1283,14 +1263,13 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
                .index          = rtd->num,
                .get            = rsnd_kctrl_get,
                .put            = rsnd_kctrl_put,
-               .private_value  = (unsigned long)cfg,
        };
        int ret;
 
        if (size > RSND_MAX_CHANNELS)
                return -EINVAL;
 
-       kctrl = snd_ctl_new1(&knew, mod);
+       kctrl = snd_ctl_new1(&knew, cfg);
        if (!kctrl)
                return -ENOMEM;
 
@@ -1306,6 +1285,7 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
        cfg->card       = card;
        cfg->kctrl      = kctrl;
        cfg->io         = io;
+       cfg->mod        = mod;
 
        return 0;
 }
index 4ba8f2fe7a4c47f08f046de4062e8ff7e9279cc4..e7f53f44165d78b423c56a1623bbc2cfe965e0e6 100644 (file)
@@ -394,13 +394,16 @@ int rsnd_ctu_probe(struct rsnd_priv *priv)
                clk = devm_clk_get(dev, name);
                if (IS_ERR(clk)) {
                        ret = PTR_ERR(clk);
+                       of_node_put(np);
                        goto rsnd_ctu_probe_done;
                }
 
                ret = rsnd_mod_init(priv, rsnd_mod_get(ctu), &rsnd_ctu_ops,
                                    clk, rsnd_mod_get_status, RSND_MOD_CTU, i);
-               if (ret)
+               if (ret) {
+                       of_node_put(np);
                        goto rsnd_ctu_probe_done;
+               }
 
                i++;
        }
index 99d2d9459e755a46f630b36f93611e88c4feeae6..1743ade3cc55563c04204b37b70d57254f41cae8 100644 (file)
@@ -380,13 +380,16 @@ int rsnd_dvc_probe(struct rsnd_priv *priv)
                clk = devm_clk_get(dev, name);
                if (IS_ERR(clk)) {
                        ret = PTR_ERR(clk);
+                       of_node_put(np);
                        goto rsnd_dvc_probe_done;
                }
 
                ret = rsnd_mod_init(priv, rsnd_mod_get(dvc), &rsnd_dvc_ops,
                                    clk, rsnd_mod_get_status, RSND_MOD_DVC, i);
-               if (ret)
+               if (ret) {
+                       of_node_put(np);
                        goto rsnd_dvc_probe_done;
+               }
 
                i++;
        }
index 195fc7bb22afb6519fb574af7b28832d2defda6b..6c4826c189a42d06eec412cf0086b9721faa28be 100644 (file)
@@ -168,13 +168,16 @@ int rsnd_mix_probe(struct rsnd_priv *priv)
                clk = devm_clk_get(dev, name);
                if (IS_ERR(clk)) {
                        ret = PTR_ERR(clk);
+                       of_node_put(np);
                        goto rsnd_mix_probe_done;
                }
 
                ret = rsnd_mod_init(priv, rsnd_mod_get(mix), &rsnd_mix_ops,
                                    clk, rsnd_mod_get_status, RSND_MOD_MIX, i);
-               if (ret)
+               if (ret) {
+                       of_node_put(np);
                        goto rsnd_mix_probe_done;
+               }
 
                i++;
        }
index 99c57611df886a0700f7978cb93b5279b7c2498d..c5de71f2dc8c429b9ed3aabab509ded1651b92f9 100644 (file)
@@ -614,6 +614,7 @@ struct rsnd_kctrl_cfg {
        struct rsnd_dai_stream *io;
        struct snd_card *card;
        struct snd_kcontrol *kctrl;
+       struct rsnd_mod *mod;
 };
 
 #define RSND_MAX_CHANNELS      8
index 7aa239e28491525053d4dd957bf2cc4d2f4b056c..8e9a1de0ec251af2b1bb12195cc0ca442db4f80e 100644 (file)
@@ -581,20 +581,24 @@ int rsnd_src_probe(struct rsnd_priv *priv)
                src->irq = irq_of_parse_and_map(np, 0);
                if (!src->irq) {
                        ret = -EINVAL;
+                       of_node_put(np);
                        goto rsnd_src_probe_done;
                }
 
                clk = devm_clk_get(dev, name);
                if (IS_ERR(clk)) {
                        ret = PTR_ERR(clk);
+                       of_node_put(np);
                        goto rsnd_src_probe_done;
                }
 
                ret = rsnd_mod_init(priv, rsnd_mod_get(src),
                                    &rsnd_src_ops, clk, rsnd_mod_get_status,
                                    RSND_MOD_SRC, i);
-               if (ret)
+               if (ret) {
+                       of_node_put(np);
                        goto rsnd_src_probe_done;
+               }
 
 skip:
                i++;
index 90cc9c13c4e079ab5c9a207f5678601f51dfd8de..0309de58bf18f41975cc98a33d9be155a42e634e 100644 (file)
@@ -107,6 +107,7 @@ struct rsnd_ssi {
        (rsnd_ssi_multi_slaves(io) & (1 << rsnd_mod_id(mod)))
 #define rsnd_ssi_is_run_mods(mod, io) \
        (rsnd_ssi_run_mods(io) & (1 << rsnd_mod_id(mod)))
+#define rsnd_ssi_can_output_clk(mod) (!__rsnd_ssi_is_pin_sharing(mod))
 
 int rsnd_ssi_hdmi_port(struct rsnd_dai_stream *io)
 {
@@ -256,7 +257,6 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
        struct device *dev = rsnd_priv_to_dev(priv);
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
-       struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
        int chan = rsnd_runtime_channel_for_ssi(io);
        int idx, ret;
        unsigned int main_rate;
@@ -267,7 +267,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
        if (!rsnd_rdai_is_clk_master(rdai))
                return 0;
 
-       if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
+       if (!rsnd_ssi_can_output_clk(mod))
                return 0;
 
        if (rsnd_ssi_is_multi_slave(mod, io))
@@ -318,12 +318,11 @@ static void rsnd_ssi_master_clk_stop(struct rsnd_mod *mod,
 {
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
-       struct rsnd_mod *ssi_parent_mod = rsnd_io_to_mod_ssip(io);
 
        if (!rsnd_rdai_is_clk_master(rdai))
                return;
 
-       if (ssi_parent_mod && !rsnd_ssi_is_parent(mod, io))
+       if (!rsnd_ssi_can_output_clk(mod))
                return;
 
        if (ssi->usrcnt > 1)
@@ -346,6 +345,9 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
        u32 wsr;
        int is_tdm;
 
+       if (rsnd_ssi_is_parent(mod, io))
+               return;
+
        is_tdm = rsnd_runtime_is_ssi_tdm(io);
 
        /*
@@ -484,8 +486,7 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
        if (ret < 0)
                return ret;
 
-       if (!rsnd_ssi_is_parent(mod, io))
-               rsnd_ssi_config_init(mod, io);
+       rsnd_ssi_config_init(mod, io);
 
        rsnd_ssi_register_setup(mod);
 
@@ -1101,6 +1102,7 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
                clk = devm_clk_get(dev, name);
                if (IS_ERR(clk)) {
                        ret = PTR_ERR(clk);
+                       of_node_put(np);
                        goto rsnd_ssi_probe_done;
                }
 
@@ -1113,6 +1115,7 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
                ssi->irq = irq_of_parse_and_map(np, 0);
                if (!ssi->irq) {
                        ret = -EINVAL;
+                       of_node_put(np);
                        goto rsnd_ssi_probe_done;
                }
 
@@ -1123,8 +1126,10 @@ int rsnd_ssi_probe(struct rsnd_priv *priv)
 
                ret = rsnd_mod_init(priv, rsnd_mod_get(ssi), ops, clk,
                                    rsnd_ssi_get_status, RSND_MOD_SSI, i);
-               if (ret)
+               if (ret) {
+                       of_node_put(np);
                        goto rsnd_ssi_probe_done;
+               }
 
                i++;
        }
index bed2c9c0004b8fb0c6ccb1d9215443f4846e1eba..4d948757d300d04be3bfca3c63f78c68085a8506 100644 (file)
@@ -250,7 +250,7 @@ int rsnd_ssiu_probe(struct rsnd_priv *priv)
 {
        struct device *dev = rsnd_priv_to_dev(priv);
        struct rsnd_ssiu *ssiu;
-       static struct rsnd_mod_ops *ops;
+       struct rsnd_mod_ops *ops;
        int i, nr, ret;
 
        /* same number to SSI */