1 /* SPDX-License-Identifier: GPL-2.0 */
5 * Configfs support for the uvc function.
7 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
8 * http://www.samsung.com
10 * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com>
12 #ifndef UVC_CONFIGFS_H
13 #define UVC_CONFIGFS_H
15 #include <linux/configfs.h>
19 static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
21 return container_of(to_config_group(item), struct f_uvc_opts,
25 #define UVCG_STREAMING_CONTROL_SIZE 1
27 DECLARE_UVC_HEADER_DESCRIPTOR(1);
29 struct uvcg_control_header {
30 struct config_item item;
31 struct UVC_HEADER_DESCRIPTOR(1) desc;
35 static inline struct uvcg_control_header *to_uvcg_control_header(struct config_item *item)
37 return container_of(item, struct uvcg_control_header, item);
40 struct uvcg_color_matching {
41 struct config_group group;
42 struct uvc_color_matching_descriptor desc;
46 #define to_uvcg_color_matching(group_ptr) \
47 container_of(group_ptr, struct uvcg_color_matching, group)
49 enum uvcg_format_type {
50 UVCG_UNCOMPRESSED = 0,
55 struct config_group group;
56 enum uvcg_format_type type;
58 struct list_head frames;
60 __u8 bmaControls[UVCG_STREAMING_CONTROL_SIZE];
61 struct uvcg_color_matching *color_matching;
64 struct uvcg_format_ptr {
65 struct uvcg_format *fmt;
66 struct list_head entry;
69 static inline struct uvcg_format *to_uvcg_format(struct config_item *item)
71 return container_of(to_config_group(item), struct uvcg_format, group);
74 struct uvcg_streaming_header {
75 struct config_item item;
76 struct uvc_input_header_descriptor desc;
78 struct list_head formats;
82 static inline struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item)
84 return container_of(item, struct uvcg_streaming_header, item);
87 struct uvcg_frame_ptr {
88 struct uvcg_frame *frm;
89 struct list_head entry;
93 struct config_item item;
94 enum uvcg_format_type fmt_type;
98 u8 b_descriptor_subtype;
105 u32 dw_max_video_frame_buffer_size;
106 u32 dw_default_frame_interval;
107 u8 b_frame_interval_type;
108 } __attribute__((packed)) frame;
109 u32 *dw_frame_interval;
112 static inline struct uvcg_frame *to_uvcg_frame(struct config_item *item)
114 return container_of(item, struct uvcg_frame, item);
117 /* -----------------------------------------------------------------------------
118 * streaming/uncompressed/<NAME>
121 struct uvcg_uncompressed {
122 struct uvcg_format fmt;
123 struct uvc_format_uncompressed desc;
126 static inline struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
128 return container_of(to_uvcg_format(item), struct uvcg_uncompressed, fmt);
131 /* -----------------------------------------------------------------------------
132 * streaming/mjpeg/<NAME>
136 struct uvcg_format fmt;
137 struct uvc_format_mjpeg desc;
140 static inline struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
142 return container_of(to_uvcg_format(item), struct uvcg_mjpeg, fmt);
145 /* -----------------------------------------------------------------------------
146 * control/extensions/<NAME>
149 struct uvcg_extension_unit_descriptor {
152 u8 bDescriptorSubType;
154 u8 guidExtensionCode[16];
163 struct uvcg_extension {
164 struct config_item item;
165 struct list_head list;
166 u8 string_descriptor_index;
167 struct uvcg_extension_unit_descriptor desc;
170 static inline struct uvcg_extension *to_uvcg_extension(struct config_item *item)
172 return container_of(item, struct uvcg_extension, item);
175 int uvcg_attach_configfs(struct f_uvc_opts *opts);
177 #endif /* UVC_CONFIGFS_H */