From patchwork Wed Oct 14 01:57:38 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Chen X-Patchwork-Id: 7389661 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 49BDEBEEA4 for ; Wed, 14 Oct 2015 02:00:42 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3DF90209A8 for ; Wed, 14 Oct 2015 02:00:41 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 262D62099F for ; Wed, 14 Oct 2015 02:00:40 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZmBLI-0005sL-2e; Wed, 14 Oct 2015 01:59:00 +0000 Received: from mail-by2on0125.outbound.protection.outlook.com ([207.46.100.125] helo=na01-by2-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1ZmBLE-0005kQ-Rw for linux-arm-kernel@lists.infradead.org; Wed, 14 Oct 2015 01:58:57 +0000 Received: from BY2PR03CA063.namprd03.prod.outlook.com (10.141.249.36) by DM2PR0301MB0863.namprd03.prod.outlook.com (10.160.215.149) with Microsoft SMTP Server (TLS) id 15.1.293.16; Wed, 14 Oct 2015 01:58:34 +0000 Received: from BY2FFO11FD011.protection.gbl (2a01:111:f400:7c0c::182) by BY2PR03CA063.outlook.office365.com (2a01:111:e400:2c5d::36) with Microsoft SMTP Server (TLS) id 15.1.293.16 via Frontend Transport; Wed, 14 Oct 2015 01:58:34 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=freescale.com; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BY2FFO11FD011.mail.protection.outlook.com (10.1.14.129) with Microsoft SMTP Server (TLS) id 15.1.293.9 via Frontend Transport; Wed, 14 Oct 2015 01:58:33 +0000 Received: from shlinux2.ap.freescale.net (shlinux2.ap.freescale.net [10.192.224.44]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t9E1wUsf020912; Tue, 13 Oct 2015 18:58:30 -0700 From: Peter Chen To: , Subject: [PATCH v4 2/2] usb: chipidea: imx: refine clock operations to adapt for all platforms Date: Wed, 14 Oct 2015 09:57:38 +0800 Message-ID: <1444787859-31509-1-git-send-email-peter.chen@freescale.com> X-Mailer: git-send-email 1.9.1 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD011; 1:5uw/VTQdnfMt1mYC8rT+sidDFvIG+JPCaepawinKRF4bdDwCqQSMaKmLoAjP9mG+Pz0BU4xpw5TUe3r5DdYhZy4bas/XrF1V+QchkFg+17rlTvBz5u8GxdJXselR/KZy1w7prjrYEPElZQ68knHNJbA766UnB+U3aXtEVGK0em/XuGAFpo+Q8XwYc/YwB4qs3pPAO+9Ec49bw3HvbKpnBw9LX7x02NNFxreVHSlaoq7Nj0L3wz0FyfjkGxVIXA71LgF48Las6sD23MA5J6qtTiia4hphEJ2eSM5FyLsBVr0YHZQJF0Piv2UrU0t19Z07EPPI9UknOXLnqwg8XmjRR+zEdACpHxsjszRLMV3uFuCTpyLxhgbC/zLkA2pjqZrZQhWZcvQ4GRdqDx+BbK1vBA== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(50466002)(36756003)(6806005)(5007970100001)(104016004)(33646002)(11100500001)(106466001)(19580405001)(229853001)(77096005)(105606002)(19580395003)(92566002)(48376002)(46102003)(97736004)(47776003)(50986999)(5001920100001)(64706001)(5001770100001)(69596002)(189998001)(85426001)(87936001)(5001960100002)(81156007)(50226001)(5003940100001)(86362001)(5008740100001); DIR:OUT; SFP:1102; SCL:1; SRVR:DM2PR0301MB0863; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0863; 2:xqo2MKvoDJOGERdlgoWcYP6REanuDRvMew5DFbaOv6//H7p4pXnyncl3MvgBO3eW44q8+O8J8OnK/hqskT48ojZDN4vlh9s0joPlPvhBf2GTxfBIrVqRrY85OWMsyVUXmeJZnOQrkeAUEkvESZQ3RJFBKg0GBiY6I3qmwIo/tR4=; 3:LTrvo0NA5h9Vq7vYhCWjyG9qgxVy7c9xWGu4aDlkEDxKT6CBJDlSYzEl3qEK9iGR316NxfOHu3dseNaPNLJmMLV/PaBBwMeRzdf14l7eA7LA03Dmv6k0KNmwlJ5nx6eULhFcK+hFDdPKhXwyfx9rQ6EGdFAtLrNB+hVWg/M6IrEnXZAVI6d0rc2YtzeNr2W7KhWSr9InrXkYFAIaqzU38VKfvbCZzbcyuyapwS/XIBw=; 25:br9jBqQJTZh8PwJXSYhHkf2FckTs3wehQogOZb9NBgkcRU5mTPwYX70TWy4gfwPoj4/0wJINDJhrS3WvmsIVAM1Ar0HalrWQ4k7L4fYyaetUWfq0P6sWRHoy3wmXbJyKUs0p5hMTM3/wHDW80MAsLg3HlmeIGtQ3WE14dS5kVQ8hEbpPOLSBw5SdNBEcywuO2cxwYpteU9YAyb7q8EktTNAwvYV50G4G4ojgKS50B/qpvho+mQHj09rrolnrzgpjtUjIm07gFakWh/zA9BDaUw== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM2PR0301MB0863; X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0863; 20:FQLQNgcjniOajta3IOAxuKhONkj1iPTWje0aCsyar2kBOOxTCn7c7JW+XDRnWfjiAIJKBnjFMuywYOyi567MoNHzOIUMRBQCu+7xnuDei2C0yNvHeSaD6IH52O9iUDRy5SD9zm7vNamaUp4w9tyKV286BkvOBRVXRvFWZZQauBg/ylrWmyWl+eOVpyxcqPUy4iOZn3dUo5Ylvgk+HoCARy3R6QzzJ9IMuKUSE8pRPtdzECs55Ludy+hAduatHwMKkOZbqSYFdvA49w9iZlhoeBM16QeXCiyIehNMPtRl/GnrXzcbkrS4Qb/7okkTmSQKKGF98vAZ/+TCUxiclSIHLgAacUerIibTLNFxY4e6boo=; 4:FvmxYuXN2TC6NJK+O8ltUSefTLndWMMLnmwjjMKkCYPjjRP4JuDRpPN4AsWn+vCWt6P436ZQGmVIH2abFQyMyUEP9y/FG3adTHPlIIneO1SpTNkMdnOaa1zFmIfjj1APaeXKlTCV7Alww8Js9hDDoh0cSw3x0JZJU1BgKVamJDN7IRsZdIWgxrJw2oY2QADONYMxFSb7kOYjA9GNHExOzahKwDgv8fB/S+rvAHoU2dpH7WR6DoODBV5Q7+vZVpHMJBsIE3YBopZZ7vfss9rU4DwDUPzoGvkgDSh9zrLrTXIegxKTtruR85uUpfaMMjeMHYvNMi7niU2aBFI0xqbFbMahQmT3R4KpUqXUtNysCzM= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(8121501046)(5005006)(520078)(3002001); SRVR:DM2PR0301MB0863; BCL:0; PCL:0; RULEID:; SRVR:DM2PR0301MB0863; X-Forefront-PRVS: 0729050452 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM2PR0301MB0863; 23:vm9xSD6GDZ25bAwcWR/Yx1DAAzCQ94Iul4iupDH?= =?us-ascii?Q?75vYArEL/28BUyuf+rbKhDxppJXYEfltOCKxlWZ6sIpY/qe7rvJGHaShNoDD?= =?us-ascii?Q?TvxrJeIz4rWi7pRvzxoeW0AmICmdqE/xAiKwt173pfRRzeTAmFvt7/34qNoR?= =?us-ascii?Q?ykHHUc19TPFnzgktjA69czKXMLQcx9jkiUpCOWK20SfD/I3qZNFJQcf5aMX7?= =?us-ascii?Q?4fs8lUFMh7D81h6VgMoc0QhgV5WkGdepqjy49VPnyZ2tzqAM/VjGe07ITHyU?= =?us-ascii?Q?D1j/OQE69TEibPHIk+owJEHDbAQk5Gifv4Pvf3b1m1d09vpFrtG5BapAVX+l?= =?us-ascii?Q?qOV9UL1ZRsGDo5YOU377F6F81FTMb9YW5+jj13cj3l+mKl2LXcJkpUF/3znD?= =?us-ascii?Q?uNwqgxZGG9TmK6PxF+Dh2zjJ1Nte7RiCAhUtuH3HNlJfDL67g7BGepWPruqO?= =?us-ascii?Q?244rTtHngjhTlJNqkyKfBOGqN2w6Yk3kJjW7EuV44qF/Y23fvBBkHv1qyZlZ?= =?us-ascii?Q?6K98BdmDPwEzY6ADGDu2Wh6uxtlu3fbK0dIZiSzCfeCwn7r/ECZ/gt/M4qkZ?= =?us-ascii?Q?pODz9qwrj1a6KTw6wLW1IjYSTG7pI7A1LSr4rJn/L2GrJ6KB3Snwn3OCMEwp?= =?us-ascii?Q?8HeEKzqsirOwaZPTNGPCVbiUqiuJ8z9FPd9k1B48t7Uz1wofKNII/xUsj5dV?= =?us-ascii?Q?m5CPMTnHWDPT2TNRORw6EGoSFCvH/xvjfsabDeDL4E8DRW6jU/iYIIuquUVL?= =?us-ascii?Q?W1JH7vWg5yo+Y60POmbFlxxL7yWfxHzftiZc1iyRs+wXinYY0/ha3g+QCNkt?= =?us-ascii?Q?UVrOYHHw5fMvQGXWkB08l6qz/6yrhVj3+cjeAz3jTL0t11lGy9m+Rij/e2qy?= =?us-ascii?Q?tHr++c7HXwjr900DzCLUi3ZddhPN5p5Azrky1G7GP0fGM+O1FfHgDGaG00n/?= =?us-ascii?Q?zlPTfgPYXVLHTFeJd1XrtoWfFm75ATTVav2bT1bvKg/I+y7t8X4ANh0G4BJS?= =?us-ascii?Q?6GZLFM4Bp//z0TXMD/jfqqTiCW/zmmzN/HZlwU65ajblAifrzdhS9Q2/p9hq?= =?us-ascii?Q?l06szsqOoVac45W3C9+6rbgVnfiIU?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB0863; 5:A9PzFKGRw6d621mODr+3uZsS+L4mYIIoaal8JZ8XCWgNdqktslPJfVCV8XZYJVsQEMTf5CBHG6wJzDXFIQqwiK2qFsJyTo6g4Tc4Gu/UwK3J1g+HPVFdqzG1WEzEfB+kb0lFtylW3iufwUg9T1mv3A==; 24:DRpQ4HtqTdp010xkGwOuv0/GvKTgAdQ3diw1nibdssCaPcKhfatyZWCYbc4H3PeHjhJPF/yRRmxwZF+UqNeO98snRtG0r6WHVZDa+2Azlyo=; 20:HwFxUKhLPwQ40LIaFrUN9+Xkqt0rrbDrw3D5wNwKBLtaMS5QvKn5TtFBB34q41WUJAnPEEV7KJiNXrqzE8h75Q== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Oct 2015 01:58:33.8107 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB0863 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20151013_185856_994841_E1919CE8 X-CRM114-Status: GOOD ( 18.40 ) X-Spam-Score: -1.9 (-) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, fabio.estevam@freescale.com, pawel.moll@arm.com, stable@vger.kernel.org, robh+dt@kernel.org, Peter Chen , kernel@pengutronix.de, linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Some i.mx platforms need three clocks to let controller work, but others only need one, refine clock operation to adapt for all platforms, it fixes a regression found at i.mx27. Signed-off-by: Peter Chen Tested-by: Fabio Estevam Cc: #v4.1+ --- drivers/usb/chipidea/ci_hdrc_imx.c | 132 ++++++++++++++++++++++++++++++++----- 1 file changed, 114 insertions(+), 18 deletions(-) diff --git a/drivers/usb/chipidea/ci_hdrc_imx.c b/drivers/usb/chipidea/ci_hdrc_imx.c index 6ccbf60..82b1dfe 100644 --- a/drivers/usb/chipidea/ci_hdrc_imx.c +++ b/drivers/usb/chipidea/ci_hdrc_imx.c @@ -84,6 +84,12 @@ struct ci_hdrc_imx_data { struct imx_usbmisc_data *usbmisc_data; bool supports_runtime_pm; bool in_lpm; + /* SoC before i.mx6 (except imx23/imx28) needs three clks */ + bool need_three_clks; + struct clk *clk_ipg; + struct clk *clk_ahb; + struct clk *clk_per; + /* --------------------------------- */ }; /* Common functions shared by usbmisc drivers */ @@ -135,6 +141,103 @@ static struct imx_usbmisc_data *usbmisc_get_init_data(struct device *dev) } /* End of common functions shared by usbmisc drivers*/ +static int imx_get_clks(struct device *dev) +{ + struct ci_hdrc_imx_data *data = dev_get_drvdata(dev); + int ret = 0; + + data->clk_ipg = devm_clk_get(dev, "ipg"); + if (IS_ERR(data->clk_ipg)) { + /* If the platform only needs one clocks */ + data->clk = devm_clk_get(dev, NULL); + if (IS_ERR(data->clk)) { + ret = PTR_ERR(data->clk); + dev_err(dev, + "Failed to get clock, err=%d\n", ret); + dev_err(dev, + "Failed to get ipg clock, err=%d\n", ret); + return ret; + } + return ret; + } + + data->clk_ahb = devm_clk_get(dev, "ahb"); + if (IS_ERR(data->clk_ahb)) { + ret = PTR_ERR(data->clk_ahb); + dev_err(dev, + "Failed to get ahb clock, err=%d\n", ret); + return ret; + } + + data->clk_per = devm_clk_get(dev, "per"); + if (IS_ERR(data->clk_per)) { + ret = PTR_ERR(data->clk_per); + dev_err(dev, + "Failed to get per clock, err=%d\n", ret); + return ret; + } + + data->need_three_clks = true; + return ret; +} + +static int imx_prepare_enable_clks(struct device *dev) +{ + struct ci_hdrc_imx_data *data = dev_get_drvdata(dev); + int ret = 0; + + if (data->need_three_clks) { + ret = clk_prepare_enable(data->clk_ipg); + if (ret) { + dev_err(dev, + "Failed to prepare/enable ipg clk, err=%d\n", + ret); + return ret; + } + + ret = clk_prepare_enable(data->clk_ahb); + if (ret) { + dev_err(dev, + "Failed to prepare/enable ahb clk, err=%d\n", + ret); + clk_disable_unprepare(data->clk_ipg); + return ret; + } + + ret = clk_prepare_enable(data->clk_per); + if (ret) { + dev_err(dev, + "Failed to prepare/enable per clk, err=%d\n", + ret); + clk_disable_unprepare(data->clk_ahb); + clk_disable_unprepare(data->clk_ipg); + return ret; + } + } else { + ret = clk_prepare_enable(data->clk); + if (ret) { + dev_err(dev, + "Failed to prepare/enable clk, err=%d\n", + ret); + return ret; + } + } + + return ret; +} + +static void imx_disable_unprepare_clks(struct device *dev) +{ + struct ci_hdrc_imx_data *data = dev_get_drvdata(dev); + + if (data->need_three_clks) { + clk_disable_unprepare(data->clk_per); + clk_disable_unprepare(data->clk_ipg); + clk_disable_unprepare(data->clk_ahb); + } else { + clk_disable_unprepare(data->clk); + } +} static int ci_hdrc_imx_probe(struct platform_device *pdev) { @@ -153,23 +256,18 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) if (!data) return -ENOMEM; + platform_set_drvdata(pdev, data); data->usbmisc_data = usbmisc_get_init_data(&pdev->dev); if (IS_ERR(data->usbmisc_data)) return PTR_ERR(data->usbmisc_data); - data->clk = devm_clk_get(&pdev->dev, NULL); - if (IS_ERR(data->clk)) { - dev_err(&pdev->dev, - "Failed to get clock, err=%ld\n", PTR_ERR(data->clk)); - return PTR_ERR(data->clk); - } + ret = imx_get_clks(&pdev->dev); + if (ret) + return ret; - ret = clk_prepare_enable(data->clk); - if (ret) { - dev_err(&pdev->dev, - "Failed to prepare or enable clock, err=%d\n", ret); + ret = imx_prepare_enable_clks(&pdev->dev); + if (ret) return ret; - } data->phy = devm_usb_get_phy_by_phandle(&pdev->dev, "fsl,usbphy", 0); if (IS_ERR(data->phy)) { @@ -212,8 +310,6 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) goto disable_device; } - platform_set_drvdata(pdev, data); - if (data->supports_runtime_pm) { pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); @@ -226,7 +322,7 @@ static int ci_hdrc_imx_probe(struct platform_device *pdev) disable_device: ci_hdrc_remove_device(data->ci_pdev); err_clk: - clk_disable_unprepare(data->clk); + imx_disable_unprepare_clks(&pdev->dev); return ret; } @@ -240,7 +336,7 @@ static int ci_hdrc_imx_remove(struct platform_device *pdev) pm_runtime_put_noidle(&pdev->dev); } ci_hdrc_remove_device(data->ci_pdev); - clk_disable_unprepare(data->clk); + imx_disable_unprepare_clks(&pdev->dev); return 0; } @@ -252,7 +348,7 @@ static int imx_controller_suspend(struct device *dev) dev_dbg(dev, "at %s\n", __func__); - clk_disable_unprepare(data->clk); + imx_disable_unprepare_clks(dev); data->in_lpm = true; return 0; @@ -270,7 +366,7 @@ static int imx_controller_resume(struct device *dev) return 0; } - ret = clk_prepare_enable(data->clk); + ret = imx_prepare_enable_clks(dev); if (ret) return ret; @@ -285,7 +381,7 @@ static int imx_controller_resume(struct device *dev) return 0; clk_disable: - clk_disable_unprepare(data->clk); + imx_disable_unprepare_clks(dev); return ret; }