blob: 8146af7f14912a35b8d24a957dd69d8604ea2b0a [file] [log] [blame]
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001/*
2 * Gadget Driver for Android
3 *
4 * Copyright (C) 2008 Google, Inc.
5 * Author: Mike Lockwood <lockwood@android.com>
6 *
7 * This software is licensed under the terms of the GNU General Public
8 * License version 2, as published by the Free Software Foundation, and
9 * may be copied, distributed, and modified under those terms.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 */
17
18/* #define DEBUG */
19/* #define VERBOSE_DEBUG */
20
21#include <linux/init.h>
22#include <linux/module.h>
23#include <linux/fs.h>
24
25#include <linux/delay.h>
26#include <linux/kernel.h>
27#include <linux/utsname.h>
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050028#include <linux/platform_device.h>
29
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050030#include <linux/usb/ch9.h>
31#include <linux/usb/composite.h>
32#include <linux/usb/gadget.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070033#include <linux/usb/android.h>
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050034
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050035#include "gadget_chips.h"
36
37/*
38 * Kbuild is not very cooperative with respect to linking separately
39 * compiled library objects into one module. So for now we won't use
40 * separate compilation ... ensuring init/exit sections work to shrink
41 * the runtime footprint, and giving us at least some parts of what
42 * a "gcc --combine ... part1.c part2.c part3.c ... " build would.
43 */
44#include "usbstring.c"
45#include "config.c"
46#include "epautoconf.c"
47#include "composite.c"
48
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070049#include "f_diag.c"
Benoit Gobyaab96812011-04-19 20:37:33 -070050#include "f_mass_storage.c"
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070051//#include "u_serial.c"
52//#include "f_acm.c"
Benoit Gobyaab96812011-04-19 20:37:33 -070053#include "f_adb.c"
54#include "f_mtp.c"
55#include "f_accessory.c"
56#define USB_ETH_RNDIS y
57#include "f_rndis.c"
58#include "rndis.c"
59#include "u_ether.c"
60
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050061MODULE_AUTHOR("Mike Lockwood");
62MODULE_DESCRIPTION("Android Composite USB Driver");
63MODULE_LICENSE("GPL");
64MODULE_VERSION("1.0");
65
66static const char longname[] = "Gadget Android";
67
Benoit Gobyaab96812011-04-19 20:37:33 -070068/* Default vendor and product IDs, overridden by userspace */
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050069#define VENDOR_ID 0x18D1
70#define PRODUCT_ID 0x0001
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050071
Benoit Gobyaab96812011-04-19 20:37:33 -070072struct android_usb_function {
73 char *name;
74 void *config;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050075
Benoit Gobyaab96812011-04-19 20:37:33 -070076 struct device *dev;
77 char *dev_name;
78 struct device_attribute **attributes;
79
80 /* for android_dev.enabled_functions */
81 struct list_head enabled_list;
82
83 /* Optional: initialization during gadget bind */
84 int (*init)(struct android_usb_function *, struct usb_composite_dev *);
85 /* Optional: cleanup during gadget unbind */
86 void (*cleanup)(struct android_usb_function *);
87
88 int (*bind_config)(struct android_usb_function *, struct usb_configuration *);
89
90 /* Optional: called when the configuration is removed */
91 void (*unbind_config)(struct android_usb_function *, struct usb_configuration *);
92 /* Optional: handle ctrl requests before the device is configured
93 * and/or before the function is enabled */
94 int (*ctrlrequest)(struct android_usb_function *,
95 struct usb_composite_dev *,
96 const struct usb_ctrlrequest *);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -050097};
98
Benoit Gobyaab96812011-04-19 20:37:33 -070099struct android_dev {
100 struct android_usb_function **functions;
101 struct list_head enabled_functions;
102 struct usb_composite_dev *cdev;
103 struct device *dev;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700104 struct android_usb_platform_data *pdata;
Benoit Gobyaab96812011-04-19 20:37:33 -0700105
106 bool enabled;
107 bool connected;
108 bool sw_connected;
109 struct work_struct work;
110};
111
112static struct class *android_class;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500113static struct android_dev *_android_dev;
Benoit Gobyaab96812011-04-19 20:37:33 -0700114static int android_bind_config(struct usb_configuration *c);
115static void android_unbind_config(struct usb_configuration *c);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500116
117/* string IDs are assigned dynamically */
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500118#define STRING_MANUFACTURER_IDX 0
119#define STRING_PRODUCT_IDX 1
120#define STRING_SERIAL_IDX 2
121
Benoit Gobyaab96812011-04-19 20:37:33 -0700122static char manufacturer_string[256];
123static char product_string[256];
124static char serial_string[256];
125
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500126/* String Table */
127static struct usb_string strings_dev[] = {
Benoit Gobyaab96812011-04-19 20:37:33 -0700128 [STRING_MANUFACTURER_IDX].s = manufacturer_string,
129 [STRING_PRODUCT_IDX].s = product_string,
130 [STRING_SERIAL_IDX].s = serial_string,
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500131 { } /* end of list */
132};
133
134static struct usb_gadget_strings stringtab_dev = {
135 .language = 0x0409, /* en-us */
136 .strings = strings_dev,
137};
138
139static struct usb_gadget_strings *dev_strings[] = {
140 &stringtab_dev,
141 NULL,
142};
143
144static struct usb_device_descriptor device_desc = {
145 .bLength = sizeof(device_desc),
146 .bDescriptorType = USB_DT_DEVICE,
147 .bcdUSB = __constant_cpu_to_le16(0x0200),
148 .bDeviceClass = USB_CLASS_PER_INTERFACE,
149 .idVendor = __constant_cpu_to_le16(VENDOR_ID),
150 .idProduct = __constant_cpu_to_le16(PRODUCT_ID),
151 .bcdDevice = __constant_cpu_to_le16(0xffff),
152 .bNumConfigurations = 1,
153};
154
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500155static struct usb_configuration android_config_driver = {
156 .label = "android",
Benoit Gobyaab96812011-04-19 20:37:33 -0700157 .unbind = android_unbind_config,
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -0500158 .bConfigurationValue = 1,
159 .bmAttributes = USB_CONFIG_ATT_ONE | USB_CONFIG_ATT_SELFPOWER,
160 .bMaxPower = 0xFA, /* 500ma */
161};
162
Benoit Gobyaab96812011-04-19 20:37:33 -0700163static void android_work(struct work_struct *data)
164{
165 struct android_dev *dev = container_of(data, struct android_dev, work);
166 struct usb_composite_dev *cdev = dev->cdev;
167 char *disconnected[2] = { "USB_STATE=DISCONNECTED", NULL };
168 char *connected[2] = { "USB_STATE=CONNECTED", NULL };
169 char *configured[2] = { "USB_STATE=CONFIGURED", NULL };
170 unsigned long flags;
171
172 spin_lock_irqsave(&cdev->lock, flags);
173 if (cdev->config) {
174 spin_unlock_irqrestore(&cdev->lock, flags);
175 kobject_uevent_env(&dev->dev->kobj, KOBJ_CHANGE,
176 configured);
177 return;
178 }
179 if (dev->connected != dev->sw_connected) {
180 dev->sw_connected = dev->connected;
181 spin_unlock_irqrestore(&cdev->lock, flags);
182 kobject_uevent_env(&dev->dev->kobj, KOBJ_CHANGE,
183 dev->sw_connected ? connected : disconnected);
184 } else {
185 spin_unlock_irqrestore(&cdev->lock, flags);
186 }
187}
188
189
190/*-------------------------------------------------------------------------*/
191/* Supported functions initialization */
192
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700193char diag_clients[32]; /* enabled DIAG clients - "diag[,diag_mdm]" */
194static ssize_t clients_store(
195 struct device *device, struct device_attribute *attr,
196 const char *buff, size_t size)
197{
198 strncpy(diag_clients, buff, sizeof(diag_clients));
199
200 return size;
201}
202
203static DEVICE_ATTR(clients, S_IWUSR, NULL, clients_store);
204static struct device_attribute *diag_function_attributes[] =
205 { &dev_attr_clients, NULL };
206
207static int diag_function_init(struct android_usb_function *f,
208 struct usb_composite_dev *cdev)
209{
210 return diag_setup();
211}
212
213static void diag_function_cleanup(struct android_usb_function *f)
214{
215 diag_cleanup();
216}
217
218static int diag_function_bind_config(struct android_usb_function *f,
219 struct usb_configuration *c)
220{
221 char *name;
222 char buf[32], *b;
Manu Gautamc5760302011-08-25 14:30:24 +0530223 int once = 0, err = -1;
224 int (*notify)(uint32_t, const char *);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700225
226 strncpy(buf, diag_clients, sizeof(buf));
227 b = strim(buf);
228
229 while (b) {
230 name = strsep(&b, ",");
Manu Gautamc5760302011-08-25 14:30:24 +0530231 /* Allow only first diag channel to update pid and serial no */
232 if (!once++)
233 notify = _android_dev->pdata->update_pid_and_serial_num;
234 else
235 notify = NULL;
236
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700237 if (name) {
Manu Gautamc5760302011-08-25 14:30:24 +0530238 err = diag_function_add(c, name, notify);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700239 if (err)
240 pr_err("diag: Cannot open channel '%s'", name);
241 }
242 }
243
244 return err;
245}
246
247static struct android_usb_function diag_function = {
248 .name = "diag",
249 .init = diag_function_init,
250 .cleanup = diag_function_cleanup,
251 .bind_config = diag_function_bind_config,
252 .attributes = diag_function_attributes,
253};
254
Benoit Gobyaab96812011-04-19 20:37:33 -0700255static int adb_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev)
256{
257 return adb_setup();
258}
259
260static void adb_function_cleanup(struct android_usb_function *f)
261{
262 adb_cleanup();
263}
264
265static int adb_function_bind_config(struct android_usb_function *f, struct usb_configuration *c)
266{
267 return adb_bind_config(c);
268}
269
270static struct android_usb_function adb_function = {
271 .name = "adb",
272 .init = adb_function_init,
273 .cleanup = adb_function_cleanup,
274 .bind_config = adb_function_bind_config,
275};
276
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700277#if 0
Benoit Gobyaab96812011-04-19 20:37:33 -0700278#define MAX_ACM_INSTANCES 4
279struct acm_function_config {
280 int instances;
281};
282
283static int acm_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev)
284{
285 f->config = kzalloc(sizeof(struct acm_function_config), GFP_KERNEL);
286 if (!f->config)
287 return -ENOMEM;
288
289 return gserial_setup(cdev->gadget, MAX_ACM_INSTANCES);
290}
291
292static void acm_function_cleanup(struct android_usb_function *f)
293{
294 gserial_cleanup();
295 kfree(f->config);
296 f->config = NULL;
297}
298
299static int acm_function_bind_config(struct android_usb_function *f, struct usb_configuration *c)
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530300{
301 int i;
Benoit Gobyaab96812011-04-19 20:37:33 -0700302 int ret = 0;
303 struct acm_function_config *config = f->config;
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530304
Benoit Gobyaab96812011-04-19 20:37:33 -0700305 for (i = 0; i < config->instances; i++) {
306 ret = acm_bind_config(c, i);
307 if (ret) {
308 pr_err("Could not bind acm%u config\n", i);
309 break;
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530310 }
311 }
Benoit Gobyaab96812011-04-19 20:37:33 -0700312
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530313 return ret;
314}
315
Benoit Gobyaab96812011-04-19 20:37:33 -0700316static ssize_t acm_instances_show(struct device *dev,
317 struct device_attribute *attr, char *buf)
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530318{
Benoit Gobyaab96812011-04-19 20:37:33 -0700319 struct android_usb_function *f = dev_get_drvdata(dev);
320 struct acm_function_config *config = f->config;
321 return sprintf(buf, "%d\n", config->instances);
322}
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530323
Benoit Gobyaab96812011-04-19 20:37:33 -0700324static ssize_t acm_instances_store(struct device *dev,
325 struct device_attribute *attr, const char *buf, size_t size)
326{
327 struct android_usb_function *f = dev_get_drvdata(dev);
328 struct acm_function_config *config = f->config;
329 int value;
330
331 sscanf(buf, "%d", &value);
332 if (value > MAX_ACM_INSTANCES)
333 value = MAX_ACM_INSTANCES;
334 config->instances = value;
335 return size;
336}
337
338static DEVICE_ATTR(instances, S_IRUGO | S_IWUSR, acm_instances_show, acm_instances_store);
339static struct device_attribute *acm_function_attributes[] = { &dev_attr_instances, NULL };
340
341static struct android_usb_function acm_function = {
342 .name = "acm",
343 .init = acm_function_init,
344 .cleanup = acm_function_cleanup,
345 .bind_config = acm_function_bind_config,
346 .attributes = acm_function_attributes,
347};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700348#endif
Benoit Gobyaab96812011-04-19 20:37:33 -0700349
350static int mtp_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev)
351{
352 return mtp_setup();
353}
354
355static void mtp_function_cleanup(struct android_usb_function *f)
356{
357 mtp_cleanup();
358}
359
360static int mtp_function_bind_config(struct android_usb_function *f, struct usb_configuration *c)
361{
Mike Lockwoodcf7addf2011-06-01 22:17:36 -0400362 return mtp_bind_config(c, false);
363}
364
365static int ptp_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev)
366{
367 /* nothing to do - initialization is handled by mtp_function_init */
368 return 0;
369}
370
371static void ptp_function_cleanup(struct android_usb_function *f)
372{
373 /* nothing to do - cleanup is handled by mtp_function_cleanup */
374}
375
376static int ptp_function_bind_config(struct android_usb_function *f, struct usb_configuration *c)
377{
378 return mtp_bind_config(c, true);
Benoit Gobyaab96812011-04-19 20:37:33 -0700379}
380
381static int mtp_function_ctrlrequest(struct android_usb_function *f,
382 struct usb_composite_dev *cdev,
383 const struct usb_ctrlrequest *c)
384{
385 return mtp_ctrlrequest(cdev, c);
386}
387
388static struct android_usb_function mtp_function = {
389 .name = "mtp",
390 .init = mtp_function_init,
391 .cleanup = mtp_function_cleanup,
392 .bind_config = mtp_function_bind_config,
393 .ctrlrequest = mtp_function_ctrlrequest,
394};
395
Mike Lockwoodcf7addf2011-06-01 22:17:36 -0400396/* PTP function is same as MTP with slightly different interface descriptor */
397static struct android_usb_function ptp_function = {
398 .name = "ptp",
399 .init = ptp_function_init,
400 .cleanup = ptp_function_cleanup,
401 .bind_config = ptp_function_bind_config,
402};
403
Benoit Gobyaab96812011-04-19 20:37:33 -0700404
405struct rndis_function_config {
406 u8 ethaddr[ETH_ALEN];
407 u32 vendorID;
408 char manufacturer[256];
409 bool wceis;
410};
411
412static int rndis_function_init(struct android_usb_function *f, struct usb_composite_dev *cdev)
413{
414 f->config = kzalloc(sizeof(struct rndis_function_config), GFP_KERNEL);
415 if (!f->config)
416 return -ENOMEM;
417 return 0;
418}
419
420static void rndis_function_cleanup(struct android_usb_function *f)
421{
422 kfree(f->config);
423 f->config = NULL;
424}
425
426static int rndis_function_bind_config(struct android_usb_function *f,
427 struct usb_configuration *c)
428{
429 int ret;
430 struct rndis_function_config *rndis = f->config;
431
432 if (!rndis) {
433 pr_err("%s: rndis_pdata\n", __func__);
434 return -1;
435 }
436
437 pr_info("%s MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", __func__,
438 rndis->ethaddr[0], rndis->ethaddr[1], rndis->ethaddr[2],
439 rndis->ethaddr[3], rndis->ethaddr[4], rndis->ethaddr[5]);
440
Mike Lockwood394bf632011-08-12 14:35:42 -0700441 ret = gether_setup_name(c->cdev->gadget, rndis->ethaddr, "rndis");
Benoit Gobyaab96812011-04-19 20:37:33 -0700442 if (ret) {
443 pr_err("%s: gether_setup failed\n", __func__);
444 return ret;
445 }
446
447 if (rndis->wceis) {
448 /* "Wireless" RNDIS; auto-detected by Windows */
449 rndis_iad_descriptor.bFunctionClass =
450 USB_CLASS_WIRELESS_CONTROLLER;
451 rndis_iad_descriptor.bFunctionSubClass = 0x01;
452 rndis_iad_descriptor.bFunctionProtocol = 0x03;
453 rndis_control_intf.bInterfaceClass =
454 USB_CLASS_WIRELESS_CONTROLLER;
455 rndis_control_intf.bInterfaceSubClass = 0x01;
456 rndis_control_intf.bInterfaceProtocol = 0x03;
457 }
458
459 return rndis_bind_config(c, rndis->ethaddr, rndis->vendorID,
460 rndis->manufacturer);
461}
462
463static void rndis_function_unbind_config(struct android_usb_function *f,
464 struct usb_configuration *c)
465{
466 gether_cleanup();
467}
468
469static ssize_t rndis_manufacturer_show(struct device *dev,
470 struct device_attribute *attr, char *buf)
471{
472 struct android_usb_function *f = dev_get_drvdata(dev);
473 struct rndis_function_config *config = f->config;
474 return sprintf(buf, "%s\n", config->manufacturer);
475}
476
477static ssize_t rndis_manufacturer_store(struct device *dev,
478 struct device_attribute *attr, const char *buf, size_t size)
479{
480 struct android_usb_function *f = dev_get_drvdata(dev);
481 struct rndis_function_config *config = f->config;
482
483 if (size >= sizeof(config->manufacturer))
484 return -EINVAL;
485 if (sscanf(buf, "%s", config->manufacturer) == 1)
486 return size;
487 return -1;
488}
489
490static DEVICE_ATTR(manufacturer, S_IRUGO | S_IWUSR, rndis_manufacturer_show,
491 rndis_manufacturer_store);
492
493static ssize_t rndis_wceis_show(struct device *dev,
494 struct device_attribute *attr, char *buf)
495{
496 struct android_usb_function *f = dev_get_drvdata(dev);
497 struct rndis_function_config *config = f->config;
498 return sprintf(buf, "%d\n", config->wceis);
499}
500
501static ssize_t rndis_wceis_store(struct device *dev,
502 struct device_attribute *attr, const char *buf, size_t size)
503{
504 struct android_usb_function *f = dev_get_drvdata(dev);
505 struct rndis_function_config *config = f->config;
506 int value;
507
508 if (sscanf(buf, "%d", &value) == 1) {
509 config->wceis = value;
510 return size;
511 }
512 return -EINVAL;
513}
514
515static DEVICE_ATTR(wceis, S_IRUGO | S_IWUSR, rndis_wceis_show,
516 rndis_wceis_store);
517
518static ssize_t rndis_ethaddr_show(struct device *dev,
519 struct device_attribute *attr, char *buf)
520{
521 struct android_usb_function *f = dev_get_drvdata(dev);
522 struct rndis_function_config *rndis = f->config;
523 return sprintf(buf, "%02x:%02x:%02x:%02x:%02x:%02x\n",
524 rndis->ethaddr[0], rndis->ethaddr[1], rndis->ethaddr[2],
525 rndis->ethaddr[3], rndis->ethaddr[4], rndis->ethaddr[5]);
526}
527
528static ssize_t rndis_ethaddr_store(struct device *dev,
529 struct device_attribute *attr, const char *buf, size_t size)
530{
531 struct android_usb_function *f = dev_get_drvdata(dev);
532 struct rndis_function_config *rndis = f->config;
533
534 if (sscanf(buf, "%02x:%02x:%02x:%02x:%02x:%02x\n",
535 (int *)&rndis->ethaddr[0], (int *)&rndis->ethaddr[1],
536 (int *)&rndis->ethaddr[2], (int *)&rndis->ethaddr[3],
537 (int *)&rndis->ethaddr[4], (int *)&rndis->ethaddr[5]) == 6)
538 return size;
539 return -EINVAL;
540}
541
542static DEVICE_ATTR(ethaddr, S_IRUGO | S_IWUSR, rndis_ethaddr_show,
543 rndis_ethaddr_store);
544
545static ssize_t rndis_vendorID_show(struct device *dev,
546 struct device_attribute *attr, char *buf)
547{
548 struct android_usb_function *f = dev_get_drvdata(dev);
549 struct rndis_function_config *config = f->config;
550 return sprintf(buf, "%04x\n", config->vendorID);
551}
552
553static ssize_t rndis_vendorID_store(struct device *dev,
554 struct device_attribute *attr, const char *buf, size_t size)
555{
556 struct android_usb_function *f = dev_get_drvdata(dev);
557 struct rndis_function_config *config = f->config;
558 int value;
559
560 if (sscanf(buf, "%04x", &value) == 1) {
561 config->vendorID = value;
562 return size;
563 }
564 return -EINVAL;
565}
566
567static DEVICE_ATTR(vendorID, S_IRUGO | S_IWUSR, rndis_vendorID_show,
568 rndis_vendorID_store);
569
570static struct device_attribute *rndis_function_attributes[] = {
571 &dev_attr_manufacturer,
572 &dev_attr_wceis,
573 &dev_attr_ethaddr,
574 &dev_attr_vendorID,
575 NULL
576};
577
578static struct android_usb_function rndis_function = {
579 .name = "rndis",
580 .init = rndis_function_init,
581 .cleanup = rndis_function_cleanup,
582 .bind_config = rndis_function_bind_config,
583 .unbind_config = rndis_function_unbind_config,
584 .attributes = rndis_function_attributes,
585};
586
587
588struct mass_storage_function_config {
589 struct fsg_config fsg;
590 struct fsg_common *common;
591};
592
593static int mass_storage_function_init(struct android_usb_function *f,
594 struct usb_composite_dev *cdev)
595{
596 struct mass_storage_function_config *config;
597 struct fsg_common *common;
598 int err;
599
600 config = kzalloc(sizeof(struct mass_storage_function_config),
601 GFP_KERNEL);
602 if (!config)
603 return -ENOMEM;
604
605 config->fsg.nluns = 1;
606 config->fsg.luns[0].removable = 1;
607
608 common = fsg_common_init(NULL, cdev, &config->fsg);
609 if (IS_ERR(common)) {
610 kfree(config);
611 return PTR_ERR(common);
612 }
613
614 err = sysfs_create_link(&f->dev->kobj,
615 &common->luns[0].dev.kobj,
616 "lun");
617 if (err) {
618 kfree(config);
619 return err;
620 }
621
622 config->common = common;
623 f->config = config;
624 return 0;
625}
626
627static void mass_storage_function_cleanup(struct android_usb_function *f)
628{
629 kfree(f->config);
630 f->config = NULL;
631}
632
633static int mass_storage_function_bind_config(struct android_usb_function *f,
634 struct usb_configuration *c)
635{
636 struct mass_storage_function_config *config = f->config;
637 return fsg_bind_config(c->cdev, c, config->common);
638}
639
640static ssize_t mass_storage_inquiry_show(struct device *dev,
641 struct device_attribute *attr, char *buf)
642{
643 struct android_usb_function *f = dev_get_drvdata(dev);
644 struct mass_storage_function_config *config = f->config;
645 return sprintf(buf, "%s\n", config->common->inquiry_string);
646}
647
648static ssize_t mass_storage_inquiry_store(struct device *dev,
649 struct device_attribute *attr, const char *buf, size_t size)
650{
651 struct android_usb_function *f = dev_get_drvdata(dev);
652 struct mass_storage_function_config *config = f->config;
653 if (size >= sizeof(config->common->inquiry_string))
654 return -EINVAL;
655 if (sscanf(buf, "%s", config->common->inquiry_string) != 1)
656 return -EINVAL;
657 return size;
658}
659
660static DEVICE_ATTR(inquiry_string, S_IRUGO | S_IWUSR,
661 mass_storage_inquiry_show,
662 mass_storage_inquiry_store);
663
664static struct device_attribute *mass_storage_function_attributes[] = {
665 &dev_attr_inquiry_string,
666 NULL
667};
668
669static struct android_usb_function mass_storage_function = {
670 .name = "mass_storage",
671 .init = mass_storage_function_init,
672 .cleanup = mass_storage_function_cleanup,
673 .bind_config = mass_storage_function_bind_config,
674 .attributes = mass_storage_function_attributes,
675};
676
677
678static int accessory_function_init(struct android_usb_function *f,
679 struct usb_composite_dev *cdev)
680{
681 return acc_setup();
682}
683
684static void accessory_function_cleanup(struct android_usb_function *f)
685{
686 acc_cleanup();
687}
688
689static int accessory_function_bind_config(struct android_usb_function *f,
690 struct usb_configuration *c)
691{
692 return acc_bind_config(c);
693}
694
695static int accessory_function_ctrlrequest(struct android_usb_function *f,
696 struct usb_composite_dev *cdev,
697 const struct usb_ctrlrequest *c)
698{
699 return acc_ctrlrequest(cdev, c);
700}
701
702static struct android_usb_function accessory_function = {
703 .name = "accessory",
704 .init = accessory_function_init,
705 .cleanup = accessory_function_cleanup,
706 .bind_config = accessory_function_bind_config,
707 .ctrlrequest = accessory_function_ctrlrequest,
708};
709
710
711static struct android_usb_function *supported_functions[] = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700712 &diag_function,
Benoit Gobyaab96812011-04-19 20:37:33 -0700713 &adb_function,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700714// &acm_function,
Benoit Gobyaab96812011-04-19 20:37:33 -0700715 &mtp_function,
Mike Lockwoodcf7addf2011-06-01 22:17:36 -0400716 &ptp_function,
Benoit Gobyaab96812011-04-19 20:37:33 -0700717 &rndis_function,
718 &mass_storage_function,
719 &accessory_function,
720 NULL
721};
722
723
724static int android_init_functions(struct android_usb_function **functions,
725 struct usb_composite_dev *cdev)
726{
727 struct android_dev *dev = _android_dev;
728 struct android_usb_function *f;
729 struct device_attribute **attrs;
730 struct device_attribute *attr;
731 int err;
732 int index = 0;
733
734 for (; (f = *functions++); index++) {
735 f->dev_name = kasprintf(GFP_KERNEL, "f_%s", f->name);
736 f->dev = device_create(android_class, dev->dev,
737 MKDEV(0, index), f, f->dev_name);
738 if (IS_ERR(f->dev)) {
739 pr_err("%s: Failed to create dev %s", __func__,
740 f->dev_name);
741 err = PTR_ERR(f->dev);
742 goto err_create;
743 }
744
745 if (f->init) {
746 err = f->init(f, cdev);
747 if (err) {
748 pr_err("%s: Failed to init %s", __func__,
749 f->name);
750 goto err_out;
751 }
752 }
753
754 attrs = f->attributes;
755 if (attrs) {
756 while ((attr = *attrs++) && !err)
757 err = device_create_file(f->dev, attr);
758 }
759 if (err) {
760 pr_err("%s: Failed to create function %s attributes",
761 __func__, f->name);
762 goto err_out;
763 }
764 }
765 return 0;
766
767err_out:
768 device_destroy(android_class, f->dev->devt);
769err_create:
770 kfree(f->dev_name);
771 return err;
772}
773
774static void android_cleanup_functions(struct android_usb_function **functions)
775{
776 struct android_usb_function *f;
777
778 while (*functions) {
779 f = *functions++;
780
781 if (f->dev) {
782 device_destroy(android_class, f->dev->devt);
783 kfree(f->dev_name);
784 }
785
786 if (f->cleanup)
787 f->cleanup(f);
788 }
789}
790
791static int
792android_bind_enabled_functions(struct android_dev *dev,
793 struct usb_configuration *c)
794{
795 struct android_usb_function *f;
796 int ret;
797
798 list_for_each_entry(f, &dev->enabled_functions, enabled_list) {
799 ret = f->bind_config(f, c);
800 if (ret) {
801 pr_err("%s: %s failed", __func__, f->name);
802 return ret;
803 }
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530804 }
805 return 0;
806}
807
Benoit Gobyaab96812011-04-19 20:37:33 -0700808static void
809android_unbind_enabled_functions(struct android_dev *dev,
810 struct usb_configuration *c)
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530811{
Benoit Gobyaab96812011-04-19 20:37:33 -0700812 struct android_usb_function *f;
813
814 list_for_each_entry(f, &dev->enabled_functions, enabled_list) {
815 if (f->unbind_config)
816 f->unbind_config(f, c);
817 }
818}
819
820static int android_enable_function(struct android_dev *dev, char *name)
821{
822 struct android_usb_function **functions = dev->functions;
823 struct android_usb_function *f;
824 while ((f = *functions++)) {
825 if (!strcmp(name, f->name)) {
826 list_add_tail(&f->enabled_list, &dev->enabled_functions);
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530827 return 0;
Mike Lockwoodaecca432011-02-09 09:38:26 -0500828 }
829 }
Benoit Gobyaab96812011-04-19 20:37:33 -0700830 return -EINVAL;
Mike Lockwoodaecca432011-02-09 09:38:26 -0500831}
832
Benoit Gobyaab96812011-04-19 20:37:33 -0700833/*-------------------------------------------------------------------------*/
834/* /sys/class/android_usb/android%d/ interface */
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530835
Benoit Gobyaab96812011-04-19 20:37:33 -0700836static ssize_t
837functions_show(struct device *pdev, struct device_attribute *attr, char *buf)
838{
839 struct android_dev *dev = dev_get_drvdata(pdev);
840 struct android_usb_function *f;
841 char *buff = buf;
842
843 list_for_each_entry(f, &dev->enabled_functions, enabled_list)
844 buff += sprintf(buff, "%s,", f->name);
845 if (buff != buf)
846 *(buff-1) = '\n';
847 return buff - buf;
848}
849
850static ssize_t
851functions_store(struct device *pdev, struct device_attribute *attr,
852 const char *buff, size_t size)
853{
854 struct android_dev *dev = dev_get_drvdata(pdev);
855 char *name;
856 char buf[256], *b;
857 int err;
858
859 INIT_LIST_HEAD(&dev->enabled_functions);
860
861 strncpy(buf, buff, sizeof(buf));
862 b = strim(buf);
863
864 while (b) {
865 name = strsep(&b, ",");
866 if (name) {
867 err = android_enable_function(dev, name);
868 if (err)
869 pr_err("android_usb: Cannot enable '%s'", name);
Krishna, Vamsi83814ea2009-02-11 21:07:20 +0530870 }
871 }
Benoit Gobyaab96812011-04-19 20:37:33 -0700872
873 return size;
874}
875
876static ssize_t enable_show(struct device *pdev, struct device_attribute *attr,
877 char *buf)
878{
879 struct android_dev *dev = dev_get_drvdata(pdev);
880 return sprintf(buf, "%d\n", dev->enabled);
881}
882
883static ssize_t enable_store(struct device *pdev, struct device_attribute *attr,
884 const char *buff, size_t size)
885{
886 struct android_dev *dev = dev_get_drvdata(pdev);
887 struct usb_composite_dev *cdev = dev->cdev;
888 int enabled = 0;
889
890 sscanf(buff, "%d", &enabled);
891 if (enabled && !dev->enabled) {
892 /* update values in composite driver's copy of device descriptor */
893 cdev->desc.idVendor = device_desc.idVendor;
894 cdev->desc.idProduct = device_desc.idProduct;
895 cdev->desc.bcdDevice = device_desc.bcdDevice;
896 cdev->desc.bDeviceClass = device_desc.bDeviceClass;
897 cdev->desc.bDeviceSubClass = device_desc.bDeviceSubClass;
898 cdev->desc.bDeviceProtocol = device_desc.bDeviceProtocol;
899 usb_add_config(cdev, &android_config_driver,
900 android_bind_config);
901 usb_gadget_connect(cdev->gadget);
902 dev->enabled = true;
903 } else if (!enabled && dev->enabled) {
904 usb_gadget_disconnect(cdev->gadget);
905 usb_remove_config(cdev, &android_config_driver);
906 dev->enabled = false;
907 } else {
908 pr_err("android_usb: already %s\n",
909 dev->enabled ? "enabled" : "disabled");
910 }
911 return size;
912}
913
914static ssize_t state_show(struct device *pdev, struct device_attribute *attr,
915 char *buf)
916{
917 struct android_dev *dev = dev_get_drvdata(pdev);
918 struct usb_composite_dev *cdev = dev->cdev;
919 char *state = "DISCONNECTED";
920 unsigned long flags;
921
922 if (!cdev)
923 goto out;
924
925 spin_lock_irqsave(&cdev->lock, flags);
926 if (cdev->config)
927 state = "CONFIGURED";
928 else if (dev->connected)
929 state = "CONNECTED";
930 spin_unlock_irqrestore(&cdev->lock, flags);
931out:
932 return sprintf(buf, "%s\n", state);
933}
934
935#define DESCRIPTOR_ATTR(field, format_string) \
936static ssize_t \
937field ## _show(struct device *dev, struct device_attribute *attr, \
938 char *buf) \
939{ \
940 return sprintf(buf, format_string, device_desc.field); \
941} \
942static ssize_t \
943field ## _store(struct device *dev, struct device_attribute *attr, \
944 const char *buf, size_t size) \
945{ \
946 int value; \
947 if (sscanf(buf, format_string, &value) == 1) { \
948 device_desc.field = value; \
949 return size; \
950 } \
951 return -1; \
952} \
953static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, field ## _show, field ## _store);
954
955#define DESCRIPTOR_STRING_ATTR(field, buffer) \
956static ssize_t \
957field ## _show(struct device *dev, struct device_attribute *attr, \
958 char *buf) \
959{ \
960 return sprintf(buf, "%s", buffer); \
961} \
962static ssize_t \
963field ## _store(struct device *dev, struct device_attribute *attr, \
964 const char *buf, size_t size) \
965{ \
966 if (size >= sizeof(buffer)) return -EINVAL; \
967 if (sscanf(buf, "%s", buffer) == 1) { \
968 return size; \
969 } \
970 return -1; \
971} \
972static DEVICE_ATTR(field, S_IRUGO | S_IWUSR, field ## _show, field ## _store);
973
974
975DESCRIPTOR_ATTR(idVendor, "%04x\n")
976DESCRIPTOR_ATTR(idProduct, "%04x\n")
977DESCRIPTOR_ATTR(bcdDevice, "%04x\n")
978DESCRIPTOR_ATTR(bDeviceClass, "%d\n")
979DESCRIPTOR_ATTR(bDeviceSubClass, "%d\n")
980DESCRIPTOR_ATTR(bDeviceProtocol, "%d\n")
981DESCRIPTOR_STRING_ATTR(iManufacturer, manufacturer_string)
982DESCRIPTOR_STRING_ATTR(iProduct, product_string)
983DESCRIPTOR_STRING_ATTR(iSerial, serial_string)
984
985static DEVICE_ATTR(functions, S_IRUGO | S_IWUSR, functions_show, functions_store);
986static DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, enable_show, enable_store);
987static DEVICE_ATTR(state, S_IRUGO, state_show, NULL);
988
989static struct device_attribute *android_usb_attributes[] = {
990 &dev_attr_idVendor,
991 &dev_attr_idProduct,
992 &dev_attr_bcdDevice,
993 &dev_attr_bDeviceClass,
994 &dev_attr_bDeviceSubClass,
995 &dev_attr_bDeviceProtocol,
996 &dev_attr_iManufacturer,
997 &dev_attr_iProduct,
998 &dev_attr_iSerial,
999 &dev_attr_functions,
1000 &dev_attr_enable,
1001 &dev_attr_state,
1002 NULL
1003};
1004
1005/*-------------------------------------------------------------------------*/
1006/* Composite driver */
1007
1008static int android_bind_config(struct usb_configuration *c)
1009{
1010 struct android_dev *dev = _android_dev;
1011 int ret = 0;
1012
1013 ret = android_bind_enabled_functions(dev, c);
1014 if (ret)
1015 return ret;
1016
1017 return 0;
1018}
1019
1020static void android_unbind_config(struct usb_configuration *c)
1021{
1022 struct android_dev *dev = _android_dev;
1023
1024 android_unbind_enabled_functions(dev, c);
Krishna, Vamsi83814ea2009-02-11 21:07:20 +05301025}
1026
Dmitry Shmidt577e37a2010-07-02 12:46:34 -07001027static int android_bind(struct usb_composite_dev *cdev)
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001028{
1029 struct android_dev *dev = _android_dev;
1030 struct usb_gadget *gadget = cdev->gadget;
Mike Lockwoodaecca432011-02-09 09:38:26 -05001031 int gcnum, id, ret;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001032
Benoit Gobyaab96812011-04-19 20:37:33 -07001033 usb_gadget_disconnect(gadget);
1034
1035 ret = android_init_functions(dev->functions, cdev);
1036 if (ret)
1037 return ret;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001038
1039 /* Allocate string descriptor numbers ... note that string
1040 * contents can be overridden by the composite_dev glue.
1041 */
1042 id = usb_string_id(cdev);
1043 if (id < 0)
1044 return id;
1045 strings_dev[STRING_MANUFACTURER_IDX].id = id;
1046 device_desc.iManufacturer = id;
1047
1048 id = usb_string_id(cdev);
1049 if (id < 0)
1050 return id;
1051 strings_dev[STRING_PRODUCT_IDX].id = id;
1052 device_desc.iProduct = id;
1053
Benoit Gobyaab96812011-04-19 20:37:33 -07001054 /* Default strings - should be updated by userspace */
1055 strncpy(manufacturer_string, "Android", sizeof(manufacturer_string) - 1);
1056 strncpy(product_string, "Android", sizeof(product_string) - 1);
1057 strncpy(serial_string, "0123456789ABCDEF", sizeof(serial_string) - 1);
1058
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001059 id = usb_string_id(cdev);
1060 if (id < 0)
1061 return id;
1062 strings_dev[STRING_SERIAL_IDX].id = id;
1063 device_desc.iSerialNumber = id;
1064
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001065 gcnum = usb_gadget_controller_number(gadget);
1066 if (gcnum >= 0)
1067 device_desc.bcdDevice = cpu_to_le16(0x0200 + gcnum);
1068 else {
1069 /* gadget zero is so simple (for now, no altsettings) that
1070 * it SHOULD NOT have problems with bulk-capable hardware.
1071 * so just warn about unrcognized controllers -- don't panic.
1072 *
1073 * things like configuration and altsetting numbering
1074 * can need hardware-specific attention though.
1075 */
1076 pr_warning("%s: controller '%s' not recognized\n",
1077 longname, gadget->name);
1078 device_desc.bcdDevice = __constant_cpu_to_le16(0x9999);
1079 }
1080
1081 usb_gadget_set_selfpowered(gadget);
1082 dev->cdev = cdev;
1083
1084 return 0;
1085}
1086
Benoit Gobyaab96812011-04-19 20:37:33 -07001087static int android_usb_unbind(struct usb_composite_dev *cdev)
1088{
1089 struct android_dev *dev = _android_dev;
1090
1091 cancel_work_sync(&dev->work);
1092 android_cleanup_functions(dev->functions);
1093 return 0;
1094}
1095
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001096static struct usb_composite_driver android_usb_driver = {
1097 .name = "android_usb",
1098 .dev = &device_desc,
1099 .strings = dev_strings,
Benoit Gobyaab96812011-04-19 20:37:33 -07001100 .unbind = android_usb_unbind,
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001101};
1102
Benoit Gobyaab96812011-04-19 20:37:33 -07001103static int
1104android_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *c)
1105{
1106 struct android_dev *dev = _android_dev;
1107 struct usb_composite_dev *cdev = get_gadget_data(gadget);
1108 struct usb_request *req = cdev->req;
Benoit Gobyaab96812011-04-19 20:37:33 -07001109 struct android_usb_function *f;
1110 int value = -EOPNOTSUPP;
1111 unsigned long flags;
1112
1113 req->zero = 0;
1114 req->complete = composite_setup_complete;
1115 req->length = 0;
1116 gadget->ep0->driver_data = cdev;
1117
Mike Lockwood6c7dd4b2011-08-02 11:13:48 -04001118 list_for_each_entry(f, &dev->enabled_functions, enabled_list) {
Benoit Gobyaab96812011-04-19 20:37:33 -07001119 if (f->ctrlrequest) {
1120 value = f->ctrlrequest(f, cdev, c);
1121 if (value >= 0)
1122 break;
1123 }
1124 }
1125
1126 if (value < 0)
1127 value = composite_setup(gadget, c);
1128
1129 spin_lock_irqsave(&cdev->lock, flags);
1130 if (!dev->connected) {
1131 dev->connected = 1;
1132 schedule_work(&dev->work);
1133 }
1134 else if (c->bRequest == USB_REQ_SET_CONFIGURATION && cdev->config) {
1135 schedule_work(&dev->work);
1136 }
1137 spin_unlock_irqrestore(&cdev->lock, flags);
1138
1139 return value;
1140}
1141
1142static void android_disconnect(struct usb_gadget *gadget)
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001143{
Krishna, Vamsi83814ea2009-02-11 21:07:20 +05301144 struct android_dev *dev = _android_dev;
Benoit Gobyaab96812011-04-19 20:37:33 -07001145 dev->connected = 0;
1146 schedule_work(&dev->work);
1147 composite_disconnect(gadget);
Krishna, Vamsi83814ea2009-02-11 21:07:20 +05301148}
1149
Benoit Gobyaab96812011-04-19 20:37:33 -07001150static int android_create_device(struct android_dev *dev)
John Michelaud5d2de62010-12-10 11:33:54 -06001151{
Benoit Gobyaab96812011-04-19 20:37:33 -07001152 struct device_attribute **attrs = android_usb_attributes;
1153 struct device_attribute *attr;
1154 int err;
John Michelaud5d2de62010-12-10 11:33:54 -06001155
Benoit Gobyaab96812011-04-19 20:37:33 -07001156 dev->dev = device_create(android_class, NULL,
1157 MKDEV(0, 0), NULL, "android0");
1158 if (IS_ERR(dev->dev))
1159 return PTR_ERR(dev->dev);
John Michelaud5d2de62010-12-10 11:33:54 -06001160
Benoit Gobyaab96812011-04-19 20:37:33 -07001161 dev_set_drvdata(dev->dev, dev);
1162
1163 while ((attr = *attrs++)) {
1164 err = device_create_file(dev->dev, attr);
1165 if (err) {
1166 device_destroy(android_class, dev->dev->devt);
1167 return err;
John Michelaud5d2de62010-12-10 11:33:54 -06001168 }
1169 }
Benoit Gobyaab96812011-04-19 20:37:33 -07001170 return 0;
John Michelaud5d2de62010-12-10 11:33:54 -06001171}
1172
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001173static int __devinit android_probe(struct platform_device *pdev)
1174{
1175 struct android_usb_platform_data *pdata = pdev->dev.platform_data;
1176 struct android_dev *dev = _android_dev;
1177
1178 dev->pdata = pdata;
1179
1180 return 0;
1181}
1182
1183static struct platform_driver android_platform_driver = {
1184 .driver = { .name = "android_usb"},
1185};
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001186
1187static int __init init(void)
1188{
1189 struct android_dev *dev;
Benoit Gobyaab96812011-04-19 20:37:33 -07001190 int err;
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001191
Benoit Gobyaab96812011-04-19 20:37:33 -07001192 android_class = class_create(THIS_MODULE, "android_usb");
1193 if (IS_ERR(android_class))
1194 return PTR_ERR(android_class);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001195
1196 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1197 if (!dev)
1198 return -ENOMEM;
1199
Benoit Gobyaab96812011-04-19 20:37:33 -07001200 dev->functions = supported_functions;
1201 INIT_LIST_HEAD(&dev->enabled_functions);
1202 INIT_WORK(&dev->work, android_work);
1203
1204 err = android_create_device(dev);
1205 if (err) {
1206 class_destroy(android_class);
1207 kfree(dev);
1208 return err;
1209 }
1210
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001211 _android_dev = dev;
1212
Benoit Gobyaab96812011-04-19 20:37:33 -07001213 /* Override composite driver functions */
1214 composite_driver.setup = android_setup;
1215 composite_driver.disconnect = android_disconnect;
1216
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001217 platform_driver_probe(&android_platform_driver, android_probe);
1218
Benoit Gobyaab96812011-04-19 20:37:33 -07001219 return usb_composite_probe(&android_usb_driver, android_bind);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001220}
1221module_init(init);
1222
1223static void __exit cleanup(void)
1224{
1225 usb_composite_unregister(&android_usb_driver);
Benoit Gobyaab96812011-04-19 20:37:33 -07001226 class_destroy(android_class);
Mike Lockwood7f0d7bd2008-12-02 22:01:33 -05001227 kfree(_android_dev);
1228 _android_dev = NULL;
1229}
1230module_exit(cleanup);