uvc_configfs.h (3155B)
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 40enum uvcg_format_type { 41 UVCG_UNCOMPRESSED = 0, 42 UVCG_MJPEG, 43}; 44 45struct 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 54struct uvcg_format_ptr { 55 struct uvcg_format *fmt; 56 struct list_head entry; 57}; 58 59static 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 64struct 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 72static 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 77struct uvcg_frame_ptr { 78 struct uvcg_frame *frm; 79 struct list_head entry; 80}; 81 82struct 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 102static 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 111struct uvcg_uncompressed { 112 struct uvcg_format fmt; 113 struct uvc_format_uncompressed desc; 114}; 115 116static 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 125struct uvcg_mjpeg { 126 struct uvcg_format fmt; 127 struct uvc_format_mjpeg desc; 128}; 129 130static 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 135int uvcg_attach_configfs(struct f_uvc_opts *opts); 136 137#endif /* UVC_CONFIGFS_H */