summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrishna Yarlagadda <kyarlagadda@nvidia.com>2013-05-02 17:30:46 +0530
committerRiham Haidar <rhaidar@nvidia.com>2013-06-11 17:29:56 -0700
commitfd8b151aba563df1be5d57cae204bfee2ed5f4cb (patch)
tree2ecaf78c410d7af365dce19f37c4be8c6a08f408
parent4eb9e7d8dfcb84257a46f7a68fb6b1914bbb6024 (diff)
ARM: tegra: USB: Dynamic host load support
Enable platform data to load xhci dynamically when otg cable is connected Bug 1242148 Change-Id: I586f035ceedf49fb321242e7ac2e272620315d7a Signed-off-by: Krishna Yarlagadda <kyarlagadda@nvidia.com> Reviewed-on: http://git-master/r/234145 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/board-dalmore.c4
-rw-r--r--arch/arm/mach-tegra/board-pluto.c42
-rw-r--r--arch/arm/mach-tegra/include/mach/xusb.h4
-rw-r--r--arch/arm/mach-tegra/xusb.c8
-rw-r--r--include/linux/platform_data/tegra_usb.h3
5 files changed, 36 insertions, 25 deletions
diff --git a/arch/arm/mach-tegra/board-dalmore.c b/arch/arm/mach-tegra/board-dalmore.c
index a0a011273cf1..43f7249cc867 100644
--- a/arch/arm/mach-tegra/board-dalmore.c
+++ b/arch/arm/mach-tegra/board-dalmore.c
@@ -559,8 +559,10 @@ static void dalmore_xusb_init(void)
{
int usb_port_owner_info = tegra_get_usb_port_owner_info();
- if (usb_port_owner_info & UTMI2_PORT_OWNER_XUSB)
+ if (usb_port_owner_info & UTMI2_PORT_OWNER_XUSB) {
tegra_xusb_init(&xusb_bdata);
+ tegra_xusb_register();
+ }
}
static struct gpio modem_gpios[] = { /* Nemo modem */
diff --git a/arch/arm/mach-tegra/board-pluto.c b/arch/arm/mach-tegra/board-pluto.c
index 58b8df16547c..b52445b83936 100644
--- a/arch/arm/mach-tegra/board-pluto.c
+++ b/arch/arm/mach-tegra/board-pluto.c
@@ -735,6 +735,12 @@ static struct tegra_usb_platform_data tegra_ehci1_utmi_pdata = {
},
};
+static struct tegra_xusb_board_data xusb_bdata = {
+ .portmap = TEGRA_XUSB_SS_P0 | TEGRA_XUSB_USB2_P0,
+ /* ss_portmap[0:3] = SS0 map, ss_portmap[4:7] = SS1 map */
+ .ss_portmap = (TEGRA_XUSB_SS_PORT_MAP_USB2_P0 << 0),
+};
+
static struct tegra_usb_otg_data tegra_otg_pdata = {
.ehci_device = &tegra_ehci1_device,
.ehci_pdata = &tegra_ehci1_utmi_pdata,
@@ -1032,14 +1038,21 @@ static struct platform_device tegra_baseband_xmm_power2_device = {
static void pluto_usb_init(void)
{
int usb_port_owner_info = tegra_get_usb_port_owner_info();
-
- if (!(usb_port_owner_info & UTMI1_PORT_OWNER_XUSB)) {
- tegra_otg_device.dev.platform_data = &tegra_otg_pdata;
- platform_device_register(&tegra_otg_device);
-
- /* Setup the udc platform data */
- tegra_udc_device.dev.platform_data = &tegra_udc_pdata;
+ struct tegra_xusb_platform_data *xusb_pdata;
+
+ if ((usb_port_owner_info & UTMI1_PORT_OWNER_XUSB)) {
+ xusb_pdata = tegra_xusb_init(&xusb_bdata);
+ tegra_otg_pdata.is_xhci = true;
+ tegra_otg_pdata.xhci_device = &tegra_xhci_device;
+ tegra_otg_pdata.xhci_pdata = xusb_pdata;
+ } else {
+ tegra_otg_pdata.is_xhci = false;
}
+ tegra_otg_device.dev.platform_data = &tegra_otg_pdata;
+ platform_device_register(&tegra_otg_device);
+
+ /* Setup the udc platform data */
+ tegra_udc_device.dev.platform_data = &tegra_udc_pdata;
}
static void pluto_modem_init(void)
@@ -1132,23 +1145,9 @@ static void pluto_modem_init(void)
}
}
-static struct tegra_xusb_board_data xusb_bdata = {
- .portmap = TEGRA_XUSB_SS_P0 | TEGRA_XUSB_USB2_P0,
- /* ss_portmap[0:3] = SS0 map, ss_portmap[4:7] = SS1 map */
- .ss_portmap = (TEGRA_XUSB_SS_PORT_MAP_USB2_P0 << 0),
-};
-
-static void pluto_xusb_init(void)
-{
- int usb_port_owner_info = tegra_get_usb_port_owner_info();
-
- if (usb_port_owner_info & UTMI1_PORT_OWNER_XUSB)
- tegra_xusb_init(&xusb_bdata);
-}
#else
static void pluto_usb_init(void) { }
static void pluto_modem_init(void) { }
-static void pluto_xusb_init(void) { }
#endif
static void pluto_audio_init(void)
@@ -1269,7 +1268,6 @@ static void __init tegra_pluto_init(void)
pluto_i2c_init();
pluto_spi_init();
pluto_usb_init();
- pluto_xusb_init();
pluto_uart_init();
pluto_audio_init();
platform_add_devices(pluto_devices, ARRAY_SIZE(pluto_devices));
diff --git a/arch/arm/mach-tegra/include/mach/xusb.h b/arch/arm/mach-tegra/include/mach/xusb.h
index f0c215a460f5..6dc9f7373ef4 100644
--- a/arch/arm/mach-tegra/include/mach/xusb.h
+++ b/arch/arm/mach-tegra/include/mach/xusb.h
@@ -69,5 +69,7 @@ struct tegra_xusb_platform_data {
#define TEGRA_XUSB_NEED_HS_DISCONNECT_SW_WAR BIT(0)
-extern void tegra_xusb_init(struct tegra_xusb_board_data *bdata);
+extern struct tegra_xusb_platform_data *tegra_xusb_init(
+ struct tegra_xusb_board_data *bdata);
+extern void tegra_xusb_register(void);
#endif /* _XUSB_H */
diff --git a/arch/arm/mach-tegra/xusb.c b/arch/arm/mach-tegra/xusb.c
index 7405fde47e5a..ba87df5a20f8 100644
--- a/arch/arm/mach-tegra/xusb.c
+++ b/arch/arm/mach-tegra/xusb.c
@@ -45,7 +45,8 @@ static void tegra_xusb_read_usb_calib(void)
tegra_xusb_plat_data.hs_curr_level_pad1 = (usb_calib0 >> 15) & 0x3f;
}
-void tegra_xusb_init(struct tegra_xusb_board_data *bdata)
+struct tegra_xusb_platform_data *tegra_xusb_init(
+ struct tegra_xusb_board_data *bdata)
{
#ifdef CONFIG_ARCH_TEGRA_11x_SOC
tegra_xusb_plat_data.quirks |= TEGRA_XUSB_NEED_HS_DISCONNECT_SW_WAR;
@@ -59,6 +60,11 @@ void tegra_xusb_init(struct tegra_xusb_board_data *bdata)
#endif
tegra_xusb_read_usb_calib();
tegra_xusb_plat_data.bdata = bdata;
+ return &tegra_xusb_plat_data;
+}
+
+void tegra_xusb_register(void)
+{
tegra_xhci_device.dev.platform_data = &tegra_xusb_plat_data;
platform_device_register(&tegra_xhci_device);
}
diff --git a/include/linux/platform_data/tegra_usb.h b/include/linux/platform_data/tegra_usb.h
index 139ab617b252..22cf3783c4a8 100644
--- a/include/linux/platform_data/tegra_usb.h
+++ b/include/linux/platform_data/tegra_usb.h
@@ -147,9 +147,12 @@ struct tegra_usb_platform_data {
struct tegra_usb_otg_data {
struct platform_device *ehci_device;
struct tegra_usb_platform_data *ehci_pdata;
+ struct platform_device *xhci_device;
+ struct tegra_xusb_platform_data *xhci_pdata;
char *vbus_extcon_dev_name;
char *id_extcon_dev_name;
int id_det_gpio;
+ bool is_xhci;
};
#endif /* _TEGRA_USB_H_ */