1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * uvc_configfs.h
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 <[email protected]>
11 */
12 #ifndef UVC_CONFIGFS_H
13 #define UVC_CONFIGFS_H
14
15 #include <linux/configfs.h>
16
17 #include "u_uvc.h"
18
to_f_uvc_opts(struct config_item * item)19 static inline struct f_uvc_opts *to_f_uvc_opts(struct config_item *item)
20 {
21 return container_of(to_config_group(item), struct f_uvc_opts,
22 func_inst.group);
23 }
24
25 #define UVCG_STREAMING_CONTROL_SIZE 1
26
27 DECLARE_UVC_HEADER_DESCRIPTOR(1);
28
29 struct uvcg_control_header {
30 struct config_item item;
31 struct UVC_HEADER_DESCRIPTOR(1) desc;
32 unsigned linked;
33 };
34
to_uvcg_control_header(struct config_item * item)35 static inline struct uvcg_control_header *to_uvcg_control_header(struct config_item *item)
36 {
37 return container_of(item, struct uvcg_control_header, item);
38 }
39
40 struct uvcg_color_matching {
41 struct config_group group;
42 struct uvc_color_matching_descriptor desc;
43 unsigned int refcnt;
44 };
45
46 #define to_uvcg_color_matching(group_ptr) \
47 container_of(group_ptr, struct uvcg_color_matching, group)
48
49 enum uvcg_format_type {
50 UVCG_UNCOMPRESSED = 0,
51 UVCG_MJPEG,
52 UVCG_FRAMEBASED,
53 };
54
55 struct uvcg_format {
56 struct config_group group;
57 enum uvcg_format_type type;
58 unsigned linked;
59 struct list_head frames;
60 unsigned num_frames;
61 __u8 bmaControls[UVCG_STREAMING_CONTROL_SIZE];
62 struct uvcg_color_matching *color_matching;
63 };
64
65 struct uvcg_format_ptr {
66 struct uvcg_format *fmt;
67 struct list_head entry;
68 };
69
to_uvcg_format(struct config_item * item)70 static inline struct uvcg_format *to_uvcg_format(struct config_item *item)
71 {
72 return container_of(to_config_group(item), struct uvcg_format, group);
73 }
74
75 struct uvcg_streaming_header {
76 struct config_item item;
77 struct uvc_input_header_descriptor desc;
78 unsigned linked;
79 struct list_head formats;
80 unsigned num_fmt;
81 };
82
to_uvcg_streaming_header(struct config_item * item)83 static inline struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item)
84 {
85 return container_of(item, struct uvcg_streaming_header, item);
86 }
87
88 struct uvcg_frame_ptr {
89 struct uvcg_frame *frm;
90 struct list_head entry;
91 };
92
93 struct uvcg_frame {
94 struct config_item item;
95 enum uvcg_format_type fmt_type;
96 struct {
97 u8 b_length;
98 u8 b_descriptor_type;
99 u8 b_descriptor_subtype;
100 u8 b_frame_index;
101 u8 bm_capabilities;
102 u16 w_width;
103 u16 w_height;
104 u32 dw_min_bit_rate;
105 u32 dw_max_bit_rate;
106 u32 dw_max_video_frame_buffer_size;
107 u32 dw_default_frame_interval;
108 u8 b_frame_interval_type;
109 u32 dw_bytes_perline;
110 } __attribute__((packed)) frame;
111 u32 *dw_frame_interval;
112 };
113
to_uvcg_frame(struct config_item * item)114 static inline struct uvcg_frame *to_uvcg_frame(struct config_item *item)
115 {
116 return container_of(item, struct uvcg_frame, item);
117 }
118
119 /* -----------------------------------------------------------------------------
120 * streaming/uncompressed/<NAME>
121 */
122
123 struct uvcg_uncompressed {
124 struct uvcg_format fmt;
125 struct uvc_format_uncompressed desc;
126 };
127
to_uvcg_uncompressed(struct config_item * item)128 static inline struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
129 {
130 return container_of(to_uvcg_format(item), struct uvcg_uncompressed, fmt);
131 }
132
133 /* -----------------------------------------------------------------------------
134 * streaming/mjpeg/<NAME>
135 */
136
137 struct uvcg_mjpeg {
138 struct uvcg_format fmt;
139 struct uvc_format_mjpeg desc;
140 };
141
to_uvcg_mjpeg(struct config_item * item)142 static inline struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
143 {
144 return container_of(to_uvcg_format(item), struct uvcg_mjpeg, fmt);
145 }
146
147 /* -----------------------------------------------------------------------------
148 * streaming/framebased/<NAME>
149 */
150
151 struct uvcg_framebased {
152 struct uvcg_format fmt;
153 struct uvc_format_framebased desc;
154 };
155
to_uvcg_framebased(struct config_item * item)156 static inline struct uvcg_framebased *to_uvcg_framebased(struct config_item *item)
157 {
158 return container_of(to_uvcg_format(item), struct uvcg_framebased, fmt);
159 }
160
161 /* -----------------------------------------------------------------------------
162 * control/extensions/<NAME>
163 */
164
165 struct uvcg_extension_unit_descriptor {
166 u8 bLength;
167 u8 bDescriptorType;
168 u8 bDescriptorSubType;
169 u8 bUnitID;
170 u8 guidExtensionCode[16];
171 u8 bNumControls;
172 u8 bNrInPins;
173 u8 *baSourceID;
174 u8 bControlSize;
175 u8 *bmControls;
176 u8 iExtension;
177 } __packed;
178
179 struct uvcg_extension {
180 struct config_item item;
181 struct list_head list;
182 u8 string_descriptor_index;
183 struct uvcg_extension_unit_descriptor desc;
184 };
185
to_uvcg_extension(struct config_item * item)186 static inline struct uvcg_extension *to_uvcg_extension(struct config_item *item)
187 {
188 return container_of(item, struct uvcg_extension, item);
189 }
190
191 int uvcg_attach_configfs(struct f_uvc_opts *opts);
192
193 #endif /* UVC_CONFIGFS_H */
194