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 uvcg_control_header { 30 struct config_item item; 31 struct UVC_HEADER_DESCRIPTOR(1) desc; 32 unsigned linked; 33 }; 34 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 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 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 85 static 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 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