From: Pavankumar Kondeti <pkondeti@codeaurora.org>
To: greg@kroah.com, linux-usb@vger.kernel.org
Cc: linux-arm-msm@vger.kernel.org,
Anji jonnala <anjir@codeaurora.org>,
Pavankumar Kondeti <pkondeti@codeaurora.org>
Subject: [PATCH 4/5] USB: OTG: msm: Configure PHY Analog and Digital voltage domains
Date: Thu, 28 Apr 2011 13:31:32 +0530 [thread overview]
Message-ID: <1303977693-18389-4-git-send-email-pkondeti@codeaurora.org> (raw)
In-Reply-To: <1303977693-18389-1-git-send-email-pkondeti@codeaurora.org>
From: Anji jonnala <anjir@codeaurora.org>
Signed-off-by: Anji jonnala <anjir@codeaurora.org>
Signed-off-by: Pavankumar Kondeti <pkondeti@codeaurora.org>
---
drivers/usb/otg/msm_otg.c | 194 ++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 193 insertions(+), 1 deletions(-)
diff --git a/drivers/usb/otg/msm_otg.c b/drivers/usb/otg/msm_otg.c
index 526a650..425418d 100644
--- a/drivers/usb/otg/msm_otg.c
+++ b/drivers/usb/otg/msm_otg.c
@@ -38,6 +38,7 @@
#include <linux/usb/hcd.h>
#include <linux/usb/msm_hsusb.h>
#include <linux/usb/msm_hsusb_hw.h>
+#include <linux/regulator/consumer.h>
#include <mach/clk.h>
@@ -45,6 +46,175 @@
#define DRIVER_NAME "msm_otg"
#define ULPI_IO_TIMEOUT_USEC (10 * 1000)
+
+#define USB_PHY_3P3_VOL_MIN 3050000 /* uV */
+#define USB_PHY_3P3_VOL_MAX 3300000 /* uV */
+#define USB_PHY_3P3_HPM_LOAD 50000 /* uA */
+#define USB_PHY_3P3_LPM_LOAD 4000 /* uA */
+
+#define USB_PHY_1P8_VOL_MIN 1800000 /* uV */
+#define USB_PHY_1P8_VOL_MAX 1800000 /* uV */
+#define USB_PHY_1P8_HPM_LOAD 50000 /* uA */
+#define USB_PHY_1P8_LPM_LOAD 4000 /* uA */
+
+#define USB_PHY_VDD_DIG_VOL_MIN 1000000 /* uV */
+#define USB_PHY_VDD_DIG_VOL_MAX 1320000 /* uV */
+
+static struct regulator *hsusb_3p3;
+static struct regulator *hsusb_1p8;
+static struct regulator *hsusb_vddcx;
+
+static int msm_hsusb_init_vddcx(struct msm_otg *motg, int init)
+{
+ int ret = 0;
+
+ if (init) {
+ hsusb_vddcx = regulator_get(motg->otg.dev, "HSUSB_VDDCX");
+ if (IS_ERR(hsusb_vddcx)) {
+ dev_err(motg->otg.dev, "unable to get hsusb vddcx\n");
+ return PTR_ERR(hsusb_vddcx);
+ }
+
+ ret = regulator_set_voltage(hsusb_vddcx,
+ USB_PHY_VDD_DIG_VOL_MIN,
+ USB_PHY_VDD_DIG_VOL_MAX);
+ if (ret) {
+ dev_err(motg->otg.dev, "unable to set the voltage"
+ "for hsusb vddcx\n");
+ regulator_put(hsusb_vddcx);
+ return ret;
+ }
+
+ ret = regulator_enable(hsusb_vddcx);
+ if (ret) {
+ dev_err(motg->otg.dev, "unable to enable hsusb vddcx\n");
+ regulator_put(hsusb_vddcx);
+ }
+ } else {
+ ret = regulator_set_voltage(hsusb_vddcx, 0,
+ USB_PHY_VDD_DIG_VOL_MIN);
+ if (ret) {
+ dev_err(motg->otg.dev, "unable to set the voltage"
+ "for hsusb vddcx\n");
+ return ret;
+ }
+ ret = regulator_disable(hsusb_vddcx);
+ if (ret) {
+ dev_err(motg->otg.dev, "unable to disable hsusb vddcx\n");
+ return ret;
+ }
+
+ regulator_put(hsusb_vddcx);
+ }
+
+ return ret;
+}
+
+static int msm_hsusb_ldo_init(struct msm_otg *motg, int init)
+{
+ int rc = 0;
+
+ if (init) {
+ hsusb_3p3 = regulator_get(motg->otg.dev, "HSUSB_3p3");
+ if (IS_ERR(hsusb_3p3)) {
+ dev_err(motg->otg.dev, "unable to get hsusb 3p3\n");
+ return PTR_ERR(hsusb_3p3);
+ }
+
+ rc = regulator_set_voltage(hsusb_3p3, USB_PHY_3P3_VOL_MIN,
+ USB_PHY_3P3_VOL_MAX);
+ if (rc) {
+ dev_err(motg->otg.dev, "unable to set voltage level for"
+ "hsusb 3p3\n");
+ goto put_3p3;
+ }
+ rc = regulator_enable(hsusb_3p3);
+ if (rc) {
+ dev_err(motg->otg.dev, "unable to enable the hsusb 3p3\n");
+ goto put_3p3_lpm;
+ }
+ hsusb_1p8 = regulator_get(motg->otg.dev, "HSUSB_1p8");
+ if (IS_ERR(hsusb_1p8)) {
+ dev_err(motg->otg.dev, "unable to get hsusb 1p8\n");
+ rc = PTR_ERR(hsusb_1p8);
+ goto put_3p3_lpm;
+ }
+ rc = regulator_set_voltage(hsusb_1p8, USB_PHY_1P8_VOL_MIN,
+ USB_PHY_1P8_VOL_MAX);
+ if (rc) {
+ dev_err(motg->otg.dev, "unable to set voltage level for"
+ "hsusb 1p8\n");
+ goto put_1p8;
+ }
+ rc = regulator_enable(hsusb_1p8);
+ if (rc) {
+ dev_err(motg->otg.dev, "unable to enable the hsusb 1p8\n");
+ goto disable_1p8;
+ }
+
+ return 0;
+ }
+
+disable_1p8:
+ regulator_set_voltage(hsusb_1p8, 0, USB_PHY_1P8_VOL_MAX);
+ regulator_disable(hsusb_1p8);
+put_1p8:
+ regulator_put(hsusb_1p8);
+put_3p3_lpm:
+ regulator_set_voltage(hsusb_3p3, 0, USB_PHY_3P3_VOL_MAX);
+put_3p3:
+ regulator_put(hsusb_3p3);
+ return rc;
+}
+
+static int msm_hsusb_ldo_set_mode(int on)
+{
+ int ret = 0;
+
+ if (!hsusb_1p8 || IS_ERR(hsusb_1p8)) {
+ pr_err("%s: HSUSB_1p8 is not initialized\n", __func__);
+ return -ENODEV;
+ }
+
+ if (!hsusb_3p3 || IS_ERR(hsusb_3p3)) {
+ pr_err("%s: HSUSB_3p3 is not initialized\n", __func__);
+ return -ENODEV;
+ }
+
+ if (on) {
+ ret = regulator_set_optimum_mode(hsusb_1p8,
+ USB_PHY_1P8_HPM_LOAD);
+ if (ret < 0) {
+ pr_err("%s: Unable to set HPM of the regulator:"
+ "HSUSB_1p8\n", __func__);
+ return ret;
+ }
+ ret = regulator_set_optimum_mode(hsusb_3p3,
+ USB_PHY_3P3_HPM_LOAD);
+ if (ret < 0) {
+ pr_err("%s: Unable to set HPM of the regulator:"
+ "HSUSB_3p3\n", __func__);
+ regulator_set_optimum_mode(hsusb_1p8,
+ USB_PHY_1P8_LPM_LOAD);
+ return ret;
+ }
+ } else {
+ ret = regulator_set_optimum_mode(hsusb_1p8,
+ USB_PHY_1P8_LPM_LOAD);
+ if (ret < 0)
+ pr_err("%s: Unable to set LPM of the regulator:"
+ "HSUSB_1p8\n", __func__);
+ ret = regulator_set_optimum_mode(hsusb_3p3,
+ USB_PHY_3P3_LPM_LOAD);
+ if (ret < 0)
+ pr_err("%s: Unable to set LPM of the regulator:"
+ "HSUSB_3p3\n", __func__);
+ }
+
+ pr_debug("reg (%s)\n", on ? "HPM" : "LPM");
+ return ret < 0 ? ret : 0;
+}
+
static int ulpi_read(struct otg_transceiver *otg, u32 reg)
{
struct msm_otg *motg = container_of(otg, struct msm_otg, otg);
@@ -353,7 +523,6 @@ static int msm_otg_resume(struct msm_otg *motg)
if (!IS_ERR(motg->pclk_src))
clk_enable(motg->pclk_src);
- clk_enable(motg->pclk);
clk_enable(motg->clk);
if (motg->core_clk)
clk_enable(motg->core_clk);
@@ -1297,6 +1466,24 @@ static int __init msm_otg_probe(struct platform_device *pdev)
clk_enable(motg->clk);
clk_enable(motg->pclk);
+
+ ret = msm_hsusb_init_vddcx(motg, 1);
+ if (ret) {
+ dev_err(&pdev->dev, "hsusb vddcx configuration failed\n");
+ goto free_regs;
+ }
+
+ ret = msm_hsusb_ldo_init(motg, 1);
+ if (ret) {
+ dev_err(&pdev->dev, "hsusb vreg configuration failed\n");
+ goto free_config_vddcx;
+ }
+ ret = msm_hsusb_ldo_set_mode(1);
+ if (ret) {
+ dev_err(&pdev->dev, "hsusb vreg enable failed\n");
+ goto free_ldo_init;
+ }
+
if (motg->core_clk)
clk_enable(motg->core_clk);
@@ -1345,6 +1532,10 @@ free_irq:
disable_clks:
clk_disable(motg->pclk);
clk_disable(motg->clk);
+free_ldo_init:
+ msm_hsusb_ldo_init(motg, 0);
+free_config_vddcx:
+ msm_hsusb_init_vddcx(motg, 0);
free_regs:
iounmap(motg->regs);
put_core_clk:
@@ -1409,6 +1600,7 @@ static int __devexit msm_otg_remove(struct platform_device *pdev)
clk_disable(motg->pclk_src);
clk_put(motg->pclk_src);
}
+ msm_hsusb_ldo_init(motg, 0);
iounmap(motg->regs);
pm_runtime_set_suspended(&pdev->dev);
--
Sent by a consultant of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
next prev parent reply other threads:[~2011-04-28 8:01 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-28 8:01 [PATCH 1/5] USB: gadget: Use Zero Interrupt Threshold Control for ci13xxx_msm Pavankumar Kondeti
2011-04-28 8:01 ` [PATCH 2/5] USB: OTG: vote for dayatona fabric clock Pavankumar Kondeti
2011-04-28 8:01 ` [PATCH 3/5] USB: OTG: msm: Implement charger detection Pavankumar Kondeti
2011-04-28 8:01 ` Pavankumar Kondeti [this message]
2011-04-29 10:14 ` [PATCH 4/5] USB: OTG: msm: Configure PHY Analog and Digital voltage domains Sergei Shtylyov
2011-05-02 6:03 ` Pavan Kondeti
2011-04-28 8:01 ` [PATCH 5/5] USB: OTG: msm: Add PHY suspend support for MSM8960 Pavankumar Kondeti
2011-04-28 14:49 ` Sergei Shtylyov
2011-04-29 5:20 ` Pavan Kondeti
2011-04-28 12:18 ` [PATCH 1/5] USB: gadget: Use Zero Interrupt Threshold Control for ci13xxx_msm Sergei Shtylyov
2011-04-29 5:16 ` Pavan Kondeti
2011-04-29 5:22 ` Pavankumar Kondeti
2011-04-29 5:22 ` [PATCH 2/5] USB: OTG: vote for dayatona fabric clock Pavankumar Kondeti
[not found] ` <1304054532-3523-1-git-send-email-pkondeti-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-04-29 5:22 ` [PATCH 3/5] USB: OTG: msm: Implement charger detection Pavankumar Kondeti
2011-04-29 5:22 ` [PATCH 5/5] USB: OTG: msm: Add PHY suspend support for MSM8960 Pavankumar Kondeti
2011-04-29 5:22 ` [PATCH 4/5] USB: OTG: msm: Configure PHY Analog and Digital voltage domains Pavankumar Kondeti
2011-05-02 6:36 ` [PATCH V2 0/5] USB Charging, PHY init and suspend support for MSM8960 Pavankumar Kondeti
2011-05-02 6:36 ` [PATCH V2 1/5] USB: gadget: Use Zero Interrupt Threshold Control for ci13xxx_msm Pavankumar Kondeti
2011-05-02 6:36 ` [PATCH V2 2/5] USB: OTG: vote for dayatona fabric clock Pavankumar Kondeti
2011-05-02 6:36 ` [PATCH V2 3/5] USB: OTG: msm: Implement charger detection Pavankumar Kondeti
[not found] ` <1304318192-24374-1-git-send-email-pkondeti-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-02 6:36 ` [PATCH V2 4/5] USB: OTG: msm: Configure PHY Analog and Digital voltage domains Pavankumar Kondeti
2011-05-02 6:36 ` [PATCH V2 5/5] USB: OTG: msm: Add PHY suspend support for MSM8960 Pavankumar Kondeti
2011-05-02 12:22 ` Sergei Shtylyov
2011-05-03 5:01 ` Pavan Kondeti
[not found] ` <1303977693-18389-1-git-send-email-pkondeti-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-02 9:58 ` [PATCH V3 0/5] USB Charging, PHY init and " Pavankumar Kondeti
[not found] ` <1304330325-21982-1-git-send-email-pkondeti-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-02 9:58 ` [PATCH V3 1/5] USB: gadget: Use Zero Interrupt Threshold Control for ci13xxx_msm Pavankumar Kondeti
2011-05-02 9:58 ` [PATCH V3 2/5] USB: OTG: msm: vote for dayatona fabric clock Pavankumar Kondeti
2011-05-02 9:58 ` [PATCH V3 3/5] USB: OTG: msm: Implement charger detection Pavankumar Kondeti
2011-05-02 9:58 ` [PATCH V3 4/5] USB: OTG: msm: Configure PHY Analog and Digital voltage domains Pavankumar Kondeti
2011-05-02 9:58 ` [PATCH V3 5/5] USB: OTG: msm: Add PHY suspend support for MSM8960 Pavankumar Kondeti
2011-05-03 5:13 ` [PATCH V4 0/5] USB Charging, PHY init and " Pavankumar Kondeti
[not found] ` <1304399633-16120-1-git-send-email-pkondeti-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-03 5:13 ` [PATCH V4 1/5] USB: gadget: Use Zero Interrupt Threshold Control for ci13xxx_msm Pavankumar Kondeti
2011-05-03 5:13 ` [PATCH V4 2/5] USB: OTG: msm: vote for dayatona fabric clock Pavankumar Kondeti
[not found] ` <1304399633-16120-3-git-send-email-pkondeti-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-03 11:14 ` Sergei Shtylyov
2011-05-03 12:29 ` Pavan Kondeti
2011-05-03 17:15 ` Greg KH
2011-05-04 4:48 ` Pavan Kondeti
2011-05-03 5:13 ` [PATCH V4 3/5] USB: OTG: msm: Implement charger detection Pavankumar Kondeti
2011-05-03 5:13 ` [PATCH V4 4/5] USB: OTG: msm: Configure PHY Analog and Digital voltage domains Pavankumar Kondeti
2011-05-03 5:13 ` [PATCH V4 5/5] USB: OTG: msm: Add PHY suspend support for MSM8960 Pavankumar Kondeti
2011-05-04 4:49 ` [PATCH V5 0/4] USB Charging, PHY init and " Pavankumar Kondeti
2011-05-04 4:49 ` [PATCH V5 1/4] USB: OTG: msm: vote for dayatona fabric clock Pavankumar Kondeti
2011-05-04 4:49 ` [PATCH V5 2/4] USB: OTG: msm: Implement charger detection Pavankumar Kondeti
[not found] ` <1304484589-17186-1-git-send-email-pkondeti-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2011-05-04 4:49 ` [PATCH V5 3/4] USB: OTG: msm: Configure PHY Analog and Digital voltage domains Pavankumar Kondeti
2011-05-04 4:49 ` [PATCH V5 4/4] USB: OTG: msm: Add PHY suspend support for MSM8960 Pavankumar Kondeti
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1303977693-18389-4-git-send-email-pkondeti@codeaurora.org \
--to=pkondeti@codeaurora.org \
--cc=anjir@codeaurora.org \
--cc=greg@kroah.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).