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 enum uvcg_format_type { 41 UVCG_UNCOMPRESSED = 0, 42 UVCG_MJPEG, 43 }; 44 45 struct uvcg_format { 46 struct config_group group; 47 enum uvcg_format_type type; 48 unsigned linked; 49 struct list_head frames; 50 unsigned num_frames; 51 __u8 bmaControls[UVCG_STREAMING_CONTROL_SIZE]; 52 }; 53 54 struct uvcg_format_ptr { 55 struct uvcg_format *fmt; 56 struct list_head entry; 57 }; 58 59 static inline struct uvcg_format *to_uvcg_format(struct config_item *item) 60 { 61 return container_of(to_config_group(item), struct uvcg_format, group); 62 } 63 64 struct uvcg_streaming_header { 65 struct config_item item; 66 struct uvc_input_header_descriptor desc; 67 unsigned linked; 68 struct list_head formats; 69 unsigned num_fmt; 70 }; 71 72 static inline struct uvcg_streaming_header *to_uvcg_streaming_header(struct config_item *item) 73 { 74 return container_of(item, struct uvcg_streaming_header, item); 75 } 76 77 struct uvcg_frame_ptr { 78 struct uvcg_frame *frm; 79 struct list_head entry; 80 }; 81 82 struct uvcg_frame { 83 struct config_item item; 84 enum uvcg_format_type fmt_type; 85 struct { 86 u8 b_length; 87 u8 b_descriptor_type; 88 u8 b_descriptor_subtype; 89 u8 b_frame_index; 90 u8 bm_capabilities; 91 u16 w_width; 92 u16 w_height; 93 u32 dw_min_bit_rate; 94 u32 dw_max_bit_rate; 95 u32 dw_max_video_frame_buffer_size; 96 u32 dw_default_frame_interval; 97 u8 b_frame_interval_type; 98 } __attribute__((packed)) frame; 99 u32 *dw_frame_interval; 100 }; 101 102 static inline struct uvcg_frame *to_uvcg_frame(struct config_item *item) 103 { 104 return container_of(item, struct uvcg_frame, item); 105 } 106 107 /* ----------------------------------------------------------------------------- 108 * streaming/uncompressed/<NAME> 109 */ 110 111 struct uvcg_uncompressed { 112 struct uvcg_format fmt; 113 struct uvc_format_uncompressed desc; 114 }; 115 116 static inline struct uvcg_uncompressed *to_uvcg_uncompressed(struct config_item *item) 117 { 118 return container_of(to_uvcg_format(item), struct uvcg_uncompressed, fmt); 119 } 120 121 /* ----------------------------------------------------------------------------- 122 * streaming/mjpeg/<NAME> 123 */ 124 125 struct uvcg_mjpeg { 126 struct uvcg_format fmt; 127 struct uvc_format_mjpeg desc; 128 }; 129 130 static inline struct uvcg_mjpeg *to_uvcg_mjpeg(struct config_item *item) 131 { 132 return container_of(to_uvcg_format(item), struct uvcg_mjpeg, fmt); 133 } 134 135 int uvcg_attach_configfs(struct f_uvc_opts *opts); 136 137 #endif /* UVC_CONFIGFS_H */ 138