summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVarun Wadekar <vwadekar@nvidia.com>2011-01-20 16:50:10 +0530
committerVarun Colbert <vcolbert@nvidia.com>2011-02-16 00:11:52 -0800
commit9eabd6d56f86f437afe77d570d578750919b29a0 (patch)
tree48cc19aab4ee11a7349365b2a3683662b96de445
parent6f29288ac9c3891111e18691b6a04d871872b311 (diff)
ARM: ventana: enable usb rndis support
bug 773058 Change-Id: Id46df86adbb169e0bb1c2d4915649061deb95b07 Signed-off-by: Varun Wadekar <vwadekar@nvidia.com> Reviewed-on: http://git-master/r/16376 Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com> Tested-by: Bharat Nihalani <bnihalani@nvidia.com>
-rw-r--r--arch/arm/mach-tegra/board-ventana.c118
1 files changed, 91 insertions, 27 deletions
diff --git a/arch/arm/mach-tegra/board-ventana.c b/arch/arm/mach-tegra/board-ventana.c
index b5442e5bc639..a52820790521 100644
--- a/arch/arm/mach-tegra/board-ventana.c
+++ b/arch/arm/mach-tegra/board-ventana.c
@@ -188,34 +188,64 @@ static __initdata struct tegra_clk_init_table ventana_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 "Ventana"
+#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 = 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 = 0x7100,
- .num_functions = ARRAY_SIZE(usb_functions_adb),
- .functions = usb_functions_adb,
+ .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 = "Ventana",
+ .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,
};
static struct platform_device androidusb_device = {
@@ -226,6 +256,22 @@ static struct platform_device androidusb_device = {
},
};
+#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 i2c_board_info __initdata ventana_i2c_bus1_board_info[] = {
{
I2C_BOARD_INFO("wm8903", 0x1a),
@@ -628,15 +674,6 @@ static struct tegra_otg_platform_data tegra_otg_pdata = {
.host_unregister = &tegra_usb_otg_host_unregister,
};
-static void ventana_usb_init(void)
-{
- 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 ventana_gps_init(void)
{
struct clk *clk32 = clk_get_sys(NULL, "blink");
@@ -665,9 +702,36 @@ static void __init ventana_power_off_init(void)
pm_power_off = ventana_power_off;
}
+#define SERIAL_NUMBER_LENGTH 20
+static char usb_serial_num[SERIAL_NUMBER_LENGTH];
+static void ventana_usb_init(void)
+{
+ char *src = NULL;
+ int i;
+
+ 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_ventana_init(void)
{
- char serial[20];
#if defined(CONFIG_TOUCHSCREEN_PANJIT_I2C) || \
defined(CONFIG_TOUCHSCREEN_ATMEL_MT_T9)
struct board_info BoardInfo;
@@ -677,8 +741,8 @@ static void __init tegra_ventana_init(void)
tegra_clk_init_from_table(ventana_clk_init_table);
ventana_pinmux_init();
ventana_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;