From patchwork Fri May 31 10:13:06 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Hebbar, Gururaja" X-Patchwork-Id: 2641961 Return-Path: X-Original-To: patchwork-davinci@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from bear.ext.ti.com (bear.ext.ti.com [192.94.94.41]) by patchwork2.kernel.org (Postfix) with ESMTP id BBA18DFB79 for ; Fri, 31 May 2013 10:14:40 +0000 (UTC) Received: from dlelxv90.itg.ti.com ([172.17.2.17]) by bear.ext.ti.com (8.13.7/8.13.7) with ESMTP id r4VAD7Ji024095; Fri, 31 May 2013 05:13:07 -0500 Received: from DLEE71.ent.ti.com (dlee71.ent.ti.com [157.170.170.114]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id r4VAD7A4007794; Fri, 31 May 2013 05:13:07 -0500 Received: from dlelxv23.itg.ti.com (172.17.1.198) by DLEE71.ent.ti.com (157.170.170.114) with Microsoft SMTP Server id 14.2.342.3; Fri, 31 May 2013 05:13:07 -0500 Received: from linux.omap.com (dlelxs01.itg.ti.com [157.170.227.31]) by dlelxv23.itg.ti.com (8.13.8/8.13.8) with ESMTP id r4VAD78N008493; Fri, 31 May 2013 05:13:07 -0500 Received: from linux.omap.com (localhost [127.0.0.1]) by linux.omap.com (Postfix) with ESMTP id BC6C480627; Fri, 31 May 2013 05:13:06 -0500 (CDT) X-Original-To: davinci-linux-open-source@linux.davincidsp.com Delivered-To: davinci-linux-open-source@linux.davincidsp.com Received: from dlelxv90.itg.ti.com (dlelxv90.itg.ti.com [172.17.2.17]) by linux.omap.com (Postfix) with ESMTP id 69F4580630 for ; Fri, 31 May 2013 05:11:20 -0500 (CDT) Received: from DLEE71.ent.ti.com (dlee71.ent.ti.com [157.170.170.114]) by dlelxv90.itg.ti.com (8.14.3/8.13.8) with ESMTP id r4VABJHo003558; Fri, 31 May 2013 05:11:19 -0500 Received: from dlelxv24.itg.ti.com (172.17.1.199) by DLEE71.ent.ti.com (157.170.170.114) with Microsoft SMTP Server id 14.2.342.3; Fri, 31 May 2013 05:11:19 -0500 Received: from ucmsshproxy.india.ext.ti.com (dbdp20.itg.ti.com [172.24.170.38]) by dlelxv24.itg.ti.com (8.13.8/8.13.8) with SMTP id r4VABE5b016837; Fri, 31 May 2013 05:11:15 -0500 Received: from symphony.india.ext.ti.com (unknown [192.168.247.13]) by ucmsshproxy.india.ext.ti.com (Postfix) with ESMTP id 501EE158008; Fri, 31 May 2013 15:41:13 +0530 (IST) Received: from ubuntu-psp-linux.india.ext.ti.com (ubuntu-psp-linux [192.168.247.46]) by symphony.india.ext.ti.com (8.11.7p1+Sun/8.11.7) with ESMTP id r4VABCR05847; Fri, 31 May 2013 15:41:12 +0530 (IST) From: Hebbar Gururaja To: , , , Subject: [PATCH 06/11] usb: musb: dsps: Adopt pinctrl support Date: Fri, 31 May 2013 15:43:06 +0530 Message-ID: <1369995191-20855-7-git-send-email-gururaja.hebbar@ti.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1369995191-20855-1-git-send-email-gururaja.hebbar@ti.com> References: <1369995191-20855-1-git-send-email-gururaja.hebbar@ti.com> MIME-Version: 1.0 CC: , , Greg Kroah-Hartman , , , , Felipe Balbi , X-BeenThere: davinci-linux-open-source@linux.davincidsp.com X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: Errors-To: davinci-linux-open-source-bounces@linux.davincidsp.com Amend the musb controller to optionally take a pin control handle and set the state of the pins to: - "default" on boot, resume - "sleep" on suspend() By optionally putting the pins into sleep state in the suspend callback we can accomplish two things. - One is to minimize current leakage from pins and thus save power, - second, we can prevent the IP from driving pins output in an uncontrolled manner, which may happen if the power domain drops the domain regulator. If any of the above pin states are missing in dt, a warning message about the missing state is displayed. If certain pin-states are not available, to remove this warning message pass respective state name with null phandler. Todo: - if an idle state is available for pins, add support for it. Signed-off-by: Hebbar Gururaja Cc: Felipe Balbi Cc: Greg Kroah-Hartman Cc: linux-usb@vger.kernel.org --- :100644 100644 e1b661d... a9580fe... M drivers/usb/musb/musb_dsps.c drivers/usb/musb/musb_dsps.c | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c index e1b661d..a9580fe 100644 --- a/drivers/usb/musb/musb_dsps.c +++ b/drivers/usb/musb/musb_dsps.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -124,6 +125,11 @@ struct dsps_glue { struct timer_list timer[2]; /* otg_workaround timer */ unsigned long last_timer[2]; /* last timer data for each instance */ u32 __iomem *usb_ctrl[2]; + + /* two pin states - default, sleep */ + struct pinctrl *pinctrl; + struct pinctrl_state *pins_default; + struct pinctrl_state *pins_sleep; }; #define DSPS_AM33XX_CONTROL_MODULE_PHYS_0 0x44e10620 @@ -636,6 +642,36 @@ static int dsps_probe(struct platform_device *pdev) ret = -ENOMEM; goto err1; } + + glue->pinctrl = devm_pinctrl_get(&pdev->dev); + if (!IS_ERR(glue->pinctrl)) { + glue->pins_default = pinctrl_lookup_state(glue->pinctrl, + PINCTRL_STATE_DEFAULT); + if (IS_ERR(glue->pins_default)) + dev_dbg(&pdev->dev, "could not get default pinstate\n"); + else + if (pinctrl_select_state(glue->pinctrl, + glue->pins_default)) + dev_err(&pdev->dev, + "could not set default pinstate\n"); + + glue->pins_sleep = pinctrl_lookup_state(glue->pinctrl, + PINCTRL_STATE_SLEEP); + if (IS_ERR(glue->pins_sleep)) + dev_dbg(&pdev->dev, "could not get sleep pinstate\n"); + } else { + /* + * Since we continue even when pinctrl node is not found, + * Invalidate pins as not available. This is to make sure that + * IS_ERR(pins_xxx) results in failure when used. + */ + glue->pins_default = ERR_PTR(-ENODATA); + glue->pins_sleep = ERR_PTR(-ENODATA); + + dev_dbg(&pdev->dev, "did not get pins for i2c error: %li\n", + PTR_ERR(glue->pinctrl)); + } + platform_set_drvdata(pdev, glue); /* enable the usbss clocks */ @@ -700,6 +736,11 @@ static int dsps_suspend(struct device *dev) for (i = 0; i < wrp->instances; i++) musb_dsps_phy_control(glue, i, 0); + /* Optionally let pins go into sleep states */ + if (!IS_ERR(glue->pins_sleep)) + if (pinctrl_select_state(glue->pinctrl, glue->pins_sleep)) + dev_err(dev, "could not set pins to sleep state\n"); + return 0; } @@ -710,6 +751,11 @@ static int dsps_resume(struct device *dev) const struct dsps_musb_wrapper *wrp = glue->wrp; int i; + /* Optionaly enable pins to be muxed in and configured */ + if (!IS_ERR(glue->pins_default)) + if (pinctrl_select_state(glue->pinctrl, glue->pins_default)) + dev_err(dev, "could not set default pins\n"); + for (i = 0; i < wrp->instances; i++) musb_dsps_phy_control(glue, i, 1);