usb: udc: store usb_udc pointer in struct usb_gadget
[linux-2.6-block.git] / drivers / usb / gadget / udc / udc-core.c
CommitLineData
2ccea03a
FB
1/**
2 * udc.c - Core UDC Framework
3 *
4 * Copyright (C) 2010 Texas Instruments
5 * Author: Felipe Balbi <balbi@ti.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 of
9 * the License as published by the Free Software Foundation.
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 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <linux/kernel.h>
21#include <linux/module.h>
22#include <linux/device.h>
23#include <linux/list.h>
24#include <linux/err.h>
a698908d 25#include <linux/dma-mapping.h>
5702f753 26#include <linux/workqueue.h>
2ccea03a
FB
27
28#include <linux/usb/ch9.h>
29#include <linux/usb/gadget.h>
0cfbd328 30#include <linux/usb.h>
2ccea03a
FB
31
32/**
33 * struct usb_udc - describes one usb device controller
34 * @driver - the gadget driver pointer. For use by the class code
35 * @dev - the child device to the actual controller
36 * @gadget - the gadget. For use by the class code
37 * @list - for use by the udc class driver
38 *
39 * This represents the internal data structure which is used by the UDC-class
40 * to hold information about udc driver and gadget together.
41 */
42struct usb_udc {
43 struct usb_gadget_driver *driver;
44 struct usb_gadget *gadget;
45 struct device dev;
46 struct list_head list;
47};
48
49static struct class *udc_class;
2ccea03a
FB
50static LIST_HEAD(udc_list);
51static DEFINE_MUTEX(udc_lock);
52
53/* ------------------------------------------------------------------------- */
54
908b9613
AS
55#ifdef CONFIG_HAS_DMA
56
a698908d
FB
57int usb_gadget_map_request(struct usb_gadget *gadget,
58 struct usb_request *req, int is_in)
59{
60 if (req->length == 0)
61 return 0;
62
63 if (req->num_sgs) {
64 int mapped;
65
66 mapped = dma_map_sg(&gadget->dev, req->sg, req->num_sgs,
67 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
68 if (mapped == 0) {
69 dev_err(&gadget->dev, "failed to map SGs\n");
70 return -EFAULT;
71 }
72
73 req->num_mapped_sgs = mapped;
74 } else {
75 req->dma = dma_map_single(&gadget->dev, req->buf, req->length,
76 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
77
78 if (dma_mapping_error(&gadget->dev, req->dma)) {
79 dev_err(&gadget->dev, "failed to map buffer\n");
80 return -EFAULT;
81 }
82 }
83
84 return 0;
85}
86EXPORT_SYMBOL_GPL(usb_gadget_map_request);
87
88void usb_gadget_unmap_request(struct usb_gadget *gadget,
89 struct usb_request *req, int is_in)
90{
91 if (req->length == 0)
92 return;
93
94 if (req->num_mapped_sgs) {
95 dma_unmap_sg(&gadget->dev, req->sg, req->num_mapped_sgs,
96 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
97
98 req->num_mapped_sgs = 0;
99 } else {
100 dma_unmap_single(&gadget->dev, req->dma, req->length,
101 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
102 }
103}
104EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
105
908b9613
AS
106#endif /* CONFIG_HAS_DMA */
107
a698908d
FB
108/* ------------------------------------------------------------------------- */
109
3fc2aa55
MS
110/**
111 * usb_gadget_giveback_request - give the request back to the gadget layer
112 * Context: in_interrupt()
113 *
114 * This is called by device controller drivers in order to return the
115 * completed request back to the gadget layer.
116 */
117void usb_gadget_giveback_request(struct usb_ep *ep,
118 struct usb_request *req)
119{
0cfbd328
MS
120 if (likely(req->status == 0))
121 usb_led_activity(USB_LED_EVENT_GADGET);
122
3fc2aa55
MS
123 req->complete(ep, req);
124}
125EXPORT_SYMBOL_GPL(usb_gadget_giveback_request);
126
127/* ------------------------------------------------------------------------- */
128
5702f753
FB
129static void usb_gadget_state_work(struct work_struct *work)
130{
dfea9c94
PC
131 struct usb_gadget *gadget = work_to_gadget(work);
132 struct usb_udc *udc = gadget->udc;
5702f753 133
dfea9c94
PC
134 if (udc)
135 sysfs_notify(&udc->dev.kobj, NULL, "state");
5702f753
FB
136}
137
49401f41
FB
138void usb_gadget_set_state(struct usb_gadget *gadget,
139 enum usb_device_state state)
140{
141 gadget->state = state;
5702f753 142 schedule_work(&gadget->work);
49401f41
FB
143}
144EXPORT_SYMBOL_GPL(usb_gadget_set_state);
145
146/* ------------------------------------------------------------------------- */
147
974a70bd
PC
148/**
149 * usb_gadget_udc_reset - notifies the udc core that bus reset occurs
150 * @gadget: The gadget which bus reset occurs
151 * @driver: The gadget driver we want to notify
152 *
153 * If the udc driver has bus reset handler, it needs to call this when the bus
154 * reset occurs, it notifies the gadget driver that the bus reset occurs as
155 * well as updates gadget state.
156 */
157void usb_gadget_udc_reset(struct usb_gadget *gadget,
158 struct usb_gadget_driver *driver)
159{
160 driver->reset(gadget);
161 usb_gadget_set_state(gadget, USB_STATE_DEFAULT);
162}
163EXPORT_SYMBOL_GPL(usb_gadget_udc_reset);
164
352c2dc8
SAS
165/**
166 * usb_gadget_udc_start - tells usb device controller to start up
2c683347 167 * @udc: The UDC to be started
352c2dc8
SAS
168 *
169 * This call is issued by the UDC Class driver when it's about
170 * to register a gadget driver to the device controller, before
171 * calling gadget driver's bind() method.
172 *
173 * It allows the controller to be powered off until strictly
174 * necessary to have it powered on.
175 *
176 * Returns zero on success, else negative errno.
177 */
2c683347 178static inline int usb_gadget_udc_start(struct usb_udc *udc)
352c2dc8 179{
2c683347 180 return udc->gadget->ops->udc_start(udc->gadget, udc->driver);
352c2dc8
SAS
181}
182
352c2dc8
SAS
183/**
184 * usb_gadget_udc_stop - tells usb device controller we don't need it anymore
185 * @gadget: The device we want to stop activity
186 * @driver: The driver to unbind from @gadget
187 *
188 * This call is issued by the UDC Class driver after calling
189 * gadget driver's unbind() method.
190 *
191 * The details are implementation specific, but it can go as
192 * far as powering off UDC completely and disable its data
193 * line pullups.
194 */
2c683347 195static inline void usb_gadget_udc_stop(struct usb_udc *udc)
352c2dc8 196{
22835b80 197 udc->gadget->ops->udc_stop(udc->gadget);
352c2dc8
SAS
198}
199
2ccea03a
FB
200/**
201 * usb_udc_release - release the usb_udc struct
202 * @dev: the dev member within usb_udc
203 *
204 * This is called by driver's core in order to free memory once the last
205 * reference is released.
206 */
207static void usb_udc_release(struct device *dev)
208{
209 struct usb_udc *udc;
210
211 udc = container_of(dev, struct usb_udc, dev);
212 dev_dbg(dev, "releasing '%s'\n", dev_name(dev));
213 kfree(udc);
214}
215
019f976e 216static const struct attribute_group *usb_udc_attr_groups[];
792bfcf7
FB
217
218static void usb_udc_nop_release(struct device *dev)
219{
220 dev_vdbg(dev, "%s\n", __func__);
221}
222
2ccea03a 223/**
792bfcf7
FB
224 * usb_add_gadget_udc_release - adds a new gadget to the udc class driver list
225 * @parent: the parent device to this udc. Usually the controller driver's
226 * device.
227 * @gadget: the gadget to be added to the list.
228 * @release: a gadget release function.
2ccea03a
FB
229 *
230 * Returns zero on success, negative errno otherwise.
231 */
792bfcf7
FB
232int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
233 void (*release)(struct device *dev))
2ccea03a
FB
234{
235 struct usb_udc *udc;
236 int ret = -ENOMEM;
237
238 udc = kzalloc(sizeof(*udc), GFP_KERNEL);
239 if (!udc)
240 goto err1;
241
7bce401c 242 dev_set_name(&gadget->dev, "gadget");
5702f753 243 INIT_WORK(&gadget->work, usb_gadget_state_work);
2ed14320 244 gadget->dev.parent = parent;
f07bd56b 245
908b9613 246#ifdef CONFIG_HAS_DMA
658c8cf1
FB
247 dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask);
248 gadget->dev.dma_parms = parent->dma_parms;
249 gadget->dev.dma_mask = parent->dma_mask;
908b9613 250#endif
658c8cf1 251
ddf47ccb 252 if (release)
792bfcf7 253 gadget->dev.release = release;
ddf47ccb
FB
254 else
255 gadget->dev.release = usb_udc_nop_release;
792bfcf7 256
7bce401c
FB
257 ret = device_register(&gadget->dev);
258 if (ret)
259 goto err2;
f07bd56b 260
2ccea03a
FB
261 device_initialize(&udc->dev);
262 udc->dev.release = usb_udc_release;
263 udc->dev.class = udc_class;
019f976e 264 udc->dev.groups = usb_udc_attr_groups;
2ccea03a
FB
265 udc->dev.parent = parent;
266 ret = dev_set_name(&udc->dev, "%s", kobject_name(&parent->kobj));
267 if (ret)
f07bd56b 268 goto err3;
2ccea03a
FB
269
270 udc->gadget = gadget;
dfea9c94 271 gadget->udc = udc;
2ccea03a
FB
272
273 mutex_lock(&udc_lock);
274 list_add_tail(&udc->list, &udc_list);
275
276 ret = device_add(&udc->dev);
277 if (ret)
f07bd56b 278 goto err4;
2ccea03a 279
49401f41 280 usb_gadget_set_state(gadget, USB_STATE_NOTATTACHED);
2ccea03a
FB
281
282 mutex_unlock(&udc_lock);
283
284 return 0;
f07bd56b
FB
285
286err4:
2ccea03a
FB
287 list_del(&udc->list);
288 mutex_unlock(&udc_lock);
289
f07bd56b 290err3:
2ccea03a
FB
291 put_device(&udc->dev);
292
f07bd56b 293err2:
7bce401c 294 put_device(&gadget->dev);
c5dbc220 295 kfree(udc);
7bce401c 296
2ccea03a
FB
297err1:
298 return ret;
299}
792bfcf7
FB
300EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release);
301
302/**
303 * usb_add_gadget_udc - adds a new gadget to the udc class driver list
304 * @parent: the parent device to this udc. Usually the controller
305 * driver's device.
306 * @gadget: the gadget to be added to the list
307 *
308 * Returns zero on success, negative errno otherwise.
309 */
310int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)
311{
312 return usb_add_gadget_udc_release(parent, gadget, NULL);
313}
2ccea03a
FB
314EXPORT_SYMBOL_GPL(usb_add_gadget_udc);
315
316static void usb_gadget_remove_driver(struct usb_udc *udc)
317{
318 dev_dbg(&udc->dev, "unregistering UDC driver [%s]\n",
8da9fe8a 319 udc->driver->function);
2ccea03a
FB
320
321 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
322
2d7ebbb0
FB
323 usb_gadget_disconnect(udc->gadget);
324 udc->driver->disconnect(udc->gadget);
325 udc->driver->unbind(udc->gadget);
2c683347 326 usb_gadget_udc_stop(udc);
2ccea03a
FB
327
328 udc->driver = NULL;
329 udc->dev.driver = NULL;
70d3a498 330 udc->gadget->dev.driver = NULL;
2ccea03a
FB
331}
332
333/**
334 * usb_del_gadget_udc - deletes @udc from udc_list
335 * @gadget: the gadget to be removed.
336 *
337 * This, will call usb_gadget_unregister_driver() if
338 * the @udc is still busy.
339 */
340void usb_del_gadget_udc(struct usb_gadget *gadget)
341{
dfea9c94 342 struct usb_udc *udc = gadget->udc;
2ccea03a 343
dfea9c94
PC
344 if (!udc)
345 return;
2ccea03a 346
2ccea03a
FB
347 dev_vdbg(gadget->dev.parent, "unregistering gadget\n");
348
dfea9c94 349 mutex_lock(&udc_lock);
2ccea03a
FB
350 list_del(&udc->list);
351 mutex_unlock(&udc_lock);
352
353 if (udc->driver)
354 usb_gadget_remove_driver(udc);
355
356 kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
5702f753 357 flush_work(&gadget->work);
2ccea03a 358 device_unregister(&udc->dev);
7bce401c 359 device_unregister(&gadget->dev);
2ccea03a
FB
360}
361EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
362
363/* ------------------------------------------------------------------------- */
364
4c49a5f0 365static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver)
2ccea03a 366{
4c49a5f0 367 int ret;
2ccea03a 368
2ccea03a
FB
369 dev_dbg(&udc->dev, "registering UDC driver [%s]\n",
370 driver->function);
371
372 udc->driver = driver;
373 udc->dev.driver = &driver->driver;
70d3a498 374 udc->gadget->dev.driver = &driver->driver;
2ccea03a 375
2d7ebbb0
FB
376 ret = driver->bind(udc->gadget, driver);
377 if (ret)
378 goto err1;
2c683347 379 ret = usb_gadget_udc_start(udc);
2d7ebbb0
FB
380 if (ret) {
381 driver->unbind(udc->gadget);
382 goto err1;
352c2dc8 383 }
2d7ebbb0 384 usb_gadget_connect(udc->gadget);
2ccea03a
FB
385
386 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
2ccea03a 387 return 0;
2ccea03a 388err1:
f8cffc84
FE
389 if (ret != -EISNAM)
390 dev_err(&udc->dev, "failed to start %s: %d\n",
2ccea03a
FB
391 udc->driver->function, ret);
392 udc->driver = NULL;
393 udc->dev.driver = NULL;
70d3a498 394 udc->gadget->dev.driver = NULL;
4c49a5f0
SAS
395 return ret;
396}
397
02e8c966 398int usb_udc_attach_driver(const char *name, struct usb_gadget_driver *driver)
4c49a5f0
SAS
399{
400 struct usb_udc *udc = NULL;
401 int ret = -ENODEV;
402
403 mutex_lock(&udc_lock);
404 list_for_each_entry(udc, &udc_list, list) {
405 ret = strcmp(name, dev_name(&udc->dev));
406 if (!ret)
407 break;
408 }
409 if (ret) {
410 ret = -ENODEV;
411 goto out;
412 }
413 if (udc->driver) {
414 ret = -EBUSY;
415 goto out;
416 }
417 ret = udc_bind_to_driver(udc, driver);
418out:
419 mutex_unlock(&udc_lock);
420 return ret;
421}
02e8c966 422EXPORT_SYMBOL_GPL(usb_udc_attach_driver);
4c49a5f0
SAS
423
424int usb_gadget_probe_driver(struct usb_gadget_driver *driver)
425{
426 struct usb_udc *udc = NULL;
427 int ret;
428
429 if (!driver || !driver->bind || !driver->setup)
430 return -EINVAL;
431
432 mutex_lock(&udc_lock);
433 list_for_each_entry(udc, &udc_list, list) {
434 /* For now we take the first one */
435 if (!udc->driver)
436 goto found;
437 }
438
439 pr_debug("couldn't find an available UDC\n");
440 mutex_unlock(&udc_lock);
441 return -ENODEV;
442found:
443 ret = udc_bind_to_driver(udc, driver);
2ccea03a
FB
444 mutex_unlock(&udc_lock);
445 return ret;
446}
447EXPORT_SYMBOL_GPL(usb_gadget_probe_driver);
448
449int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
450{
451 struct usb_udc *udc = NULL;
452 int ret = -ENODEV;
453
454 if (!driver || !driver->unbind)
455 return -EINVAL;
456
457 mutex_lock(&udc_lock);
458 list_for_each_entry(udc, &udc_list, list)
459 if (udc->driver == driver) {
460 usb_gadget_remove_driver(udc);
b5fb8d0a
PC
461 usb_gadget_set_state(udc->gadget,
462 USB_STATE_NOTATTACHED);
2ccea03a
FB
463 ret = 0;
464 break;
465 }
466
467 mutex_unlock(&udc_lock);
468 return ret;
469}
470EXPORT_SYMBOL_GPL(usb_gadget_unregister_driver);
471
472/* ------------------------------------------------------------------------- */
473
474static ssize_t usb_udc_srp_store(struct device *dev,
475 struct device_attribute *attr, const char *buf, size_t n)
476{
1d91a962 477 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
2ccea03a
FB
478
479 if (sysfs_streq(buf, "1"))
480 usb_gadget_wakeup(udc->gadget);
481
482 return n;
483}
484static DEVICE_ATTR(srp, S_IWUSR, NULL, usb_udc_srp_store);
485
486static ssize_t usb_udc_softconn_store(struct device *dev,
487 struct device_attribute *attr, const char *buf, size_t n)
488{
865569ba 489 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
2ccea03a 490
bfa6b18c
FB
491 if (!udc->driver) {
492 dev_err(dev, "soft-connect without a gadget driver\n");
493 return -EOPNOTSUPP;
494 }
495
2ccea03a 496 if (sysfs_streq(buf, "connect")) {
2c683347 497 usb_gadget_udc_start(udc);
2ccea03a
FB
498 usb_gadget_connect(udc->gadget);
499 } else if (sysfs_streq(buf, "disconnect")) {
83a787a7 500 usb_gadget_disconnect(udc->gadget);
0abd0696 501 udc->driver->disconnect(udc->gadget);
2c683347 502 usb_gadget_udc_stop(udc);
2ccea03a
FB
503 } else {
504 dev_err(dev, "unsupported command '%s'\n", buf);
505 return -EINVAL;
506 }
507
508 return n;
509}
510static DEVICE_ATTR(soft_connect, S_IWUSR, NULL, usb_udc_softconn_store);
511
ce26bd23
GKH
512static ssize_t state_show(struct device *dev, struct device_attribute *attr,
513 char *buf)
49401f41
FB
514{
515 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
516 struct usb_gadget *gadget = udc->gadget;
517
518 return sprintf(buf, "%s\n", usb_state_string(gadget->state));
519}
ce26bd23 520static DEVICE_ATTR_RO(state);
49401f41 521
d327ab5b 522#define USB_UDC_SPEED_ATTR(name, param) \
ce26bd23 523ssize_t name##_show(struct device *dev, \
d327ab5b
MN
524 struct device_attribute *attr, char *buf) \
525{ \
526 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \
527 return snprintf(buf, PAGE_SIZE, "%s\n", \
528 usb_speed_string(udc->gadget->param)); \
529} \
ce26bd23 530static DEVICE_ATTR_RO(name)
d327ab5b
MN
531
532static USB_UDC_SPEED_ATTR(current_speed, speed);
533static USB_UDC_SPEED_ATTR(maximum_speed, max_speed);
534
2ccea03a 535#define USB_UDC_ATTR(name) \
ce26bd23 536ssize_t name##_show(struct device *dev, \
2ccea03a
FB
537 struct device_attribute *attr, char *buf) \
538{ \
019f976e 539 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \
2ccea03a
FB
540 struct usb_gadget *gadget = udc->gadget; \
541 \
542 return snprintf(buf, PAGE_SIZE, "%d\n", gadget->name); \
543} \
ce26bd23 544static DEVICE_ATTR_RO(name)
2ccea03a 545
2ccea03a
FB
546static USB_UDC_ATTR(is_otg);
547static USB_UDC_ATTR(is_a_peripheral);
548static USB_UDC_ATTR(b_hnp_enable);
549static USB_UDC_ATTR(a_hnp_support);
550static USB_UDC_ATTR(a_alt_hnp_support);
3f6dd4fe 551static USB_UDC_ATTR(is_selfpowered);
2ccea03a
FB
552
553static struct attribute *usb_udc_attrs[] = {
554 &dev_attr_srp.attr,
555 &dev_attr_soft_connect.attr,
49401f41 556 &dev_attr_state.attr,
d327ab5b
MN
557 &dev_attr_current_speed.attr,
558 &dev_attr_maximum_speed.attr,
2ccea03a 559
2ccea03a
FB
560 &dev_attr_is_otg.attr,
561 &dev_attr_is_a_peripheral.attr,
562 &dev_attr_b_hnp_enable.attr,
563 &dev_attr_a_hnp_support.attr,
564 &dev_attr_a_alt_hnp_support.attr,
3f6dd4fe 565 &dev_attr_is_selfpowered.attr,
2ccea03a
FB
566 NULL,
567};
568
569static const struct attribute_group usb_udc_attr_group = {
570 .attrs = usb_udc_attrs,
571};
572
573static const struct attribute_group *usb_udc_attr_groups[] = {
574 &usb_udc_attr_group,
575 NULL,
576};
577
578static int usb_udc_uevent(struct device *dev, struct kobj_uevent_env *env)
579{
580 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
581 int ret;
582
583 ret = add_uevent_var(env, "USB_UDC_NAME=%s", udc->gadget->name);
584 if (ret) {
585 dev_err(dev, "failed to add uevent USB_UDC_NAME\n");
586 return ret;
587 }
588
589 if (udc->driver) {
590 ret = add_uevent_var(env, "USB_UDC_DRIVER=%s",
591 udc->driver->function);
592 if (ret) {
593 dev_err(dev, "failed to add uevent USB_UDC_DRIVER\n");
594 return ret;
595 }
596 }
597
598 return 0;
599}
600
601static int __init usb_udc_init(void)
602{
603 udc_class = class_create(THIS_MODULE, "udc");
604 if (IS_ERR(udc_class)) {
605 pr_err("failed to create udc class --> %ld\n",
606 PTR_ERR(udc_class));
607 return PTR_ERR(udc_class);
608 }
609
610 udc_class->dev_uevent = usb_udc_uevent;
2ccea03a
FB
611 return 0;
612}
613subsys_initcall(usb_udc_init);
614
615static void __exit usb_udc_exit(void)
616{
617 class_destroy(udc_class);
618}
619module_exit(usb_udc_exit);
620
621MODULE_DESCRIPTION("UDC Framework");
622MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
623MODULE_LICENSE("GPL v2");