Merge tag 'icc-6.7-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/djakov/icc...
[linux-2.6-microblaze.git] / drivers / usb / gadget / function / f_hid.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * f_hid.c -- USB HID function driver
4  *
5  * Copyright (C) 2010 Fabien Chouteau <fabien.chouteau@barco.com>
6  */
7
8 #include <linux/kernel.h>
9 #include <linux/module.h>
10 #include <linux/hid.h>
11 #include <linux/idr.h>
12 #include <linux/cdev.h>
13 #include <linux/mutex.h>
14 #include <linux/poll.h>
15 #include <linux/uaccess.h>
16 #include <linux/wait.h>
17 #include <linux/sched.h>
18 #include <linux/usb/g_hid.h>
19
20 #include "u_f.h"
21 #include "u_hid.h"
22
23 #define HIDG_MINORS     4
24
25 static int major, minors;
26
27 static const struct class hidg_class = {
28         .name = "hidg",
29 };
30
31 static DEFINE_IDA(hidg_ida);
32 static DEFINE_MUTEX(hidg_ida_lock); /* protects access to hidg_ida */
33
34 /*-------------------------------------------------------------------------*/
35 /*                            HID gadget struct                            */
36
37 struct f_hidg_req_list {
38         struct usb_request      *req;
39         unsigned int            pos;
40         struct list_head        list;
41 };
42
43 struct f_hidg {
44         /* configuration */
45         unsigned char                   bInterfaceSubClass;
46         unsigned char                   bInterfaceProtocol;
47         unsigned char                   protocol;
48         unsigned char                   idle;
49         unsigned short                  report_desc_length;
50         char                            *report_desc;
51         unsigned short                  report_length;
52         /*
53          * use_out_ep - if true, the OUT Endpoint (interrupt out method)
54          *              will be used to receive reports from the host
55          *              using functions with the "intout" suffix.
56          *              Otherwise, the OUT Endpoint will not be configured
57          *              and the SETUP/SET_REPORT method ("ssreport" suffix)
58          *              will be used to receive reports.
59          */
60         bool                            use_out_ep;
61
62         /* recv report */
63         spinlock_t                      read_spinlock;
64         wait_queue_head_t               read_queue;
65         /* recv report - interrupt out only (use_out_ep == 1) */
66         struct list_head                completed_out_req;
67         unsigned int                    qlen;
68         /* recv report - setup set_report only (use_out_ep == 0) */
69         char                            *set_report_buf;
70         unsigned int                    set_report_length;
71
72         /* send report */
73         spinlock_t                      write_spinlock;
74         bool                            write_pending;
75         wait_queue_head_t               write_queue;
76         struct usb_request              *req;
77
78         struct device                   dev;
79         struct cdev                     cdev;
80         struct usb_function             func;
81
82         struct usb_ep                   *in_ep;
83         struct usb_ep                   *out_ep;
84 };
85
86 static inline struct f_hidg *func_to_hidg(struct usb_function *f)
87 {
88         return container_of(f, struct f_hidg, func);
89 }
90
91 static void hidg_release(struct device *dev)
92 {
93         struct f_hidg *hidg = container_of(dev, struct f_hidg, dev);
94
95         kfree(hidg->report_desc);
96         kfree(hidg->set_report_buf);
97         kfree(hidg);
98 }
99
100 /*-------------------------------------------------------------------------*/
101 /*                           Static descriptors                            */
102
103 static struct usb_interface_descriptor hidg_interface_desc = {
104         .bLength                = sizeof hidg_interface_desc,
105         .bDescriptorType        = USB_DT_INTERFACE,
106         /* .bInterfaceNumber    = DYNAMIC */
107         .bAlternateSetting      = 0,
108         /* .bNumEndpoints       = DYNAMIC (depends on use_out_ep) */
109         .bInterfaceClass        = USB_CLASS_HID,
110         /* .bInterfaceSubClass  = DYNAMIC */
111         /* .bInterfaceProtocol  = DYNAMIC */
112         /* .iInterface          = DYNAMIC */
113 };
114
115 static struct hid_descriptor hidg_desc = {
116         .bLength                        = sizeof hidg_desc,
117         .bDescriptorType                = HID_DT_HID,
118         .bcdHID                         = cpu_to_le16(0x0101),
119         .bCountryCode                   = 0x00,
120         .bNumDescriptors                = 0x1,
121         /*.desc[0].bDescriptorType      = DYNAMIC */
122         /*.desc[0].wDescriptorLenght    = DYNAMIC */
123 };
124
125 /* Super-Speed Support */
126
127 static struct usb_endpoint_descriptor hidg_ss_in_ep_desc = {
128         .bLength                = USB_DT_ENDPOINT_SIZE,
129         .bDescriptorType        = USB_DT_ENDPOINT,
130         .bEndpointAddress       = USB_DIR_IN,
131         .bmAttributes           = USB_ENDPOINT_XFER_INT,
132         /*.wMaxPacketSize       = DYNAMIC */
133         .bInterval              = 4, /* FIXME: Add this field in the
134                                       * HID gadget configuration?
135                                       * (struct hidg_func_descriptor)
136                                       */
137 };
138
139 static struct usb_ss_ep_comp_descriptor hidg_ss_in_comp_desc = {
140         .bLength                = sizeof(hidg_ss_in_comp_desc),
141         .bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
142
143         /* .bMaxBurst           = 0, */
144         /* .bmAttributes        = 0, */
145         /* .wBytesPerInterval   = DYNAMIC */
146 };
147
148 static struct usb_endpoint_descriptor hidg_ss_out_ep_desc = {
149         .bLength                = USB_DT_ENDPOINT_SIZE,
150         .bDescriptorType        = USB_DT_ENDPOINT,
151         .bEndpointAddress       = USB_DIR_OUT,
152         .bmAttributes           = USB_ENDPOINT_XFER_INT,
153         /*.wMaxPacketSize       = DYNAMIC */
154         .bInterval              = 4, /* FIXME: Add this field in the
155                                       * HID gadget configuration?
156                                       * (struct hidg_func_descriptor)
157                                       */
158 };
159
160 static struct usb_ss_ep_comp_descriptor hidg_ss_out_comp_desc = {
161         .bLength                = sizeof(hidg_ss_out_comp_desc),
162         .bDescriptorType        = USB_DT_SS_ENDPOINT_COMP,
163
164         /* .bMaxBurst           = 0, */
165         /* .bmAttributes        = 0, */
166         /* .wBytesPerInterval   = DYNAMIC */
167 };
168
169 static struct usb_descriptor_header *hidg_ss_descriptors_intout[] = {
170         (struct usb_descriptor_header *)&hidg_interface_desc,
171         (struct usb_descriptor_header *)&hidg_desc,
172         (struct usb_descriptor_header *)&hidg_ss_in_ep_desc,
173         (struct usb_descriptor_header *)&hidg_ss_in_comp_desc,
174         (struct usb_descriptor_header *)&hidg_ss_out_ep_desc,
175         (struct usb_descriptor_header *)&hidg_ss_out_comp_desc,
176         NULL,
177 };
178
179 static struct usb_descriptor_header *hidg_ss_descriptors_ssreport[] = {
180         (struct usb_descriptor_header *)&hidg_interface_desc,
181         (struct usb_descriptor_header *)&hidg_desc,
182         (struct usb_descriptor_header *)&hidg_ss_in_ep_desc,
183         (struct usb_descriptor_header *)&hidg_ss_in_comp_desc,
184         NULL,
185 };
186
187 /* High-Speed Support */
188
189 static struct usb_endpoint_descriptor hidg_hs_in_ep_desc = {
190         .bLength                = USB_DT_ENDPOINT_SIZE,
191         .bDescriptorType        = USB_DT_ENDPOINT,
192         .bEndpointAddress       = USB_DIR_IN,
193         .bmAttributes           = USB_ENDPOINT_XFER_INT,
194         /*.wMaxPacketSize       = DYNAMIC */
195         .bInterval              = 4, /* FIXME: Add this field in the
196                                       * HID gadget configuration?
197                                       * (struct hidg_func_descriptor)
198                                       */
199 };
200
201 static struct usb_endpoint_descriptor hidg_hs_out_ep_desc = {
202         .bLength                = USB_DT_ENDPOINT_SIZE,
203         .bDescriptorType        = USB_DT_ENDPOINT,
204         .bEndpointAddress       = USB_DIR_OUT,
205         .bmAttributes           = USB_ENDPOINT_XFER_INT,
206         /*.wMaxPacketSize       = DYNAMIC */
207         .bInterval              = 4, /* FIXME: Add this field in the
208                                       * HID gadget configuration?
209                                       * (struct hidg_func_descriptor)
210                                       */
211 };
212
213 static struct usb_descriptor_header *hidg_hs_descriptors_intout[] = {
214         (struct usb_descriptor_header *)&hidg_interface_desc,
215         (struct usb_descriptor_header *)&hidg_desc,
216         (struct usb_descriptor_header *)&hidg_hs_in_ep_desc,
217         (struct usb_descriptor_header *)&hidg_hs_out_ep_desc,
218         NULL,
219 };
220
221 static struct usb_descriptor_header *hidg_hs_descriptors_ssreport[] = {
222         (struct usb_descriptor_header *)&hidg_interface_desc,
223         (struct usb_descriptor_header *)&hidg_desc,
224         (struct usb_descriptor_header *)&hidg_hs_in_ep_desc,
225         NULL,
226 };
227
228 /* Full-Speed Support */
229
230 static struct usb_endpoint_descriptor hidg_fs_in_ep_desc = {
231         .bLength                = USB_DT_ENDPOINT_SIZE,
232         .bDescriptorType        = USB_DT_ENDPOINT,
233         .bEndpointAddress       = USB_DIR_IN,
234         .bmAttributes           = USB_ENDPOINT_XFER_INT,
235         /*.wMaxPacketSize       = DYNAMIC */
236         .bInterval              = 10, /* FIXME: Add this field in the
237                                        * HID gadget configuration?
238                                        * (struct hidg_func_descriptor)
239                                        */
240 };
241
242 static struct usb_endpoint_descriptor hidg_fs_out_ep_desc = {
243         .bLength                = USB_DT_ENDPOINT_SIZE,
244         .bDescriptorType        = USB_DT_ENDPOINT,
245         .bEndpointAddress       = USB_DIR_OUT,
246         .bmAttributes           = USB_ENDPOINT_XFER_INT,
247         /*.wMaxPacketSize       = DYNAMIC */
248         .bInterval              = 10, /* FIXME: Add this field in the
249                                        * HID gadget configuration?
250                                        * (struct hidg_func_descriptor)
251                                        */
252 };
253
254 static struct usb_descriptor_header *hidg_fs_descriptors_intout[] = {
255         (struct usb_descriptor_header *)&hidg_interface_desc,
256         (struct usb_descriptor_header *)&hidg_desc,
257         (struct usb_descriptor_header *)&hidg_fs_in_ep_desc,
258         (struct usb_descriptor_header *)&hidg_fs_out_ep_desc,
259         NULL,
260 };
261
262 static struct usb_descriptor_header *hidg_fs_descriptors_ssreport[] = {
263         (struct usb_descriptor_header *)&hidg_interface_desc,
264         (struct usb_descriptor_header *)&hidg_desc,
265         (struct usb_descriptor_header *)&hidg_fs_in_ep_desc,
266         NULL,
267 };
268
269 /*-------------------------------------------------------------------------*/
270 /*                                 Strings                                 */
271
272 #define CT_FUNC_HID_IDX 0
273
274 static struct usb_string ct_func_string_defs[] = {
275         [CT_FUNC_HID_IDX].s     = "HID Interface",
276         {},                     /* end of list */
277 };
278
279 static struct usb_gadget_strings ct_func_string_table = {
280         .language       = 0x0409,       /* en-US */
281         .strings        = ct_func_string_defs,
282 };
283
284 static struct usb_gadget_strings *ct_func_strings[] = {
285         &ct_func_string_table,
286         NULL,
287 };
288
289 /*-------------------------------------------------------------------------*/
290 /*                              Char Device                                */
291
292 static ssize_t f_hidg_intout_read(struct file *file, char __user *buffer,
293                                   size_t count, loff_t *ptr)
294 {
295         struct f_hidg *hidg = file->private_data;
296         struct f_hidg_req_list *list;
297         struct usb_request *req;
298         unsigned long flags;
299         int ret;
300
301         if (!count)
302                 return 0;
303
304         spin_lock_irqsave(&hidg->read_spinlock, flags);
305
306 #define READ_COND_INTOUT (!list_empty(&hidg->completed_out_req))
307
308         /* wait for at least one buffer to complete */
309         while (!READ_COND_INTOUT) {
310                 spin_unlock_irqrestore(&hidg->read_spinlock, flags);
311                 if (file->f_flags & O_NONBLOCK)
312                         return -EAGAIN;
313
314                 if (wait_event_interruptible(hidg->read_queue, READ_COND_INTOUT))
315                         return -ERESTARTSYS;
316
317                 spin_lock_irqsave(&hidg->read_spinlock, flags);
318         }
319
320         /* pick the first one */
321         list = list_first_entry(&hidg->completed_out_req,
322                                 struct f_hidg_req_list, list);
323
324         /*
325          * Remove this from list to protect it from beign free()
326          * while host disables our function
327          */
328         list_del(&list->list);
329
330         req = list->req;
331         count = min_t(unsigned int, count, req->actual - list->pos);
332         spin_unlock_irqrestore(&hidg->read_spinlock, flags);
333
334         /* copy to user outside spinlock */
335         count -= copy_to_user(buffer, req->buf + list->pos, count);
336         list->pos += count;
337
338         /*
339          * if this request is completely handled and transfered to
340          * userspace, remove its entry from the list and requeue it
341          * again. Otherwise, we will revisit it again upon the next
342          * call, taking into account its current read position.
343          */
344         if (list->pos == req->actual) {
345                 kfree(list);
346
347                 req->length = hidg->report_length;
348                 ret = usb_ep_queue(hidg->out_ep, req, GFP_KERNEL);
349                 if (ret < 0) {
350                         free_ep_req(hidg->out_ep, req);
351                         return ret;
352                 }
353         } else {
354                 spin_lock_irqsave(&hidg->read_spinlock, flags);
355                 list_add(&list->list, &hidg->completed_out_req);
356                 spin_unlock_irqrestore(&hidg->read_spinlock, flags);
357
358                 wake_up(&hidg->read_queue);
359         }
360
361         return count;
362 }
363
364 #define READ_COND_SSREPORT (hidg->set_report_buf != NULL)
365
366 static ssize_t f_hidg_ssreport_read(struct file *file, char __user *buffer,
367                                     size_t count, loff_t *ptr)
368 {
369         struct f_hidg *hidg = file->private_data;
370         char *tmp_buf = NULL;
371         unsigned long flags;
372
373         if (!count)
374                 return 0;
375
376         spin_lock_irqsave(&hidg->read_spinlock, flags);
377
378         while (!READ_COND_SSREPORT) {
379                 spin_unlock_irqrestore(&hidg->read_spinlock, flags);
380                 if (file->f_flags & O_NONBLOCK)
381                         return -EAGAIN;
382
383                 if (wait_event_interruptible(hidg->read_queue, READ_COND_SSREPORT))
384                         return -ERESTARTSYS;
385
386                 spin_lock_irqsave(&hidg->read_spinlock, flags);
387         }
388
389         count = min_t(unsigned int, count, hidg->set_report_length);
390         tmp_buf = hidg->set_report_buf;
391         hidg->set_report_buf = NULL;
392
393         spin_unlock_irqrestore(&hidg->read_spinlock, flags);
394
395         if (tmp_buf != NULL) {
396                 count -= copy_to_user(buffer, tmp_buf, count);
397                 kfree(tmp_buf);
398         } else {
399                 count = -ENOMEM;
400         }
401
402         wake_up(&hidg->read_queue);
403
404         return count;
405 }
406
407 static ssize_t f_hidg_read(struct file *file, char __user *buffer,
408                            size_t count, loff_t *ptr)
409 {
410         struct f_hidg *hidg = file->private_data;
411
412         if (hidg->use_out_ep)
413                 return f_hidg_intout_read(file, buffer, count, ptr);
414         else
415                 return f_hidg_ssreport_read(file, buffer, count, ptr);
416 }
417
418 static void f_hidg_req_complete(struct usb_ep *ep, struct usb_request *req)
419 {
420         struct f_hidg *hidg = (struct f_hidg *)ep->driver_data;
421         unsigned long flags;
422
423         if (req->status != 0) {
424                 ERROR(hidg->func.config->cdev,
425                         "End Point Request ERROR: %d\n", req->status);
426         }
427
428         spin_lock_irqsave(&hidg->write_spinlock, flags);
429         hidg->write_pending = 0;
430         spin_unlock_irqrestore(&hidg->write_spinlock, flags);
431         wake_up(&hidg->write_queue);
432 }
433
434 static ssize_t f_hidg_write(struct file *file, const char __user *buffer,
435                             size_t count, loff_t *offp)
436 {
437         struct f_hidg *hidg  = file->private_data;
438         struct usb_request *req;
439         unsigned long flags;
440         ssize_t status = -ENOMEM;
441
442         spin_lock_irqsave(&hidg->write_spinlock, flags);
443
444         if (!hidg->req) {
445                 spin_unlock_irqrestore(&hidg->write_spinlock, flags);
446                 return -ESHUTDOWN;
447         }
448
449 #define WRITE_COND (!hidg->write_pending)
450 try_again:
451         /* write queue */
452         while (!WRITE_COND) {
453                 spin_unlock_irqrestore(&hidg->write_spinlock, flags);
454                 if (file->f_flags & O_NONBLOCK)
455                         return -EAGAIN;
456
457                 if (wait_event_interruptible_exclusive(
458                                 hidg->write_queue, WRITE_COND))
459                         return -ERESTARTSYS;
460
461                 spin_lock_irqsave(&hidg->write_spinlock, flags);
462         }
463
464         hidg->write_pending = 1;
465         req = hidg->req;
466         count  = min_t(unsigned, count, hidg->report_length);
467
468         spin_unlock_irqrestore(&hidg->write_spinlock, flags);
469
470         if (!req) {
471                 ERROR(hidg->func.config->cdev, "hidg->req is NULL\n");
472                 status = -ESHUTDOWN;
473                 goto release_write_pending;
474         }
475
476         status = copy_from_user(req->buf, buffer, count);
477         if (status != 0) {
478                 ERROR(hidg->func.config->cdev,
479                         "copy_from_user error\n");
480                 status = -EINVAL;
481                 goto release_write_pending;
482         }
483
484         spin_lock_irqsave(&hidg->write_spinlock, flags);
485
486         /* when our function has been disabled by host */
487         if (!hidg->req) {
488                 free_ep_req(hidg->in_ep, req);
489                 /*
490                  * TODO
491                  * Should we fail with error here?
492                  */
493                 goto try_again;
494         }
495
496         req->status   = 0;
497         req->zero     = 0;
498         req->length   = count;
499         req->complete = f_hidg_req_complete;
500         req->context  = hidg;
501
502         spin_unlock_irqrestore(&hidg->write_spinlock, flags);
503
504         if (!hidg->in_ep->enabled) {
505                 ERROR(hidg->func.config->cdev, "in_ep is disabled\n");
506                 status = -ESHUTDOWN;
507                 goto release_write_pending;
508         }
509
510         status = usb_ep_queue(hidg->in_ep, req, GFP_ATOMIC);
511         if (status < 0)
512                 goto release_write_pending;
513         else
514                 status = count;
515
516         return status;
517 release_write_pending:
518         spin_lock_irqsave(&hidg->write_spinlock, flags);
519         hidg->write_pending = 0;
520         spin_unlock_irqrestore(&hidg->write_spinlock, flags);
521
522         wake_up(&hidg->write_queue);
523
524         return status;
525 }
526
527 static __poll_t f_hidg_poll(struct file *file, poll_table *wait)
528 {
529         struct f_hidg   *hidg  = file->private_data;
530         __poll_t        ret = 0;
531
532         poll_wait(file, &hidg->read_queue, wait);
533         poll_wait(file, &hidg->write_queue, wait);
534
535         if (WRITE_COND)
536                 ret |= EPOLLOUT | EPOLLWRNORM;
537
538         if (hidg->use_out_ep) {
539                 if (READ_COND_INTOUT)
540                         ret |= EPOLLIN | EPOLLRDNORM;
541         } else {
542                 if (READ_COND_SSREPORT)
543                         ret |= EPOLLIN | EPOLLRDNORM;
544         }
545
546         return ret;
547 }
548
549 #undef WRITE_COND
550 #undef READ_COND_SSREPORT
551 #undef READ_COND_INTOUT
552
553 static int f_hidg_release(struct inode *inode, struct file *fd)
554 {
555         fd->private_data = NULL;
556         return 0;
557 }
558
559 static int f_hidg_open(struct inode *inode, struct file *fd)
560 {
561         struct f_hidg *hidg =
562                 container_of(inode->i_cdev, struct f_hidg, cdev);
563
564         fd->private_data = hidg;
565
566         return 0;
567 }
568
569 /*-------------------------------------------------------------------------*/
570 /*                                usb_function                             */
571
572 static inline struct usb_request *hidg_alloc_ep_req(struct usb_ep *ep,
573                                                     unsigned length)
574 {
575         return alloc_ep_req(ep, length);
576 }
577
578 static void hidg_intout_complete(struct usb_ep *ep, struct usb_request *req)
579 {
580         struct f_hidg *hidg = (struct f_hidg *) req->context;
581         struct usb_composite_dev *cdev = hidg->func.config->cdev;
582         struct f_hidg_req_list *req_list;
583         unsigned long flags;
584
585         switch (req->status) {
586         case 0:
587                 req_list = kzalloc(sizeof(*req_list), GFP_ATOMIC);
588                 if (!req_list) {
589                         ERROR(cdev, "Unable to allocate mem for req_list\n");
590                         goto free_req;
591                 }
592
593                 req_list->req = req;
594
595                 spin_lock_irqsave(&hidg->read_spinlock, flags);
596                 list_add_tail(&req_list->list, &hidg->completed_out_req);
597                 spin_unlock_irqrestore(&hidg->read_spinlock, flags);
598
599                 wake_up(&hidg->read_queue);
600                 break;
601         default:
602                 ERROR(cdev, "Set report failed %d\n", req->status);
603                 fallthrough;
604         case -ECONNABORTED:             /* hardware forced ep reset */
605         case -ECONNRESET:               /* request dequeued */
606         case -ESHUTDOWN:                /* disconnect from host */
607 free_req:
608                 free_ep_req(ep, req);
609                 return;
610         }
611 }
612
613 static void hidg_ssreport_complete(struct usb_ep *ep, struct usb_request *req)
614 {
615         struct f_hidg *hidg = (struct f_hidg *)req->context;
616         struct usb_composite_dev *cdev = hidg->func.config->cdev;
617         char *new_buf = NULL;
618         unsigned long flags;
619
620         if (req->status != 0 || req->buf == NULL || req->actual == 0) {
621                 ERROR(cdev,
622                       "%s FAILED: status=%d, buf=%p, actual=%d\n",
623                       __func__, req->status, req->buf, req->actual);
624                 return;
625         }
626
627         spin_lock_irqsave(&hidg->read_spinlock, flags);
628
629         new_buf = krealloc(hidg->set_report_buf, req->actual, GFP_ATOMIC);
630         if (new_buf == NULL) {
631                 spin_unlock_irqrestore(&hidg->read_spinlock, flags);
632                 return;
633         }
634         hidg->set_report_buf = new_buf;
635
636         hidg->set_report_length = req->actual;
637         memcpy(hidg->set_report_buf, req->buf, req->actual);
638
639         spin_unlock_irqrestore(&hidg->read_spinlock, flags);
640
641         wake_up(&hidg->read_queue);
642 }
643
644 static int hidg_setup(struct usb_function *f,
645                 const struct usb_ctrlrequest *ctrl)
646 {
647         struct f_hidg                   *hidg = func_to_hidg(f);
648         struct usb_composite_dev        *cdev = f->config->cdev;
649         struct usb_request              *req  = cdev->req;
650         int status = 0;
651         __u16 value, length;
652
653         value   = __le16_to_cpu(ctrl->wValue);
654         length  = __le16_to_cpu(ctrl->wLength);
655
656         VDBG(cdev,
657              "%s crtl_request : bRequestType:0x%x bRequest:0x%x Value:0x%x\n",
658              __func__, ctrl->bRequestType, ctrl->bRequest, value);
659
660         switch ((ctrl->bRequestType << 8) | ctrl->bRequest) {
661         case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
662                   | HID_REQ_GET_REPORT):
663                 VDBG(cdev, "get_report\n");
664
665                 /* send an empty report */
666                 length = min_t(unsigned, length, hidg->report_length);
667                 memset(req->buf, 0x0, length);
668
669                 goto respond;
670                 break;
671
672         case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
673                   | HID_REQ_GET_PROTOCOL):
674                 VDBG(cdev, "get_protocol\n");
675                 length = min_t(unsigned int, length, 1);
676                 ((u8 *) req->buf)[0] = hidg->protocol;
677                 goto respond;
678                 break;
679
680         case ((USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
681                   | HID_REQ_GET_IDLE):
682                 VDBG(cdev, "get_idle\n");
683                 length = min_t(unsigned int, length, 1);
684                 ((u8 *) req->buf)[0] = hidg->idle;
685                 goto respond;
686                 break;
687
688         case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
689                   | HID_REQ_SET_REPORT):
690                 VDBG(cdev, "set_report | wLength=%d\n", ctrl->wLength);
691                 if (hidg->use_out_ep)
692                         goto stall;
693                 req->complete = hidg_ssreport_complete;
694                 req->context  = hidg;
695                 goto respond;
696                 break;
697
698         case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
699                   | HID_REQ_SET_PROTOCOL):
700                 VDBG(cdev, "set_protocol\n");
701                 if (value > HID_REPORT_PROTOCOL)
702                         goto stall;
703                 length = 0;
704                 /*
705                  * We assume that programs implementing the Boot protocol
706                  * are also compatible with the Report Protocol
707                  */
708                 if (hidg->bInterfaceSubClass == USB_INTERFACE_SUBCLASS_BOOT) {
709                         hidg->protocol = value;
710                         goto respond;
711                 }
712                 goto stall;
713                 break;
714
715         case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8
716                   | HID_REQ_SET_IDLE):
717                 VDBG(cdev, "set_idle\n");
718                 length = 0;
719                 hidg->idle = value >> 8;
720                 goto respond;
721                 break;
722
723         case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8
724                   | USB_REQ_GET_DESCRIPTOR):
725                 switch (value >> 8) {
726                 case HID_DT_HID:
727                 {
728                         struct hid_descriptor hidg_desc_copy = hidg_desc;
729
730                         VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: HID\n");
731                         hidg_desc_copy.desc[0].bDescriptorType = HID_DT_REPORT;
732                         hidg_desc_copy.desc[0].wDescriptorLength =
733                                 cpu_to_le16(hidg->report_desc_length);
734
735                         length = min_t(unsigned short, length,
736                                                    hidg_desc_copy.bLength);
737                         memcpy(req->buf, &hidg_desc_copy, length);
738                         goto respond;
739                         break;
740                 }
741                 case HID_DT_REPORT:
742                         VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: REPORT\n");
743                         length = min_t(unsigned short, length,
744                                                    hidg->report_desc_length);
745                         memcpy(req->buf, hidg->report_desc, length);
746                         goto respond;
747                         break;
748
749                 default:
750                         VDBG(cdev, "Unknown descriptor request 0x%x\n",
751                                  value >> 8);
752                         goto stall;
753                         break;
754                 }
755                 break;
756
757         default:
758                 VDBG(cdev, "Unknown request 0x%x\n",
759                          ctrl->bRequest);
760                 goto stall;
761                 break;
762         }
763
764 stall:
765         return -EOPNOTSUPP;
766
767 respond:
768         req->zero = 0;
769         req->length = length;
770         status = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
771         if (status < 0)
772                 ERROR(cdev, "usb_ep_queue error on ep0 %d\n", value);
773         return status;
774 }
775
776 static void hidg_disable(struct usb_function *f)
777 {
778         struct f_hidg *hidg = func_to_hidg(f);
779         struct f_hidg_req_list *list, *next;
780         unsigned long flags;
781
782         usb_ep_disable(hidg->in_ep);
783
784         if (hidg->out_ep) {
785                 usb_ep_disable(hidg->out_ep);
786
787                 spin_lock_irqsave(&hidg->read_spinlock, flags);
788                 list_for_each_entry_safe(list, next, &hidg->completed_out_req, list) {
789                         free_ep_req(hidg->out_ep, list->req);
790                         list_del(&list->list);
791                         kfree(list);
792                 }
793                 spin_unlock_irqrestore(&hidg->read_spinlock, flags);
794         }
795
796         spin_lock_irqsave(&hidg->write_spinlock, flags);
797         if (!hidg->write_pending) {
798                 free_ep_req(hidg->in_ep, hidg->req);
799                 hidg->write_pending = 1;
800         }
801
802         hidg->req = NULL;
803         spin_unlock_irqrestore(&hidg->write_spinlock, flags);
804 }
805
806 static int hidg_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
807 {
808         struct usb_composite_dev                *cdev = f->config->cdev;
809         struct f_hidg                           *hidg = func_to_hidg(f);
810         struct usb_request                      *req_in = NULL;
811         unsigned long                           flags;
812         int i, status = 0;
813
814         VDBG(cdev, "hidg_set_alt intf:%d alt:%d\n", intf, alt);
815
816         if (hidg->in_ep != NULL) {
817                 /* restart endpoint */
818                 usb_ep_disable(hidg->in_ep);
819
820                 status = config_ep_by_speed(f->config->cdev->gadget, f,
821                                             hidg->in_ep);
822                 if (status) {
823                         ERROR(cdev, "config_ep_by_speed FAILED!\n");
824                         goto fail;
825                 }
826                 status = usb_ep_enable(hidg->in_ep);
827                 if (status < 0) {
828                         ERROR(cdev, "Enable IN endpoint FAILED!\n");
829                         goto fail;
830                 }
831                 hidg->in_ep->driver_data = hidg;
832
833                 req_in = hidg_alloc_ep_req(hidg->in_ep, hidg->report_length);
834                 if (!req_in) {
835                         status = -ENOMEM;
836                         goto disable_ep_in;
837                 }
838         }
839
840         if (hidg->use_out_ep && hidg->out_ep != NULL) {
841                 /* restart endpoint */
842                 usb_ep_disable(hidg->out_ep);
843
844                 status = config_ep_by_speed(f->config->cdev->gadget, f,
845                                             hidg->out_ep);
846                 if (status) {
847                         ERROR(cdev, "config_ep_by_speed FAILED!\n");
848                         goto free_req_in;
849                 }
850                 status = usb_ep_enable(hidg->out_ep);
851                 if (status < 0) {
852                         ERROR(cdev, "Enable OUT endpoint FAILED!\n");
853                         goto free_req_in;
854                 }
855                 hidg->out_ep->driver_data = hidg;
856
857                 /*
858                  * allocate a bunch of read buffers and queue them all at once.
859                  */
860                 for (i = 0; i < hidg->qlen && status == 0; i++) {
861                         struct usb_request *req =
862                                         hidg_alloc_ep_req(hidg->out_ep,
863                                                           hidg->report_length);
864                         if (req) {
865                                 req->complete = hidg_intout_complete;
866                                 req->context  = hidg;
867                                 status = usb_ep_queue(hidg->out_ep, req,
868                                                       GFP_ATOMIC);
869                                 if (status) {
870                                         ERROR(cdev, "%s queue req --> %d\n",
871                                                 hidg->out_ep->name, status);
872                                         free_ep_req(hidg->out_ep, req);
873                                 }
874                         } else {
875                                 status = -ENOMEM;
876                                 goto disable_out_ep;
877                         }
878                 }
879         }
880
881         if (hidg->in_ep != NULL) {
882                 spin_lock_irqsave(&hidg->write_spinlock, flags);
883                 hidg->req = req_in;
884                 hidg->write_pending = 0;
885                 spin_unlock_irqrestore(&hidg->write_spinlock, flags);
886
887                 wake_up(&hidg->write_queue);
888         }
889         return 0;
890 disable_out_ep:
891         if (hidg->out_ep)
892                 usb_ep_disable(hidg->out_ep);
893 free_req_in:
894         if (req_in)
895                 free_ep_req(hidg->in_ep, req_in);
896
897 disable_ep_in:
898         if (hidg->in_ep)
899                 usb_ep_disable(hidg->in_ep);
900
901 fail:
902         return status;
903 }
904
905 static const struct file_operations f_hidg_fops = {
906         .owner          = THIS_MODULE,
907         .open           = f_hidg_open,
908         .release        = f_hidg_release,
909         .write          = f_hidg_write,
910         .read           = f_hidg_read,
911         .poll           = f_hidg_poll,
912         .llseek         = noop_llseek,
913 };
914
915 static int hidg_bind(struct usb_configuration *c, struct usb_function *f)
916 {
917         struct usb_ep           *ep;
918         struct f_hidg           *hidg = func_to_hidg(f);
919         struct usb_string       *us;
920         int                     status;
921
922         /* maybe allocate device-global string IDs, and patch descriptors */
923         us = usb_gstrings_attach(c->cdev, ct_func_strings,
924                                  ARRAY_SIZE(ct_func_string_defs));
925         if (IS_ERR(us))
926                 return PTR_ERR(us);
927         hidg_interface_desc.iInterface = us[CT_FUNC_HID_IDX].id;
928
929         /* allocate instance-specific interface IDs, and patch descriptors */
930         status = usb_interface_id(c, f);
931         if (status < 0)
932                 goto fail;
933         hidg_interface_desc.bInterfaceNumber = status;
934
935         /* allocate instance-specific endpoints */
936         status = -ENODEV;
937         ep = usb_ep_autoconfig(c->cdev->gadget, &hidg_fs_in_ep_desc);
938         if (!ep)
939                 goto fail;
940         hidg->in_ep = ep;
941
942         hidg->out_ep = NULL;
943         if (hidg->use_out_ep) {
944                 ep = usb_ep_autoconfig(c->cdev->gadget, &hidg_fs_out_ep_desc);
945                 if (!ep)
946                         goto fail;
947                 hidg->out_ep = ep;
948         }
949
950         /* used only if use_out_ep == 1 */
951         hidg->set_report_buf = NULL;
952
953         /* set descriptor dynamic values */
954         hidg_interface_desc.bInterfaceSubClass = hidg->bInterfaceSubClass;
955         hidg_interface_desc.bInterfaceProtocol = hidg->bInterfaceProtocol;
956         hidg_interface_desc.bNumEndpoints = hidg->use_out_ep ? 2 : 1;
957         hidg->protocol = HID_REPORT_PROTOCOL;
958         hidg->idle = 1;
959         hidg_ss_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
960         hidg_ss_in_comp_desc.wBytesPerInterval =
961                                 cpu_to_le16(hidg->report_length);
962         hidg_hs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
963         hidg_fs_in_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
964         hidg_ss_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
965         hidg_ss_out_comp_desc.wBytesPerInterval =
966                                 cpu_to_le16(hidg->report_length);
967         hidg_hs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
968         hidg_fs_out_ep_desc.wMaxPacketSize = cpu_to_le16(hidg->report_length);
969         /*
970          * We can use hidg_desc struct here but we should not relay
971          * that its content won't change after returning from this function.
972          */
973         hidg_desc.desc[0].bDescriptorType = HID_DT_REPORT;
974         hidg_desc.desc[0].wDescriptorLength =
975                 cpu_to_le16(hidg->report_desc_length);
976
977         hidg_hs_in_ep_desc.bEndpointAddress =
978                 hidg_fs_in_ep_desc.bEndpointAddress;
979         hidg_hs_out_ep_desc.bEndpointAddress =
980                 hidg_fs_out_ep_desc.bEndpointAddress;
981
982         hidg_ss_in_ep_desc.bEndpointAddress =
983                 hidg_fs_in_ep_desc.bEndpointAddress;
984         hidg_ss_out_ep_desc.bEndpointAddress =
985                 hidg_fs_out_ep_desc.bEndpointAddress;
986
987         if (hidg->use_out_ep)
988                 status = usb_assign_descriptors(f,
989                         hidg_fs_descriptors_intout,
990                         hidg_hs_descriptors_intout,
991                         hidg_ss_descriptors_intout,
992                         hidg_ss_descriptors_intout);
993         else
994                 status = usb_assign_descriptors(f,
995                         hidg_fs_descriptors_ssreport,
996                         hidg_hs_descriptors_ssreport,
997                         hidg_ss_descriptors_ssreport,
998                         hidg_ss_descriptors_ssreport);
999
1000         if (status)
1001                 goto fail;
1002
1003         spin_lock_init(&hidg->write_spinlock);
1004         hidg->write_pending = 1;
1005         hidg->req = NULL;
1006         spin_lock_init(&hidg->read_spinlock);
1007         init_waitqueue_head(&hidg->write_queue);
1008         init_waitqueue_head(&hidg->read_queue);
1009         INIT_LIST_HEAD(&hidg->completed_out_req);
1010
1011         /* create char device */
1012         cdev_init(&hidg->cdev, &f_hidg_fops);
1013         status = cdev_device_add(&hidg->cdev, &hidg->dev);
1014         if (status)
1015                 goto fail_free_descs;
1016
1017         return 0;
1018 fail_free_descs:
1019         usb_free_all_descriptors(f);
1020 fail:
1021         ERROR(f->config->cdev, "hidg_bind FAILED\n");
1022         if (hidg->req != NULL)
1023                 free_ep_req(hidg->in_ep, hidg->req);
1024
1025         return status;
1026 }
1027
1028 static inline int hidg_get_minor(void)
1029 {
1030         int ret;
1031
1032         ret = ida_simple_get(&hidg_ida, 0, 0, GFP_KERNEL);
1033         if (ret >= HIDG_MINORS) {
1034                 ida_simple_remove(&hidg_ida, ret);
1035                 ret = -ENODEV;
1036         }
1037
1038         return ret;
1039 }
1040
1041 static inline struct f_hid_opts *to_f_hid_opts(struct config_item *item)
1042 {
1043         return container_of(to_config_group(item), struct f_hid_opts,
1044                             func_inst.group);
1045 }
1046
1047 static void hid_attr_release(struct config_item *item)
1048 {
1049         struct f_hid_opts *opts = to_f_hid_opts(item);
1050
1051         usb_put_function_instance(&opts->func_inst);
1052 }
1053
1054 static struct configfs_item_operations hidg_item_ops = {
1055         .release        = hid_attr_release,
1056 };
1057
1058 #define F_HID_OPT(name, prec, limit)                                    \
1059 static ssize_t f_hid_opts_##name##_show(struct config_item *item, char *page)\
1060 {                                                                       \
1061         struct f_hid_opts *opts = to_f_hid_opts(item);                  \
1062         int result;                                                     \
1063                                                                         \
1064         mutex_lock(&opts->lock);                                        \
1065         result = sprintf(page, "%d\n", opts->name);                     \
1066         mutex_unlock(&opts->lock);                                      \
1067                                                                         \
1068         return result;                                                  \
1069 }                                                                       \
1070                                                                         \
1071 static ssize_t f_hid_opts_##name##_store(struct config_item *item,      \
1072                                          const char *page, size_t len)  \
1073 {                                                                       \
1074         struct f_hid_opts *opts = to_f_hid_opts(item);                  \
1075         int ret;                                                        \
1076         u##prec num;                                                    \
1077                                                                         \
1078         mutex_lock(&opts->lock);                                        \
1079         if (opts->refcnt) {                                             \
1080                 ret = -EBUSY;                                           \
1081                 goto end;                                               \
1082         }                                                               \
1083                                                                         \
1084         ret = kstrtou##prec(page, 0, &num);                             \
1085         if (ret)                                                        \
1086                 goto end;                                               \
1087                                                                         \
1088         if (num > limit) {                                              \
1089                 ret = -EINVAL;                                          \
1090                 goto end;                                               \
1091         }                                                               \
1092         opts->name = num;                                               \
1093         ret = len;                                                      \
1094                                                                         \
1095 end:                                                                    \
1096         mutex_unlock(&opts->lock);                                      \
1097         return ret;                                                     \
1098 }                                                                       \
1099                                                                         \
1100 CONFIGFS_ATTR(f_hid_opts_, name)
1101
1102 F_HID_OPT(subclass, 8, 255);
1103 F_HID_OPT(protocol, 8, 255);
1104 F_HID_OPT(no_out_endpoint, 8, 1);
1105 F_HID_OPT(report_length, 16, 65535);
1106
1107 static ssize_t f_hid_opts_report_desc_show(struct config_item *item, char *page)
1108 {
1109         struct f_hid_opts *opts = to_f_hid_opts(item);
1110         int result;
1111
1112         mutex_lock(&opts->lock);
1113         result = opts->report_desc_length;
1114         memcpy(page, opts->report_desc, opts->report_desc_length);
1115         mutex_unlock(&opts->lock);
1116
1117         return result;
1118 }
1119
1120 static ssize_t f_hid_opts_report_desc_store(struct config_item *item,
1121                                             const char *page, size_t len)
1122 {
1123         struct f_hid_opts *opts = to_f_hid_opts(item);
1124         int ret = -EBUSY;
1125         char *d;
1126
1127         mutex_lock(&opts->lock);
1128
1129         if (opts->refcnt)
1130                 goto end;
1131         if (len > PAGE_SIZE) {
1132                 ret = -ENOSPC;
1133                 goto end;
1134         }
1135         d = kmemdup(page, len, GFP_KERNEL);
1136         if (!d) {
1137                 ret = -ENOMEM;
1138                 goto end;
1139         }
1140         kfree(opts->report_desc);
1141         opts->report_desc = d;
1142         opts->report_desc_length = len;
1143         opts->report_desc_alloc = true;
1144         ret = len;
1145 end:
1146         mutex_unlock(&opts->lock);
1147         return ret;
1148 }
1149
1150 CONFIGFS_ATTR(f_hid_opts_, report_desc);
1151
1152 static ssize_t f_hid_opts_dev_show(struct config_item *item, char *page)
1153 {
1154         struct f_hid_opts *opts = to_f_hid_opts(item);
1155
1156         return sprintf(page, "%d:%d\n", major, opts->minor);
1157 }
1158
1159 CONFIGFS_ATTR_RO(f_hid_opts_, dev);
1160
1161 static struct configfs_attribute *hid_attrs[] = {
1162         &f_hid_opts_attr_subclass,
1163         &f_hid_opts_attr_protocol,
1164         &f_hid_opts_attr_no_out_endpoint,
1165         &f_hid_opts_attr_report_length,
1166         &f_hid_opts_attr_report_desc,
1167         &f_hid_opts_attr_dev,
1168         NULL,
1169 };
1170
1171 static const struct config_item_type hid_func_type = {
1172         .ct_item_ops    = &hidg_item_ops,
1173         .ct_attrs       = hid_attrs,
1174         .ct_owner       = THIS_MODULE,
1175 };
1176
1177 static inline void hidg_put_minor(int minor)
1178 {
1179         ida_simple_remove(&hidg_ida, minor);
1180 }
1181
1182 static void hidg_free_inst(struct usb_function_instance *f)
1183 {
1184         struct f_hid_opts *opts;
1185
1186         opts = container_of(f, struct f_hid_opts, func_inst);
1187
1188         mutex_lock(&hidg_ida_lock);
1189
1190         hidg_put_minor(opts->minor);
1191         if (ida_is_empty(&hidg_ida))
1192                 ghid_cleanup();
1193
1194         mutex_unlock(&hidg_ida_lock);
1195
1196         if (opts->report_desc_alloc)
1197                 kfree(opts->report_desc);
1198
1199         kfree(opts);
1200 }
1201
1202 static struct usb_function_instance *hidg_alloc_inst(void)
1203 {
1204         struct f_hid_opts *opts;
1205         struct usb_function_instance *ret;
1206         int status = 0;
1207
1208         opts = kzalloc(sizeof(*opts), GFP_KERNEL);
1209         if (!opts)
1210                 return ERR_PTR(-ENOMEM);
1211         mutex_init(&opts->lock);
1212         opts->func_inst.free_func_inst = hidg_free_inst;
1213         ret = &opts->func_inst;
1214
1215         mutex_lock(&hidg_ida_lock);
1216
1217         if (ida_is_empty(&hidg_ida)) {
1218                 status = ghid_setup(NULL, HIDG_MINORS);
1219                 if (status)  {
1220                         ret = ERR_PTR(status);
1221                         kfree(opts);
1222                         goto unlock;
1223                 }
1224         }
1225
1226         opts->minor = hidg_get_minor();
1227         if (opts->minor < 0) {
1228                 ret = ERR_PTR(opts->minor);
1229                 kfree(opts);
1230                 if (ida_is_empty(&hidg_ida))
1231                         ghid_cleanup();
1232                 goto unlock;
1233         }
1234         config_group_init_type_name(&opts->func_inst.group, "", &hid_func_type);
1235
1236 unlock:
1237         mutex_unlock(&hidg_ida_lock);
1238         return ret;
1239 }
1240
1241 static void hidg_free(struct usb_function *f)
1242 {
1243         struct f_hidg *hidg;
1244         struct f_hid_opts *opts;
1245
1246         hidg = func_to_hidg(f);
1247         opts = container_of(f->fi, struct f_hid_opts, func_inst);
1248         put_device(&hidg->dev);
1249         mutex_lock(&opts->lock);
1250         --opts->refcnt;
1251         mutex_unlock(&opts->lock);
1252 }
1253
1254 static void hidg_unbind(struct usb_configuration *c, struct usb_function *f)
1255 {
1256         struct f_hidg *hidg = func_to_hidg(f);
1257
1258         cdev_device_del(&hidg->cdev, &hidg->dev);
1259
1260         usb_free_all_descriptors(f);
1261 }
1262
1263 static struct usb_function *hidg_alloc(struct usb_function_instance *fi)
1264 {
1265         struct f_hidg *hidg;
1266         struct f_hid_opts *opts;
1267         int ret;
1268
1269         /* allocate and initialize one new instance */
1270         hidg = kzalloc(sizeof(*hidg), GFP_KERNEL);
1271         if (!hidg)
1272                 return ERR_PTR(-ENOMEM);
1273
1274         opts = container_of(fi, struct f_hid_opts, func_inst);
1275
1276         mutex_lock(&opts->lock);
1277
1278         device_initialize(&hidg->dev);
1279         hidg->dev.release = hidg_release;
1280         hidg->dev.class = &hidg_class;
1281         hidg->dev.devt = MKDEV(major, opts->minor);
1282         ret = dev_set_name(&hidg->dev, "hidg%d", opts->minor);
1283         if (ret)
1284                 goto err_unlock;
1285
1286         hidg->bInterfaceSubClass = opts->subclass;
1287         hidg->bInterfaceProtocol = opts->protocol;
1288         hidg->report_length = opts->report_length;
1289         hidg->report_desc_length = opts->report_desc_length;
1290         if (opts->report_desc) {
1291                 hidg->report_desc = kmemdup(opts->report_desc,
1292                                             opts->report_desc_length,
1293                                             GFP_KERNEL);
1294                 if (!hidg->report_desc) {
1295                         ret = -ENOMEM;
1296                         goto err_put_device;
1297                 }
1298         }
1299         hidg->use_out_ep = !opts->no_out_endpoint;
1300
1301         ++opts->refcnt;
1302         mutex_unlock(&opts->lock);
1303
1304         hidg->func.name    = "hid";
1305         hidg->func.bind    = hidg_bind;
1306         hidg->func.unbind  = hidg_unbind;
1307         hidg->func.set_alt = hidg_set_alt;
1308         hidg->func.disable = hidg_disable;
1309         hidg->func.setup   = hidg_setup;
1310         hidg->func.free_func = hidg_free;
1311
1312         /* this could be made configurable at some point */
1313         hidg->qlen         = 4;
1314
1315         return &hidg->func;
1316
1317 err_put_device:
1318         put_device(&hidg->dev);
1319 err_unlock:
1320         mutex_unlock(&opts->lock);
1321         return ERR_PTR(ret);
1322 }
1323
1324 DECLARE_USB_FUNCTION_INIT(hid, hidg_alloc_inst, hidg_alloc);
1325 MODULE_LICENSE("GPL");
1326 MODULE_AUTHOR("Fabien Chouteau");
1327
1328 int ghid_setup(struct usb_gadget *g, int count)
1329 {
1330         int status;
1331         dev_t dev;
1332
1333         status = class_register(&hidg_class);
1334         if (status)
1335                 return status;
1336
1337         status = alloc_chrdev_region(&dev, 0, count, "hidg");
1338         if (status) {
1339                 class_unregister(&hidg_class);
1340                 return status;
1341         }
1342
1343         major = MAJOR(dev);
1344         minors = count;
1345
1346         return 0;
1347 }
1348
1349 void ghid_cleanup(void)
1350 {
1351         if (major) {
1352                 unregister_chrdev_region(MKDEV(major, 0), minors);
1353                 major = minors = 0;
1354         }
1355
1356         class_unregister(&hidg_class);
1357 }