File Index
Files and directories
Sign in
FILE

uvc_configfs.h

File preview with syntax highlighting.

linux-6.19.14/drivers/usb/gadget/function/uvc_configfs.h C
  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 */
~/ Read-only file preview.