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