Signed-off-by: Pavankumar Kondeti <[email protected]>
---
 arch/arm/mach-msm/board-qsd8x50.c      |   59 ++++++++++++++++++++++++++++++++
 arch/arm/mach-msm/devices-qsd8x50.c    |   23 ++++++++++++
 arch/arm/mach-msm/include/mach/board.h |    5 +++
 3 files changed, 87 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-msm/board-qsd8x50.c 
b/arch/arm/mach-msm/board-qsd8x50.c
index e3cc807..976cb7c 100644
--- a/arch/arm/mach-msm/board-qsd8x50.c
+++ b/arch/arm/mach-msm/board-qsd8x50.c
@@ -20,6 +20,9 @@
 #include <linux/gpio.h>
 #include <linux/platform_device.h>
 #include <linux/delay.h>
+#include <linux/err.h>
+#include <linux/clk.h>
+#include <linux/usb/msm_hsusb.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
@@ -35,6 +38,60 @@
 
 extern struct sys_timer msm_timer;
 
+static int hsusb_phy_init_seq[] = {
+       0x08, 0x31,     /* Increase HS Driver Amplitude */
+       0x20, 0x32,     /* Enable and set Pre-Emphasis Depth to 10% */
+       -1 };
+
+static void hsusb_phy_reset(void)
+{
+       struct clk *phy_reset_clk;
+       int ret;
+
+       phy_reset_clk = clk_get(NULL, "usb_phy_clk");
+       if (IS_ERR(phy_reset_clk)) {
+               pr_err("%s: failed to get usb_phy_clk\n", __func__);
+               return;
+       }
+
+       ret = clk_reset(phy_reset_clk, CLK_RESET_ASSERT);
+       if (ret) {
+               pr_err("%s: phy clk assert failed\n", __func__);
+               clk_put(phy_reset_clk);
+               return;
+       }
+       usleep_range(1000, 1200);
+       ret = clk_reset(phy_reset_clk, CLK_RESET_DEASSERT);
+       if (ret)
+               pr_err("%s: phy clk deassert failed\n", __func__);
+       clk_put(phy_reset_clk);
+}
+
+static void hsusb_hw_reset(bool enable)
+{
+       struct clk *hs_clk;
+       int ret;
+
+       hs_clk = clk_get(NULL, "usb_hs_clk");
+       if (IS_ERR(hs_clk)) {
+               pr_err("%s: failed to get usb_hs_clk\n", __func__);
+               return;
+       }
+       ret = clk_reset(hs_clk, enable ? CLK_RESET_ASSERT : CLK_RESET_DEASSERT);
+       if (ret)
+               pr_err("%s: usb hs_clk %s failed\n", __func__,
+                               enable ? "assert" : "deassert");
+
+       clk_put(hs_clk);
+}
+
+
+static struct msm_hsusb_platform_data msm_hsusb_pdata = {
+       .phy_init_seq           = hsusb_phy_init_seq,
+       .phy_reset              = hsusb_phy_reset,
+       .hw_reset               = hsusb_hw_reset,
+};
+
 static struct msm_gpio uart3_config_data[] = {
        { GPIO_CFG(86, 1, GPIO_INPUT,   GPIO_PULL_DOWN, GPIO_2MA), "UART2_Rx"},
        { GPIO_CFG(87, 1, GPIO_OUTPUT,  GPIO_PULL_DOWN, GPIO_2MA), "UART2_Tx"},
@@ -42,6 +99,7 @@ static struct msm_gpio uart3_config_data[] = {
 
 static struct platform_device *devices[] __initdata = {
        &msm_device_uart3,
+       &msm_device_hsusb,
 };
 
 static void msm8x50_init_uart3(void)
@@ -65,6 +123,7 @@ static void __init qsd8x50_init_irq(void)
 static void __init qsd8x50_init(void)
 {
        msm8x50_init_uart3();
+       msm_device_hsusb.dev.platform_data = &msm_hsusb_pdata;
        platform_add_devices(devices, ARRAY_SIZE(devices));
 }
 
diff --git a/arch/arm/mach-msm/devices-qsd8x50.c 
b/arch/arm/mach-msm/devices-qsd8x50.c
index 4d4a507..74240e9 100644
--- a/arch/arm/mach-msm/devices-qsd8x50.c
+++ b/arch/arm/mach-msm/devices-qsd8x50.c
@@ -28,6 +28,29 @@
 
 #include <mach/mmc.h>
 
+static struct resource resources_hsusb[] = {
+       {
+               .start  = MSM_HSUSB_PHYS,
+               .end    = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE,
+               .flags  = IORESOURCE_MEM,
+       },
+       {
+               .start  = INT_USB_HS,
+               .end    = INT_USB_HS,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device msm_device_hsusb = {
+       .name           = "msm_hsusb",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(resources_hsusb),
+       .resource       = resources_hsusb,
+       .dev            = {
+               .coherent_dma_mask      = 0xffffffff,
+       },
+};
+
 static struct resource resources_uart3[] = {
        {
                .start  = INT_UART3,
diff --git a/arch/arm/mach-msm/include/mach/board.h 
b/arch/arm/mach-msm/include/mach/board.h
index 5a79bcf..6b69eda 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -44,5 +44,10 @@ void __init msm_acpu_clock_init(struct 
msm_acpu_clock_platform_data *);
 int __init msm_add_sdcc(unsigned int controller,
                        struct msm_mmc_platform_data *plat,
                        unsigned int stat_irq, unsigned long stat_irq_flags);
+#ifdef CONFIG_USB_MSM_72K
+void msm_hsusb_set_vbus_state(int online);
+#else
+static inline void msm_hsusb_set_vbus_state(int online) {}
+#endif
 
 #endif
-- 
1.7.1

-- 
Sent by a consultant of the Qualcomm Innovation Center, Inc.
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum.
--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to