|
@@ -713,9 +713,40 @@ static const struct uvcg_config_group_type uvcg_control_class_grp_type = {
|
|
|
* control
|
|
|
*/
|
|
|
|
|
|
+static ssize_t uvcg_default_control_b_interface_number_show(
|
|
|
+ struct config_item *item, char *page)
|
|
|
+{
|
|
|
+ struct config_group *group = to_config_group(item);
|
|
|
+ struct mutex *su_mutex = &group->cg_subsys->su_mutex;
|
|
|
+ struct config_item *opts_item;
|
|
|
+ struct f_uvc_opts *opts;
|
|
|
+ int result = 0;
|
|
|
+
|
|
|
+ mutex_lock(su_mutex); /* for navigating configfs hierarchy */
|
|
|
+
|
|
|
+ opts_item = item->ci_parent;
|
|
|
+ opts = to_f_uvc_opts(opts_item);
|
|
|
+
|
|
|
+ mutex_lock(&opts->lock);
|
|
|
+ result += sprintf(page, "%u\n", opts->control_interface);
|
|
|
+ mutex_unlock(&opts->lock);
|
|
|
+
|
|
|
+ mutex_unlock(su_mutex);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+UVC_ATTR_RO(uvcg_default_control_, b_interface_number, bInterfaceNumber);
|
|
|
+
|
|
|
+static struct configfs_attribute *uvcg_default_control_attrs[] = {
|
|
|
+ &uvcg_default_control_attr_b_interface_number,
|
|
|
+ NULL,
|
|
|
+};
|
|
|
+
|
|
|
static const struct uvcg_config_group_type uvcg_control_grp_type = {
|
|
|
.type = {
|
|
|
.ct_item_ops = &uvcg_config_item_ops,
|
|
|
+ .ct_attrs = uvcg_default_control_attrs,
|
|
|
.ct_owner = THIS_MODULE,
|
|
|
},
|
|
|
.name = "control",
|
|
@@ -2259,9 +2290,40 @@ static const struct uvcg_config_group_type uvcg_streaming_class_grp_type = {
|
|
|
* streaming
|
|
|
*/
|
|
|
|
|
|
+static ssize_t uvcg_default_streaming_b_interface_number_show(
|
|
|
+ struct config_item *item, char *page)
|
|
|
+{
|
|
|
+ struct config_group *group = to_config_group(item);
|
|
|
+ struct mutex *su_mutex = &group->cg_subsys->su_mutex;
|
|
|
+ struct config_item *opts_item;
|
|
|
+ struct f_uvc_opts *opts;
|
|
|
+ int result = 0;
|
|
|
+
|
|
|
+ mutex_lock(su_mutex); /* for navigating configfs hierarchy */
|
|
|
+
|
|
|
+ opts_item = item->ci_parent;
|
|
|
+ opts = to_f_uvc_opts(opts_item);
|
|
|
+
|
|
|
+ mutex_lock(&opts->lock);
|
|
|
+ result += sprintf(page, "%u\n", opts->streaming_interface);
|
|
|
+ mutex_unlock(&opts->lock);
|
|
|
+
|
|
|
+ mutex_unlock(su_mutex);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+UVC_ATTR_RO(uvcg_default_streaming_, b_interface_number, bInterfaceNumber);
|
|
|
+
|
|
|
+static struct configfs_attribute *uvcg_default_streaming_attrs[] = {
|
|
|
+ &uvcg_default_streaming_attr_b_interface_number,
|
|
|
+ NULL,
|
|
|
+};
|
|
|
+
|
|
|
static const struct uvcg_config_group_type uvcg_streaming_grp_type = {
|
|
|
.type = {
|
|
|
.ct_item_ops = &uvcg_config_item_ops,
|
|
|
+ .ct_attrs = uvcg_default_streaming_attrs,
|
|
|
.ct_owner = THIS_MODULE,
|
|
|
},
|
|
|
.name = "streaming",
|