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};
53
54struct uvcg_format {
55	struct config_group		group;
56	enum uvcg_format_type		type;
57	unsigned			linked;
58	struct list_head		frames;
59	unsigned			num_frames;
60	__u8				bmaControls[UVCG_STREAMING_CONTROL_SIZE];
61	struct uvcg_color_matching	*color_matching;
62};
63
64struct uvcg_format_ptr {
65	struct uvcg_format	*fmt;
66	struct list_head	entry;
67};
68
69static inline struct uvcg_format *to_uvcg_format(struct config_item *item)
70{
71	return container_of(to_config_group(item), struct uvcg_format, group);
72}
73
74struct uvcg_streaming_header {
75	struct config_item				item;
76	struct uvc_input_header_descriptor		desc;
77	unsigned					linked;
78	struct list_head				formats;
79	unsigned					num_fmt;
80};
81
82static inline struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item)
83{
84	return container_of(item, struct uvcg_streaming_header, item);
85}
86
87struct uvcg_frame_ptr {
88	struct uvcg_frame	*frm;
89	struct list_head	entry;
90};
91
92struct uvcg_frame {
93	struct config_item	item;
94	enum uvcg_format_type	fmt_type;
95	struct {
96		u8	b_length;
97		u8	b_descriptor_type;
98		u8	b_descriptor_subtype;
99		u8	b_frame_index;
100		u8	bm_capabilities;
101		u16	w_width;
102		u16	w_height;
103		u32	dw_min_bit_rate;
104		u32	dw_max_bit_rate;
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;
110};
111
112static inline struct uvcg_frame *to_uvcg_frame(struct config_item *item)
113{
114	return container_of(item, struct uvcg_frame, item);
115}
116
117/* -----------------------------------------------------------------------------
118 * streaming/uncompressed/<NAME>
119 */
120
121struct uvcg_uncompressed {
122	struct uvcg_format		fmt;
123	struct uvc_format_uncompressed	desc;
124};
125
126static inline struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item)
127{
128	return container_of(to_uvcg_format(item), struct uvcg_uncompressed, fmt);
129}
130
131/* -----------------------------------------------------------------------------
132 * streaming/mjpeg/<NAME>
133 */
134
135struct uvcg_mjpeg {
136	struct uvcg_format		fmt;
137	struct uvc_format_mjpeg		desc;
138};
139
140static inline struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item)
141{
142	return container_of(to_uvcg_format(item), struct uvcg_mjpeg, fmt);
143}
144
145/* -----------------------------------------------------------------------------
146 * control/extensions/<NAME>
147 */
148
149struct uvcg_extension_unit_descriptor {
150	u8 bLength;
151	u8 bDescriptorType;
152	u8 bDescriptorSubType;
153	u8 bUnitID;
154	u8 guidExtensionCode[16];
155	u8 bNumControls;
156	u8 bNrInPins;
157	u8 *baSourceID;
158	u8 bControlSize;
159	u8 *bmControls;
160	u8 iExtension;
161} __packed;
162
163struct uvcg_extension {
164	struct config_item item;
165	struct list_head list;
166	u8 string_descriptor_index;
167	struct uvcg_extension_unit_descriptor desc;
168};
169
170static inline struct uvcg_extension *to_uvcg_extension(struct config_item *item)
171{
172	return container_of(item, struct uvcg_extension, item);
173}
174
175int uvcg_attach_configfs(struct f_uvc_opts *opts);
176
177#endif /* UVC_CONFIGFS_H */
178