From patchwork Thu Dec 29 11:34:03 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 9491151 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 559FA62AB8 for ; Thu, 29 Dec 2016 11:34:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 498F91FF1D for ; Thu, 29 Dec 2016 11:34:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 3DDBA203B9; Thu, 29 Dec 2016 11:34:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 41EAF1FF1D for ; Thu, 29 Dec 2016 11:34:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752129AbcL2Lec (ORCPT ); Thu, 29 Dec 2016 06:34:32 -0500 Received: from mailout4.w1.samsung.com ([210.118.77.14]:53688 "EHLO mailout4.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751358AbcL2Lea (ORCPT ); Thu, 29 Dec 2016 06:34:30 -0500 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout4.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OIY00BO72TELZ00@mailout4.w1.samsung.com> for linux-samsung-soc@vger.kernel.org; Thu, 29 Dec 2016 11:34:27 +0000 (GMT) Received: from eusmges4.samsung.com (unknown [203.254.199.244]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20161229113426eucas1p1b68d2cd861f80efc3917b36b479f3b00~UtuO9zIB62138521385eucas1p1m; Thu, 29 Dec 2016 11:34:26 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges4.samsung.com (EUCPMTA) with SMTP id AB.60.20460.2C4F4685; Thu, 29 Dec 2016 11:34:26 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20161229113425eucas1p2600ba7e4337e90f65c0bc60bb4a9c2ec~UtuORDLkL0547505475eucas1p2L; Thu, 29 Dec 2016 11:34:25 +0000 (GMT) X-AuditID: cbfec7f4-f79b96d000004fec-c1-5864f4c2160e Received: from eusync2.samsung.com ( [203.254.199.212]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 1E.4F.03557.AE4F4685; Thu, 29 Dec 2016 11:35:06 +0000 (GMT) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OIY00CMD2T7BA50@eusync2.samsung.com>; Thu, 29 Dec 2016 11:34:25 +0000 (GMT) From: Marek Szyprowski To: alsa-devel@alsa-project.org, linux-samsung-soc@vger.kernel.org Cc: Marek Szyprowski , Mark Brown , Sylwester Nawrocki , Sangbeom Kim , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz , Inki Dae , Javier Martinez Canillas Subject: [PATCH 1/5] ASoC: samsung: i2s: Remove virtual device for secondary DAI Date: Thu, 29 Dec 2016 12:34:03 +0100 Message-id: <1483011247-21613-2-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1483011247-21613-1-git-send-email-m.szyprowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAAzWRbUhTYRTHe+7dy93oxmVKHmwKjcrKlxIG3VSkN2J+k8CSKGq4i1qbzs3J FCSZOXWCmiJNUxxIGcvQxjQRkZw5K8U50GaKtWz0Ys5MZySE5nb12++c8z+/h8ND4CIPJ5LI zStkNHlypYQn5PQ5NyfjHQFF5mnPgIiedjsw+oW5m0s3ffbx6IZP9Rx62d+F0S5XD582u4Yw +vnrBT49slzJpd1PA9g5oaxn3cCT2azVPJm9boEvq7VbkWzdFp3OvS5MUTDK3CJGcyr1tjDH aDEgdc0Zvdfn5JShxTgTEhBAScHVEuCzfBCmPnbzTEhIiKjHCOaqGvlssY7gx7NhtLfRXv6P ww6eIBh84+GyRRkG3v75kItHJYLJb+IFOZy6AM2tv0JenJrDoMYwtbNOEGHUFdh8FxHMcKij sDJr5gfbJCUDy8ur7GPR8NbZyA2ygEqD+78NWFADVCUfrOMTIQ1QUWB7hbP5S7A42sFlOQyW xuy7p4mhumoYY7kOgaEilmUzgkk/yXIyjIy5Q7s4dQAa+h7irJ6EKqOIjcjANe/f1ZwHV88j nD29FUHnxAOsHoktaJ8VhTM6rSqb0UoTtHKVVpeXnZCVr7Khne8e3xoL9KMOZ5IDUQSS7CdB rMgUceVF2mKVAwGBS8LJwNpOi1TIi0sYTf4tjU7JaB3oEMGRRJCDlulrIipbXsjcZRg1o9mb YoQgsgy1CFTMSOn2t3spnXH67dqVGHV811ZFpPXYxI30NkGBp6Sz4GfS8YTYgaFSS9OdmcOK i+Rae6/e67h2dtVsXZX2jnZHfO9fUs42b9LuDOnMV5FPkHXE+jcq5v0fn9pLZtRs0LrkxY1J 5c3ZJWNdpdGe+sVyWbzQNnziQ7k+bUvC0ebIE0/iGq38PyS6L+7qAgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrBLMWRmVeSWpSXmKPExsVy+t/xK7qvvqREGJx7JGRx5eIhJouNM9az Wkx9+ITNYtL9CSwWb96uYbI4f34Du8WM8/uYLNYeuctucfhNO6vFxRVfmBy4PDZ8bmLz2LSq k81jS/9ddo++LasYPT5vkgtgjXKzyUhNTEktUkjNS85PycxLt1UKDXHTtVBSyEvMTbVVitD1 DQlSUihLzCkF8owM0ICDc4B7sJK+XYJbRtuCJsaCbvOKB0+OsTQwPtLpYuTkkBAwkZjf/IcF whaTuHBvPVsXIxeHkMASRok9rSvZIZwmJonOl7OYQarYBAwlut52sYHYIgJOEjPnvAfrYBa4 wyTx/dEisFHCAgES6zvngBWxCKhKvLsxA2gSBwevgIfEgu1hENvkJE4em8wKYnMKeEq0fGxi ArGFgEr+vPrHNIGRdwEjwypGkdTS4tz03GJDveLE3OLSvHS95PzcTYzAUN927OfmHYyXNgYf YhTgYFTi4ZWQSYkQYk0sK67MPcQowcGsJML75RNQiDclsbIqtSg/vqg0J7X4EKMp0E0TmaVE k/OBcZhXEm9oYmhuaWhkbGFhbmSkJM5b8uFKuJBAemJJanZqakFqEUwfEwenVAOjymZZw+PP CwWvL01588XndOrtiezufErt1Ufin3X3Hkt+6/Lt1d0IoZNlZftrfx3NLDY+81fvP2PpbNt4 t+CcT2JX/Ao+v9gjv0pns9PyyplBbyZqNvxdenvyiUTNvz9S/cR4Pjx/9q755pW1ddtFvppy H1tz4n+p4hmFisxPiTuEZIxtf0g0K7EUZyQaajEXFScCAN3tbLCLAgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20161229113425eucas1p2600ba7e4337e90f65c0bc60bb4a9c2ec X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20161229113425eucas1p2600ba7e4337e90f65c0bc60bb4a9c2ec X-RootMTR: 20161229113425eucas1p2600ba7e4337e90f65c0bc60bb4a9c2ec References: <1483011247-21613-1-git-send-email-m.szyprowski@samsung.com> Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP For some unknown (maybe historical?) reasons support for secondary I2S DAI was implemented by adding additional virtual platform device, which was then probed again with the main I2S driver. This pattern is really hard to follow and provides no benefits, so lets remove this hack and register both DAIs during linear probe of Exynos I2S controller driver. Signed-off-by: Marek Szyprowski --- sound/soc/samsung/i2s.c | 102 ++++++++++++------------------------------------ 1 file changed, 26 insertions(+), 76 deletions(-) diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c index e00974bc5616..ce4e70ef5568 100644 --- a/sound/soc/samsung/i2s.c +++ b/sound/soc/samsung/i2s.c @@ -34,11 +34,6 @@ #define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t) -enum samsung_dai_type { - TYPE_PRI, - TYPE_SEC, -}; - struct samsung_i2s_variant_regs { unsigned int bfs_off; unsigned int rfs_off; @@ -54,7 +49,6 @@ struct samsung_i2s_variant_regs { }; struct samsung_i2s_dai_data { - int dai_type; u32 quirks; const struct samsung_i2s_variant_regs *i2s_variant_regs; }; @@ -1066,7 +1060,6 @@ static int samsung_i2s_dai_remove(struct snd_soc_dai *dai) static struct i2s_dai *i2s_alloc_dai(struct platform_device *pdev, bool sec) { struct i2s_dai *i2s; - int ret; i2s = devm_kzalloc(&pdev->dev, sizeof(struct i2s_dai), GFP_KERNEL); if (i2s == NULL) @@ -1091,28 +1084,10 @@ static struct i2s_dai *i2s_alloc_dai(struct platform_device *pdev, bool sec) i2s->i2s_dai_drv.capture.channels_max = 2; i2s->i2s_dai_drv.capture.rates = SAMSUNG_I2S_RATES; i2s->i2s_dai_drv.capture.formats = SAMSUNG_I2S_FMTS; - dev_set_drvdata(&i2s->pdev->dev, i2s); - } else { /* Create a new platform_device for Secondary */ - i2s->pdev = platform_device_alloc("samsung-i2s-sec", -1); - if (!i2s->pdev) - return NULL; - - i2s->pdev->dev.parent = &pdev->dev; - - platform_set_drvdata(i2s->pdev, i2s); - ret = platform_device_add(i2s->pdev); - if (ret < 0) - return NULL; } - return i2s; } -static void i2s_free_sec_dai(struct i2s_dai *i2s) -{ - platform_device_del(i2s->pdev); -} - #ifdef CONFIG_PM static int i2s_runtime_suspend(struct device *dev) { @@ -1231,22 +1206,6 @@ static int samsung_i2s_probe(struct platform_device *pdev) i2s_dai_data = (struct samsung_i2s_dai_data *) platform_get_device_id(pdev)->driver_data; - /* Call during the secondary interface registration */ - if (i2s_dai_data->dai_type == TYPE_SEC) { - sec_dai = dev_get_drvdata(&pdev->dev); - if (!sec_dai) { - dev_err(&pdev->dev, "Unable to get drvdata\n"); - return -EFAULT; - } - ret = samsung_asoc_dma_platform_register(&pdev->dev, - sec_dai->filter, "tx-sec", NULL); - if (ret != 0) - return ret; - - return devm_snd_soc_register_component(&sec_dai->pdev->dev, - &samsung_i2s_component, - &sec_dai->i2s_dai_drv, 1); - } pri_dai = i2s_alloc_dai(pdev, false); if (!pri_dai) { @@ -1318,6 +1277,12 @@ static int samsung_i2s_probe(struct platform_device *pdev) if (ret < 0) goto err_disable_clk; + ret = devm_snd_soc_register_component(&pdev->dev, + &samsung_i2s_component, + &pri_dai->i2s_dai_drv, 1); + if (ret < 0) + goto err_disable_clk; + if (quirks & QUIRK_SEC_DAI) { sec_dai = i2s_alloc_dai(pdev, true); if (!sec_dai) { @@ -1342,6 +1307,17 @@ static int samsung_i2s_probe(struct platform_device *pdev) sec_dai->idma_playback.addr = idma_addr; 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); + if (ret < 0) + goto err_disable_clk; + + ret = devm_snd_soc_register_component(&pdev->dev, + &samsung_i2s_component, + &sec_dai->i2s_dai_drv, 1); + if (ret < 0) + goto err_disable_clk; } if (i2s_pdata && i2s_pdata->cfg_gpio && i2s_pdata->cfg_gpio(pdev)) { @@ -1350,11 +1326,7 @@ static int samsung_i2s_probe(struct platform_device *pdev) goto err_disable_clk; } - ret = devm_snd_soc_register_component(&pri_dai->pdev->dev, - &samsung_i2s_component, - &pri_dai->i2s_dai_drv, 1); - if (ret < 0) - goto err_free_dai; + dev_set_drvdata(&pdev->dev, pri_dai); pm_runtime_enable(&pdev->dev); @@ -1364,9 +1336,6 @@ static int samsung_i2s_probe(struct platform_device *pdev) return 0; pm_runtime_disable(&pdev->dev); -err_free_dai: - if (sec_dai) - i2s_free_sec_dai(sec_dai); err_disable_clk: clk_disable_unprepare(pri_dai->clk); return ret; @@ -1374,25 +1343,18 @@ static int samsung_i2s_probe(struct platform_device *pdev) static int samsung_i2s_remove(struct platform_device *pdev) { - struct i2s_dai *i2s, *other; + struct i2s_dai *pri_dai, *sec_dai; - i2s = dev_get_drvdata(&pdev->dev); - other = get_other_dai(i2s); + pri_dai = dev_get_drvdata(&pdev->dev); + sec_dai = pri_dai->sec_dai; - if (other) { - other->pri_dai = NULL; - other->sec_dai = NULL; - } else { - pm_runtime_disable(&pdev->dev); - } + pri_dai->sec_dai = NULL; + sec_dai->pri_dai = NULL; - if (!is_secondary(i2s)) { - i2s_unregister_clock_provider(pdev); - clk_disable_unprepare(i2s->clk); - } + pm_runtime_disable(&pdev->dev); - i2s->pri_dai = NULL; - i2s->sec_dai = NULL; + i2s_unregister_clock_provider(pdev); + clk_disable_unprepare(pri_dai->clk); return 0; } @@ -1454,49 +1416,37 @@ static int samsung_i2s_remove(struct platform_device *pdev) }; static const struct samsung_i2s_dai_data i2sv3_dai_type = { - .dai_type = TYPE_PRI, .quirks = QUIRK_NO_MUXPSR, .i2s_variant_regs = &i2sv3_regs, }; static const struct samsung_i2s_dai_data i2sv5_dai_type = { - .dai_type = TYPE_PRI, .quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI | QUIRK_NEED_RSTCLR | QUIRK_SUPPORTS_IDMA, .i2s_variant_regs = &i2sv3_regs, }; static const struct samsung_i2s_dai_data i2sv6_dai_type = { - .dai_type = TYPE_PRI, .quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI | QUIRK_NEED_RSTCLR | QUIRK_SUPPORTS_TDM | QUIRK_SUPPORTS_IDMA, .i2s_variant_regs = &i2sv6_regs, }; static const struct samsung_i2s_dai_data i2sv7_dai_type = { - .dai_type = TYPE_PRI, .quirks = QUIRK_PRI_6CHAN | QUIRK_SEC_DAI | QUIRK_NEED_RSTCLR | QUIRK_SUPPORTS_TDM, .i2s_variant_regs = &i2sv7_regs, }; static const struct samsung_i2s_dai_data i2sv5_dai_type_i2s1 = { - .dai_type = TYPE_PRI, .quirks = QUIRK_PRI_6CHAN | QUIRK_NEED_RSTCLR, .i2s_variant_regs = &i2sv5_i2s1_regs, }; -static const struct samsung_i2s_dai_data samsung_dai_type_sec = { - .dai_type = TYPE_SEC, -}; - 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", - .driver_data = (kernel_ulong_t)&samsung_dai_type_sec, }, {}, };