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  
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  };
53  
54  struct 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  
64  struct uvcg_format_ptr {
65  	struct uvcg_format	*fmt;
66  	struct list_head	entry;
67  };
68  
to_uvcg_format(struct config_item * item)69  static 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  
74  struct 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  
to_uvcg_streaming_header(struct config_item * item)82  static 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  
87  struct uvcg_frame_ptr {
88  	struct uvcg_frame	*frm;
89  	struct list_head	entry;
90  };
91  
92  struct 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  
to_uvcg_frame(struct config_item * item)112  static 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  
121  struct uvcg_uncompressed {
122  	struct uvcg_format		fmt;
123  	struct uvc_format_uncompressed	desc;
124  };
125  
to_uvcg_uncompressed(struct config_item * item)126  static 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  
135  struct uvcg_mjpeg {
136  	struct uvcg_format		fmt;
137  	struct uvc_format_mjpeg		desc;
138  };
139  
to_uvcg_mjpeg(struct config_item * item)140  static 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  
149  struct 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  
163  struct 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  
to_uvcg_extension(struct config_item * item)170  static inline struct uvcg_extension *to_uvcg_extension(struct config_item *item)
171  {
172  	return container_of(item, struct uvcg_extension, item);
173  }
174  
175  int uvcg_attach_configfs(struct f_uvc_opts *opts);
176  
177  #endif /* UVC_CONFIGFS_H */
178