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
19static 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
27DECLARE_UVC_HEADER_DESCRIPTOR(1);
28
29struct uvcg_control_header {
30 struct config_item item;
31 struct UVC_HEADER_DESCRIPTOR(1) desc;
32 unsigned linked;
33};
34
35static 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
40struct 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) \
47container_of(group_ptr, struct uvcg_color_matching, group)
48
49enum uvcg_format_type {
50 UVCG_UNCOMPRESSED = 0,
51 UVCG_MJPEG,
52 UVCG_FRAMEBASED,
53};
54
55struct 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
65struct uvcg_format_ptr {
66 struct uvcg_format *fmt;
67 struct list_head entry;
68};
69
70static 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
75struct uvcg_streaming_header {
76 struct config_item item;
77 unsigned linked;
78 struct list_head formats;
79 unsigned num_fmt;
80
81 /* Must be last --ends in a flexible-array member. */
82 struct uvc_input_header_descriptor desc;
83};
84
85static inline struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item)
86{
87 return container_of(item, struct uvcg_streaming_header, item);
88}
89
90struct uvcg_frame_ptr {
91 struct uvcg_frame *frm;
92 struct list_head entry;
93};
94
95struct 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
116static 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
125struct uvcg_uncompressed {
126 struct uvcg_format fmt;
127 struct uvc_format_uncompressed desc;
128};
129
130static 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
139struct uvcg_mjpeg {
140 struct uvcg_format fmt;
141 struct uvc_format_mjpeg desc;
142};
143
144static 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
153struct uvcg_framebased {
154 struct uvcg_format fmt;
155 struct uvc_format_framebased desc;
156};
157
158static 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
167struct 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
181struct 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
188static inline struct uvcg_extension *to_uvcg_extension(struct config_item *item)
189{
190 return container_of(item, struct uvcg_extension, item);
191}
192
193int uvcg_attach_configfs(struct f_uvc_opts *opts);
194
195#endif /* UVC_CONFIGFS_H */
196

source code of linux/drivers/usb/gadget/function/uvc_configfs.h