From: Paul Elder <paul.el...@ideasonboard.com>

Some attributes of the UVC frame descriptors should be read-only in
configfs, such as bFrameIndex. Add a read-only version of
UVCG_FRAME_ATTR to achieve this.

Signed-off-by: Paul Elder <paul.el...@ideasonboard.com>
---
 drivers/usb/gadget/function/uvc_configfs.c | 24 ++++++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/drivers/usb/gadget/function/uvc_configfs.c 
b/drivers/usb/gadget/function/uvc_configfs.c
index 90de6418209b..0ad6ea57d0b7 100644
--- a/drivers/usb/gadget/function/uvc_configfs.c
+++ b/drivers/usb/gadget/function/uvc_configfs.c
@@ -1067,6 +1067,30 @@ static struct uvcg_frame *to_uvcg_frame(struct 
config_item *item)
        return container_of(item, struct uvcg_frame, item);
 }
 
+#define UVCG_FRAME_ATTR_RO(cname, aname, to_cpu_endian, to_little_endian, 
bits) \
+static ssize_t uvcg_frame_##cname##_show(struct config_item *item, char *page)\
+{                                                                      \
+       struct uvcg_frame *f = to_uvcg_frame(item);                     \
+       struct f_uvc_opts *opts;                                        \
+       struct config_item *opts_item;                                  \
+       struct mutex *su_mutex = &f->item.ci_group->cg_subsys->su_mutex;\
+       int result;                                                     \
+                                                                       \
+       mutex_lock(su_mutex); /* for navigating configfs hierarchy */   \
+                                                                       \
+       opts_item = f->item.ci_parent->ci_parent->ci_parent->ci_parent; \
+       opts = to_f_uvc_opts(opts_item);                                \
+                                                                       \
+       mutex_lock(&opts->lock);                                        \
+       result = sprintf(page, "%d\n", to_cpu_endian(f->frame.cname));  \
+       mutex_unlock(&opts->lock);                                      \
+                                                                       \
+       mutex_unlock(su_mutex);                                         \
+       return result;                                                  \
+}                                                                      \
+                                                                       \
+UVC_ATTR_RO(uvcg_frame_, cname, aname);
+
 #define UVCG_FRAME_ATTR(cname, aname, to_cpu_endian, to_little_endian, bits) \
 static ssize_t uvcg_frame_##cname##_show(struct config_item *item, char *page)\
 {                                                                      \
-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to