summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2019-02-12 19:03:22 +0100
committerSylwester Nawrocki <s.nawrocki@samsung.com>2019-03-04 18:05:33 +0100
commit13f8c0d674dd2d6fe115706a6e60212b487fff10 (patch)
tree3b2f3d26fc866a15ec8381bca5761e562b91f8d4
parent2523652bcca60a61c5ee1eec39da01430ab7e396 (diff)
downloadlinux-exynos-13f8c0d674dd2d6fe115706a6e60212b487fff10.tar.gz
linux-exynos-13f8c0d674dd2d6fe115706a6e60212b487fff10.tar.bz2
linux-exynos-13f8c0d674dd2d6fe115706a6e60212b487fff10.zip
ASoC: samsung: i2s: Restore support for the secondary PCM
This patch introduces again registration of additional platform device as we still need it for registering the secondary dmaengine PCM component. This patch in most part is a revert of changes done in commit be2c92eb64023e ("ASoC: samsung: i2s: Remove virtual device for secondary DAI") Change-Id: Ib7a47c83511403b32e04c41edf8148d77481abb3 Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Acked-by: Krzysztof Kozlowski <krzk@kernel.org> Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r--sound/soc/samsung/i2s.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c
index 692389c7e39c..ba37d5db532e 100644
--- a/sound/soc/samsung/i2s.c
+++ b/sound/soc/samsung/i2s.c
@@ -109,6 +109,7 @@ static DEFINE_SPINLOCK(lock);
struct samsung_i2s_priv {
struct platform_device *pdev;
+ struct platform_device *pdev_sec;
/* Spinlock protecting access to the device's registers */
spinlock_t spinlock;
@@ -1311,6 +1312,34 @@ static int i2s_register_clock_provider(struct platform_device *pdev)
return ret;
}
+/* Create platform device for the secondary PCM */
+static int i2s_create_secondary_device(struct samsung_i2s_priv *priv)
+{
+ struct platform_device *pdev;
+ int ret;
+
+ pdev = platform_device_register_simple("samsung-i2s-sec", -1, NULL, 0);
+ if (!pdev)
+ return -ENOMEM;
+
+ ret = device_attach(&pdev->dev);
+ if (ret < 0) {
+ dev_info(&pdev->dev, "device_attach() failed\n");
+ return ret;
+ }
+
+ priv->pdev_sec = pdev;
+
+ return 0;
+}
+
+static void i2s_delete_secondary_device(struct samsung_i2s_priv *priv)
+{
+ if (priv->pdev_sec) {
+ platform_device_del(priv->pdev_sec);
+ priv->pdev_sec = NULL;
+ }
+}
static int samsung_i2s_probe(struct platform_device *pdev)
{
struct i2s_dai *pri_dai, *sec_dai = NULL;
@@ -1328,13 +1357,15 @@ static int samsung_i2s_probe(struct platform_device *pdev)
i2s_dai_data = (struct samsung_i2s_dai_data *)
platform_get_device_id(pdev)->driver_data;
+ /* Nothing to do if it is the secondary device probe */
+ if (!i2s_dai_data)
+ return 0;
+
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
quirks = np ? i2s_dai_data->quirks : i2s_pdata->type.quirks;
- quirks &= ~(QUIRK_SEC_DAI | QUIRK_SUPPORTS_IDMA);
-
num_dais = (quirks & QUIRK_SEC_DAI) ? 2 : 1;
priv->pdev = pdev;
@@ -1424,8 +1455,13 @@ static int samsung_i2s_probe(struct platform_device *pdev)
sec_dai->pri_dai = pri_dai;
pri_dai->sec_dai = sec_dai;
- ret = samsung_asoc_dma_platform_register(&pdev->dev,
- sec_dai->filter, "tx-sec", NULL, NULL);
+ ret = i2s_create_secondary_device(priv);
+ if (ret < 0)
+ goto err_disable_clk;
+
+ ret = samsung_asoc_dma_platform_register(&priv->pdev_sec->dev,
+ sec_dai->filter, "tx-sec", NULL,
+ &pdev->dev);
if (ret < 0)
goto err_disable_clk;
@@ -1460,6 +1496,7 @@ err_disable_pm:
pm_runtime_disable(&pdev->dev);
err_disable_clk:
clk_disable_unprepare(pri_dai->clk);
+ i2s_delete_secondary_device(priv);
return ret;
}
@@ -1468,12 +1505,17 @@ static int samsung_i2s_remove(struct platform_device *pdev)
struct samsung_i2s_priv *priv = dev_get_drvdata(&pdev->dev);
struct i2s_dai *pri_dai = samsung_i2s_get_pri_dai(&pdev->dev);
+ /* The secondary device has no driver data assigned */
+ if (!priv)
+ return 0;
+
pm_runtime_get_sync(&pdev->dev);
pm_runtime_disable(&pdev->dev);
i2s_unregister_clock_provider(pdev);
clk_disable_unprepare(pri_dai->clk);
pm_runtime_put_noidle(&pdev->dev);
+ i2s_delete_secondary_device(priv);
return 0;
}
@@ -1571,6 +1613,8 @@ static const struct platform_device_id samsung_i2s_driver_ids[] = {
{
.name = "samsung-i2s",
.driver_data = (kernel_ulong_t)&i2sv3_dai_type,
+ }, {
+ .name = "samsung-i2s-sec",
},
{},
};