1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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>
25#include <linux/dma-mapping.h>
26#include <linux/workqueue.h>
27
28#include <linux/usb/ch9.h>
29#include <linux/usb/gadget.h>
30#include <linux/usb.h>
31
32#include "trace.h"
33
34
35
36
37
38
39
40
41
42
43
44
45
46struct usb_udc {
47 struct usb_gadget_driver *driver;
48 struct usb_gadget *gadget;
49 struct device dev;
50 struct list_head list;
51 bool vbus;
52};
53
54static struct class *udc_class;
55static LIST_HEAD(udc_list);
56static LIST_HEAD(gadget_driver_pending_list);
57static DEFINE_MUTEX(udc_lock);
58
59static int udc_bind_to_driver(struct usb_udc *udc,
60 struct usb_gadget_driver *driver);
61
62
63
64
65
66
67
68
69
70
71
72void usb_ep_set_maxpacket_limit(struct usb_ep *ep,
73 unsigned maxpacket_limit)
74{
75 ep->maxpacket_limit = maxpacket_limit;
76 ep->maxpacket = maxpacket_limit;
77
78 trace_usb_ep_set_maxpacket_limit(ep, 0);
79}
80EXPORT_SYMBOL_GPL(usb_ep_set_maxpacket_limit);
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102int usb_ep_enable(struct usb_ep *ep)
103{
104 int ret = 0;
105
106 if (ep->enabled)
107 goto out;
108
109 ret = ep->ops->enable(ep, ep->desc);
110 if (ret)
111 goto out;
112
113 ep->enabled = true;
114
115out:
116 trace_usb_ep_enable(ep, ret);
117
118 return ret;
119}
120EXPORT_SYMBOL_GPL(usb_ep_enable);
121
122
123
124
125
126
127
128
129
130
131
132
133
134int usb_ep_disable(struct usb_ep *ep)
135{
136 int ret = 0;
137
138 if (!ep->enabled)
139 goto out;
140
141 ret = ep->ops->disable(ep);
142 if (ret) {
143 ret = ret;
144 goto out;
145 }
146
147 ep->enabled = false;
148
149out:
150 trace_usb_ep_disable(ep, ret);
151
152 return ret;
153}
154EXPORT_SYMBOL_GPL(usb_ep_disable);
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170struct usb_request *usb_ep_alloc_request(struct usb_ep *ep,
171 gfp_t gfp_flags)
172{
173 struct usb_request *req = NULL;
174
175 req = ep->ops->alloc_request(ep, gfp_flags);
176
177 trace_usb_ep_alloc_request(ep, req, req ? 0 : -ENOMEM);
178
179 return req;
180}
181EXPORT_SYMBOL_GPL(usb_ep_alloc_request);
182
183
184
185
186
187
188
189
190
191
192void usb_ep_free_request(struct usb_ep *ep,
193 struct usb_request *req)
194{
195 ep->ops->free_request(ep, req);
196 trace_usb_ep_free_request(ep, req, 0);
197}
198EXPORT_SYMBOL_GPL(usb_ep_free_request);
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257int usb_ep_queue(struct usb_ep *ep,
258 struct usb_request *req, gfp_t gfp_flags)
259{
260 int ret = 0;
261
262 if (WARN_ON_ONCE(!ep->enabled && ep->address)) {
263 ret = -ESHUTDOWN;
264 goto out;
265 }
266
267 ret = ep->ops->queue(ep, req, gfp_flags);
268
269out:
270 trace_usb_ep_queue(ep, req, ret);
271
272 return ret;
273}
274EXPORT_SYMBOL_GPL(usb_ep_queue);
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291int usb_ep_dequeue(struct usb_ep *ep, struct usb_request *req)
292{
293 int ret;
294
295 ret = ep->ops->dequeue(ep, req);
296 trace_usb_ep_dequeue(ep, req, ret);
297
298 return ret;
299}
300EXPORT_SYMBOL_GPL(usb_ep_dequeue);
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323int usb_ep_set_halt(struct usb_ep *ep)
324{
325 int ret;
326
327 ret = ep->ops->set_halt(ep, 1);
328 trace_usb_ep_set_halt(ep, ret);
329
330 return ret;
331}
332EXPORT_SYMBOL_GPL(usb_ep_set_halt);
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347int usb_ep_clear_halt(struct usb_ep *ep)
348{
349 int ret;
350
351 ret = ep->ops->set_halt(ep, 0);
352 trace_usb_ep_clear_halt(ep, ret);
353
354 return ret;
355}
356EXPORT_SYMBOL_GPL(usb_ep_clear_halt);
357
358
359
360
361
362
363
364
365
366
367
368int usb_ep_set_wedge(struct usb_ep *ep)
369{
370 int ret;
371
372 if (ep->ops->set_wedge)
373 ret = ep->ops->set_wedge(ep);
374 else
375 ret = ep->ops->set_halt(ep, 1);
376
377 trace_usb_ep_set_wedge(ep, ret);
378
379 return ret;
380}
381EXPORT_SYMBOL_GPL(usb_ep_set_wedge);
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398int usb_ep_fifo_status(struct usb_ep *ep)
399{
400 int ret;
401
402 if (ep->ops->fifo_status)
403 ret = ep->ops->fifo_status(ep);
404 else
405 ret = -EOPNOTSUPP;
406
407 trace_usb_ep_fifo_status(ep, ret);
408
409 return ret;
410}
411EXPORT_SYMBOL_GPL(usb_ep_fifo_status);
412
413
414
415
416
417
418
419
420
421
422void usb_ep_fifo_flush(struct usb_ep *ep)
423{
424 if (ep->ops->fifo_flush)
425 ep->ops->fifo_flush(ep);
426
427 trace_usb_ep_fifo_flush(ep, 0);
428}
429EXPORT_SYMBOL_GPL(usb_ep_fifo_flush);
430
431
432
433
434
435
436
437
438
439
440int usb_gadget_frame_number(struct usb_gadget *gadget)
441{
442 int ret;
443
444 ret = gadget->ops->get_frame(gadget);
445
446 trace_usb_gadget_frame_number(gadget, ret);
447
448 return ret;
449}
450EXPORT_SYMBOL_GPL(usb_gadget_frame_number);
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465int usb_gadget_wakeup(struct usb_gadget *gadget)
466{
467 int ret = 0;
468
469 if (!gadget->ops->wakeup) {
470 ret = -EOPNOTSUPP;
471 goto out;
472 }
473
474 ret = gadget->ops->wakeup(gadget);
475
476out:
477 trace_usb_gadget_wakeup(gadget, ret);
478
479 return ret;
480}
481EXPORT_SYMBOL_GPL(usb_gadget_wakeup);
482
483
484
485
486
487
488
489
490
491
492int usb_gadget_set_selfpowered(struct usb_gadget *gadget)
493{
494 int ret = 0;
495
496 if (!gadget->ops->set_selfpowered) {
497 ret = -EOPNOTSUPP;
498 goto out;
499 }
500
501 ret = gadget->ops->set_selfpowered(gadget, 1);
502
503out:
504 trace_usb_gadget_set_selfpowered(gadget, ret);
505
506 return ret;
507}
508EXPORT_SYMBOL_GPL(usb_gadget_set_selfpowered);
509
510
511
512
513
514
515
516
517
518
519
520int usb_gadget_clear_selfpowered(struct usb_gadget *gadget)
521{
522 int ret = 0;
523
524 if (!gadget->ops->set_selfpowered) {
525 ret = -EOPNOTSUPP;
526 goto out;
527 }
528
529 ret = gadget->ops->set_selfpowered(gadget, 0);
530
531out:
532 trace_usb_gadget_clear_selfpowered(gadget, ret);
533
534 return ret;
535}
536EXPORT_SYMBOL_GPL(usb_gadget_clear_selfpowered);
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551int usb_gadget_vbus_connect(struct usb_gadget *gadget)
552{
553 int ret = 0;
554
555 if (!gadget->ops->vbus_session) {
556 ret = -EOPNOTSUPP;
557 goto out;
558 }
559
560 ret = gadget->ops->vbus_session(gadget, 1);
561
562out:
563 trace_usb_gadget_vbus_connect(gadget, ret);
564
565 return ret;
566}
567EXPORT_SYMBOL_GPL(usb_gadget_vbus_connect);
568
569
570
571
572
573
574
575
576
577
578
579
580
581int usb_gadget_vbus_draw(struct usb_gadget *gadget, unsigned mA)
582{
583 int ret = 0;
584
585 if (!gadget->ops->vbus_draw) {
586 ret = -EOPNOTSUPP;
587 goto out;
588 }
589
590 ret = gadget->ops->vbus_draw(gadget, mA);
591 if (!ret)
592 gadget->mA = mA;
593
594out:
595 trace_usb_gadget_vbus_draw(gadget, ret);
596
597 return ret;
598}
599EXPORT_SYMBOL_GPL(usb_gadget_vbus_draw);
600
601
602
603
604
605
606
607
608
609
610
611
612int usb_gadget_vbus_disconnect(struct usb_gadget *gadget)
613{
614 int ret = 0;
615
616 if (!gadget->ops->vbus_session) {
617 ret = -EOPNOTSUPP;
618 goto out;
619 }
620
621 ret = gadget->ops->vbus_session(gadget, 0);
622
623out:
624 trace_usb_gadget_vbus_disconnect(gadget, ret);
625
626 return ret;
627}
628EXPORT_SYMBOL_GPL(usb_gadget_vbus_disconnect);
629
630
631
632
633
634
635
636
637
638
639
640
641int usb_gadget_connect(struct usb_gadget *gadget)
642{
643 int ret = 0;
644
645 if (!gadget->ops->pullup) {
646 ret = -EOPNOTSUPP;
647 goto out;
648 }
649
650 if (gadget->deactivated) {
651
652
653
654
655 gadget->connected = true;
656 goto out;
657 }
658
659 ret = gadget->ops->pullup(gadget, 1);
660 if (!ret)
661 gadget->connected = 1;
662
663out:
664 trace_usb_gadget_connect(gadget, ret);
665
666 return ret;
667}
668EXPORT_SYMBOL_GPL(usb_gadget_connect);
669
670
671
672
673
674
675
676
677
678
679
680int usb_gadget_disconnect(struct usb_gadget *gadget)
681{
682 int ret = 0;
683
684 if (!gadget->ops->pullup) {
685 ret = -EOPNOTSUPP;
686 goto out;
687 }
688
689 if (gadget->deactivated) {
690
691
692
693
694 gadget->connected = false;
695 goto out;
696 }
697
698 ret = gadget->ops->pullup(gadget, 0);
699 if (!ret)
700 gadget->connected = 0;
701
702out:
703 trace_usb_gadget_disconnect(gadget, ret);
704
705 return ret;
706}
707EXPORT_SYMBOL_GPL(usb_gadget_disconnect);
708
709
710
711
712
713
714
715
716
717
718
719
720int usb_gadget_deactivate(struct usb_gadget *gadget)
721{
722 int ret = 0;
723
724 if (gadget->deactivated)
725 goto out;
726
727 if (gadget->connected) {
728 ret = usb_gadget_disconnect(gadget);
729 if (ret)
730 goto out;
731
732
733
734
735
736 gadget->connected = true;
737 }
738 gadget->deactivated = true;
739
740out:
741 trace_usb_gadget_deactivate(gadget, ret);
742
743 return ret;
744}
745EXPORT_SYMBOL_GPL(usb_gadget_deactivate);
746
747
748
749
750
751
752
753
754
755
756int usb_gadget_activate(struct usb_gadget *gadget)
757{
758 int ret = 0;
759
760 if (!gadget->deactivated)
761 goto out;
762
763 gadget->deactivated = false;
764
765
766
767
768
769 if (gadget->connected)
770 ret = usb_gadget_connect(gadget);
771
772out:
773 trace_usb_gadget_activate(gadget, ret);
774
775 return ret;
776}
777EXPORT_SYMBOL_GPL(usb_gadget_activate);
778
779
780
781#ifdef CONFIG_HAS_DMA
782
783int usb_gadget_map_request_by_dev(struct device *dev,
784 struct usb_request *req, int is_in)
785{
786 if (req->length == 0)
787 return 0;
788
789 if (req->num_sgs) {
790 int mapped;
791
792 mapped = dma_map_sg(dev, req->sg, req->num_sgs,
793 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
794 if (mapped == 0) {
795 dev_err(dev, "failed to map SGs\n");
796 return -EFAULT;
797 }
798
799 req->num_mapped_sgs = mapped;
800 } else {
801 req->dma = dma_map_single(dev, req->buf, req->length,
802 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
803
804 if (dma_mapping_error(dev, req->dma)) {
805 dev_err(dev, "failed to map buffer\n");
806 return -EFAULT;
807 }
808 }
809
810 return 0;
811}
812EXPORT_SYMBOL_GPL(usb_gadget_map_request_by_dev);
813
814int usb_gadget_map_request(struct usb_gadget *gadget,
815 struct usb_request *req, int is_in)
816{
817 return usb_gadget_map_request_by_dev(gadget->dev.parent, req, is_in);
818}
819EXPORT_SYMBOL_GPL(usb_gadget_map_request);
820
821void usb_gadget_unmap_request_by_dev(struct device *dev,
822 struct usb_request *req, int is_in)
823{
824 if (req->length == 0)
825 return;
826
827 if (req->num_mapped_sgs) {
828 dma_unmap_sg(dev, req->sg, req->num_sgs,
829 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
830
831 req->num_mapped_sgs = 0;
832 } else {
833 dma_unmap_single(dev, req->dma, req->length,
834 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
835 }
836}
837EXPORT_SYMBOL_GPL(usb_gadget_unmap_request_by_dev);
838
839void usb_gadget_unmap_request(struct usb_gadget *gadget,
840 struct usb_request *req, int is_in)
841{
842 usb_gadget_unmap_request_by_dev(gadget->dev.parent, req, is_in);
843}
844EXPORT_SYMBOL_GPL(usb_gadget_unmap_request);
845
846#endif
847
848
849
850
851
852
853
854
855
856
857void usb_gadget_giveback_request(struct usb_ep *ep,
858 struct usb_request *req)
859{
860 if (likely(req->status == 0))
861 usb_led_activity(USB_LED_EVENT_GADGET);
862
863 trace_usb_gadget_giveback_request(ep, req, 0);
864
865 req->complete(ep, req);
866}
867EXPORT_SYMBOL_GPL(usb_gadget_giveback_request);
868
869
870
871
872
873
874
875
876
877struct usb_ep *gadget_find_ep_by_name(struct usb_gadget *g, const char *name)
878{
879 struct usb_ep *ep;
880
881 gadget_for_each_ep(ep, g) {
882 if (!strcmp(ep->name, name))
883 return ep;
884 }
885
886 return NULL;
887}
888EXPORT_SYMBOL_GPL(gadget_find_ep_by_name);
889
890
891
892int usb_gadget_ep_match_desc(struct usb_gadget *gadget,
893 struct usb_ep *ep, struct usb_endpoint_descriptor *desc,
894 struct usb_ss_ep_comp_descriptor *ep_comp)
895{
896 u8 type;
897 u16 max;
898 int num_req_streams = 0;
899
900
901 if (ep->claimed)
902 return 0;
903
904 type = usb_endpoint_type(desc);
905 max = 0x7ff & usb_endpoint_maxp(desc);
906
907 if (usb_endpoint_dir_in(desc) && !ep->caps.dir_in)
908 return 0;
909 if (usb_endpoint_dir_out(desc) && !ep->caps.dir_out)
910 return 0;
911
912 if (max > ep->maxpacket_limit)
913 return 0;
914
915
916 if (!gadget_is_dualspeed(gadget) && usb_endpoint_maxp(desc) & (3<<11))
917 return 0;
918
919 switch (type) {
920 case USB_ENDPOINT_XFER_CONTROL:
921
922 return 0;
923 case USB_ENDPOINT_XFER_ISOC:
924 if (!ep->caps.type_iso)
925 return 0;
926
927 if (!gadget_is_dualspeed(gadget) && max > 1023)
928 return 0;
929 break;
930 case USB_ENDPOINT_XFER_BULK:
931 if (!ep->caps.type_bulk)
932 return 0;
933 if (ep_comp && gadget_is_superspeed(gadget)) {
934
935
936
937
938 num_req_streams = ep_comp->bmAttributes & 0x1f;
939 if (num_req_streams > ep->max_streams)
940 return 0;
941 }
942 break;
943 case USB_ENDPOINT_XFER_INT:
944
945
946
947 if (!ep->caps.type_int && !ep->caps.type_bulk)
948 return 0;
949
950 if (!gadget_is_dualspeed(gadget) && max > 64)
951 return 0;
952 break;
953 }
954
955 return 1;
956}
957EXPORT_SYMBOL_GPL(usb_gadget_ep_match_desc);
958
959
960
961static void usb_gadget_state_work(struct work_struct *work)
962{
963 struct usb_gadget *gadget = work_to_gadget(work);
964 struct usb_udc *udc = gadget->udc;
965
966 if (udc)
967 sysfs_notify(&udc->dev.kobj, NULL, "state");
968}
969
970void usb_gadget_set_state(struct usb_gadget *gadget,
971 enum usb_device_state state)
972{
973 gadget->state = state;
974 schedule_work(&gadget->work);
975}
976EXPORT_SYMBOL_GPL(usb_gadget_set_state);
977
978
979
980static void usb_udc_connect_control(struct usb_udc *udc)
981{
982 if (udc->vbus)
983 usb_gadget_connect(udc->gadget);
984 else
985 usb_gadget_disconnect(udc->gadget);
986}
987
988
989
990
991
992
993
994
995
996
997void usb_udc_vbus_handler(struct usb_gadget *gadget, bool status)
998{
999 struct usb_udc *udc = gadget->udc;
1000
1001 if (udc) {
1002 udc->vbus = status;
1003 usb_udc_connect_control(udc);
1004 }
1005}
1006EXPORT_SYMBOL_GPL(usb_udc_vbus_handler);
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017void usb_gadget_udc_reset(struct usb_gadget *gadget,
1018 struct usb_gadget_driver *driver)
1019{
1020 driver->reset(gadget);
1021 usb_gadget_set_state(gadget, USB_STATE_DEFAULT);
1022}
1023EXPORT_SYMBOL_GPL(usb_gadget_udc_reset);
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038static inline int usb_gadget_udc_start(struct usb_udc *udc)
1039{
1040 return udc->gadget->ops->udc_start(udc->gadget, udc->driver);
1041}
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055static inline void usb_gadget_udc_stop(struct usb_udc *udc)
1056{
1057 udc->gadget->ops->udc_stop(udc->gadget);
1058}
1059
1060
1061
1062
1063
1064
1065
1066
1067static void usb_udc_release(struct device *dev)
1068{
1069 struct usb_udc *udc;
1070
1071 udc = container_of(dev, struct usb_udc, dev);
1072 dev_dbg(dev, "releasing '%s'\n", dev_name(dev));
1073 kfree(udc);
1074}
1075
1076static const struct attribute_group *usb_udc_attr_groups[];
1077
1078static void usb_udc_nop_release(struct device *dev)
1079{
1080 dev_vdbg(dev, "%s\n", __func__);
1081}
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,
1093 void (*release)(struct device *dev))
1094{
1095 struct usb_udc *udc;
1096 struct usb_gadget_driver *driver;
1097 int ret = -ENOMEM;
1098
1099 udc = kzalloc(sizeof(*udc), GFP_KERNEL);
1100 if (!udc)
1101 goto err1;
1102
1103 dev_set_name(&gadget->dev, "gadget");
1104 INIT_WORK(&gadget->work, usb_gadget_state_work);
1105 gadget->dev.parent = parent;
1106
1107 if (release)
1108 gadget->dev.release = release;
1109 else
1110 gadget->dev.release = usb_udc_nop_release;
1111
1112 ret = device_register(&gadget->dev);
1113 if (ret)
1114 goto err2;
1115
1116 device_initialize(&udc->dev);
1117 udc->dev.release = usb_udc_release;
1118 udc->dev.class = udc_class;
1119 udc->dev.groups = usb_udc_attr_groups;
1120 udc->dev.parent = parent;
1121 ret = dev_set_name(&udc->dev, "%s", kobject_name(&parent->kobj));
1122 if (ret)
1123 goto err3;
1124
1125 udc->gadget = gadget;
1126 gadget->udc = udc;
1127
1128 mutex_lock(&udc_lock);
1129 list_add_tail(&udc->list, &udc_list);
1130
1131 ret = device_add(&udc->dev);
1132 if (ret)
1133 goto err4;
1134
1135 usb_gadget_set_state(gadget, USB_STATE_NOTATTACHED);
1136 udc->vbus = true;
1137
1138
1139 list_for_each_entry(driver, &gadget_driver_pending_list, pending) {
1140 if (!driver->udc_name || strcmp(driver->udc_name,
1141 dev_name(&udc->dev)) == 0) {
1142 ret = udc_bind_to_driver(udc, driver);
1143 if (ret != -EPROBE_DEFER)
1144 list_del(&driver->pending);
1145 if (ret)
1146 goto err5;
1147 break;
1148 }
1149 }
1150
1151 mutex_unlock(&udc_lock);
1152
1153 return 0;
1154
1155err5:
1156 device_del(&udc->dev);
1157
1158err4:
1159 list_del(&udc->list);
1160 mutex_unlock(&udc_lock);
1161
1162err3:
1163 put_device(&udc->dev);
1164 device_del(&gadget->dev);
1165
1166err2:
1167 put_device(&gadget->dev);
1168 kfree(udc);
1169
1170err1:
1171 return ret;
1172}
1173EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release);
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187char *usb_get_gadget_udc_name(void)
1188{
1189 struct usb_udc *udc;
1190 char *name = NULL;
1191
1192
1193 mutex_lock(&udc_lock);
1194 list_for_each_entry(udc, &udc_list, list) {
1195 if (!udc->driver) {
1196 name = kstrdup(udc->gadget->name, GFP_KERNEL);
1197 break;
1198 }
1199 }
1200 mutex_unlock(&udc_lock);
1201 return name;
1202}
1203EXPORT_SYMBOL_GPL(usb_get_gadget_udc_name);
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget)
1214{
1215 return usb_add_gadget_udc_release(parent, gadget, NULL);
1216}
1217EXPORT_SYMBOL_GPL(usb_add_gadget_udc);
1218
1219static void usb_gadget_remove_driver(struct usb_udc *udc)
1220{
1221 dev_dbg(&udc->dev, "unregistering UDC driver [%s]\n",
1222 udc->driver->function);
1223
1224 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
1225
1226 usb_gadget_disconnect(udc->gadget);
1227 udc->driver->disconnect(udc->gadget);
1228 udc->driver->unbind(udc->gadget);
1229 usb_gadget_udc_stop(udc);
1230
1231 udc->driver = NULL;
1232 udc->dev.driver = NULL;
1233 udc->gadget->dev.driver = NULL;
1234}
1235
1236
1237
1238
1239
1240
1241
1242
1243void usb_del_gadget_udc(struct usb_gadget *gadget)
1244{
1245 struct usb_udc *udc = gadget->udc;
1246
1247 if (!udc)
1248 return;
1249
1250 dev_vdbg(gadget->dev.parent, "unregistering gadget\n");
1251
1252 mutex_lock(&udc_lock);
1253 list_del(&udc->list);
1254
1255 if (udc->driver) {
1256 struct usb_gadget_driver *driver = udc->driver;
1257
1258 usb_gadget_remove_driver(udc);
1259 list_add(&driver->pending, &gadget_driver_pending_list);
1260 }
1261 mutex_unlock(&udc_lock);
1262
1263 kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE);
1264 flush_work(&gadget->work);
1265 device_unregister(&udc->dev);
1266 device_unregister(&gadget->dev);
1267}
1268EXPORT_SYMBOL_GPL(usb_del_gadget_udc);
1269
1270
1271
1272static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver)
1273{
1274 int ret;
1275
1276 dev_dbg(&udc->dev, "registering UDC driver [%s]\n",
1277 driver->function);
1278
1279 udc->driver = driver;
1280 udc->dev.driver = &driver->driver;
1281 udc->gadget->dev.driver = &driver->driver;
1282
1283 ret = driver->bind(udc->gadget, driver);
1284 if (ret)
1285 goto err1;
1286 ret = usb_gadget_udc_start(udc);
1287 if (ret) {
1288 driver->unbind(udc->gadget);
1289 goto err1;
1290 }
1291 usb_udc_connect_control(udc);
1292
1293 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
1294 return 0;
1295err1:
1296 if (ret != -EISNAM)
1297 dev_err(&udc->dev, "failed to start %s: %d\n",
1298 udc->driver->function, ret);
1299 udc->driver = NULL;
1300 udc->dev.driver = NULL;
1301 udc->gadget->dev.driver = NULL;
1302 return ret;
1303}
1304
1305int usb_gadget_probe_driver(struct usb_gadget_driver *driver)
1306{
1307 struct usb_udc *udc = NULL;
1308 int ret = -ENODEV;
1309
1310 if (!driver || !driver->bind || !driver->setup)
1311 return -EINVAL;
1312
1313 mutex_lock(&udc_lock);
1314 if (driver->udc_name) {
1315 list_for_each_entry(udc, &udc_list, list) {
1316 ret = strcmp(driver->udc_name, dev_name(&udc->dev));
1317 if (!ret)
1318 break;
1319 }
1320 if (!ret && !udc->driver)
1321 goto found;
1322 } else {
1323 list_for_each_entry(udc, &udc_list, list) {
1324
1325 if (!udc->driver)
1326 goto found;
1327 }
1328 }
1329
1330 if (!driver->match_existing_only) {
1331 list_add_tail(&driver->pending, &gadget_driver_pending_list);
1332 pr_info("udc-core: couldn't find an available UDC - added [%s] to list of pending drivers\n",
1333 driver->function);
1334 ret = 0;
1335 }
1336
1337 mutex_unlock(&udc_lock);
1338 return ret;
1339found:
1340 ret = udc_bind_to_driver(udc, driver);
1341 mutex_unlock(&udc_lock);
1342 return ret;
1343}
1344EXPORT_SYMBOL_GPL(usb_gadget_probe_driver);
1345
1346int usb_gadget_unregister_driver(struct usb_gadget_driver *driver)
1347{
1348 struct usb_udc *udc = NULL;
1349 int ret = -ENODEV;
1350
1351 if (!driver || !driver->unbind)
1352 return -EINVAL;
1353
1354 mutex_lock(&udc_lock);
1355 list_for_each_entry(udc, &udc_list, list)
1356 if (udc->driver == driver) {
1357 usb_gadget_remove_driver(udc);
1358 usb_gadget_set_state(udc->gadget,
1359 USB_STATE_NOTATTACHED);
1360 ret = 0;
1361 break;
1362 }
1363
1364 if (ret) {
1365 list_del(&driver->pending);
1366 ret = 0;
1367 }
1368 mutex_unlock(&udc_lock);
1369 return ret;
1370}
1371EXPORT_SYMBOL_GPL(usb_gadget_unregister_driver);
1372
1373
1374
1375static ssize_t usb_udc_srp_store(struct device *dev,
1376 struct device_attribute *attr, const char *buf, size_t n)
1377{
1378 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
1379
1380 if (sysfs_streq(buf, "1"))
1381 usb_gadget_wakeup(udc->gadget);
1382
1383 return n;
1384}
1385static DEVICE_ATTR(srp, S_IWUSR, NULL, usb_udc_srp_store);
1386
1387static ssize_t usb_udc_softconn_store(struct device *dev,
1388 struct device_attribute *attr, const char *buf, size_t n)
1389{
1390 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
1391
1392 if (!udc->driver) {
1393 dev_err(dev, "soft-connect without a gadget driver\n");
1394 return -EOPNOTSUPP;
1395 }
1396
1397 if (sysfs_streq(buf, "connect")) {
1398 usb_gadget_udc_start(udc);
1399 usb_gadget_connect(udc->gadget);
1400 } else if (sysfs_streq(buf, "disconnect")) {
1401 usb_gadget_disconnect(udc->gadget);
1402 udc->driver->disconnect(udc->gadget);
1403 usb_gadget_udc_stop(udc);
1404 } else {
1405 dev_err(dev, "unsupported command '%s'\n", buf);
1406 return -EINVAL;
1407 }
1408
1409 return n;
1410}
1411static DEVICE_ATTR(soft_connect, S_IWUSR, NULL, usb_udc_softconn_store);
1412
1413static ssize_t state_show(struct device *dev, struct device_attribute *attr,
1414 char *buf)
1415{
1416 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
1417 struct usb_gadget *gadget = udc->gadget;
1418
1419 return sprintf(buf, "%s\n", usb_state_string(gadget->state));
1420}
1421static DEVICE_ATTR_RO(state);
1422
1423#define USB_UDC_SPEED_ATTR(name, param) \
1424ssize_t name##_show(struct device *dev, \
1425 struct device_attribute *attr, char *buf) \
1426{ \
1427 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \
1428 return snprintf(buf, PAGE_SIZE, "%s\n", \
1429 usb_speed_string(udc->gadget->param)); \
1430} \
1431static DEVICE_ATTR_RO(name)
1432
1433static USB_UDC_SPEED_ATTR(current_speed, speed);
1434static USB_UDC_SPEED_ATTR(maximum_speed, max_speed);
1435
1436#define USB_UDC_ATTR(name) \
1437ssize_t name##_show(struct device *dev, \
1438 struct device_attribute *attr, char *buf) \
1439{ \
1440 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \
1441 struct usb_gadget *gadget = udc->gadget; \
1442 \
1443 return snprintf(buf, PAGE_SIZE, "%d\n", gadget->name); \
1444} \
1445static DEVICE_ATTR_RO(name)
1446
1447static USB_UDC_ATTR(is_otg);
1448static USB_UDC_ATTR(is_a_peripheral);
1449static USB_UDC_ATTR(b_hnp_enable);
1450static USB_UDC_ATTR(a_hnp_support);
1451static USB_UDC_ATTR(a_alt_hnp_support);
1452static USB_UDC_ATTR(is_selfpowered);
1453
1454static struct attribute *usb_udc_attrs[] = {
1455 &dev_attr_srp.attr,
1456 &dev_attr_soft_connect.attr,
1457 &dev_attr_state.attr,
1458 &dev_attr_current_speed.attr,
1459 &dev_attr_maximum_speed.attr,
1460
1461 &dev_attr_is_otg.attr,
1462 &dev_attr_is_a_peripheral.attr,
1463 &dev_attr_b_hnp_enable.attr,
1464 &dev_attr_a_hnp_support.attr,
1465 &dev_attr_a_alt_hnp_support.attr,
1466 &dev_attr_is_selfpowered.attr,
1467 NULL,
1468};
1469
1470static const struct attribute_group usb_udc_attr_group = {
1471 .attrs = usb_udc_attrs,
1472};
1473
1474static const struct attribute_group *usb_udc_attr_groups[] = {
1475 &usb_udc_attr_group,
1476 NULL,
1477};
1478
1479static int usb_udc_uevent(struct device *dev, struct kobj_uevent_env *env)
1480{
1481 struct usb_udc *udc = container_of(dev, struct usb_udc, dev);
1482 int ret;
1483
1484 ret = add_uevent_var(env, "USB_UDC_NAME=%s", udc->gadget->name);
1485 if (ret) {
1486 dev_err(dev, "failed to add uevent USB_UDC_NAME\n");
1487 return ret;
1488 }
1489
1490 if (udc->driver) {
1491 ret = add_uevent_var(env, "USB_UDC_DRIVER=%s",
1492 udc->driver->function);
1493 if (ret) {
1494 dev_err(dev, "failed to add uevent USB_UDC_DRIVER\n");
1495 return ret;
1496 }
1497 }
1498
1499 return 0;
1500}
1501
1502static int __init usb_udc_init(void)
1503{
1504 udc_class = class_create(THIS_MODULE, "udc");
1505 if (IS_ERR(udc_class)) {
1506 pr_err("failed to create udc class --> %ld\n",
1507 PTR_ERR(udc_class));
1508 return PTR_ERR(udc_class);
1509 }
1510
1511 udc_class->dev_uevent = usb_udc_uevent;
1512 return 0;
1513}
1514subsys_initcall(usb_udc_init);
1515
1516static void __exit usb_udc_exit(void)
1517{
1518 class_destroy(udc_class);
1519}
1520module_exit(usb_udc_exit);
1521
1522MODULE_DESCRIPTION("UDC Framework");
1523MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
1524MODULE_LICENSE("GPL v2");
1525