diff options
author | Varun Wadekar <vwadekar@nvidia.com> | 2011-06-29 18:21:40 +0530 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-07-11 13:47:50 -0700 |
commit | c7885a11d80a0cfcaddad6863609d220b70e5787 (patch) | |
tree | 085b6d9f9ebcf7488071f674f4ec51c9bc88059b /arch/arm/mach-tegra/board-whistler.c | |
parent | cf2a75a8f5ce6ad268b885424e8503dbfe641c7d (diff) |
arm: tegra: whistler: enable usb rndis support
Bug 842809
Reviewed-on: http://git-master/r/#change,38960
(cherry picked from commit 1c6ab84d33c5c8a2715d52a41ed3cf5b29663fb2)
Change-Id: I8df83e281b8c488733bfd3ba0b3dabc1e51edc92
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/39325
Reviewed-by: Varun Colbert <vcolbert@nvidia.com>
Tested-by: Varun Colbert <vcolbert@nvidia.com>
Diffstat (limited to 'arch/arm/mach-tegra/board-whistler.c')
-rw-r--r-- | arch/arm/mach-tegra/board-whistler.c | 120 |
1 files changed, 91 insertions, 29 deletions
diff --git a/arch/arm/mach-tegra/board-whistler.c b/arch/arm/mach-tegra/board-whistler.c index 625713f42818..f71a2e08fd01 100644 --- a/arch/arm/mach-tegra/board-whistler.c +++ b/arch/arm/mach-tegra/board-whistler.c @@ -168,34 +168,81 @@ static __initdata struct tegra_clk_init_table whistler_clk_init_table[] = { { NULL, NULL, 0, 0}, }; -static char *usb_functions[] = { "mtp", "usb_mass_storage" }; -static char *usb_functions_adb[] = { "mtp", "adb", "usb_mass_storage" }; +#define USB_MANUFACTURER_NAME "NVIDIA" +#define USB_PRODUCT_NAME "Whistler" +#define USB_PRODUCT_ID_MTP_ADB 0x7100 +#define USB_PRODUCT_ID_MTP 0x7102 +#define USB_PRODUCT_ID_RNDIS 0x7103 +#define USB_VENDOR_ID 0x0955 + +static char *usb_functions_mtp_ums[] = { "mtp", "usb_mass_storage" }; +static char *usb_functions_mtp_adb_ums[] = { "mtp", "adb", "usb_mass_storage" }; +#ifdef CONFIG_USB_ANDROID_RNDIS +static char *usb_functions_rndis[] = { "rndis" }; +static char *usb_functions_rndis_adb[] = { "rndis", "adb" }; +#endif +static char *usb_functions_all[] = { +#ifdef CONFIG_USB_ANDROID_RNDIS + "rndis", +#endif + "mtp", + "adb", + "usb_mass_storage" +}; static struct android_usb_product usb_products[] = { { - .product_id = 0x7102, - .num_functions = ARRAY_SIZE(usb_functions), - .functions = usb_functions, + .product_id = USB_PRODUCT_ID_MTP, + .num_functions = ARRAY_SIZE(usb_functions_mtp_ums), + .functions = usb_functions_mtp_ums, }, { - .product_id = 0x7100, - .num_functions = ARRAY_SIZE(usb_functions_adb), - .functions = usb_functions_adb, + .product_id = USB_PRODUCT_ID_MTP_ADB, + .num_functions = ARRAY_SIZE(usb_functions_mtp_adb_ums), + .functions = usb_functions_mtp_adb_ums, }, +#ifdef CONFIG_USB_ANDROID_RNDIS + { + .product_id = USB_PRODUCT_ID_RNDIS, + .num_functions = ARRAY_SIZE(usb_functions_rndis), + .functions = usb_functions_rndis, + }, + { + .product_id = USB_PRODUCT_ID_RNDIS, + .num_functions = ARRAY_SIZE(usb_functions_rndis_adb), + .functions = usb_functions_rndis_adb, + }, +#endif }; /* standard android USB platform data */ static struct android_usb_platform_data andusb_plat = { - .vendor_id = 0x0955, - .product_id = 0x7100, - .manufacturer_name = "NVIDIA", - .product_name = "Whistler", + .vendor_id = USB_VENDOR_ID, + .product_id = USB_PRODUCT_ID_MTP_ADB, + .manufacturer_name = USB_MANUFACTURER_NAME, + .product_name = USB_PRODUCT_NAME, .serial_number = NULL, .num_products = ARRAY_SIZE(usb_products), .products = usb_products, - .num_functions = ARRAY_SIZE(usb_functions_adb), - .functions = usb_functions_adb, + .num_functions = ARRAY_SIZE(usb_functions_all), + .functions = usb_functions_all, +}; + +#ifdef CONFIG_USB_ANDROID_RNDIS +static struct usb_ether_platform_data rndis_pdata = { + .ethaddr = {0, 0, 0, 0, 0, 0}, + .vendorID = USB_VENDOR_ID, + .vendorDescr = USB_MANUFACTURER_NAME, +}; + +static struct platform_device rndis_device = { + .name = "rndis", + .id = -1, + .dev = { + .platform_data = &rndis_pdata, + }, }; +#endif static struct platform_device androidusb_device = { .name = "android_usb", @@ -564,17 +611,6 @@ static struct tegra_otg_platform_data tegra_otg_pdata = { .host_unregister = &tegra_usb_otg_host_unregister, }; -static void whistler_usb_init(void) -{ - tegra_usb_phy_init(tegra_usb_phy_pdata, ARRAY_SIZE(tegra_usb_phy_pdata)); - - tegra_otg_device.dev.platform_data = &tegra_otg_pdata; - platform_device_register(&tegra_otg_device); - - tegra_ehci3_device.dev.platform_data = &tegra_ehci_pdata[2]; - platform_device_register(&tegra_ehci3_device); -} - static int __init whistler_gps_init(void) { tegra_gpio_enable(TEGRA_GPIO_PU4); @@ -607,16 +643,42 @@ static void whistler_codec_init(void) { i2c_register_board_info(4, whistler_codec_info, 1); } -static void __init tegra_whistler_init(void) + +#define SERIAL_NUMBER_LENGTH 20 +static char usb_serial_num[SERIAL_NUMBER_LENGTH]; +static void whistler_usb_init(void) { - char serial[20]; + tegra_usb_phy_init(tegra_usb_phy_pdata, ARRAY_SIZE(tegra_usb_phy_pdata)); + + tegra_otg_device.dev.platform_data = &tegra_otg_pdata; + platform_device_register(&tegra_otg_device); + + tegra_ehci3_device.dev.platform_data = &tegra_ehci_pdata[2]; + platform_device_register(&tegra_ehci3_device); + +#ifdef CONFIG_USB_ANDROID_RNDIS + src = usb_serial_num; + /* create a fake MAC address from our serial number. + * first byte is 0x02 to signify locally administered. + */ + rndis_pdata.ethaddr[0] = 0x02; + for (i = 0; *src; i++) { + /* XOR the USB serial across the remaining bytes */ + rndis_pdata.ethaddr[i % (ETH_ALEN - 1) + 1] ^= *src++; + } + platform_device_register(&rndis_device); +#endif +} + +static void __init tegra_whistler_init(void) +{ tegra_common_init(); tegra_clk_init_from_table(whistler_clk_init_table); whistler_pinmux_init(); whistler_i2c_init(); - snprintf(serial, sizeof(serial), "%llx", tegra_chip_uid()); - andusb_plat.serial_number = kstrdup(serial, GFP_KERNEL); + snprintf(usb_serial_num, sizeof(usb_serial_num), "%llx", tegra_chip_uid()); + andusb_plat.serial_number = kstrdup(usb_serial_num, GFP_KERNEL); tegra_i2s_device1.dev.platform_data = &tegra_audio_pdata[0]; tegra_i2s_device2.dev.platform_data = &tegra_audio_pdata[1]; tegra_spdif_device.dev.platform_data = &tegra_spdif_pdata; |