Merge branch 'x86/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
[linux-2.6-microblaze.git] / drivers / usb / gadget / function / uvc_configfs.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * uvc_configfs.c
4  *
5  * Configfs support for the uvc function.
6  *
7  * Copyright (c) 2014 Samsung Electronics Co., Ltd.
8  *              http://www.samsung.com
9  *
10  * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
11  */
12 #include "u_uvc.h"
13 #include "uvc_configfs.h"
14
15 #define UVCG_STREAMING_CONTROL_SIZE     1
16
17 #define UVC_ATTR(prefix, cname, aname) \
18 static struct configfs_attribute prefix##attr_##cname = { \
19         .ca_name        = __stringify(aname),                           \
20         .ca_mode        = S_IRUGO | S_IWUGO,                            \
21         .ca_owner       = THIS_MODULE,                                  \
22         .show           = prefix##cname##_show,                         \
23         .store          = prefix##cname##_store,                        \
24 }
25
26 #define UVC_ATTR_RO(prefix, cname, aname) \
27 static struct configfs_attribute prefix##attr_##cname = { \
28         .ca_name        = __stringify(aname),                           \
29         .ca_mode        = S_IRUGO,                                      \
30         .ca_owner       = THIS_MODULE,                                  \
31         .show           = prefix##cname##_show,                         \
32 }
33
34 static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item);
35
36 /* control/header/<NAME> */
37 DECLARE_UVC_HEADER_DESCRIPTOR(1);
38
39 struct uvcg_control_header {
40         struct config_item              item;
41         struct UVC_HEADER_DESCRIPTOR(1) desc;
42         unsigned                        linked;
43 };
44
45 static struct uvcg_control_header *to_uvcg_control_header(struct config_item *item)
46 {
47         return container_of(item, struct uvcg_control_header, item);
48 }
49
50 #define UVCG_CTRL_HDR_ATTR(cname, aname, conv, str2u, uxx, vnoc, limit) \
51 static ssize_t uvcg_control_header_##cname##_show(                      \
52         struct config_item *item, char *page)                   \
53 {                                                                       \
54         struct uvcg_control_header *ch = to_uvcg_control_header(item);  \
55         struct f_uvc_opts *opts;                                        \
56         struct config_item *opts_item;                                  \
57         struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
58         int result;                                                     \
59                                                                         \
60         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
61                                                                         \
62         opts_item = ch->item.ci_parent->ci_parent->ci_parent;           \
63         opts = to_f_uvc_opts(opts_item);                                \
64                                                                         \
65         mutex_lock(&opts->lock);                                        \
66         result = sprintf(page, "%d\n", conv(ch->desc.aname));           \
67         mutex_unlock(&opts->lock);                                      \
68                                                                         \
69         mutex_unlock(su_mutex);                                         \
70         return result;                                                  \
71 }                                                                       \
72                                                                         \
73 static ssize_t                                                          \
74 uvcg_control_header_##cname##_store(struct config_item *item,           \
75                            const char *page, size_t len)                \
76 {                                                                       \
77         struct uvcg_control_header *ch = to_uvcg_control_header(item);  \
78         struct f_uvc_opts *opts;                                        \
79         struct config_item *opts_item;                                  \
80         struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;\
81         int ret;                                                        \
82         uxx num;                                                        \
83                                                                         \
84         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
85                                                                         \
86         opts_item = ch->item.ci_parent->ci_parent->ci_parent;           \
87         opts = to_f_uvc_opts(opts_item);                                \
88                                                                         \
89         mutex_lock(&opts->lock);                                        \
90         if (ch->linked || opts->refcnt) {                               \
91                 ret = -EBUSY;                                           \
92                 goto end;                                               \
93         }                                                               \
94                                                                         \
95         ret = str2u(page, 0, &num);                                     \
96         if (ret)                                                        \
97                 goto end;                                               \
98                                                                         \
99         if (num > limit) {                                              \
100                 ret = -EINVAL;                                          \
101                 goto end;                                               \
102         }                                                               \
103         ch->desc.aname = vnoc(num);                                     \
104         ret = len;                                                      \
105 end:                                                                    \
106         mutex_unlock(&opts->lock);                                      \
107         mutex_unlock(su_mutex);                                         \
108         return ret;                                                     \
109 }                                                                       \
110                                                                         \
111 UVC_ATTR(uvcg_control_header_, cname, aname)
112
113 UVCG_CTRL_HDR_ATTR(bcd_uvc, bcdUVC, le16_to_cpu, kstrtou16, u16, cpu_to_le16,
114                    0xffff);
115
116 UVCG_CTRL_HDR_ATTR(dw_clock_frequency, dwClockFrequency, le32_to_cpu, kstrtou32,
117                    u32, cpu_to_le32, 0x7fffffff);
118
119 #undef UVCG_CTRL_HDR_ATTR
120
121 static struct configfs_attribute *uvcg_control_header_attrs[] = {
122         &uvcg_control_header_attr_bcd_uvc,
123         &uvcg_control_header_attr_dw_clock_frequency,
124         NULL,
125 };
126
127 static const struct config_item_type uvcg_control_header_type = {
128         .ct_attrs       = uvcg_control_header_attrs,
129         .ct_owner       = THIS_MODULE,
130 };
131
132 static struct config_item *uvcg_control_header_make(struct config_group *group,
133                                                     const char *name)
134 {
135         struct uvcg_control_header *h;
136
137         h = kzalloc(sizeof(*h), GFP_KERNEL);
138         if (!h)
139                 return ERR_PTR(-ENOMEM);
140
141         h->desc.bLength                 = UVC_DT_HEADER_SIZE(1);
142         h->desc.bDescriptorType         = USB_DT_CS_INTERFACE;
143         h->desc.bDescriptorSubType      = UVC_VC_HEADER;
144         h->desc.bcdUVC                  = cpu_to_le16(0x0100);
145         h->desc.dwClockFrequency        = cpu_to_le32(48000000);
146
147         config_item_init_type_name(&h->item, name, &uvcg_control_header_type);
148
149         return &h->item;
150 }
151
152 static void uvcg_control_header_drop(struct config_group *group,
153                               struct config_item *item)
154 {
155         struct uvcg_control_header *h = to_uvcg_control_header(item);
156
157         kfree(h);
158 }
159
160 /* control/header */
161 static struct uvcg_control_header_grp {
162         struct config_group     group;
163 } uvcg_control_header_grp;
164
165 static struct configfs_group_operations uvcg_control_header_grp_ops = {
166         .make_item              = uvcg_control_header_make,
167         .drop_item              = uvcg_control_header_drop,
168 };
169
170 static const struct config_item_type uvcg_control_header_grp_type = {
171         .ct_group_ops   = &uvcg_control_header_grp_ops,
172         .ct_owner       = THIS_MODULE,
173 };
174
175 /* control/processing/default */
176 static struct uvcg_default_processing {
177         struct config_group     group;
178 } uvcg_default_processing;
179
180 static inline struct uvcg_default_processing
181 *to_uvcg_default_processing(struct config_item *item)
182 {
183         return container_of(to_config_group(item),
184                             struct uvcg_default_processing, group);
185 }
186
187 #define UVCG_DEFAULT_PROCESSING_ATTR(cname, aname, conv)                \
188 static ssize_t uvcg_default_processing_##cname##_show(                  \
189         struct config_item *item, char *page)                           \
190 {                                                                       \
191         struct uvcg_default_processing *dp = to_uvcg_default_processing(item); \
192         struct f_uvc_opts *opts;                                        \
193         struct config_item *opts_item;                                  \
194         struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex;        \
195         struct uvc_processing_unit_descriptor *pd;                      \
196         int result;                                                     \
197                                                                         \
198         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
199                                                                         \
200         opts_item = dp->group.cg_item.ci_parent->ci_parent->ci_parent;  \
201         opts = to_f_uvc_opts(opts_item);                                \
202         pd = &opts->uvc_processing;                                     \
203                                                                         \
204         mutex_lock(&opts->lock);                                        \
205         result = sprintf(page, "%d\n", conv(pd->aname));                \
206         mutex_unlock(&opts->lock);                                      \
207                                                                         \
208         mutex_unlock(su_mutex);                                         \
209         return result;                                                  \
210 }                                                                       \
211                                                                         \
212 UVC_ATTR_RO(uvcg_default_processing_, cname, aname)
213
214 #define identity_conv(x) (x)
215
216 UVCG_DEFAULT_PROCESSING_ATTR(b_unit_id, bUnitID, identity_conv);
217 UVCG_DEFAULT_PROCESSING_ATTR(b_source_id, bSourceID, identity_conv);
218 UVCG_DEFAULT_PROCESSING_ATTR(w_max_multiplier, wMaxMultiplier, le16_to_cpu);
219 UVCG_DEFAULT_PROCESSING_ATTR(i_processing, iProcessing, identity_conv);
220
221 #undef identity_conv
222
223 #undef UVCG_DEFAULT_PROCESSING_ATTR
224
225 static ssize_t uvcg_default_processing_bm_controls_show(
226         struct config_item *item, char *page)
227 {
228         struct uvcg_default_processing *dp = to_uvcg_default_processing(item);
229         struct f_uvc_opts *opts;
230         struct config_item *opts_item;
231         struct mutex *su_mutex = &dp->group.cg_subsys->su_mutex;
232         struct uvc_processing_unit_descriptor *pd;
233         int result, i;
234         char *pg = page;
235
236         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
237
238         opts_item = dp->group.cg_item.ci_parent->ci_parent->ci_parent;
239         opts = to_f_uvc_opts(opts_item);
240         pd = &opts->uvc_processing;
241
242         mutex_lock(&opts->lock);
243         for (result = 0, i = 0; i < pd->bControlSize; ++i) {
244                 result += sprintf(pg, "%d\n", pd->bmControls[i]);
245                 pg = page + result;
246         }
247         mutex_unlock(&opts->lock);
248
249         mutex_unlock(su_mutex);
250
251         return result;
252 }
253
254 UVC_ATTR_RO(uvcg_default_processing_, bm_controls, bmControls);
255
256 static struct configfs_attribute *uvcg_default_processing_attrs[] = {
257         &uvcg_default_processing_attr_b_unit_id,
258         &uvcg_default_processing_attr_b_source_id,
259         &uvcg_default_processing_attr_w_max_multiplier,
260         &uvcg_default_processing_attr_bm_controls,
261         &uvcg_default_processing_attr_i_processing,
262         NULL,
263 };
264
265 static const struct config_item_type uvcg_default_processing_type = {
266         .ct_attrs       = uvcg_default_processing_attrs,
267         .ct_owner       = THIS_MODULE,
268 };
269
270 /* struct uvcg_processing {}; */
271
272 /* control/processing */
273 static struct uvcg_processing_grp {
274         struct config_group     group;
275 } uvcg_processing_grp;
276
277 static const struct config_item_type uvcg_processing_grp_type = {
278         .ct_owner = THIS_MODULE,
279 };
280
281 /* control/terminal/camera/default */
282 static struct uvcg_default_camera {
283         struct config_group     group;
284 } uvcg_default_camera;
285
286 static inline struct uvcg_default_camera
287 *to_uvcg_default_camera(struct config_item *item)
288 {
289         return container_of(to_config_group(item),
290                             struct uvcg_default_camera, group);
291 }
292
293 #define UVCG_DEFAULT_CAMERA_ATTR(cname, aname, conv)                    \
294 static ssize_t uvcg_default_camera_##cname##_show(                      \
295         struct config_item *item, char *page)                           \
296 {                                                                       \
297         struct uvcg_default_camera *dc = to_uvcg_default_camera(item);  \
298         struct f_uvc_opts *opts;                                        \
299         struct config_item *opts_item;                                  \
300         struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;        \
301         struct uvc_camera_terminal_descriptor *cd;                      \
302         int result;                                                     \
303                                                                         \
304         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
305                                                                         \
306         opts_item = dc->group.cg_item.ci_parent->ci_parent->ci_parent-> \
307                         ci_parent;                                      \
308         opts = to_f_uvc_opts(opts_item);                                \
309         cd = &opts->uvc_camera_terminal;                                \
310                                                                         \
311         mutex_lock(&opts->lock);                                        \
312         result = sprintf(page, "%d\n", conv(cd->aname));                \
313         mutex_unlock(&opts->lock);                                      \
314                                                                         \
315         mutex_unlock(su_mutex);                                         \
316                                                                         \
317         return result;                                                  \
318 }                                                                       \
319                                                                         \
320 UVC_ATTR_RO(uvcg_default_camera_, cname, aname)
321
322 #define identity_conv(x) (x)
323
324 UVCG_DEFAULT_CAMERA_ATTR(b_terminal_id, bTerminalID, identity_conv);
325 UVCG_DEFAULT_CAMERA_ATTR(w_terminal_type, wTerminalType, le16_to_cpu);
326 UVCG_DEFAULT_CAMERA_ATTR(b_assoc_terminal, bAssocTerminal, identity_conv);
327 UVCG_DEFAULT_CAMERA_ATTR(i_terminal, iTerminal, identity_conv);
328 UVCG_DEFAULT_CAMERA_ATTR(w_objective_focal_length_min, wObjectiveFocalLengthMin,
329                          le16_to_cpu);
330 UVCG_DEFAULT_CAMERA_ATTR(w_objective_focal_length_max, wObjectiveFocalLengthMax,
331                          le16_to_cpu);
332 UVCG_DEFAULT_CAMERA_ATTR(w_ocular_focal_length, wOcularFocalLength,
333                          le16_to_cpu);
334
335 #undef identity_conv
336
337 #undef UVCG_DEFAULT_CAMERA_ATTR
338
339 static ssize_t uvcg_default_camera_bm_controls_show(
340         struct config_item *item, char *page)
341 {
342         struct uvcg_default_camera *dc = to_uvcg_default_camera(item);
343         struct f_uvc_opts *opts;
344         struct config_item *opts_item;
345         struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;
346         struct uvc_camera_terminal_descriptor *cd;
347         int result, i;
348         char *pg = page;
349
350         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
351
352         opts_item = dc->group.cg_item.ci_parent->ci_parent->ci_parent->
353                         ci_parent;
354         opts = to_f_uvc_opts(opts_item);
355         cd = &opts->uvc_camera_terminal;
356
357         mutex_lock(&opts->lock);
358         for (result = 0, i = 0; i < cd->bControlSize; ++i) {
359                 result += sprintf(pg, "%d\n", cd->bmControls[i]);
360                 pg = page + result;
361         }
362         mutex_unlock(&opts->lock);
363
364         mutex_unlock(su_mutex);
365         return result;
366 }
367
368 UVC_ATTR_RO(uvcg_default_camera_, bm_controls, bmControls);
369
370 static struct configfs_attribute *uvcg_default_camera_attrs[] = {
371         &uvcg_default_camera_attr_b_terminal_id,
372         &uvcg_default_camera_attr_w_terminal_type,
373         &uvcg_default_camera_attr_b_assoc_terminal,
374         &uvcg_default_camera_attr_i_terminal,
375         &uvcg_default_camera_attr_w_objective_focal_length_min,
376         &uvcg_default_camera_attr_w_objective_focal_length_max,
377         &uvcg_default_camera_attr_w_ocular_focal_length,
378         &uvcg_default_camera_attr_bm_controls,
379         NULL,
380 };
381
382 static const struct config_item_type uvcg_default_camera_type = {
383         .ct_attrs       = uvcg_default_camera_attrs,
384         .ct_owner       = THIS_MODULE,
385 };
386
387 /* struct uvcg_camera {}; */
388
389 /* control/terminal/camera */
390 static struct uvcg_camera_grp {
391         struct config_group     group;
392 } uvcg_camera_grp;
393
394 static const struct config_item_type uvcg_camera_grp_type = {
395         .ct_owner = THIS_MODULE,
396 };
397
398 /* control/terminal/output/default */
399 static struct uvcg_default_output {
400         struct config_group     group;
401 } uvcg_default_output;
402
403 static inline struct uvcg_default_output
404 *to_uvcg_default_output(struct config_item *item)
405 {
406         return container_of(to_config_group(item),
407                             struct uvcg_default_output, group);
408 }
409
410 #define UVCG_DEFAULT_OUTPUT_ATTR(cname, aname, conv)                    \
411 static ssize_t uvcg_default_output_##cname##_show(                      \
412         struct config_item *item, char *page)                   \
413 {                                                                       \
414         struct uvcg_default_output *dout = to_uvcg_default_output(item); \
415         struct f_uvc_opts *opts;                                        \
416         struct config_item *opts_item;                                  \
417         struct mutex *su_mutex = &dout->group.cg_subsys->su_mutex;      \
418         struct uvc_output_terminal_descriptor *cd;                      \
419         int result;                                                     \
420                                                                         \
421         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
422                                                                         \
423         opts_item = dout->group.cg_item.ci_parent->ci_parent->          \
424                         ci_parent->ci_parent;                           \
425         opts = to_f_uvc_opts(opts_item);                                \
426         cd = &opts->uvc_output_terminal;                                \
427                                                                         \
428         mutex_lock(&opts->lock);                                        \
429         result = sprintf(page, "%d\n", conv(cd->aname));                \
430         mutex_unlock(&opts->lock);                                      \
431                                                                         \
432         mutex_unlock(su_mutex);                                         \
433                                                                         \
434         return result;                                                  \
435 }                                                                       \
436                                                                         \
437 UVC_ATTR_RO(uvcg_default_output_, cname, aname)
438
439 #define identity_conv(x) (x)
440
441 UVCG_DEFAULT_OUTPUT_ATTR(b_terminal_id, bTerminalID, identity_conv);
442 UVCG_DEFAULT_OUTPUT_ATTR(w_terminal_type, wTerminalType, le16_to_cpu);
443 UVCG_DEFAULT_OUTPUT_ATTR(b_assoc_terminal, bAssocTerminal, identity_conv);
444 UVCG_DEFAULT_OUTPUT_ATTR(b_source_id, bSourceID, identity_conv);
445 UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, identity_conv);
446
447 #undef identity_conv
448
449 #undef UVCG_DEFAULT_OUTPUT_ATTR
450
451 static struct configfs_attribute *uvcg_default_output_attrs[] = {
452         &uvcg_default_output_attr_b_terminal_id,
453         &uvcg_default_output_attr_w_terminal_type,
454         &uvcg_default_output_attr_b_assoc_terminal,
455         &uvcg_default_output_attr_b_source_id,
456         &uvcg_default_output_attr_i_terminal,
457         NULL,
458 };
459
460 static const struct config_item_type uvcg_default_output_type = {
461         .ct_attrs       = uvcg_default_output_attrs,
462         .ct_owner       = THIS_MODULE,
463 };
464
465 /* struct uvcg_output {}; */
466
467 /* control/terminal/output */
468 static struct uvcg_output_grp {
469         struct config_group     group;
470 } uvcg_output_grp;
471
472 static const struct config_item_type uvcg_output_grp_type = {
473         .ct_owner = THIS_MODULE,
474 };
475
476 /* control/terminal */
477 static struct uvcg_terminal_grp {
478         struct config_group     group;
479 } uvcg_terminal_grp;
480
481 static const struct config_item_type uvcg_terminal_grp_type = {
482         .ct_owner = THIS_MODULE,
483 };
484
485 /* control/class/{fs} */
486 static struct uvcg_control_class {
487         struct config_group     group;
488 } uvcg_control_class_fs, uvcg_control_class_ss;
489
490
491 static inline struct uvc_descriptor_header
492 **uvcg_get_ctl_class_arr(struct config_item *i, struct f_uvc_opts *o)
493 {
494         struct uvcg_control_class *cl = container_of(to_config_group(i),
495                 struct uvcg_control_class, group);
496
497         if (cl == &uvcg_control_class_fs)
498                 return o->uvc_fs_control_cls;
499
500         if (cl == &uvcg_control_class_ss)
501                 return o->uvc_ss_control_cls;
502
503         return NULL;
504 }
505
506 static int uvcg_control_class_allow_link(struct config_item *src,
507                                          struct config_item *target)
508 {
509         struct config_item *control, *header;
510         struct f_uvc_opts *opts;
511         struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
512         struct uvc_descriptor_header **class_array;
513         struct uvcg_control_header *target_hdr;
514         int ret = -EINVAL;
515
516         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
517
518         control = src->ci_parent->ci_parent;
519         header = config_group_find_item(to_config_group(control), "header");
520         if (!header || target->ci_parent != header)
521                 goto out;
522
523         opts = to_f_uvc_opts(control->ci_parent);
524
525         mutex_lock(&opts->lock);
526
527         class_array = uvcg_get_ctl_class_arr(src, opts);
528         if (!class_array)
529                 goto unlock;
530         if (opts->refcnt || class_array[0]) {
531                 ret = -EBUSY;
532                 goto unlock;
533         }
534
535         target_hdr = to_uvcg_control_header(target);
536         ++target_hdr->linked;
537         class_array[0] = (struct uvc_descriptor_header *)&target_hdr->desc;
538         ret = 0;
539
540 unlock:
541         mutex_unlock(&opts->lock);
542 out:
543         mutex_unlock(su_mutex);
544         return ret;
545 }
546
547 static void uvcg_control_class_drop_link(struct config_item *src,
548                                         struct config_item *target)
549 {
550         struct config_item *control, *header;
551         struct f_uvc_opts *opts;
552         struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
553         struct uvc_descriptor_header **class_array;
554         struct uvcg_control_header *target_hdr;
555
556         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
557
558         control = src->ci_parent->ci_parent;
559         header = config_group_find_item(to_config_group(control), "header");
560         if (!header || target->ci_parent != header)
561                 goto out;
562
563         opts = to_f_uvc_opts(control->ci_parent);
564
565         mutex_lock(&opts->lock);
566
567         class_array = uvcg_get_ctl_class_arr(src, opts);
568         if (!class_array || opts->refcnt)
569                 goto unlock;
570
571         target_hdr = to_uvcg_control_header(target);
572         --target_hdr->linked;
573         class_array[0] = NULL;
574
575 unlock:
576         mutex_unlock(&opts->lock);
577 out:
578         mutex_unlock(su_mutex);
579 }
580
581 static struct configfs_item_operations uvcg_control_class_item_ops = {
582         .allow_link     = uvcg_control_class_allow_link,
583         .drop_link      = uvcg_control_class_drop_link,
584 };
585
586 static const struct config_item_type uvcg_control_class_type = {
587         .ct_item_ops    = &uvcg_control_class_item_ops,
588         .ct_owner       = THIS_MODULE,
589 };
590
591 /* control/class */
592 static struct uvcg_control_class_grp {
593         struct config_group     group;
594 } uvcg_control_class_grp;
595
596 static const struct config_item_type uvcg_control_class_grp_type = {
597         .ct_owner = THIS_MODULE,
598 };
599
600 /* control */
601 static struct uvcg_control_grp {
602         struct config_group     group;
603 } uvcg_control_grp;
604
605 static const struct config_item_type uvcg_control_grp_type = {
606         .ct_owner = THIS_MODULE,
607 };
608
609 /* streaming/uncompressed */
610 static struct uvcg_uncompressed_grp {
611         struct config_group     group;
612 } uvcg_uncompressed_grp;
613
614 /* streaming/mjpeg */
615 static struct uvcg_mjpeg_grp {
616         struct config_group     group;
617 } uvcg_mjpeg_grp;
618
619 static struct config_item *fmt_parent[] = {
620         &uvcg_uncompressed_grp.group.cg_item,
621         &uvcg_mjpeg_grp.group.cg_item,
622 };
623
624 enum uvcg_format_type {
625         UVCG_UNCOMPRESSED = 0,
626         UVCG_MJPEG,
627 };
628
629 struct uvcg_format {
630         struct config_group     group;
631         enum uvcg_format_type   type;
632         unsigned                linked;
633         unsigned                num_frames;
634         __u8                    bmaControls[UVCG_STREAMING_CONTROL_SIZE];
635 };
636
637 static struct uvcg_format *to_uvcg_format(struct config_item *item)
638 {
639         return container_of(to_config_group(item), struct uvcg_format, group);
640 }
641
642 static ssize_t uvcg_format_bma_controls_show(struct uvcg_format *f, char *page)
643 {
644         struct f_uvc_opts *opts;
645         struct config_item *opts_item;
646         struct mutex *su_mutex = &f->group.cg_subsys->su_mutex;
647         int result, i;
648         char *pg = page;
649
650         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
651
652         opts_item = f->group.cg_item.ci_parent->ci_parent->ci_parent;
653         opts = to_f_uvc_opts(opts_item);
654
655         mutex_lock(&opts->lock);
656         result = sprintf(pg, "0x");
657         pg += result;
658         for (i = 0; i < UVCG_STREAMING_CONTROL_SIZE; ++i) {
659                 result += sprintf(pg, "%x\n", f->bmaControls[i]);
660                 pg = page + result;
661         }
662         mutex_unlock(&opts->lock);
663
664         mutex_unlock(su_mutex);
665         return result;
666 }
667
668 static ssize_t uvcg_format_bma_controls_store(struct uvcg_format *ch,
669                                               const char *page, size_t len)
670 {
671         struct f_uvc_opts *opts;
672         struct config_item *opts_item;
673         struct mutex *su_mutex = &ch->group.cg_subsys->su_mutex;
674         int ret = -EINVAL;
675
676         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
677
678         opts_item = ch->group.cg_item.ci_parent->ci_parent->ci_parent;
679         opts = to_f_uvc_opts(opts_item);
680
681         mutex_lock(&opts->lock);
682         if (ch->linked || opts->refcnt) {
683                 ret = -EBUSY;
684                 goto end;
685         }
686
687         if (len < 4 || *page != '0' ||
688             (*(page + 1) != 'x' && *(page + 1) != 'X'))
689                 goto end;
690         ret = hex2bin(ch->bmaControls, page + 2, 1);
691         if (ret < 0)
692                 goto end;
693         ret = len;
694 end:
695         mutex_unlock(&opts->lock);
696         mutex_unlock(su_mutex);
697         return ret;
698 }
699
700 struct uvcg_format_ptr {
701         struct uvcg_format      *fmt;
702         struct list_head        entry;
703 };
704
705 /* streaming/header/<NAME> */
706 struct uvcg_streaming_header {
707         struct config_item                              item;
708         struct uvc_input_header_descriptor              desc;
709         unsigned                                        linked;
710         struct list_head                                formats;
711         unsigned                                        num_fmt;
712 };
713
714 static struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item)
715 {
716         return container_of(item, struct uvcg_streaming_header, item);
717 }
718
719 static int uvcg_streaming_header_allow_link(struct config_item *src,
720                                             struct config_item *target)
721 {
722         struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
723         struct config_item *opts_item;
724         struct f_uvc_opts *opts;
725         struct uvcg_streaming_header *src_hdr;
726         struct uvcg_format *target_fmt = NULL;
727         struct uvcg_format_ptr *format_ptr;
728         int i, ret = -EINVAL;
729
730         src_hdr = to_uvcg_streaming_header(src);
731         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
732
733         opts_item = src->ci_parent->ci_parent->ci_parent;
734         opts = to_f_uvc_opts(opts_item);
735
736         mutex_lock(&opts->lock);
737
738         if (src_hdr->linked) {
739                 ret = -EBUSY;
740                 goto out;
741         }
742
743         for (i = 0; i < ARRAY_SIZE(fmt_parent); ++i)
744                 if (target->ci_parent == fmt_parent[i])
745                         break;
746         if (i == ARRAY_SIZE(fmt_parent))
747                 goto out;
748
749         target_fmt = container_of(to_config_group(target), struct uvcg_format,
750                                   group);
751         if (!target_fmt)
752                 goto out;
753
754         format_ptr = kzalloc(sizeof(*format_ptr), GFP_KERNEL);
755         if (!format_ptr) {
756                 ret = -ENOMEM;
757                 goto out;
758         }
759         ret = 0;
760         format_ptr->fmt = target_fmt;
761         list_add_tail(&format_ptr->entry, &src_hdr->formats);
762         ++src_hdr->num_fmt;
763
764 out:
765         mutex_unlock(&opts->lock);
766         mutex_unlock(su_mutex);
767         return ret;
768 }
769
770 static void uvcg_streaming_header_drop_link(struct config_item *src,
771                                            struct config_item *target)
772 {
773         struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
774         struct config_item *opts_item;
775         struct f_uvc_opts *opts;
776         struct uvcg_streaming_header *src_hdr;
777         struct uvcg_format *target_fmt = NULL;
778         struct uvcg_format_ptr *format_ptr, *tmp;
779
780         src_hdr = to_uvcg_streaming_header(src);
781         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
782
783         opts_item = src->ci_parent->ci_parent->ci_parent;
784         opts = to_f_uvc_opts(opts_item);
785
786         mutex_lock(&opts->lock);
787         target_fmt = container_of(to_config_group(target), struct uvcg_format,
788                                   group);
789         if (!target_fmt)
790                 goto out;
791
792         list_for_each_entry_safe(format_ptr, tmp, &src_hdr->formats, entry)
793                 if (format_ptr->fmt == target_fmt) {
794                         list_del(&format_ptr->entry);
795                         kfree(format_ptr);
796                         --src_hdr->num_fmt;
797                         break;
798                 }
799
800 out:
801         mutex_unlock(&opts->lock);
802         mutex_unlock(su_mutex);
803 }
804
805 static struct configfs_item_operations uvcg_streaming_header_item_ops = {
806         .allow_link             = uvcg_streaming_header_allow_link,
807         .drop_link              = uvcg_streaming_header_drop_link,
808 };
809
810 #define UVCG_STREAMING_HEADER_ATTR(cname, aname, conv)                  \
811 static ssize_t uvcg_streaming_header_##cname##_show(                    \
812         struct config_item *item, char *page)                   \
813 {                                                                       \
814         struct uvcg_streaming_header *sh = to_uvcg_streaming_header(item); \
815         struct f_uvc_opts *opts;                                        \
816         struct config_item *opts_item;                                  \
817         struct mutex *su_mutex = &sh->item.ci_group->cg_subsys->su_mutex;\
818         int result;                                                     \
819                                                                         \
820         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
821                                                                         \
822         opts_item = sh->item.ci_parent->ci_parent->ci_parent;           \
823         opts = to_f_uvc_opts(opts_item);                                \
824                                                                         \
825         mutex_lock(&opts->lock);                                        \
826         result = sprintf(page, "%d\n", conv(sh->desc.aname));           \
827         mutex_unlock(&opts->lock);                                      \
828                                                                         \
829         mutex_unlock(su_mutex);                                         \
830         return result;                                                  \
831 }                                                                       \
832                                                                         \
833 UVC_ATTR_RO(uvcg_streaming_header_, cname, aname)
834
835 #define identity_conv(x) (x)
836
837 UVCG_STREAMING_HEADER_ATTR(bm_info, bmInfo, identity_conv);
838 UVCG_STREAMING_HEADER_ATTR(b_terminal_link, bTerminalLink, identity_conv);
839 UVCG_STREAMING_HEADER_ATTR(b_still_capture_method, bStillCaptureMethod,
840                            identity_conv);
841 UVCG_STREAMING_HEADER_ATTR(b_trigger_support, bTriggerSupport, identity_conv);
842 UVCG_STREAMING_HEADER_ATTR(b_trigger_usage, bTriggerUsage, identity_conv);
843
844 #undef identity_conv
845
846 #undef UVCG_STREAMING_HEADER_ATTR
847
848 static struct configfs_attribute *uvcg_streaming_header_attrs[] = {
849         &uvcg_streaming_header_attr_bm_info,
850         &uvcg_streaming_header_attr_b_terminal_link,
851         &uvcg_streaming_header_attr_b_still_capture_method,
852         &uvcg_streaming_header_attr_b_trigger_support,
853         &uvcg_streaming_header_attr_b_trigger_usage,
854         NULL,
855 };
856
857 static const struct config_item_type uvcg_streaming_header_type = {
858         .ct_item_ops    = &uvcg_streaming_header_item_ops,
859         .ct_attrs       = uvcg_streaming_header_attrs,
860         .ct_owner       = THIS_MODULE,
861 };
862
863 static struct config_item
864 *uvcg_streaming_header_make(struct config_group *group, const char *name)
865 {
866         struct uvcg_streaming_header *h;
867
868         h = kzalloc(sizeof(*h), GFP_KERNEL);
869         if (!h)
870                 return ERR_PTR(-ENOMEM);
871
872         INIT_LIST_HEAD(&h->formats);
873         h->desc.bDescriptorType         = USB_DT_CS_INTERFACE;
874         h->desc.bDescriptorSubType      = UVC_VS_INPUT_HEADER;
875         h->desc.bTerminalLink           = 3;
876         h->desc.bControlSize            = UVCG_STREAMING_CONTROL_SIZE;
877
878         config_item_init_type_name(&h->item, name, &uvcg_streaming_header_type);
879
880         return &h->item;
881 }
882
883 static void uvcg_streaming_header_drop(struct config_group *group,
884                               struct config_item *item)
885 {
886         struct uvcg_streaming_header *h = to_uvcg_streaming_header(item);
887
888         kfree(h);
889 }
890
891 /* streaming/header */
892 static struct uvcg_streaming_header_grp {
893         struct config_group     group;
894 } uvcg_streaming_header_grp;
895
896 static struct configfs_group_operations uvcg_streaming_header_grp_ops = {
897         .make_item              = uvcg_streaming_header_make,
898         .drop_item              = uvcg_streaming_header_drop,
899 };
900
901 static const struct config_item_type uvcg_streaming_header_grp_type = {
902         .ct_group_ops   = &uvcg_streaming_header_grp_ops,
903         .ct_owner       = THIS_MODULE,
904 };
905
906 /* streaming/<mode>/<format>/<NAME> */
907 struct uvcg_frame {
908         struct {
909                 u8      b_length;
910                 u8      b_descriptor_type;
911                 u8      b_descriptor_subtype;
912                 u8      b_frame_index;
913                 u8      bm_capabilities;
914                 u16     w_width;
915                 u16     w_height;
916                 u32     dw_min_bit_rate;
917                 u32     dw_max_bit_rate;
918                 u32     dw_max_video_frame_buffer_size;
919                 u32     dw_default_frame_interval;
920                 u8      b_frame_interval_type;
921         } __attribute__((packed)) frame;
922         u32 *dw_frame_interval;
923         enum uvcg_format_type   fmt_type;
924         struct config_item      item;
925 };
926
927 static struct uvcg_frame *to_uvcg_frame(struct config_item *item)
928 {
929         return container_of(item, struct uvcg_frame, item);
930 }
931
932 #define UVCG_FRAME_ATTR(cname, aname, to_cpu_endian, to_little_endian, bits) \
933 static ssize_t uvcg_frame_##cname##_show(struct config_item *item, char *page)\
934 {                                                                       \
935         struct uvcg_frame *f = to_uvcg_frame(item);                     \
936         struct f_uvc_opts *opts;                                        \
937         struct config_item *opts_item;                                  \
938         struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
939         int result;                                                     \
940                                                                         \
941         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
942                                                                         \
943         opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
944         opts = to_f_uvc_opts(opts_item);                                \
945                                                                         \
946         mutex_lock(&opts->lock);                                        \
947         result = sprintf(page, "%d\n", to_cpu_endian(f->frame.cname));  \
948         mutex_unlock(&opts->lock);                                      \
949                                                                         \
950         mutex_unlock(su_mutex);                                         \
951         return result;                                                  \
952 }                                                                       \
953                                                                         \
954 static ssize_t  uvcg_frame_##cname##_store(struct config_item *item,    \
955                                            const char *page, size_t len)\
956 {                                                                       \
957         struct uvcg_frame *f = to_uvcg_frame(item);                     \
958         struct f_uvc_opts *opts;                                        \
959         struct config_item *opts_item;                                  \
960         struct uvcg_format *fmt;                                        \
961         struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
962         int ret;                                                        \
963         u##bits num;                                                    \
964                                                                         \
965         ret = kstrtou##bits(page, 0, &num);                             \
966         if (ret)                                                        \
967                 return ret;                                             \
968                                                                         \
969         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
970                                                                         \
971         opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
972         opts = to_f_uvc_opts(opts_item);                                \
973         fmt = to_uvcg_format(f->item.ci_parent);                        \
974                                                                         \
975         mutex_lock(&opts->lock);                                        \
976         if (fmt->linked || opts->refcnt) {                              \
977                 ret = -EBUSY;                                           \
978                 goto end;                                               \
979         }                                                               \
980                                                                         \
981         f->frame.cname = to_little_endian(num);                         \
982         ret = len;                                                      \
983 end:                                                                    \
984         mutex_unlock(&opts->lock);                                      \
985         mutex_unlock(su_mutex);                                         \
986         return ret;                                                     \
987 }                                                                       \
988                                                                         \
989 UVC_ATTR(uvcg_frame_, cname, aname);
990
991 #define noop_conversion(x) (x)
992
993 UVCG_FRAME_ATTR(bm_capabilities, bmCapabilities, noop_conversion,
994                 noop_conversion, 8);
995 UVCG_FRAME_ATTR(w_width, wWidth, le16_to_cpu, cpu_to_le16, 16);
996 UVCG_FRAME_ATTR(w_height, wHeight, le16_to_cpu, cpu_to_le16, 16);
997 UVCG_FRAME_ATTR(dw_min_bit_rate, dwMinBitRate, le32_to_cpu, cpu_to_le32, 32);
998 UVCG_FRAME_ATTR(dw_max_bit_rate, dwMaxBitRate, le32_to_cpu, cpu_to_le32, 32);
999 UVCG_FRAME_ATTR(dw_max_video_frame_buffer_size, dwMaxVideoFrameBufferSize,
1000                 le32_to_cpu, cpu_to_le32, 32);
1001 UVCG_FRAME_ATTR(dw_default_frame_interval, dwDefaultFrameInterval,
1002                 le32_to_cpu, cpu_to_le32, 32);
1003
1004 #undef noop_conversion
1005
1006 #undef UVCG_FRAME_ATTR
1007
1008 static ssize_t uvcg_frame_dw_frame_interval_show(struct config_item *item,
1009                                                  char *page)
1010 {
1011         struct uvcg_frame *frm = to_uvcg_frame(item);
1012         struct f_uvc_opts *opts;
1013         struct config_item *opts_item;
1014         struct mutex *su_mutex = &frm->item.ci_group->cg_subsys->su_mutex;
1015         int result, i;
1016         char *pg = page;
1017
1018         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
1019
1020         opts_item = frm->item.ci_parent->ci_parent->ci_parent->ci_parent;
1021         opts = to_f_uvc_opts(opts_item);
1022
1023         mutex_lock(&opts->lock);
1024         for (result = 0, i = 0; i < frm->frame.b_frame_interval_type; ++i) {
1025                 result += sprintf(pg, "%d\n",
1026                                   le32_to_cpu(frm->dw_frame_interval[i]));
1027                 pg = page + result;
1028         }
1029         mutex_unlock(&opts->lock);
1030
1031         mutex_unlock(su_mutex);
1032         return result;
1033 }
1034
1035 static inline int __uvcg_count_frm_intrv(char *buf, void *priv)
1036 {
1037         ++*((int *)priv);
1038         return 0;
1039 }
1040
1041 static inline int __uvcg_fill_frm_intrv(char *buf, void *priv)
1042 {
1043         u32 num, **interv;
1044         int ret;
1045
1046         ret = kstrtou32(buf, 0, &num);
1047         if (ret)
1048                 return ret;
1049
1050         interv = priv;
1051         **interv = cpu_to_le32(num);
1052         ++*interv;
1053
1054         return 0;
1055 }
1056
1057 static int __uvcg_iter_frm_intrv(const char *page, size_t len,
1058                                  int (*fun)(char *, void *), void *priv)
1059 {
1060         /* sign, base 2 representation, newline, terminator */
1061         char buf[1 + sizeof(u32) * 8 + 1 + 1];
1062         const char *pg = page;
1063         int i, ret;
1064
1065         if (!fun)
1066                 return -EINVAL;
1067
1068         while (pg - page < len) {
1069                 i = 0;
1070                 while (i < sizeof(buf) && (pg - page < len) &&
1071                                 *pg != '\0' && *pg != '\n')
1072                         buf[i++] = *pg++;
1073                 if (i == sizeof(buf))
1074                         return -EINVAL;
1075                 while ((pg - page < len) && (*pg == '\0' || *pg == '\n'))
1076                         ++pg;
1077                 buf[i] = '\0';
1078                 ret = fun(buf, priv);
1079                 if (ret)
1080                         return ret;
1081         }
1082
1083         return 0;
1084 }
1085
1086 static ssize_t uvcg_frame_dw_frame_interval_store(struct config_item *item,
1087                                                   const char *page, size_t len)
1088 {
1089         struct uvcg_frame *ch = to_uvcg_frame(item);
1090         struct f_uvc_opts *opts;
1091         struct config_item *opts_item;
1092         struct uvcg_format *fmt;
1093         struct mutex *su_mutex = &ch->item.ci_group->cg_subsys->su_mutex;
1094         int ret = 0, n = 0;
1095         u32 *frm_intrv, *tmp;
1096
1097         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
1098
1099         opts_item = ch->item.ci_parent->ci_parent->ci_parent->ci_parent;
1100         opts = to_f_uvc_opts(opts_item);
1101         fmt = to_uvcg_format(ch->item.ci_parent);
1102
1103         mutex_lock(&opts->lock);
1104         if (fmt->linked || opts->refcnt) {
1105                 ret = -EBUSY;
1106                 goto end;
1107         }
1108
1109         ret = __uvcg_iter_frm_intrv(page, len, __uvcg_count_frm_intrv, &n);
1110         if (ret)
1111                 goto end;
1112
1113         tmp = frm_intrv = kcalloc(n, sizeof(u32), GFP_KERNEL);
1114         if (!frm_intrv) {
1115                 ret = -ENOMEM;
1116                 goto end;
1117         }
1118
1119         ret = __uvcg_iter_frm_intrv(page, len, __uvcg_fill_frm_intrv, &tmp);
1120         if (ret) {
1121                 kfree(frm_intrv);
1122                 goto end;
1123         }
1124
1125         kfree(ch->dw_frame_interval);
1126         ch->dw_frame_interval = frm_intrv;
1127         ch->frame.b_frame_interval_type = n;
1128         ret = len;
1129
1130 end:
1131         mutex_unlock(&opts->lock);
1132         mutex_unlock(su_mutex);
1133         return ret;
1134 }
1135
1136 UVC_ATTR(uvcg_frame_, dw_frame_interval, dwFrameInterval);
1137
1138 static struct configfs_attribute *uvcg_frame_attrs[] = {
1139         &uvcg_frame_attr_bm_capabilities,
1140         &uvcg_frame_attr_w_width,
1141         &uvcg_frame_attr_w_height,
1142         &uvcg_frame_attr_dw_min_bit_rate,
1143         &uvcg_frame_attr_dw_max_bit_rate,
1144         &uvcg_frame_attr_dw_max_video_frame_buffer_size,
1145         &uvcg_frame_attr_dw_default_frame_interval,
1146         &uvcg_frame_attr_dw_frame_interval,
1147         NULL,
1148 };
1149
1150 static const struct config_item_type uvcg_frame_type = {
1151         .ct_attrs       = uvcg_frame_attrs,
1152         .ct_owner       = THIS_MODULE,
1153 };
1154
1155 static struct config_item *uvcg_frame_make(struct config_group *group,
1156                                            const char *name)
1157 {
1158         struct uvcg_frame *h;
1159         struct uvcg_format *fmt;
1160         struct f_uvc_opts *opts;
1161         struct config_item *opts_item;
1162
1163         h = kzalloc(sizeof(*h), GFP_KERNEL);
1164         if (!h)
1165                 return ERR_PTR(-ENOMEM);
1166
1167         h->frame.b_descriptor_type              = USB_DT_CS_INTERFACE;
1168         h->frame.b_frame_index                  = 1;
1169         h->frame.w_width                        = cpu_to_le16(640);
1170         h->frame.w_height                       = cpu_to_le16(360);
1171         h->frame.dw_min_bit_rate                = cpu_to_le32(18432000);
1172         h->frame.dw_max_bit_rate                = cpu_to_le32(55296000);
1173         h->frame.dw_max_video_frame_buffer_size = cpu_to_le32(460800);
1174         h->frame.dw_default_frame_interval      = cpu_to_le32(666666);
1175
1176         opts_item = group->cg_item.ci_parent->ci_parent->ci_parent;
1177         opts = to_f_uvc_opts(opts_item);
1178
1179         mutex_lock(&opts->lock);
1180         fmt = to_uvcg_format(&group->cg_item);
1181         if (fmt->type == UVCG_UNCOMPRESSED) {
1182                 h->frame.b_descriptor_subtype = UVC_VS_FRAME_UNCOMPRESSED;
1183                 h->fmt_type = UVCG_UNCOMPRESSED;
1184         } else if (fmt->type == UVCG_MJPEG) {
1185                 h->frame.b_descriptor_subtype = UVC_VS_FRAME_MJPEG;
1186                 h->fmt_type = UVCG_MJPEG;
1187         } else {
1188                 mutex_unlock(&opts->lock);
1189                 kfree(h);
1190                 return ERR_PTR(-EINVAL);
1191         }
1192         ++fmt->num_frames;
1193         mutex_unlock(&opts->lock);
1194
1195         config_item_init_type_name(&h->item, name, &uvcg_frame_type);
1196
1197         return &h->item;
1198 }
1199
1200 static void uvcg_frame_drop(struct config_group *group, struct config_item *item)
1201 {
1202         struct uvcg_frame *h = to_uvcg_frame(item);
1203         struct uvcg_format *fmt;
1204         struct f_uvc_opts *opts;
1205         struct config_item *opts_item;
1206
1207         opts_item = group->cg_item.ci_parent->ci_parent->ci_parent;
1208         opts = to_f_uvc_opts(opts_item);
1209
1210         mutex_lock(&opts->lock);
1211         fmt = to_uvcg_format(&group->cg_item);
1212         --fmt->num_frames;
1213         kfree(h);
1214         mutex_unlock(&opts->lock);
1215 }
1216
1217 /* streaming/uncompressed/<NAME> */
1218 struct uvcg_uncompressed {
1219         struct uvcg_format              fmt;
1220         struct uvc_format_uncompressed  desc;
1221 };
1222
1223 static struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
1224 {
1225         return container_of(
1226                 container_of(to_config_group(item), struct uvcg_format, group),
1227                 struct uvcg_uncompressed, fmt);
1228 }
1229
1230 static struct configfs_group_operations uvcg_uncompressed_group_ops = {
1231         .make_item              = uvcg_frame_make,
1232         .drop_item              = uvcg_frame_drop,
1233 };
1234
1235 static ssize_t uvcg_uncompressed_guid_format_show(struct config_item *item,
1236                                                         char *page)
1237 {
1238         struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
1239         struct f_uvc_opts *opts;
1240         struct config_item *opts_item;
1241         struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
1242
1243         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
1244
1245         opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;
1246         opts = to_f_uvc_opts(opts_item);
1247
1248         mutex_lock(&opts->lock);
1249         memcpy(page, ch->desc.guidFormat, sizeof(ch->desc.guidFormat));
1250         mutex_unlock(&opts->lock);
1251
1252         mutex_unlock(su_mutex);
1253
1254         return sizeof(ch->desc.guidFormat);
1255 }
1256
1257 static ssize_t uvcg_uncompressed_guid_format_store(struct config_item *item,
1258                                                    const char *page, size_t len)
1259 {
1260         struct uvcg_uncompressed *ch = to_uvcg_uncompressed(item);
1261         struct f_uvc_opts *opts;
1262         struct config_item *opts_item;
1263         struct mutex *su_mutex = &ch->fmt.group.cg_subsys->su_mutex;
1264         int ret;
1265
1266         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
1267
1268         opts_item = ch->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;
1269         opts = to_f_uvc_opts(opts_item);
1270
1271         mutex_lock(&opts->lock);
1272         if (ch->fmt.linked || opts->refcnt) {
1273                 ret = -EBUSY;
1274                 goto end;
1275         }
1276
1277         memcpy(ch->desc.guidFormat, page,
1278                min(sizeof(ch->desc.guidFormat), len));
1279         ret = sizeof(ch->desc.guidFormat);
1280
1281 end:
1282         mutex_unlock(&opts->lock);
1283         mutex_unlock(su_mutex);
1284         return ret;
1285 }
1286
1287 UVC_ATTR(uvcg_uncompressed_, guid_format, guidFormat);
1288
1289 #define UVCG_UNCOMPRESSED_ATTR_RO(cname, aname, conv)                   \
1290 static ssize_t uvcg_uncompressed_##cname##_show(                        \
1291         struct config_item *item, char *page)                           \
1292 {                                                                       \
1293         struct uvcg_uncompressed *u = to_uvcg_uncompressed(item);       \
1294         struct f_uvc_opts *opts;                                        \
1295         struct config_item *opts_item;                                  \
1296         struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
1297         int result;                                                     \
1298                                                                         \
1299         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
1300                                                                         \
1301         opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1302         opts = to_f_uvc_opts(opts_item);                                \
1303                                                                         \
1304         mutex_lock(&opts->lock);                                        \
1305         result = sprintf(page, "%d\n", conv(u->desc.aname));            \
1306         mutex_unlock(&opts->lock);                                      \
1307                                                                         \
1308         mutex_unlock(su_mutex);                                         \
1309         return result;                                                  \
1310 }                                                                       \
1311                                                                         \
1312 UVC_ATTR_RO(uvcg_uncompressed_, cname, aname);
1313
1314 #define UVCG_UNCOMPRESSED_ATTR(cname, aname, conv)                      \
1315 static ssize_t uvcg_uncompressed_##cname##_show(                        \
1316         struct config_item *item, char *page)                           \
1317 {                                                                       \
1318         struct uvcg_uncompressed *u = to_uvcg_uncompressed(item);       \
1319         struct f_uvc_opts *opts;                                        \
1320         struct config_item *opts_item;                                  \
1321         struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
1322         int result;                                                     \
1323                                                                         \
1324         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
1325                                                                         \
1326         opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1327         opts = to_f_uvc_opts(opts_item);                                \
1328                                                                         \
1329         mutex_lock(&opts->lock);                                        \
1330         result = sprintf(page, "%d\n", conv(u->desc.aname));            \
1331         mutex_unlock(&opts->lock);                                      \
1332                                                                         \
1333         mutex_unlock(su_mutex);                                         \
1334         return result;                                                  \
1335 }                                                                       \
1336                                                                         \
1337 static ssize_t                                                          \
1338 uvcg_uncompressed_##cname##_store(struct config_item *item,             \
1339                                     const char *page, size_t len)       \
1340 {                                                                       \
1341         struct uvcg_uncompressed *u = to_uvcg_uncompressed(item);       \
1342         struct f_uvc_opts *opts;                                        \
1343         struct config_item *opts_item;                                  \
1344         struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
1345         int ret;                                                        \
1346         u8 num;                                                         \
1347                                                                         \
1348         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
1349                                                                         \
1350         opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1351         opts = to_f_uvc_opts(opts_item);                                \
1352                                                                         \
1353         mutex_lock(&opts->lock);                                        \
1354         if (u->fmt.linked || opts->refcnt) {                            \
1355                 ret = -EBUSY;                                           \
1356                 goto end;                                               \
1357         }                                                               \
1358                                                                         \
1359         ret = kstrtou8(page, 0, &num);                                  \
1360         if (ret)                                                        \
1361                 goto end;                                               \
1362                                                                         \
1363         if (num > 255) {                                                \
1364                 ret = -EINVAL;                                          \
1365                 goto end;                                               \
1366         }                                                               \
1367         u->desc.aname = num;                                            \
1368         ret = len;                                                      \
1369 end:                                                                    \
1370         mutex_unlock(&opts->lock);                                      \
1371         mutex_unlock(su_mutex);                                         \
1372         return ret;                                                     \
1373 }                                                                       \
1374                                                                         \
1375 UVC_ATTR(uvcg_uncompressed_, cname, aname);
1376
1377 #define identity_conv(x) (x)
1378
1379 UVCG_UNCOMPRESSED_ATTR(b_bits_per_pixel, bBitsPerPixel, identity_conv);
1380 UVCG_UNCOMPRESSED_ATTR(b_default_frame_index, bDefaultFrameIndex,
1381                        identity_conv);
1382 UVCG_UNCOMPRESSED_ATTR_RO(b_aspect_ratio_x, bAspectRatioX, identity_conv);
1383 UVCG_UNCOMPRESSED_ATTR_RO(b_aspect_ratio_y, bAspectRatioY, identity_conv);
1384 UVCG_UNCOMPRESSED_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
1385
1386 #undef identity_conv
1387
1388 #undef UVCG_UNCOMPRESSED_ATTR
1389 #undef UVCG_UNCOMPRESSED_ATTR_RO
1390
1391 static inline ssize_t
1392 uvcg_uncompressed_bma_controls_show(struct config_item *item, char *page)
1393 {
1394         struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
1395         return uvcg_format_bma_controls_show(&unc->fmt, page);
1396 }
1397
1398 static inline ssize_t
1399 uvcg_uncompressed_bma_controls_store(struct config_item *item,
1400                                      const char *page, size_t len)
1401 {
1402         struct uvcg_uncompressed *unc = to_uvcg_uncompressed(item);
1403         return uvcg_format_bma_controls_store(&unc->fmt, page, len);
1404 }
1405
1406 UVC_ATTR(uvcg_uncompressed_, bma_controls, bmaControls);
1407
1408 static struct configfs_attribute *uvcg_uncompressed_attrs[] = {
1409         &uvcg_uncompressed_attr_guid_format,
1410         &uvcg_uncompressed_attr_b_bits_per_pixel,
1411         &uvcg_uncompressed_attr_b_default_frame_index,
1412         &uvcg_uncompressed_attr_b_aspect_ratio_x,
1413         &uvcg_uncompressed_attr_b_aspect_ratio_y,
1414         &uvcg_uncompressed_attr_bm_interface_flags,
1415         &uvcg_uncompressed_attr_bma_controls,
1416         NULL,
1417 };
1418
1419 static const struct config_item_type uvcg_uncompressed_type = {
1420         .ct_group_ops   = &uvcg_uncompressed_group_ops,
1421         .ct_attrs       = uvcg_uncompressed_attrs,
1422         .ct_owner       = THIS_MODULE,
1423 };
1424
1425 static struct config_group *uvcg_uncompressed_make(struct config_group *group,
1426                                                    const char *name)
1427 {
1428         static char guid[] = {
1429                 'Y',  'U',  'Y',  '2', 0x00, 0x00, 0x10, 0x00,
1430                  0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
1431         };
1432         struct uvcg_uncompressed *h;
1433
1434         h = kzalloc(sizeof(*h), GFP_KERNEL);
1435         if (!h)
1436                 return ERR_PTR(-ENOMEM);
1437
1438         h->desc.bLength                 = UVC_DT_FORMAT_UNCOMPRESSED_SIZE;
1439         h->desc.bDescriptorType         = USB_DT_CS_INTERFACE;
1440         h->desc.bDescriptorSubType      = UVC_VS_FORMAT_UNCOMPRESSED;
1441         memcpy(h->desc.guidFormat, guid, sizeof(guid));
1442         h->desc.bBitsPerPixel           = 16;
1443         h->desc.bDefaultFrameIndex      = 1;
1444         h->desc.bAspectRatioX           = 0;
1445         h->desc.bAspectRatioY           = 0;
1446         h->desc.bmInterfaceFlags        = 0;
1447         h->desc.bCopyProtect            = 0;
1448
1449         h->fmt.type = UVCG_UNCOMPRESSED;
1450         config_group_init_type_name(&h->fmt.group, name,
1451                                     &uvcg_uncompressed_type);
1452
1453         return &h->fmt.group;
1454 }
1455
1456 static void uvcg_uncompressed_drop(struct config_group *group,
1457                             struct config_item *item)
1458 {
1459         struct uvcg_uncompressed *h = to_uvcg_uncompressed(item);
1460
1461         kfree(h);
1462 }
1463
1464 static struct configfs_group_operations uvcg_uncompressed_grp_ops = {
1465         .make_group             = uvcg_uncompressed_make,
1466         .drop_item              = uvcg_uncompressed_drop,
1467 };
1468
1469 static const struct config_item_type uvcg_uncompressed_grp_type = {
1470         .ct_group_ops   = &uvcg_uncompressed_grp_ops,
1471         .ct_owner       = THIS_MODULE,
1472 };
1473
1474 /* streaming/mjpeg/<NAME> */
1475 struct uvcg_mjpeg {
1476         struct uvcg_format              fmt;
1477         struct uvc_format_mjpeg         desc;
1478 };
1479
1480 static struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
1481 {
1482         return container_of(
1483                 container_of(to_config_group(item), struct uvcg_format, group),
1484                 struct uvcg_mjpeg, fmt);
1485 }
1486
1487 static struct configfs_group_operations uvcg_mjpeg_group_ops = {
1488         .make_item              = uvcg_frame_make,
1489         .drop_item              = uvcg_frame_drop,
1490 };
1491
1492 #define UVCG_MJPEG_ATTR_RO(cname, aname, conv)                          \
1493 static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
1494 {                                                                       \
1495         struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);                     \
1496         struct f_uvc_opts *opts;                                        \
1497         struct config_item *opts_item;                                  \
1498         struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
1499         int result;                                                     \
1500                                                                         \
1501         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
1502                                                                         \
1503         opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1504         opts = to_f_uvc_opts(opts_item);                                \
1505                                                                         \
1506         mutex_lock(&opts->lock);                                        \
1507         result = sprintf(page, "%d\n", conv(u->desc.aname));            \
1508         mutex_unlock(&opts->lock);                                      \
1509                                                                         \
1510         mutex_unlock(su_mutex);                                         \
1511         return result;                                                  \
1512 }                                                                       \
1513                                                                         \
1514 UVC_ATTR_RO(uvcg_mjpeg_, cname, aname)
1515
1516 #define UVCG_MJPEG_ATTR(cname, aname, conv)                             \
1517 static ssize_t uvcg_mjpeg_##cname##_show(struct config_item *item, char *page)\
1518 {                                                                       \
1519         struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);                     \
1520         struct f_uvc_opts *opts;                                        \
1521         struct config_item *opts_item;                                  \
1522         struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
1523         int result;                                                     \
1524                                                                         \
1525         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
1526                                                                         \
1527         opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1528         opts = to_f_uvc_opts(opts_item);                                \
1529                                                                         \
1530         mutex_lock(&opts->lock);                                        \
1531         result = sprintf(page, "%d\n", conv(u->desc.aname));            \
1532         mutex_unlock(&opts->lock);                                      \
1533                                                                         \
1534         mutex_unlock(su_mutex);                                         \
1535         return result;                                                  \
1536 }                                                                       \
1537                                                                         \
1538 static ssize_t                                                          \
1539 uvcg_mjpeg_##cname##_store(struct config_item *item,                    \
1540                            const char *page, size_t len)                \
1541 {                                                                       \
1542         struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);                     \
1543         struct f_uvc_opts *opts;                                        \
1544         struct config_item *opts_item;                                  \
1545         struct mutex *su_mutex = &u->fmt.group.cg_subsys->su_mutex;     \
1546         int ret;                                                        \
1547         u8 num;                                                         \
1548                                                                         \
1549         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
1550                                                                         \
1551         opts_item = u->fmt.group.cg_item.ci_parent->ci_parent->ci_parent;\
1552         opts = to_f_uvc_opts(opts_item);                                \
1553                                                                         \
1554         mutex_lock(&opts->lock);                                        \
1555         if (u->fmt.linked || opts->refcnt) {                            \
1556                 ret = -EBUSY;                                           \
1557                 goto end;                                               \
1558         }                                                               \
1559                                                                         \
1560         ret = kstrtou8(page, 0, &num);                                  \
1561         if (ret)                                                        \
1562                 goto end;                                               \
1563                                                                         \
1564         if (num > 255) {                                                \
1565                 ret = -EINVAL;                                          \
1566                 goto end;                                               \
1567         }                                                               \
1568         u->desc.aname = num;                                            \
1569         ret = len;                                                      \
1570 end:                                                                    \
1571         mutex_unlock(&opts->lock);                                      \
1572         mutex_unlock(su_mutex);                                         \
1573         return ret;                                                     \
1574 }                                                                       \
1575                                                                         \
1576 UVC_ATTR(uvcg_mjpeg_, cname, aname)
1577
1578 #define identity_conv(x) (x)
1579
1580 UVCG_MJPEG_ATTR(b_default_frame_index, bDefaultFrameIndex,
1581                        identity_conv);
1582 UVCG_MJPEG_ATTR_RO(bm_flags, bmFlags, identity_conv);
1583 UVCG_MJPEG_ATTR_RO(b_aspect_ratio_x, bAspectRatioX, identity_conv);
1584 UVCG_MJPEG_ATTR_RO(b_aspect_ratio_y, bAspectRatioY, identity_conv);
1585 UVCG_MJPEG_ATTR_RO(bm_interface_flags, bmInterfaceFlags, identity_conv);
1586
1587 #undef identity_conv
1588
1589 #undef UVCG_MJPEG_ATTR
1590 #undef UVCG_MJPEG_ATTR_RO
1591
1592 static inline ssize_t
1593 uvcg_mjpeg_bma_controls_show(struct config_item *item, char *page)
1594 {
1595         struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
1596         return uvcg_format_bma_controls_show(&u->fmt, page);
1597 }
1598
1599 static inline ssize_t
1600 uvcg_mjpeg_bma_controls_store(struct config_item *item,
1601                                      const char *page, size_t len)
1602 {
1603         struct uvcg_mjpeg *u = to_uvcg_mjpeg(item);
1604         return uvcg_format_bma_controls_store(&u->fmt, page, len);
1605 }
1606
1607 UVC_ATTR(uvcg_mjpeg_, bma_controls, bmaControls);
1608
1609 static struct configfs_attribute *uvcg_mjpeg_attrs[] = {
1610         &uvcg_mjpeg_attr_b_default_frame_index,
1611         &uvcg_mjpeg_attr_bm_flags,
1612         &uvcg_mjpeg_attr_b_aspect_ratio_x,
1613         &uvcg_mjpeg_attr_b_aspect_ratio_y,
1614         &uvcg_mjpeg_attr_bm_interface_flags,
1615         &uvcg_mjpeg_attr_bma_controls,
1616         NULL,
1617 };
1618
1619 static const struct config_item_type uvcg_mjpeg_type = {
1620         .ct_group_ops   = &uvcg_mjpeg_group_ops,
1621         .ct_attrs       = uvcg_mjpeg_attrs,
1622         .ct_owner       = THIS_MODULE,
1623 };
1624
1625 static struct config_group *uvcg_mjpeg_make(struct config_group *group,
1626                                                    const char *name)
1627 {
1628         struct uvcg_mjpeg *h;
1629
1630         h = kzalloc(sizeof(*h), GFP_KERNEL);
1631         if (!h)
1632                 return ERR_PTR(-ENOMEM);
1633
1634         h->desc.bLength                 = UVC_DT_FORMAT_MJPEG_SIZE;
1635         h->desc.bDescriptorType         = USB_DT_CS_INTERFACE;
1636         h->desc.bDescriptorSubType      = UVC_VS_FORMAT_MJPEG;
1637         h->desc.bDefaultFrameIndex      = 1;
1638         h->desc.bAspectRatioX           = 0;
1639         h->desc.bAspectRatioY           = 0;
1640         h->desc.bmInterfaceFlags        = 0;
1641         h->desc.bCopyProtect            = 0;
1642
1643         h->fmt.type = UVCG_MJPEG;
1644         config_group_init_type_name(&h->fmt.group, name,
1645                                     &uvcg_mjpeg_type);
1646
1647         return &h->fmt.group;
1648 }
1649
1650 static void uvcg_mjpeg_drop(struct config_group *group,
1651                             struct config_item *item)
1652 {
1653         struct uvcg_mjpeg *h = to_uvcg_mjpeg(item);
1654
1655         kfree(h);
1656 }
1657
1658 static struct configfs_group_operations uvcg_mjpeg_grp_ops = {
1659         .make_group             = uvcg_mjpeg_make,
1660         .drop_item              = uvcg_mjpeg_drop,
1661 };
1662
1663 static const struct config_item_type uvcg_mjpeg_grp_type = {
1664         .ct_group_ops   = &uvcg_mjpeg_grp_ops,
1665         .ct_owner       = THIS_MODULE,
1666 };
1667
1668 /* streaming/color_matching/default */
1669 static struct uvcg_default_color_matching {
1670         struct config_group     group;
1671 } uvcg_default_color_matching;
1672
1673 static inline struct uvcg_default_color_matching
1674 *to_uvcg_default_color_matching(struct config_item *item)
1675 {
1676         return container_of(to_config_group(item),
1677                             struct uvcg_default_color_matching, group);
1678 }
1679
1680 #define UVCG_DEFAULT_COLOR_MATCHING_ATTR(cname, aname, conv)            \
1681 static ssize_t uvcg_default_color_matching_##cname##_show(              \
1682         struct config_item *item, char *page)           \
1683 {                                                                       \
1684         struct uvcg_default_color_matching *dc =                        \
1685                 to_uvcg_default_color_matching(item);                   \
1686         struct f_uvc_opts *opts;                                        \
1687         struct config_item *opts_item;                                  \
1688         struct mutex *su_mutex = &dc->group.cg_subsys->su_mutex;        \
1689         struct uvc_color_matching_descriptor *cd;                       \
1690         int result;                                                     \
1691                                                                         \
1692         mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
1693                                                                         \
1694         opts_item = dc->group.cg_item.ci_parent->ci_parent->ci_parent;  \
1695         opts = to_f_uvc_opts(opts_item);                                \
1696         cd = &opts->uvc_color_matching;                                 \
1697                                                                         \
1698         mutex_lock(&opts->lock);                                        \
1699         result = sprintf(page, "%d\n", conv(cd->aname));                \
1700         mutex_unlock(&opts->lock);                                      \
1701                                                                         \
1702         mutex_unlock(su_mutex);                                         \
1703         return result;                                                  \
1704 }                                                                       \
1705                                                                         \
1706 UVC_ATTR_RO(uvcg_default_color_matching_, cname, aname)
1707
1708 #define identity_conv(x) (x)
1709
1710 UVCG_DEFAULT_COLOR_MATCHING_ATTR(b_color_primaries, bColorPrimaries,
1711                                  identity_conv);
1712 UVCG_DEFAULT_COLOR_MATCHING_ATTR(b_transfer_characteristics,
1713                                  bTransferCharacteristics, identity_conv);
1714 UVCG_DEFAULT_COLOR_MATCHING_ATTR(b_matrix_coefficients, bMatrixCoefficients,
1715                                  identity_conv);
1716
1717 #undef identity_conv
1718
1719 #undef UVCG_DEFAULT_COLOR_MATCHING_ATTR
1720
1721 static struct configfs_attribute *uvcg_default_color_matching_attrs[] = {
1722         &uvcg_default_color_matching_attr_b_color_primaries,
1723         &uvcg_default_color_matching_attr_b_transfer_characteristics,
1724         &uvcg_default_color_matching_attr_b_matrix_coefficients,
1725         NULL,
1726 };
1727
1728 static const struct config_item_type uvcg_default_color_matching_type = {
1729         .ct_attrs       = uvcg_default_color_matching_attrs,
1730         .ct_owner       = THIS_MODULE,
1731 };
1732
1733 /* struct uvcg_color_matching {}; */
1734
1735 /* streaming/color_matching */
1736 static struct uvcg_color_matching_grp {
1737         struct config_group     group;
1738 } uvcg_color_matching_grp;
1739
1740 static const struct config_item_type uvcg_color_matching_grp_type = {
1741         .ct_owner = THIS_MODULE,
1742 };
1743
1744 /* streaming/class/{fs|hs|ss} */
1745 static struct uvcg_streaming_class {
1746         struct config_group     group;
1747 } uvcg_streaming_class_fs, uvcg_streaming_class_hs, uvcg_streaming_class_ss;
1748
1749
1750 static inline struct uvc_descriptor_header
1751 ***__uvcg_get_stream_class_arr(struct config_item *i, struct f_uvc_opts *o)
1752 {
1753         struct uvcg_streaming_class *cl = container_of(to_config_group(i),
1754                 struct uvcg_streaming_class, group);
1755
1756         if (cl == &uvcg_streaming_class_fs)
1757                 return &o->uvc_fs_streaming_cls;
1758
1759         if (cl == &uvcg_streaming_class_hs)
1760                 return &o->uvc_hs_streaming_cls;
1761
1762         if (cl == &uvcg_streaming_class_ss)
1763                 return &o->uvc_ss_streaming_cls;
1764
1765         return NULL;
1766 }
1767
1768 enum uvcg_strm_type {
1769         UVCG_HEADER = 0,
1770         UVCG_FORMAT,
1771         UVCG_FRAME
1772 };
1773
1774 /*
1775  * Iterate over a hierarchy of streaming descriptors' config items.
1776  * The items are created by the user with configfs.
1777  *
1778  * It "processes" the header pointed to by @priv1, then for each format
1779  * that follows the header "processes" the format itself and then for
1780  * each frame inside a format "processes" the frame.
1781  *
1782  * As a "processing" function the @fun is used.
1783  *
1784  * __uvcg_iter_strm_cls() is used in two context: first, to calculate
1785  * the amount of memory needed for an array of streaming descriptors
1786  * and second, to actually fill the array.
1787  *
1788  * @h: streaming header pointer
1789  * @priv2: an "inout" parameter (the caller might want to see the changes to it)
1790  * @priv3: an "inout" parameter (the caller might want to see the changes to it)
1791  * @fun: callback function for processing each level of the hierarchy
1792  */
1793 static int __uvcg_iter_strm_cls(struct uvcg_streaming_header *h,
1794         void *priv2, void *priv3,
1795         int (*fun)(void *, void *, void *, int, enum uvcg_strm_type type))
1796 {
1797         struct uvcg_format_ptr *f;
1798         struct config_group *grp;
1799         struct config_item *item;
1800         struct uvcg_frame *frm;
1801         int ret, i, j;
1802
1803         if (!fun)
1804                 return -EINVAL;
1805
1806         i = j = 0;
1807         ret = fun(h, priv2, priv3, 0, UVCG_HEADER);
1808         if (ret)
1809                 return ret;
1810         list_for_each_entry(f, &h->formats, entry) {
1811                 ret = fun(f->fmt, priv2, priv3, i++, UVCG_FORMAT);
1812                 if (ret)
1813                         return ret;
1814                 grp = &f->fmt->group;
1815                 list_for_each_entry(item, &grp->cg_children, ci_entry) {
1816                         frm = to_uvcg_frame(item);
1817                         ret = fun(frm, priv2, priv3, j++, UVCG_FRAME);
1818                         if (ret)
1819                                 return ret;
1820                 }
1821         }
1822
1823         return ret;
1824 }
1825
1826 /*
1827  * Count how many bytes are needed for an array of streaming descriptors.
1828  *
1829  * @priv1: pointer to a header, format or frame
1830  * @priv2: inout parameter, accumulated size of the array
1831  * @priv3: inout parameter, accumulated number of the array elements
1832  * @n: unused, this function's prototype must match @fun in __uvcg_iter_strm_cls
1833  */
1834 static int __uvcg_cnt_strm(void *priv1, void *priv2, void *priv3, int n,
1835                            enum uvcg_strm_type type)
1836 {
1837         size_t *size = priv2;
1838         size_t *count = priv3;
1839
1840         switch (type) {
1841         case UVCG_HEADER: {
1842                 struct uvcg_streaming_header *h = priv1;
1843
1844                 *size += sizeof(h->desc);
1845                 /* bmaControls */
1846                 *size += h->num_fmt * UVCG_STREAMING_CONTROL_SIZE;
1847         }
1848         break;
1849         case UVCG_FORMAT: {
1850                 struct uvcg_format *fmt = priv1;
1851
1852                 if (fmt->type == UVCG_UNCOMPRESSED) {
1853                         struct uvcg_uncompressed *u =
1854                                 container_of(fmt, struct uvcg_uncompressed,
1855                                              fmt);
1856
1857                         *size += sizeof(u->desc);
1858                 } else if (fmt->type == UVCG_MJPEG) {
1859                         struct uvcg_mjpeg *m =
1860                                 container_of(fmt, struct uvcg_mjpeg, fmt);
1861
1862                         *size += sizeof(m->desc);
1863                 } else {
1864                         return -EINVAL;
1865                 }
1866         }
1867         break;
1868         case UVCG_FRAME: {
1869                 struct uvcg_frame *frm = priv1;
1870                 int sz = sizeof(frm->dw_frame_interval);
1871
1872                 *size += sizeof(frm->frame);
1873                 *size += frm->frame.b_frame_interval_type * sz;
1874         }
1875         break;
1876         }
1877
1878         ++*count;
1879
1880         return 0;
1881 }
1882
1883 /*
1884  * Fill an array of streaming descriptors.
1885  *
1886  * @priv1: pointer to a header, format or frame
1887  * @priv2: inout parameter, pointer into a block of memory
1888  * @priv3: inout parameter, pointer to a 2-dimensional array
1889  */
1890 static int __uvcg_fill_strm(void *priv1, void *priv2, void *priv3, int n,
1891                             enum uvcg_strm_type type)
1892 {
1893         void **dest = priv2;
1894         struct uvc_descriptor_header ***array = priv3;
1895         size_t sz;
1896
1897         **array = *dest;
1898         ++*array;
1899
1900         switch (type) {
1901         case UVCG_HEADER: {
1902                 struct uvc_input_header_descriptor *ihdr = *dest;
1903                 struct uvcg_streaming_header *h = priv1;
1904                 struct uvcg_format_ptr *f;
1905
1906                 memcpy(*dest, &h->desc, sizeof(h->desc));
1907                 *dest += sizeof(h->desc);
1908                 sz = UVCG_STREAMING_CONTROL_SIZE;
1909                 list_for_each_entry(f, &h->formats, entry) {
1910                         memcpy(*dest, f->fmt->bmaControls, sz);
1911                         *dest += sz;
1912                 }
1913                 ihdr->bLength = sizeof(h->desc) + h->num_fmt * sz;
1914                 ihdr->bNumFormats = h->num_fmt;
1915         }
1916         break;
1917         case UVCG_FORMAT: {
1918                 struct uvcg_format *fmt = priv1;
1919
1920                 if (fmt->type == UVCG_UNCOMPRESSED) {
1921                         struct uvc_format_uncompressed *unc = *dest;
1922                         struct uvcg_uncompressed *u =
1923                                 container_of(fmt, struct uvcg_uncompressed,
1924                                              fmt);
1925
1926                         memcpy(*dest, &u->desc, sizeof(u->desc));
1927                         *dest += sizeof(u->desc);
1928                         unc->bNumFrameDescriptors = fmt->num_frames;
1929                         unc->bFormatIndex = n + 1;
1930                 } else if (fmt->type == UVCG_MJPEG) {
1931                         struct uvc_format_mjpeg *mjp = *dest;
1932                         struct uvcg_mjpeg *m =
1933                                 container_of(fmt, struct uvcg_mjpeg, fmt);
1934
1935                         memcpy(*dest, &m->desc, sizeof(m->desc));
1936                         *dest += sizeof(m->desc);
1937                         mjp->bNumFrameDescriptors = fmt->num_frames;
1938                         mjp->bFormatIndex = n + 1;
1939                 } else {
1940                         return -EINVAL;
1941                 }
1942         }
1943         break;
1944         case UVCG_FRAME: {
1945                 struct uvcg_frame *frm = priv1;
1946                 struct uvc_descriptor_header *h = *dest;
1947
1948                 sz = sizeof(frm->frame);
1949                 memcpy(*dest, &frm->frame, sz);
1950                 *dest += sz;
1951                 sz = frm->frame.b_frame_interval_type *
1952                         sizeof(*frm->dw_frame_interval);
1953                 memcpy(*dest, frm->dw_frame_interval, sz);
1954                 *dest += sz;
1955                 if (frm->fmt_type == UVCG_UNCOMPRESSED)
1956                         h->bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(
1957                                 frm->frame.b_frame_interval_type);
1958                 else if (frm->fmt_type == UVCG_MJPEG)
1959                         h->bLength = UVC_DT_FRAME_MJPEG_SIZE(
1960                                 frm->frame.b_frame_interval_type);
1961         }
1962         break;
1963         }
1964
1965         return 0;
1966 }
1967
1968 static int uvcg_streaming_class_allow_link(struct config_item *src,
1969                                            struct config_item *target)
1970 {
1971         struct config_item *streaming, *header;
1972         struct f_uvc_opts *opts;
1973         struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
1974         struct uvc_descriptor_header ***class_array, **cl_arr;
1975         struct uvcg_streaming_header *target_hdr;
1976         void *data, *data_save;
1977         size_t size = 0, count = 0;
1978         int ret = -EINVAL;
1979
1980         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
1981
1982         streaming = src->ci_parent->ci_parent;
1983         header = config_group_find_item(to_config_group(streaming), "header");
1984         if (!header || target->ci_parent != header)
1985                 goto out;
1986
1987         opts = to_f_uvc_opts(streaming->ci_parent);
1988
1989         mutex_lock(&opts->lock);
1990
1991         class_array = __uvcg_get_stream_class_arr(src, opts);
1992         if (!class_array || *class_array || opts->refcnt) {
1993                 ret = -EBUSY;
1994                 goto unlock;
1995         }
1996
1997         target_hdr = to_uvcg_streaming_header(target);
1998         ret = __uvcg_iter_strm_cls(target_hdr, &size, &count, __uvcg_cnt_strm);
1999         if (ret)
2000                 goto unlock;
2001
2002         count += 2; /* color_matching, NULL */
2003         *class_array = kcalloc(count, sizeof(void *), GFP_KERNEL);
2004         if (!*class_array) {
2005                 ret = -ENOMEM;
2006                 goto unlock;
2007         }
2008
2009         data = data_save = kzalloc(size, GFP_KERNEL);
2010         if (!data) {
2011                 kfree(*class_array);
2012                 *class_array = NULL;
2013                 ret = -ENOMEM;
2014                 goto unlock;
2015         }
2016         cl_arr = *class_array;
2017         ret = __uvcg_iter_strm_cls(target_hdr, &data, &cl_arr,
2018                                    __uvcg_fill_strm);
2019         if (ret) {
2020                 kfree(*class_array);
2021                 *class_array = NULL;
2022                 /*
2023                  * __uvcg_fill_strm() called from __uvcg_iter_stream_cls()
2024                  * might have advanced the "data", so use a backup copy
2025                  */
2026                 kfree(data_save);
2027                 goto unlock;
2028         }
2029         *cl_arr = (struct uvc_descriptor_header *)&opts->uvc_color_matching;
2030
2031         ++target_hdr->linked;
2032         ret = 0;
2033
2034 unlock:
2035         mutex_unlock(&opts->lock);
2036 out:
2037         mutex_unlock(su_mutex);
2038         return ret;
2039 }
2040
2041 static void uvcg_streaming_class_drop_link(struct config_item *src,
2042                                           struct config_item *target)
2043 {
2044         struct config_item *streaming, *header;
2045         struct f_uvc_opts *opts;
2046         struct mutex *su_mutex = &src->ci_group->cg_subsys->su_mutex;
2047         struct uvc_descriptor_header ***class_array;
2048         struct uvcg_streaming_header *target_hdr;
2049
2050         mutex_lock(su_mutex); /* for navigating configfs hierarchy */
2051
2052         streaming = src->ci_parent->ci_parent;
2053         header = config_group_find_item(to_config_group(streaming), "header");
2054         if (!header || target->ci_parent != header)
2055                 goto out;
2056
2057         opts = to_f_uvc_opts(streaming->ci_parent);
2058
2059         mutex_lock(&opts->lock);
2060
2061         class_array = __uvcg_get_stream_class_arr(src, opts);
2062         if (!class_array || !*class_array)
2063                 goto unlock;
2064
2065         if (opts->refcnt)
2066                 goto unlock;
2067
2068         target_hdr = to_uvcg_streaming_header(target);
2069         --target_hdr->linked;
2070         kfree(**class_array);
2071         kfree(*class_array);
2072         *class_array = NULL;
2073
2074 unlock:
2075         mutex_unlock(&opts->lock);
2076 out:
2077         mutex_unlock(su_mutex);
2078 }
2079
2080 static struct configfs_item_operations uvcg_streaming_class_item_ops = {
2081         .allow_link     = uvcg_streaming_class_allow_link,
2082         .drop_link      = uvcg_streaming_class_drop_link,
2083 };
2084
2085 static const struct config_item_type uvcg_streaming_class_type = {
2086         .ct_item_ops    = &uvcg_streaming_class_item_ops,
2087         .ct_owner       = THIS_MODULE,
2088 };
2089
2090 /* streaming/class */
2091 static struct uvcg_streaming_class_grp {
2092         struct config_group     group;
2093 } uvcg_streaming_class_grp;
2094
2095 static const struct config_item_type uvcg_streaming_class_grp_type = {
2096         .ct_owner = THIS_MODULE,
2097 };
2098
2099 /* streaming */
2100 static struct uvcg_streaming_grp {
2101         struct config_group     group;
2102 } uvcg_streaming_grp;
2103
2104 static const struct config_item_type uvcg_streaming_grp_type = {
2105         .ct_owner = THIS_MODULE,
2106 };
2107
2108 static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
2109 {
2110         return container_of(to_config_group(item), struct f_uvc_opts,
2111                             func_inst.group);
2112 }
2113
2114 static void uvc_attr_release(struct config_item *item)
2115 {
2116         struct f_uvc_opts *opts = to_f_uvc_opts(item);
2117
2118         usb_put_function_instance(&opts->func_inst);
2119 }
2120
2121 static struct configfs_item_operations uvc_item_ops = {
2122         .release                = uvc_attr_release,
2123 };
2124
2125 #define UVCG_OPTS_ATTR(cname, aname, conv, str2u, uxx, vnoc, limit)     \
2126 static ssize_t f_uvc_opts_##cname##_show(                               \
2127         struct config_item *item, char *page)                           \
2128 {                                                                       \
2129         struct f_uvc_opts *opts = to_f_uvc_opts(item);                  \
2130         int result;                                                     \
2131                                                                         \
2132         mutex_lock(&opts->lock);                                        \
2133         result = sprintf(page, "%d\n", conv(opts->cname));              \
2134         mutex_unlock(&opts->lock);                                      \
2135                                                                         \
2136         return result;                                                  \
2137 }                                                                       \
2138                                                                         \
2139 static ssize_t                                                          \
2140 f_uvc_opts_##cname##_store(struct config_item *item,                    \
2141                            const char *page, size_t len)                \
2142 {                                                                       \
2143         struct f_uvc_opts *opts = to_f_uvc_opts(item);                  \
2144         int ret;                                                        \
2145         uxx num;                                                        \
2146                                                                         \
2147         mutex_lock(&opts->lock);                                        \
2148         if (opts->refcnt) {                                             \
2149                 ret = -EBUSY;                                           \
2150                 goto end;                                               \
2151         }                                                               \
2152                                                                         \
2153         ret = str2u(page, 0, &num);                                     \
2154         if (ret)                                                        \
2155                 goto end;                                               \
2156                                                                         \
2157         if (num > limit) {                                              \
2158                 ret = -EINVAL;                                          \
2159                 goto end;                                               \
2160         }                                                               \
2161         opts->cname = vnoc(num);                                        \
2162         ret = len;                                                      \
2163 end:                                                                    \
2164         mutex_unlock(&opts->lock);                                      \
2165         return ret;                                                     \
2166 }                                                                       \
2167                                                                         \
2168 UVC_ATTR(f_uvc_opts_, cname, cname)
2169
2170 #define identity_conv(x) (x)
2171
2172 UVCG_OPTS_ATTR(streaming_interval, streaming_interval, identity_conv,
2173                kstrtou8, u8, identity_conv, 16);
2174 UVCG_OPTS_ATTR(streaming_maxpacket, streaming_maxpacket, le16_to_cpu,
2175                kstrtou16, u16, le16_to_cpu, 3072);
2176 UVCG_OPTS_ATTR(streaming_maxburst, streaming_maxburst, identity_conv,
2177                kstrtou8, u8, identity_conv, 15);
2178
2179 #undef identity_conv
2180
2181 #undef UVCG_OPTS_ATTR
2182
2183 static struct configfs_attribute *uvc_attrs[] = {
2184         &f_uvc_opts_attr_streaming_interval,
2185         &f_uvc_opts_attr_streaming_maxpacket,
2186         &f_uvc_opts_attr_streaming_maxburst,
2187         NULL,
2188 };
2189
2190 static const struct config_item_type uvc_func_type = {
2191         .ct_item_ops    = &uvc_item_ops,
2192         .ct_attrs       = uvc_attrs,
2193         .ct_owner       = THIS_MODULE,
2194 };
2195
2196 int uvcg_attach_configfs(struct f_uvc_opts *opts)
2197 {
2198         config_group_init_type_name(&uvcg_control_header_grp.group,
2199                                     "header",
2200                                     &uvcg_control_header_grp_type);
2201
2202         config_group_init_type_name(&uvcg_default_processing.group,
2203                         "default", &uvcg_default_processing_type);
2204         config_group_init_type_name(&uvcg_processing_grp.group,
2205                         "processing", &uvcg_processing_grp_type);
2206         configfs_add_default_group(&uvcg_default_processing.group,
2207                         &uvcg_processing_grp.group);
2208
2209         config_group_init_type_name(&uvcg_default_camera.group,
2210                         "default", &uvcg_default_camera_type);
2211         config_group_init_type_name(&uvcg_camera_grp.group,
2212                         "camera", &uvcg_camera_grp_type);
2213         configfs_add_default_group(&uvcg_default_camera.group,
2214                         &uvcg_camera_grp.group);
2215
2216         config_group_init_type_name(&uvcg_default_output.group,
2217                         "default", &uvcg_default_output_type);
2218         config_group_init_type_name(&uvcg_output_grp.group,
2219                         "output", &uvcg_output_grp_type);
2220         configfs_add_default_group(&uvcg_default_output.group,
2221                         &uvcg_output_grp.group);
2222
2223         config_group_init_type_name(&uvcg_terminal_grp.group,
2224                         "terminal", &uvcg_terminal_grp_type);
2225         configfs_add_default_group(&uvcg_camera_grp.group,
2226                         &uvcg_terminal_grp.group);
2227         configfs_add_default_group(&uvcg_output_grp.group,
2228                         &uvcg_terminal_grp.group);
2229
2230         config_group_init_type_name(&uvcg_control_class_fs.group,
2231                         "fs", &uvcg_control_class_type);
2232         config_group_init_type_name(&uvcg_control_class_ss.group,
2233                         "ss", &uvcg_control_class_type);
2234         config_group_init_type_name(&uvcg_control_class_grp.group,
2235                         "class",
2236                         &uvcg_control_class_grp_type);
2237         configfs_add_default_group(&uvcg_control_class_fs.group,
2238                         &uvcg_control_class_grp.group);
2239         configfs_add_default_group(&uvcg_control_class_ss.group,
2240                         &uvcg_control_class_grp.group);
2241
2242         config_group_init_type_name(&uvcg_control_grp.group,
2243                         "control",
2244                         &uvcg_control_grp_type);
2245         configfs_add_default_group(&uvcg_control_header_grp.group,
2246                         &uvcg_control_grp.group);
2247         configfs_add_default_group(&uvcg_processing_grp.group,
2248                         &uvcg_control_grp.group);
2249         configfs_add_default_group(&uvcg_terminal_grp.group,
2250                         &uvcg_control_grp.group);
2251         configfs_add_default_group(&uvcg_control_class_grp.group,
2252                         &uvcg_control_grp.group);
2253
2254         config_group_init_type_name(&uvcg_streaming_header_grp.group,
2255                                     "header",
2256                                     &uvcg_streaming_header_grp_type);
2257         config_group_init_type_name(&uvcg_uncompressed_grp.group,
2258                                     "uncompressed",
2259                                     &uvcg_uncompressed_grp_type);
2260         config_group_init_type_name(&uvcg_mjpeg_grp.group,
2261                                     "mjpeg",
2262                                     &uvcg_mjpeg_grp_type);
2263         config_group_init_type_name(&uvcg_default_color_matching.group,
2264                                     "default",
2265                                     &uvcg_default_color_matching_type);
2266         config_group_init_type_name(&uvcg_color_matching_grp.group,
2267                         "color_matching",
2268                         &uvcg_color_matching_grp_type);
2269         configfs_add_default_group(&uvcg_default_color_matching.group,
2270                         &uvcg_color_matching_grp.group);
2271
2272         config_group_init_type_name(&uvcg_streaming_class_fs.group,
2273                         "fs", &uvcg_streaming_class_type);
2274         config_group_init_type_name(&uvcg_streaming_class_hs.group,
2275                         "hs", &uvcg_streaming_class_type);
2276         config_group_init_type_name(&uvcg_streaming_class_ss.group,
2277                         "ss", &uvcg_streaming_class_type);
2278         config_group_init_type_name(&uvcg_streaming_class_grp.group,
2279                         "class", &uvcg_streaming_class_grp_type);
2280         configfs_add_default_group(&uvcg_streaming_class_fs.group,
2281                         &uvcg_streaming_class_grp.group);
2282         configfs_add_default_group(&uvcg_streaming_class_hs.group,
2283                         &uvcg_streaming_class_grp.group);
2284         configfs_add_default_group(&uvcg_streaming_class_ss.group,
2285                         &uvcg_streaming_class_grp.group);
2286
2287         config_group_init_type_name(&uvcg_streaming_grp.group,
2288                         "streaming", &uvcg_streaming_grp_type);
2289         configfs_add_default_group(&uvcg_streaming_header_grp.group,
2290                         &uvcg_streaming_grp.group);
2291         configfs_add_default_group(&uvcg_uncompressed_grp.group,
2292                         &uvcg_streaming_grp.group);
2293         configfs_add_default_group(&uvcg_mjpeg_grp.group,
2294                         &uvcg_streaming_grp.group);
2295         configfs_add_default_group(&uvcg_color_matching_grp.group,
2296                         &uvcg_streaming_grp.group);
2297         configfs_add_default_group(&uvcg_streaming_class_grp.group,
2298                         &uvcg_streaming_grp.group);
2299
2300         config_group_init_type_name(&opts->func_inst.group,
2301                         "",
2302                         &uvc_func_type);
2303         configfs_add_default_group(&uvcg_control_grp.group,
2304                         &opts->func_inst.group);
2305         configfs_add_default_group(&uvcg_streaming_grp.group,
2306                         &opts->func_inst.group);
2307
2308         return 0;
2309 }