ASoC: samsung: i2s: Get rid of a static spinlock 52/197852/5
authorSylwester Nawrocki <s.nawrocki@samsung.com>
Thu, 14 Feb 2019 09:37:39 +0000 (10:37 +0100)
committerSylwester Nawrocki <s.nawrocki@samsung.com>
Mon, 4 Mar 2019 17:05:33 +0000 (18:05 +0100)
This patch makes the spinlock serializing access to the primary/secondary
PCM a per I2S controller lock, rather than a global one. There is no need
to have a global lock across multiple I2S controllers in the SoC.

Change-Id: I6b56296ce45e219ed5f37af85fd352ff51af617a
Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
Acked-by: Krzysztof Kozlowski <krzk@kernel.org>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/samsung/i2s.c

index 1be3547..766a049 100644 (file)
@@ -88,9 +88,6 @@ struct i2s_dai {
        struct samsung_i2s_priv *priv;
 };
 
-/* Lock for cross i/f checks */
-static DEFINE_SPINLOCK(lock);
-
 struct samsung_i2s_priv {
        struct platform_device *pdev;
        struct platform_device *pdev_sec;
@@ -101,6 +98,9 @@ struct samsung_i2s_priv {
        /* Spinlock protecting access to the device's registers */
        spinlock_t lock;
 
+       /* Lock for cross i/f checks */
+       spinlock_t pcm_lock;
+
        /* CPU DAIs and their corresponding drivers */
        struct i2s_dai *dai;
        struct snd_soc_dai_driver *dai_drv;
@@ -831,7 +831,7 @@ static int i2s_startup(struct snd_pcm_substream *substream,
 
        pm_runtime_get_sync(dai->dev);
 
-       spin_lock_irqsave(&lock, flags);
+       spin_lock_irqsave(&priv->pcm_lock, flags);
 
        i2s->mode |= DAI_OPENED;
 
@@ -843,7 +843,7 @@ static int i2s_startup(struct snd_pcm_substream *substream,
        if (!any_active(i2s) && (priv->quirks & QUIRK_NEED_RSTCLR))
                writel(CON_RSTCLR, i2s->priv->addr + I2SCON);
 
-       spin_unlock_irqrestore(&lock, flags);
+       spin_unlock_irqrestore(&priv->pcm_lock, flags);
 
        return 0;
 }
@@ -851,11 +851,12 @@ static int i2s_startup(struct snd_pcm_substream *substream,
 static void i2s_shutdown(struct snd_pcm_substream *substream,
        struct snd_soc_dai *dai)
 {
+       struct samsung_i2s_priv *priv = snd_soc_dai_get_drvdata(dai);
        struct i2s_dai *i2s = to_info(dai);
        struct i2s_dai *other = get_other_dai(i2s);
        unsigned long flags;
 
-       spin_lock_irqsave(&lock, flags);
+       spin_lock_irqsave(&priv->pcm_lock, flags);
 
        i2s->mode &= ~DAI_OPENED;
        i2s->mode &= ~DAI_MANAGER;
@@ -867,7 +868,7 @@ static void i2s_shutdown(struct snd_pcm_substream *substream,
        i2s->rfs = 0;
        i2s->bfs = 0;
 
-       spin_unlock_irqrestore(&lock, flags);
+       spin_unlock_irqrestore(&priv->pcm_lock, flags);
 
        pm_runtime_put(dai->dev);
 }
@@ -1405,6 +1406,7 @@ static int samsung_i2s_probe(struct platform_device *pdev)
        pri_dai = &priv->dai[SAMSUNG_I2S_ID_PRIMARY - 1];
 
        spin_lock_init(&priv->lock);
+       spin_lock_init(&priv->pcm_lock);
 
        if (!np) {
                if (i2s_pdata == NULL) {