From patchwork Fri Jun 6 14:20:10 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivek Gautam X-Patchwork-Id: 4312071 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4D7989F170 for ; Fri, 6 Jun 2014 14:24:52 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6AC752020F for ; Fri, 6 Jun 2014 14:24:50 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7BBFC201CD for ; Fri, 6 Jun 2014 14:24:49 +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 1Wsv0e-00066a-Mo; Fri, 06 Jun 2014 14:20:44 +0000 Received: from mail-pd0-x22d.google.com ([2607:f8b0:400e:c02::22d]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Wsv0b-00065Q-RM for linux-arm-kernel@lists.infradead.org; Fri, 06 Jun 2014 14:20:42 +0000 Received: by mail-pd0-f173.google.com with SMTP id v10so2479439pde.4 for ; Fri, 06 Jun 2014 07:20:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=VfdYFf4NAIMt2msM+UceNdhkDzHfr1FJJ1PeS90MqjI=; b=JP0tuHpPFbuwuqR/fO6GsAg1CsHyhR0sh1dA0MYEM5D7Z+eEVAM/k0hSpwAVGorHur ZWJ3r/GTnzep/U1EN6F2jb9MBKQWiG+t7EmHJoahL4n1abrJMZylquYfB6GK+FS7/oS0 r2C8lIeVpvArKShQsp0o4AH+lvcscld+wrCSmDayRDTtFwelfLIVVnYwhjtrFok5TtWK ygEacWFZxj+I8IPnT7+l9FHBY1kM6s9ig9XaPjoMjTyZSPzeuhTgrS7gP2y8zwDPlo3e NeBjNaVTcMZ+0Keu3jx3vkoFVymi4/YEX9O1lmEyVIsq20HE5hQBgSlCVuMqMfYeQjKY UeEA== X-Received: by 10.68.254.70 with SMTP id ag6mr7284726pbd.33.1402064421045; Fri, 06 Jun 2014 07:20:21 -0700 (PDT) Received: from vivek-linuxpc.sisodomain.com ([14.140.216.146]) by mx.google.com with ESMTPSA id no9sm36405569pbc.83.2014.06.06.07.20.17 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 06 Jun 2014 07:20:20 -0700 (PDT) From: Vivek Gautam To: linux-usb@vger.kernel.org, linux-samsung-soc@vger.kernel.org, gregkh@linuxfoundation.org Subject: [PATCH v2 1/2] usb: ehci-exynos: Make provision for vdd regulators Date: Fri, 6 Jun 2014 19:50:10 +0530 Message-Id: <1402064411-18244-1-git-send-email-gautam.vivek@samsung.com> X-Mailer: git-send-email 1.7.10.4 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140606_072041_903253_8303B544 X-CRM114-Status: GOOD ( 14.41 ) X-Spam-Score: 0.2 (/) Cc: kgene.kim@samsung.com, Jingoo Han , linux-kernel@vger.kernel.org, stern@rowland.harvard.edu, Vivek Gautam , linux-arm-kernel@lists.infradead.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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=-2.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, RP_MATCHES_RCVD, 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 Facilitate getting required 3.3V and 1.0V VDD supply for EHCI controller on Exynos. With patches for regulators' nodes merged in 3.15: c8c253f ARM: dts: Add regulator entries to smdk5420 275dcd2 ARM: dts: add max77686 pmic node for smdk5250, certain perripherals will now need to ensure that, they request VDD regulators in their drivers, and enable them so as to make them working. Signed-off-by: Vivek Gautam Cc: Jingoo Han --- Changes from v1: - Addressed review comments for making the regulators optional, and thus refactored the checks for the obtained regulators. drivers/usb/host/ehci-exynos.c | 59 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/drivers/usb/host/ehci-exynos.c b/drivers/usb/host/ehci-exynos.c index d1c7621..b788ddd 100644 --- a/drivers/usb/host/ehci-exynos.c +++ b/drivers/usb/host/ehci-exynos.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,8 @@ struct exynos_ehci_hcd { struct usb_phy *phy; struct usb_otg *otg; struct phy *phy_g[PHY_NUMBER]; + struct regulator *vdd33; + struct regulator *vdd10; }; #define to_exynos_ehci(hcd) (struct exynos_ehci_hcd *)(hcd_to_ehci(hcd)->priv) @@ -193,7 +196,31 @@ static int exynos_ehci_probe(struct platform_device *pdev) err = exynos_ehci_get_phy(&pdev->dev, exynos_ehci); if (err) - goto fail_clk; + goto fail_regulator1; + + exynos_ehci->vdd33 = devm_regulator_get(&pdev->dev, "vdd33"); + if (!IS_ERR(exynos_ehci->vdd33)) { + err = regulator_enable(exynos_ehci->vdd33); + if (err) { + dev_err(&pdev->dev, + "Failed to enable 3.3V Vdd supply\n"); + goto fail_regulator1; + } + } else { + dev_warn(&pdev->dev, "Regulator 3.3V Vdd supply not found\n"); + } + + exynos_ehci->vdd10 = devm_regulator_get(&pdev->dev, "vdd10"); + if (!IS_ERR(exynos_ehci->vdd10)) { + err = regulator_enable(exynos_ehci->vdd10); + if (err) { + dev_err(&pdev->dev, + "Failed to enable 1.0V Vdd supply\n"); + goto fail_regulator2; + } + } else { + dev_warn(&pdev->dev, "Regulator 1.0V Vdd supply not found\n"); + } skip_phy: @@ -262,6 +289,10 @@ fail_add_hcd: fail_io: clk_disable_unprepare(exynos_ehci->clk); fail_clk: + regulator_disable(exynos_ehci->vdd10); +fail_regulator2: + regulator_disable(exynos_ehci->vdd33); +fail_regulator1: usb_put_hcd(hcd); return err; } @@ -280,6 +311,11 @@ static int exynos_ehci_remove(struct platform_device *pdev) clk_disable_unprepare(exynos_ehci->clk); + if (!IS_ERR(exynos_ehci->vdd33)) + regulator_disable(exynos_ehci->vdd33); + if (!IS_ERR(exynos_ehci->vdd10)) + regulator_disable(exynos_ehci->vdd10); + usb_put_hcd(hcd); return 0; @@ -305,6 +341,11 @@ static int exynos_ehci_suspend(struct device *dev) clk_disable_unprepare(exynos_ehci->clk); + if (!IS_ERR(exynos_ehci->vdd33)) + regulator_disable(exynos_ehci->vdd33); + if (!IS_ERR(exynos_ehci->vdd10)) + regulator_disable(exynos_ehci->vdd10); + return rc; } @@ -314,6 +355,22 @@ static int exynos_ehci_resume(struct device *dev) struct exynos_ehci_hcd *exynos_ehci = to_exynos_ehci(hcd); int ret; + if (!IS_ERR(exynos_ehci->vdd33)) { + ret = regulator_enable(exynos_ehci->vdd33); + if (ret) { + dev_err(dev, "Failed to enable 3.3V Vdd supply\n"); + return ret; + } + } + + if (!IS_ERR(exynos_ehci->vdd10)) { + ret = regulator_enable(exynos_ehci->vdd10); + if (ret) { + dev_err(dev, "Failed to enable 1.0V Vdd supply\n"); + return ret; + } + } + clk_prepare_enable(exynos_ehci->clk); if (exynos_ehci->otg)