From patchwork Tue Mar 15 22:37:53 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Lechner X-Patchwork-Id: 8592871 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 4A387C0553 for ; Tue, 15 Mar 2016 22:48:34 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 499BD203AD for ; Tue, 15 Mar 2016 22:48:33 +0000 (UTC) Received: from bombadil.infradead.org (unknown [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 57BCB203AC for ; Tue, 15 Mar 2016 22:48:32 +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 1afxcF-00036Q-L8; Tue, 15 Mar 2016 22:39:03 +0000 Received: from vern.gendns.com ([206.190.152.46]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1afxbi-0002vU-Us for linux-arm-kernel@lists.infradead.org; Tue, 15 Mar 2016 22:38:34 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lechnology.com; s=default; h=References:In-Reply-To:Message-Id:Date:Subject :Cc:To:From; bh=anGbtMwnVvOiXgymyTBehqXr+d4l0TEQi/kpDc+kUjc=; b=oJx2wiblgLFHg lgzED7g6GfwCpNwRd1pseqSmCK+OuzPTZ5hMutKO5ND1MMgq2BM/mctdN76HKxmLUkZk/eROBY/Mv dE7e5/+5TOUhEUV43ecEk7B3z5z/RD5Gz8M8T8SmjpqNwjNDxTsLw7NpYfuZBaOXZbSibMHhMs5Ye xJa2NyA5H/oLqWDxesd1MjdG8lrwzbG0tGN0ylO6vWRi0XkoR65b0BMPkeanfnav3DalYV+t6r2/9 NzU+tSOFogDhL1ARhlduhWILQkVMz5Jh0O8OuWA7gab6kqwgoLKs8utTCaFG0Qm/3v+0k1QiGK8EM ly54TWQSw4QsZjuqvwH8w==; Received: from 108-198-5-147.lightspeed.okcbok.sbcglobal.net ([108.198.5.147]:36508 helo=freyr.lechnology.com) by vern.gendns.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES128-SHA256:128) (Exim 4.86_1) (envelope-from ) id 1afxbO-001vEs-Kz; Tue, 15 Mar 2016 18:38:10 -0400 From: David Lechner To: Sekhar Nori , Kevin Hilman , Alan Stern , Bin Liu , Petr Kulhavy Subject: [PATCH 5/5] usb: musb-da8xx: remove board-specific clock handling Date: Tue, 15 Mar 2016 17:37:53 -0500 Message-Id: <1458081473-8223-5-git-send-email-david@lechnology.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1458081473-8223-1-git-send-email-david@lechnology.com> References: <1458081473-8223-1-git-send-email-david@lechnology.com> X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - vern.gendns.com X-AntiAbuse: Original Domain - lists.infradead.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - lechnology.com X-Get-Message-Sender-Via: vern.gendns.com: authenticated_id: davidmain+lechnology.com/only user confirmed/virtual account not confirmed X-Authenticated-Sender: vern.gendns.com: davidmain@lechnology.com X-Source: X-Source-Args: X-Source-Dir: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160315_153831_175952_C1976B48 X-CRM114-Status: GOOD ( 15.13 ) X-Spam-Score: -2.0 (--) 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: Felipe Balbi , Russell King , David Lechner , Sergei Shtylyov , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-3.3 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RDNS_NONE,T_DKIM_INVALID,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 This driver should not have to worry about how the clocks are configured on a system. Added a usb20_phy clock to handle the USB 2.0 PLL clock externally. Also changed to using devm_ to simplify code a bit. Signed-off-by: David Lechner --- drivers/usb/musb/da8xx.c | 93 +++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 57 deletions(-) diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c index b03d3b8..4e4c872 100644 --- a/drivers/usb/musb/da8xx.c +++ b/drivers/usb/musb/da8xx.c @@ -87,50 +87,29 @@ struct da8xx_glue { struct platform_device *musb; struct platform_device *phy; struct clk *clk; + struct clk *phy_clk; }; -/* - * REVISIT (PM): we should be able to keep the PHY in low power mode most - * of the time (24 MHz oscillator and PLL off, etc.) by setting POWER.D0 - * and, when in host mode, autosuspending idle root ports... PHY_PLLON - * (overriding SUSPENDM?) then likely needs to stay off. - */ - static inline void phy_on(void) { u32 cfgchip2 = __raw_readl(CFGCHIP2); /* - * Start the on-chip PHY and its PLL. + * Most of the configuration is already done by the usb20_phy clock. + * We just need to enable the OTG PHY here. */ - cfgchip2 &= ~(CFGCHIP2_RESET | CFGCHIP2_PHYPWRDN | CFGCHIP2_OTGPWRDN); - cfgchip2 |= CFGCHIP2_PHY_PLLON; + cfgchip2 &= ~CFGCHIP2_OTGPWRDN; __raw_writel(cfgchip2, CFGCHIP2); - - pr_info("Waiting for USB PHY clock good...\n"); - while (!(__raw_readl(CFGCHIP2) & CFGCHIP2_PHYCLKGD)) - cpu_relax(); } static inline void phy_off(void) { u32 cfgchip2 = __raw_readl(CFGCHIP2); - - /* - * Ensure that USB 1.1 reference clock is not being sourced from - * USB 2.0 PHY. Otherwise do not power down the PHY. - */ - if (!(cfgchip2 & CFGCHIP2_USB1PHYCLKMUX) && - (cfgchip2 & CFGCHIP2_USB1SUSPENDM)) { - pr_warning("USB 1.1 clocked from USB 2.0 PHY -- " - "can't power it down\n"); - return; - } - /* - * Power down the on-chip PHY. + * Just turn off the OTG PHY. The usb20_phy clock takes care of + * everything else. */ - cfgchip2 |= CFGCHIP2_PHYPWRDN | CFGCHIP2_OTGPWRDN; + cfgchip2 |= CFGCHIP2_OTGPWRDN; __raw_writel(cfgchip2, CFGCHIP2); } @@ -489,38 +468,45 @@ static int da8xx_probe(struct platform_device *pdev) struct platform_device *musb; struct da8xx_glue *glue; struct platform_device_info pinfo; - struct clk *clk; - - int ret = -ENOMEM; + int ret; - glue = kzalloc(sizeof(*glue), GFP_KERNEL); + glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL); if (!glue) { dev_err(&pdev->dev, "failed to allocate glue context\n"); - goto err0; + return -ENOMEM; } - clk = clk_get(&pdev->dev, "usb20"); - if (IS_ERR(clk)) { + glue->clk = devm_clk_get(&pdev->dev, "usb20"); + if (IS_ERR(glue->clk)) { dev_err(&pdev->dev, "failed to get clock\n"); - ret = PTR_ERR(clk); - goto err3; + return PTR_ERR(glue->clk); } - ret = clk_enable(clk); + ret = clk_prepare_enable(glue->clk); if (ret) { dev_err(&pdev->dev, "failed to enable clock\n"); - goto err4; + return ret; } - glue->dev = &pdev->dev; - glue->clk = clk; + glue->phy_clk = devm_clk_get(&pdev->dev, "usb20_phy"); + if (IS_ERR(glue->phy_clk)) { + dev_err(&pdev->dev, "failed to get phy clock\n"); + return PTR_ERR(glue->phy_clk); + } + + ret = clk_prepare_enable(glue->phy_clk); + if (ret) { + dev_err(&pdev->dev, "failed to enable phy clock\n"); + goto err0; + } + glue->dev = &pdev->dev; pdata->platform_ops = &da8xx_ops; glue->phy = usb_phy_generic_register(); if (IS_ERR(glue->phy)) { ret = PTR_ERR(glue->phy); - goto err5; + goto err1; } platform_set_drvdata(pdev, glue); @@ -548,24 +534,18 @@ static int da8xx_probe(struct platform_device *pdev) if (IS_ERR(musb)) { ret = PTR_ERR(musb); dev_err(&pdev->dev, "failed to register musb device: %d\n", ret); - goto err6; + goto err2; } return 0; -err6: +err2: usb_phy_generic_unregister(glue->phy); - -err5: - clk_disable(clk); - -err4: - clk_put(clk); - -err3: - kfree(glue); - +err1: + clk_disable_unprepare(glue->phy_clk); err0: + clk_disable_unprepare(glue->clk); + return ret; } @@ -575,9 +555,8 @@ static int da8xx_remove(struct platform_device *pdev) platform_device_unregister(glue->musb); usb_phy_generic_unregister(glue->phy); - clk_disable(glue->clk); - clk_put(glue->clk); - kfree(glue); + clk_disable_unprepare(glue->phy_clk); + clk_disable_unprepare(glue->clk); return 0; }