Merge branch 'asoc-4.18' into asoc-4.19 for amd dep
authorMark Brown <broonie@kernel.org>
Fri, 22 Jun 2018 14:47:23 +0000 (15:47 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 22 Jun 2018 14:47:23 +0000 (15:47 +0100)
sound/soc/amd/acp-pcm-dma.c
sound/soc/codecs/cs47l24.c
sound/soc/codecs/wm5102.c
sound/soc/codecs/wm5110.c
sound/soc/sh/rcar/core.c
sound/soc/sh/rcar/ssi.c
sound/soc/soc-dapm.c

index 77203841c535017bd0fea9c0cd20c5722e5d0ead..1458b504849820187317d507834941f2da7f9acc 100644 (file)
@@ -773,7 +773,8 @@ static int acp_dma_hw_params(struct snd_pcm_substream *substream,
        if (WARN_ON(!rtd))
                return -EINVAL;
 
-       rtd->i2s_instance = pinfo->i2s_instance;
+       if (pinfo)
+               rtd->i2s_instance = pinfo->i2s_instance;
        if (adata->asic_type == CHIP_STONEY) {
                val = acp_reg_read(adata->acp_mmio,
                                   mmACP_I2S_16BIT_RESOLUTION_EN);
index 196e9c343aeb79711530581209050f8568fb9e78..0da52ead91e0ed42aea0cd2ee8bc27da5f23b5df 100644 (file)
@@ -1283,6 +1283,12 @@ static int cs47l24_probe(struct platform_device *pdev)
                return ret;
        }
 
+       ret = arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 1);
+       if (ret != 0)
+               dev_warn(&pdev->dev,
+                        "Failed to set compressed IRQ as a wake source: %d\n",
+                        ret);
+
        arizona_init_common(arizona);
 
        ret = arizona_init_vol_limit(arizona);
@@ -1306,6 +1312,7 @@ static int cs47l24_probe(struct platform_device *pdev)
 err_spk_irqs:
        arizona_free_spk_irqs(arizona);
 err_dsp_irq:
+       arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, cs47l24);
 
        return ret;
@@ -1323,6 +1330,7 @@ static int cs47l24_remove(struct platform_device *pdev)
 
        arizona_free_spk_irqs(arizona);
 
+       arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, cs47l24);
 
        return 0;
index 1ac83388d1b824747f99a8bed7f5e9a85f272ee2..a01a0c0e01ebda73b22a0abe311a7e72ee2f4da9 100644 (file)
@@ -2094,6 +2094,12 @@ static int wm5102_probe(struct platform_device *pdev)
                return ret;
        }
 
+       ret = arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 1);
+       if (ret != 0)
+               dev_warn(&pdev->dev,
+                        "Failed to set compressed IRQ as a wake source: %d\n",
+                        ret);
+
        arizona_init_common(arizona);
 
        ret = arizona_init_vol_limit(arizona);
@@ -2117,6 +2123,7 @@ static int wm5102_probe(struct platform_device *pdev)
 err_spk_irqs:
        arizona_free_spk_irqs(arizona);
 err_dsp_irq:
+       arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5102);
 
        return ret;
@@ -2133,6 +2140,7 @@ static int wm5102_remove(struct platform_device *pdev)
 
        arizona_free_spk_irqs(arizona);
 
+       arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5102);
 
        return 0;
index fb9835dcd8367cefde27e112a46b535d69bb2141..00c735c585d9b75c8f0d12eabca634dfa4b0e657 100644 (file)
@@ -2455,6 +2455,12 @@ static int wm5110_probe(struct platform_device *pdev)
                return ret;
        }
 
+       ret = arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 1);
+       if (ret != 0)
+               dev_warn(&pdev->dev,
+                        "Failed to set compressed IRQ as a wake source: %d\n",
+                        ret);
+
        arizona_init_common(arizona);
 
        ret = arizona_init_vol_limit(arizona);
@@ -2478,6 +2484,7 @@ static int wm5110_probe(struct platform_device *pdev)
 err_spk_irqs:
        arizona_free_spk_irqs(arizona);
 err_dsp_irq:
+       arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5110);
 
        return ret;
@@ -2496,6 +2503,7 @@ static int wm5110_remove(struct platform_device *pdev)
 
        arizona_free_spk_irqs(arizona);
 
+       arizona_set_irq_wake(arizona, ARIZONA_IRQ_DSP_IRQ1, 0);
        arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5110);
 
        return 0;
index 6091e09160853e594d33790f75c77aa076ea2cb5..f8425d8b44d2b54aff876f8759e81c740cb6157a 100644 (file)
@@ -1090,6 +1090,12 @@ static void __rsnd_dai_probe(struct rsnd_priv *priv,
                of_node_put(capture);
        }
 
