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 <andrzejtp2010@gmail.com> |
11 | */ |
12 | #ifndef UVC_CONFIGFS_H |
13 | #define UVC_CONFIGFS_H |
14 | |
15 | #include <linux/configfs.h> |
16 | |
17 | #include "u_uvc.h" |
18 | |
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 { |
30 | struct config_item ; |
31 | struct UVC_HEADER_DESCRIPTOR(1) ; |
32 | unsigned ; |
33 | }; |
34 | |
35 | static inline struct 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 | |
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 { |
76 | struct config_item ; |
77 | unsigned ; |
78 | struct list_head ; |
79 | unsigned ; |
80 | |
81 | /* Must be last --ends in a flexible-array member. */ |
82 | struct uvc_input_header_descriptor ; |
83 | }; |
84 | |
85 | static inline struct uvcg_streaming_header *(struct config_item *item) |
86 | { |
87 | return container_of(item, struct uvcg_streaming_header, item); |
88 | } |
89 | |
90 | struct uvcg_frame_ptr { |
91 | struct uvcg_frame *frm; |
92 | struct list_head entry; |
93 | }; |
94 | |
95 | struct uvcg_frame { |
96 | struct config_item item; |
97 | enum uvcg_format_type fmt_type; |
98 | struct { |
99 | u8 b_length; |
100 | u8 b_descriptor_type; |
101 | u8 b_descriptor_subtype; |
102 | u8 b_frame_index; |
103 | u8 bm_capabilities; |
104 | u16 w_width; |
105 | u16 w_height; |
106 | u32 dw_min_bit_rate; |
107 | u32 dw_max_bit_rate; |
108 | u32 dw_max_video_frame_buffer_size; |
109 | u32 dw_default_frame_interval; |
110 | u8 b_frame_interval_type; |
111 | u32 dw_bytes_perline; |
112 | } __attribute__((packed)) frame; |
113 | u32 *dw_frame_interval; |
114 | }; |
115 | |
116 | static inline struct uvcg_frame *to_uvcg_frame(struct config_item *item) |
117 | { |
118 | return container_of(item, struct uvcg_frame, item); |
119 | } |
120 | |
121 | /* ----------------------------------------------------------------------------- |
122 | * streaming/uncompressed/<NAME> |
123 | */ |
124 | |
125 | struct uvcg_uncompressed { |
126 | struct uvcg_format fmt; |
127 | struct uvc_format_uncompressed desc; |
128 | }; |
129 | |
130 | static inline struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item) |
131 | { |
132 | return container_of(to_uvcg_format(item), struct uvcg_uncompressed, fmt); |
133 | } |
134 | |
135 | /* ----------------------------------------------------------------------------- |
136 | * streaming/mjpeg/<NAME> |
137 | */ |
138 | |
139 | struct uvcg_mjpeg { |
140 | struct uvcg_format fmt; |
141 | struct uvc_format_mjpeg desc; |
142 | }; |
143 | |
144 | static inline struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item) |
145 | { |
146 | return container_of(to_uvcg_format(item), struct uvcg_mjpeg, fmt); |
147 | } |
148 | |
149 | /* ----------------------------------------------------------------------------- |
150 | * streaming/framebased/<NAME> |
151 | */ |
152 | |
153 | struct uvcg_framebased { |
154 | struct uvcg_format fmt; |
155 | struct uvc_format_framebased desc; |
156 | }; |
157 | |
158 | static inline struct uvcg_framebased *to_uvcg_framebased(struct config_item *item) |
159 | { |
160 | return container_of(to_uvcg_format(item), struct uvcg_framebased, fmt); |
161 | } |
162 | |
163 | /* ----------------------------------------------------------------------------- |
164 | * control/extensions/<NAME> |
165 | */ |
166 | |
167 | struct uvcg_extension_unit_descriptor { |
168 | u8 bLength; |
169 | u8 bDescriptorType; |
170 | u8 bDescriptorSubType; |
171 | u8 bUnitID; |
172 | u8 guidExtensionCode[16]; |
173 | u8 bNumControls; |
174 | u8 bNrInPins; |
175 | u8 *baSourceID; |
176 | u8 bControlSize; |
177 | u8 *bmControls; |
178 | u8 iExtension; |
179 | } __packed; |
180 | |
181 | struct uvcg_extension { |
182 | struct config_item item; |
183 | struct list_head list; |
184 | u8 string_descriptor_index; |
185 | struct uvcg_extension_unit_descriptor desc; |
186 | }; |
187 | |
188 | static inline struct uvcg_extension *to_uvcg_extension(struct config_item *item) |
189 | { |
190 | return container_of(item, struct uvcg_extension, item); |
191 | } |
192 | |
193 | int uvcg_attach_configfs(struct f_uvc_opts *opts); |
194 | |
195 | #endif /* UVC_CONFIGFS_H */ |
196 | |