On Thu, 7 Feb 2019 at 18:01, Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx> wrote: > > 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") > > Signed-off-by: Sylwester Nawrocki <s.nawrocki@xxxxxxxxxxx> > --- > sound/soc/samsung/i2s.c | 52 +++++++++++++++++++++++++++++++++++++---- > 1 file changed, 48 insertions(+), 4 deletions(-) > > diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c > index 4bc3b181f1c2..994dcd4b01fb 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; > @@ -1312,6 +1313,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; > @@ -1329,13 +1358,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 probing */ > + 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; > > @@ -1425,8 +1456,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; > > @@ -1461,6 +1497,7 @@ static int samsung_i2s_probe(struct platform_device *pdev) > pm_runtime_disable(&pdev->dev); > err_disable_clk: > clk_disable_unprepare(pri_dai->clk); > + i2s_delete_secondary_device(priv); > return ret; > } > > @@ -1469,12 +1506,16 @@ 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); > > + if (!priv) This is not obvious. Maybe comment that it is secondary device remove()? > + 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; > } > @@ -1573,6 +1614,9 @@ static const struct platform_device_id samsung_i2s_driver_ids[] = { > .name = "samsung-i2s", > .driver_data = (kernel_ulong_t)&i2sv3_dai_type, > }, > + { Nit - squash with previous line. Acked-by: Krzysztof Kozlowski <krzk@xxxxxxxxxx> Best regards, Krzysztof