From patchwork Tue Nov 5 01:49:43 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Chen X-Patchwork-Id: 3138811 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 5B2509F432 for ; Tue, 5 Nov 2013 02:30:10 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 3C7F9205F0 for ; Tue, 5 Nov 2013 02:30:08 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1C616205AC for ; Tue, 5 Nov 2013 02:30:07 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VdW8F-0003L6-Iu; Tue, 05 Nov 2013 02:12:41 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1VdW7J-0004Pc-FI; Tue, 05 Nov 2013 02:11:41 +0000 Received: from mail-db9lp0248.outbound.messaging.microsoft.com ([213.199.154.248] helo=db9outboundpool.messaging.microsoft.com) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1VdW6k-0004Iw-0N for linux-arm-kernel@lists.infradead.org; Tue, 05 Nov 2013 02:11:07 +0000 Received: from mail208-db9-R.bigfish.com (10.174.16.229) by DB9EHSOBE018.bigfish.com (10.174.14.81) with Microsoft SMTP Server id 14.1.225.22; Tue, 5 Nov 2013 02:10:44 +0000 Received: from mail208-db9 (localhost [127.0.0.1]) by mail208-db9-R.bigfish.com (Postfix) with ESMTP id 2A3F44401BF; Tue, 5 Nov 2013 02:10:44 +0000 (UTC) X-Forefront-Antispam-Report: CIP:70.37.183.190; KIP:(null); UIP:(null); IPV:NLI; H:mail.freescale.net; RD:none; EFVD:NLI X-SpamScore: 0 X-BigFish: VS0(zzzz1f42h2148h208ch1ee6h1de0h1fdah2073h2146h1202h1e76h1d1ah1d2ah1fc6hzz1de098h8275bh1de097hz2dh2a8h839hd24he5bhf0ah1288h12a5h12a9h12bdh12e5h137ah139eh13b6h1441h1504h1537h162dh1631h1758h1898h18e1h1946h19b5h1ad9h1b0ah1b2fh2222h1fb3h1d0ch1d2eh1d3fh1dfeh1dffh1e23h1fe8h1ff5h2218h2216h1155h) Received: from mail208-db9 (localhost.localdomain [127.0.0.1]) by mail208-db9 (MessageSwitch) id 1383617442118602_25561; Tue, 5 Nov 2013 02:10:42 +0000 (UTC) Received: from DB9EHSMHS016.bigfish.com (unknown [10.174.16.227]) by mail208-db9.bigfish.com (Postfix) with ESMTP id 171754A003F; Tue, 5 Nov 2013 02:10:42 +0000 (UTC) Received: from mail.freescale.net (70.37.183.190) by DB9EHSMHS016.bigfish.com (10.174.14.26) with Microsoft SMTP Server (TLS) id 14.16.227.3; Tue, 5 Nov 2013 02:10:41 +0000 Received: from az84smr01.freescale.net (10.64.34.197) by 039-SN1MMR1-002.039d.mgd.msft.net (10.84.1.15) with Microsoft SMTP Server (TLS) id 14.3.158.2; Tue, 5 Nov 2013 02:10:40 +0000 Received: from shlinux1.ap.freescale.net (shlinux1.ap.freescale.net [10.192.225.216]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id rA529fx5025151; Mon, 4 Nov 2013 19:10:35 -0700 From: Peter Chen To: , , , Subject: [PATCH v3 11/11] usb: phy-mxs: Add system suspend/resume API Date: Tue, 5 Nov 2013 09:49:43 +0800 Message-ID: <1383616183-10511-12-git-send-email-peter.chen@freescale.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1383616183-10511-1-git-send-email-peter.chen@freescale.com> References: <1383616183-10511-1-git-send-email-peter.chen@freescale.com> MIME-Version: 1.0 X-OriginatorOrg: freescale.com X-FOPE-CONNECTOR: Id%0$Dn%*$RO%0$TLS%0$FQDN%$TlsDn% X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20131104_211106_348064_E5BA2886 X-CRM114-Status: GOOD ( 16.94 ) X-Spam-Score: -1.9 (-) Cc: marex@denx.de, devicetree@vger.kernel.org, m.grzeschik@pengutronix.de, frank.li@freescale.com, linux-doc@vger.kernel.org, alexander.shishkin@linux.intel.com, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org, peter.chen@freescale.com, kernel@pengutronix.de, festevam@gmail.com, 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: , 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=BAYES_00, RCVD_IN_DNSWL_MED, 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 We need this to keep PHY's power on or off during the system suspend mode. If we need to enable USB wakeup, then we must keep PHY's power being on during the system suspend mode. Otherwise, we need to keep PHY's power being off to save power. Signed-off-by: Peter Chen --- drivers/usb/phy/phy-mxs-usb.c | 66 +++++++++++++++++++++++++++++++++++++++-- 1 files changed, 63 insertions(+), 3 deletions(-) diff --git a/drivers/usb/phy/phy-mxs-usb.c b/drivers/usb/phy/phy-mxs-usb.c index ff8b98c..4588c72 100644 --- a/drivers/usb/phy/phy-mxs-usb.c +++ b/drivers/usb/phy/phy-mxs-usb.c @@ -55,11 +55,18 @@ #define BM_USBPHY_DEBUG_CLKGATE BIT(30) /* Anatop Registers */ +#define ANADIG_ANA_MISC0 0x150 +#define ANADIG_ANA_MISC0_SET 0x154 +#define ANADIG_ANA_MISC0_CLR 0x158 + #define ANADIG_USB1_VBUS_DET_STAT 0x1c0 #define ANADIG_USB1_LOOPBACK_SET 0x1e4 #define ANADIG_USB1_LOOPBACK_CLR 0x1e8 +#define BM_ANADIG_ANA_MISC0_STOP_MODE_CONFIG BIT(12) +#define BM_ANADIG_ANA_MISC0_STOP_MODE_CONFIG_SL BIT(11) + #define BM_ANADIG_USB1_VBUS_DET_STAT_VBUS_VALID BIT(3) #define BM_ANADIG_USB1_LOOPBACK_UTMI_DIG_TST1 BIT(2) @@ -83,6 +90,15 @@ */ #define MXS_PHY_SENDING_SOF_TOO_FAST BIT(2) +/* imx23 style PHY */ +#define MXS_PHY_IMX23 BIT(3) + +/* imx6q style PHY */ +#define MXS_PHY_IMX6Q BIT(4) + +/* imx6sl style PHY */ +#define MXS_PHY_IMX6SL BIT(5) + /* * IC fix for MXS_PHY_ABNORAML_IN_SUSPEND, bit 17 is the effective bit * in HW_USBPHY_IP. @@ -100,19 +116,23 @@ struct mxs_phy_platform_flag { }; static const struct mxs_phy_platform_flag imx23_phy_data = { - .flags = MXS_PHY_ABNORAML_IN_SUSPEND | MXS_PHY_SENDING_SOF_TOO_FAST, + .flags = MXS_PHY_ABNORAML_IN_SUSPEND | + MXS_PHY_SENDING_SOF_TOO_FAST | + MXS_PHY_IMX23, }; static const struct mxs_phy_platform_flag imx6q_phy_data = { .flags = MXS_PHY_SENDING_SOF_TOO_FAST | MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS | - MXS_PHY_FIX_ABNORAML_IN_SUSPEND, + MXS_PHY_FIX_ABNORAML_IN_SUSPEND | + MXS_PHY_IMX6Q, }; static const struct mxs_phy_platform_flag imx6sl_phy_data = { .flags = MXS_PHY_DISCONNECT_LINE_WITHOUT_VBUS | MXS_PHY_FIX_ABNORAML_IN_SUSPEND | - MXS_PHY_FIX_SENDING_SOF_TOO_FAST, + MXS_PHY_FIX_SENDING_SOF_TOO_FAST | + MXS_PHY_IMX6SL, }; static const struct of_device_id mxs_phy_dt_ids[] = { @@ -210,6 +230,22 @@ static void mxs_phy_disconnect_line(struct mxs_phy *mxs_phy, bool on) ? "disconnected" : "connected"); } +static void mxs_phy_enable_ldo_in_suspend(struct mxs_phy *mxs_phy, bool on) +{ + unsigned int reg = on ? ANADIG_ANA_MISC0_SET : ANADIG_ANA_MISC0_CLR; + + /* If the SoCs don't have anatop, quit */ + if (!mxs_phy->regmap_anatop) + return; + + if (mxs_phy->flags & MXS_PHY_IMX6Q) + regmap_write(mxs_phy->regmap_anatop, reg, + BM_ANADIG_ANA_MISC0_STOP_MODE_CONFIG); + else if (mxs_phy->flags & MXS_PHY_IMX6SL) + regmap_write(mxs_phy->regmap_anatop, + reg, BM_ANADIG_ANA_MISC0_STOP_MODE_CONFIG_SL); +} + static int mxs_phy_init(struct usb_phy *phy) { struct mxs_phy *mxs_phy = to_mxs_phy(phy); @@ -395,6 +431,7 @@ static int mxs_phy_probe(struct platform_device *pdev) platform_set_drvdata(pdev, &mxs_phy->phy); + device_set_wakeup_capable(&pdev->dev, true); ret = usb_add_phy_dev(&mxs_phy->phy); if (ret) return ret; @@ -411,6 +448,28 @@ static int mxs_phy_remove(struct platform_device *pdev) return 0; } +static int mxs_phy_system_suspend(struct device *dev) +{ + struct mxs_phy *mxs_phy = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + mxs_phy_enable_ldo_in_suspend(mxs_phy, true); + + return 0; +} + +static int mxs_phy_system_resume(struct device *dev) +{ + struct mxs_phy *mxs_phy = dev_get_drvdata(dev); + + if (device_may_wakeup(dev)) + mxs_phy_enable_ldo_in_suspend(mxs_phy, false); + + return 0; +} + +SIMPLE_DEV_PM_OPS(mxs_phy_pm, mxs_phy_system_suspend, mxs_phy_system_resume); + static struct platform_driver mxs_phy_driver = { .probe = mxs_phy_probe, .remove = mxs_phy_remove, @@ -418,6 +477,7 @@ static struct platform_driver mxs_phy_driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, .of_match_table = mxs_phy_dt_ids, + .pm = &mxs_phy_pm, }, };