msm: 9615: Enable USB Host mode
In MDM9x15 CDP/MTP, there is no 5V LDO for USB VBUS.
So a board rework is required to power USB VBUS via an external
boost circut. The circut is enabled/disabled by a PMIC GPIO.
Change-Id: I124252666f56f88f85423527b087c8eea1268705
Signed-off-by: Amit Blay <ablay@codeaurora.org>
diff --git a/arch/arm/mach-msm/board-9615.c b/arch/arm/mach-msm/board-9615.c
index eddd4ed..44b78d1 100644
--- a/arch/arm/mach-msm/board-9615.c
+++ b/arch/arm/mach-msm/board-9615.c
@@ -623,11 +623,63 @@
.src_clk_rate = 24000000,
};
+#define USB_5V_EN 3
+#define PM_USB_5V_EN PM8018_GPIO_PM_TO_SYS(USB_5V_EN)
+
+static void msm_hsusb_vbus_power(bool on)
+{
+ int rc;
+ static bool vbus_is_on;
+ struct pm_gpio usb_vbus = {
+ .direction = PM_GPIO_DIR_OUT,
+ .pull = PM_GPIO_PULL_NO,
+ .output_buffer = PM_GPIO_OUT_BUF_CMOS,
+ .output_value = 0,
+ .vin_sel = 2,
+ .out_strength = PM_GPIO_STRENGTH_HIGH,
+ .function = PM_GPIO_FUNC_NORMAL,
+ .inv_int_pol = 0,
+ };
+
+ if (vbus_is_on == on)
+ return;
+
+ if (on) {
+ rc = pm8xxx_gpio_config(PM_USB_5V_EN, &usb_vbus);
+ if (rc) {
+ pr_err("failed to config usb_5v_en gpio\n");
+ return;
+ }
+
+ rc = gpio_request(PM_USB_5V_EN,
+ "usb_5v_en");
+ if (rc < 0) {
+ pr_err("failed to request usb_5v_en gpio\n");
+ return;
+ }
+
+ rc = gpio_direction_output(PM_USB_5V_EN, 1);
+ if (rc) {
+ pr_err("%s: unable to set_direction for gpio [%d]\n",
+ __func__, PM_USB_5V_EN);
+ goto free_usb_5v_en;
+ }
+
+ vbus_is_on = true;
+ return;
+ }
+ gpio_set_value(PM_USB_5V_EN, 0);
+free_usb_5v_en:
+ gpio_free(PM_USB_5V_EN);
+ vbus_is_on = false;
+}
+
static struct msm_otg_platform_data msm_otg_pdata = {
- .mode = USB_PERIPHERAL,
- .otg_control = OTG_NO_CONTROL,
+ .mode = USB_OTG,
+ .otg_control = OTG_PHY_CONTROL,
.phy_type = SNPS_28NM_INTEGRATED_PHY,
- .pclk_src_name = "dfab_usb_hs_clk",
+ .pclk_src_name = "dfab_usb_hs_clk",
+ .vbus_power = msm_hsusb_vbus_power,
};
static int usb_diag_update_pid_and_serial_num(uint32_t pid, const char *snum)
@@ -662,6 +714,7 @@
&msm_device_smd,
&msm_device_otg,
&msm_device_gadget_peripheral,
+ &msm_device_hsusb_host,
&android_usb_device,
&msm9615_device_uart_gsbi4,
&msm9615_device_ext_2p95v_vreg,
diff --git a/arch/arm/mach-msm/devices-9615.c b/arch/arm/mach-msm/devices-9615.c
index 88fd169..012eb85 100644
--- a/arch/arm/mach-msm/devices-9615.c
+++ b/arch/arm/mach-msm/devices-9615.c
@@ -145,6 +145,31 @@
},
};
+static struct resource resources_hsusb_host[] = {
+ {
+ .start = MSM9615_HSUSB_PHYS,
+ .end = MSM9615_HSUSB_PHYS + MSM9615_HSUSB_PHYS - 1,
+ .flags = IORESOURCE_MEM,
+ },
+ {
+ .start = USB1_HS_IRQ,
+ .end = USB1_HS_IRQ,
+ .flags = IORESOURCE_IRQ,
+ },
+};
+
+static u64 dma_mask = DMA_BIT_MASK(32);
+struct platform_device msm_device_hsusb_host = {
+ .name = "msm_hsusb_host",
+ .id = -1,
+ .num_resources = ARRAY_SIZE(resources_hsusb_host),
+ .resource = resources_hsusb_host,
+ .dev = {
+ .dma_mask = &dma_mask,
+ .coherent_dma_mask = 0xffffffff,
+ },
+};
+
static struct resource resources_uart_gsbi4[] = {
{
.start = GSBI4_UARTDM_IRQ,