diff options
author | Krishna Yarlagadda <kyarlagadda@nvidia.com> | 2013-05-02 17:30:46 +0530 |
---|---|---|
committer | Riham Haidar <rhaidar@nvidia.com> | 2013-06-11 17:29:56 -0700 |
commit | fd8b151aba563df1be5d57cae204bfee2ed5f4cb (patch) | |
tree | 2ecaf78c410d7af365dce19f37c4be8c6a08f408 | |
parent | 4eb9e7d8dfcb84257a46f7a68fb6b1914bbb6024 (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.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-tegra/board-pluto.c | 42 | ||||
-rw-r--r-- | arch/arm/mach-tegra/include/mach/xusb.h | 4 | ||||
-rw-r--r-- | arch/arm/mach-tegra/xusb.c | 8 | ||||
-rw-r--r-- | include/linux/platform_data/tegra_usb.h | 3 |
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_ */ |