aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSakethram Bommisetti <sakethram.bommisetti@stericsson.com>2011-10-12 18:40:56 +0530
committerSrinidhi KASAGAR <srinidhi.kasagar@stericsson.com>2011-10-14 08:50:39 +0200
commit308cf9e8e803c77996ade0f8bef43bbd61d48d26 (patch)
tree5af9fceabcb787aeab2fd14ea1a0be86d817146e
parentd58847b2b3247d50d3ff119ecf635bf59bce5e55 (diff)
Android:Ux500:USB: Boot time detection of USB
Enabling the usb functions from kernel space rather that enabling from user space using init.rc. Sysfs values in kernel space are not being updated from user space at the time of enumeration during boottime. ST-Ericsson Linux next: NA ST-Ericsson ID: 363818 ST-Ericsson FOSS-OUT ID: NA Change-Id: Ia17e2f9cef5bb1769718617b18fafe09e32226e2 Signed-off-by: Sakethram Bommisetti <sakethram.bommisetti@stericsson.com> Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33816 Reviewed-by: Praveena NADAHALLY <praveen.nadahally@stericsson.com> Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
-rw-r--r--drivers/usb/gadget/android.c70
1 files changed, 68 insertions, 2 deletions
diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c
index 15977c311db..3e64683b639 100644
--- a/drivers/usb/gadget/android.c
+++ b/drivers/usb/gadget/android.c
@@ -67,6 +67,10 @@ static const char longname[] = "Gadget Android";
/* Default vendor and product IDs, overridden by userspace */
#define VENDOR_ID 0x18D1
#define PRODUCT_ID 0x0001
+#define MAX_USB_SERIAL_NUMBER_LEN 32
+#if !defined(CONFIG_UX500_SOC_DB5500)
+#define PUBLIC_ID_BACKUPRAM1 (U8500_BACKUPRAM1_BASE + 0x0FC0)
+#endif
struct android_usb_function {
char *name;
@@ -218,10 +222,14 @@ struct acm_function_config {
static int acm_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev)
{
- f->config = kzalloc(sizeof(struct acm_function_config), GFP_KERNEL);
- if (!f->config)
+ struct acm_function_config *config;
+
+ config = kzalloc(sizeof(struct acm_function_config), GFP_KERNEL);
+ if (!config)
return -ENOMEM;
+ config->instances = 1;
+ f->config = config;
return gserial_setup(cdev->gadget, MAX_ACM_INSTANCES);
}
@@ -990,6 +998,62 @@ static ssize_t enable_store(struct device *pdev, struct device_attribute *attr,
return size;
}
+static void set_default_values(struct android_dev *dev)
+{
+ char *name;
+ char buf[256] = "adb,mass_storage,acm,ecm", *b;
+ int err;
+ char sbuf[MAX_USB_SERIAL_NUMBER_LEN];
+
+#if !defined(CONFIG_UX500_SOC_DB5500)
+ u32 bufer[5];
+ int i;
+ void __iomem *backup_ram = NULL;
+
+ backup_ram = ioremap(PUBLIC_ID_BACKUPRAM1, 0x14);
+
+ if (backup_ram) {
+ for (i = 0; i < 5; i++)
+ bufer[i] = readl(backup_ram + i*4);
+
+ snprintf(sbuf, MAX_USB_SERIAL_NUMBER_LEN,
+ "%.8X%.8X%.8X%.8X%.8X",
+ bufer[0], bufer[1], bufer[2], bufer[3], bufer[4]);
+
+ iounmap(backup_ram);
+ } else
+ pr_err("$$ ioremap failed\n");
+#else
+ strcpy(sbuf, "0123456789ABCDEF");
+#endif
+
+ strncpy(manufacturer_string, "ST-Ericsson",
+ sizeof(manufacturer_string) - 1);
+ strncpy(product_string, "Android Phone", sizeof(product_string) - 1);
+ strncpy(serial_string, sbuf, sizeof(serial_string) - 1);
+
+ INIT_LIST_HEAD(&dev->enabled_functions);
+
+ b = strim(buf);
+
+ while (b) {
+ name = strsep(&b, ",");
+ if (name) {
+ err = android_enable_function(dev, name);
+ if (err)
+ pr_err("android_usb: Cannot enable '%s'", name);
+ }
+ }
+
+ device_desc.idVendor = 0x04CC;
+ device_desc.idProduct = 0x2323;
+ device_desc.bDeviceClass = USB_CLASS_COMM;
+ usb_add_config(dev->cdev, &android_config_driver,
+ android_bind_config);
+ usb_gadget_connect(dev->cdev->gadget);
+ dev->enabled = true;
+}
+
static ssize_t state_show(struct device *pdev, struct device_attribute *attr,
char *buf)
{
@@ -1172,6 +1236,8 @@ static int android_bind(struct usb_composite_dev *cdev)
dev->cdev = cdev;
+ set_default_values(dev);
+
return 0;
}