+       if (rsnd_ssi_is_pin_sharing(io_capture) ||
+           rsnd_ssi_is_pin_sharing(io_playback)) {
+               /* should have symmetric_rates if pin sharing */
+               drv->symmetric_rates = 1;
+       }
+
        dev_dbg(dev, "%s (%s/%s)\n", rdai->name,
                rsnd_io_to_mod_ssi(io_playback) ? "play"    : " -- ",
                rsnd_io_to_mod_ssi(io_capture) ? "capture" : "  --   ");
index 3d9ea100a64f30108d066cf2d7a15f03d4fe1cec..8304e4ec9242c68eeabeca2516938990678aabc8 100644 (file)
@@ -33,6 +33,7 @@
 #define        CHNL_4          (1 << 22)       /* Channels */
 #define        CHNL_6          (2 << 22)       /* Channels */
 #define        CHNL_8          (3 << 22)       /* Channels */
+#define DWL_MASK       (7 << 19)       /* Data Word Length mask */
 #define        DWL_8           (0 << 19)       /* Data Word Length */
 #define        DWL_16          (1 << 19)       /* Data Word Length */
 #define        DWL_18          (2 << 19)       /* Data Word Length */
@@ -349,21 +350,18 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
        struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
        struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
        struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
-       u32 cr_own;
-       u32 cr_mode;
-       u32 wsr;
+       u32 cr_own      = ssi->cr_own;
+       u32 cr_mode     = ssi->cr_mode;
+       u32 wsr         = ssi->wsr;
        int is_tdm;
 
-       if (rsnd_ssi_is_parent(mod, io))
-               return;
-
        is_tdm = rsnd_runtime_is_ssi_tdm(io);
 
        /*
         * always use 32bit system word.
         * see also rsnd_ssi_master_clk_enable()
         */
-       cr_own = FORCE | SWL_32;
+       cr_own |= FORCE | SWL_32;
 
        if (rdai->bit_clk_inv)
                cr_own |= SCKP;
@@ -373,9 +371,18 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
                cr_own |= SDTA;
        if (rdai->sys_delay)
                cr_own |= DEL;
+
+       /*
+        * We shouldn't exchange SWSP after running.
+        * This means, parent needs to care it.
+        */
+       if (rsnd_ssi_is_parent(mod, io))
+               goto init_end;
+
        if (rsnd_io_is_play(io))
                cr_own |= TRMD;
 
+       cr_own &= ~DWL_MASK;
        switch (snd_pcm_format_width(runtime->format)) {
        case 16:
                cr_own |= DWL_16;
@@ -402,7 +409,7 @@ static void rsnd_ssi_config_init(struct rsnd_mod *mod,
                wsr     |= WS_MODE;
                cr_own  |= CHNL_8;
        }
-
+init_end:
        ssi->cr_own     = cr_own;
        ssi->cr_mode    = cr_mode;
        ssi->wsr        = wsr;
@@ -466,15 +473,18 @@ static int rsnd_ssi_quit(struct rsnd_mod *mod,
                return -EIO;
        }
 
-       if (!rsnd_ssi_is_parent(mod, io))
-               ssi->cr_own     = 0;
-
        rsnd_ssi_master_clk_stop(mod, io);
 
        rsnd_mod_power_off(mod);
 
        ssi->usrcnt--;
 
+       if (!ssi->usrcnt) {
+               ssi->cr_own     = 0;
+               ssi->cr_mode    = 0;
+               ssi->wsr        = 0;
+       }
+
        return 0;
 }
 
@@ -1051,9 +1061,10 @@ struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id)
 
 int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod)
 {
-       struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+       if (!mod)
+               return 0;
 
-       return !!(rsnd_flags_has(ssi, RSND_SSI_CLK_PIN_SHARE));
+       return !!(rsnd_flags_has(rsnd_mod_to_ssi(mod), RSND_SSI_CLK_PIN_SHARE));
 }
 
 static u32 *rsnd_ssi_get_status(struct rsnd_dai_stream *io,
index 229c123498030b092e3f82a7c021128ec5618d55..a099c3e4550478e81b16546bfc0012e407d15d24 100644 (file)
@@ -4073,6 +4073,13 @@ int snd_soc_dapm_link_dai_widgets(struct snd_soc_card *card)
                        continue;
                }
 
+               /* let users know there is no DAI to link */
+               if (!dai_w->priv) {
+                       dev_dbg(card->dev, "dai widget %s has no DAI\n",
+                               dai_w->name);
+                       continue;
+               }
+
                dai = dai_w->priv;
 
                /* ...find all widgets with the same stream and link them */