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