1 /* 2 * Copyright (C) 2012 Texas Instruments Inc 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License as 6 * published by the Free Software Foundation version 2. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program; if not, write to the Free Software 15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 16 * 17 * Contributors: 18 * Manjunath Hadli <manjunath.hadli@ti.com> 19 * Prabhakar Lad <prabhakar.lad@ti.com> 20 */ 21 22 #ifndef _DAVINCI_VPFE_VIDEO_H 23 #define _DAVINCI_VPFE_VIDEO_H 24 25 #include <media/videobuf2-v4l2.h> 26 #include <media/videobuf2-dma-contig.h> 27 28 struct vpfe_device; 29 30 /* 31 * struct vpfe_video_operations - VPFE video operations 32 * @queue: Resume streaming when a buffer is queued. Called on VIDIOC_QBUF 33 * if there was no buffer previously queued. 34 */ 35 struct vpfe_video_operations { 36 int (*queue)(struct vpfe_device *vpfe_dev, unsigned long addr); 37 }; 38 39 enum vpfe_pipeline_stream_state { 40 VPFE_PIPELINE_STREAM_STOPPED = 0, 41 VPFE_PIPELINE_STREAM_CONTINUOUS = 1, 42 VPFE_PIPELINE_STREAM_SINGLESHOT = 2, 43 }; 44 45 enum vpfe_video_state { 46 /* indicates that buffer is not queued */ 47 VPFE_VIDEO_BUFFER_NOT_QUEUED = 0, 48 /* indicates that buffer is queued */ 49 VPFE_VIDEO_BUFFER_QUEUED = 1, 50 }; 51 52 struct vpfe_pipeline { 53 /* media pipeline */ 54 struct media_pipeline *pipe; 55 /* state of the pipeline, continuous, 56 * single-shot or stopped 57 */ 58 enum vpfe_pipeline_stream_state state; 59 /* number of active input video entities */ 60 unsigned int input_num; 61 /* number of active output video entities */ 62 unsigned int output_num; 63 /* input video nodes in case of single-shot mode */ 64 struct vpfe_video_device *inputs[10]; 65 /* capturing video nodes */ 66 struct vpfe_video_device *outputs[10]; 67 }; 68 69 #define to_vpfe_pipeline(__e) \ 70 container_of((__e)->pipe, struct vpfe_pipeline, pipe) 71 72 #define to_vpfe_video(vdev) \ 73 container_of(vdev, struct vpfe_video_device, video_dev) 74 75 struct vpfe_cap_buffer { 76 struct vb2_v4l2_buffer vb; 77 struct list_head list; 78 }; 79 80 struct vpfe_video_device { 81 /* vpfe device */ 82 struct vpfe_device *vpfe_dev; 83 /* video dev */ 84 struct video_device video_dev; 85 /* media pad of video entity */ 86 struct media_pad pad; 87 /* video operations supported by video device */ 88 const struct vpfe_video_operations *ops; 89 /* type of the video buffers used by user */ 90 enum v4l2_buf_type type; 91 /* Indicates id of the field which is being captured */ 92 u32 field_id; 93 /* pipeline for which video device is part of */ 94 struct vpfe_pipeline pipe; 95 /* Indicates whether streaming started */ 96 u8 started; 97 /* Indicates state of the stream */ 98 unsigned int state; 99 /* current input at the sub device */ 100 int current_input; 101 /* 102 * This field keeps track of type of buffer exchange mechanism 103 * user has selected 104 */ 105 enum v4l2_memory memory; 106 /* number of open instances of the channel */ 107 u32 usrs; 108 /* flag to indicate whether decoder is initialized */ 109 u8 initialized; 110 /* skip frame count */ 111 u8 skip_frame_count; 112 /* skip frame count init value */ 113 u8 skip_frame_count_init; 114 /* time per frame for skipping */ 115 struct v4l2_fract timeperframe; 116 /* ptr to currently selected sub device */ 117 struct vpfe_ext_subdev_info *current_ext_subdev; 118 /* Pointer pointing to current vpfe_cap_buffer */ 119 struct vpfe_cap_buffer *cur_frm; 120 /* Pointer pointing to next vpfe_cap_buffer */ 121 struct vpfe_cap_buffer *next_frm; 122 /* Used to store pixel format */ 123 struct v4l2_format fmt; 124 struct vb2_queue buffer_queue; 125 /* allocator-specific contexts for each plane */ 126 struct vb2_alloc_ctx *alloc_ctx; 127 /* Queue of filled frames */ 128 struct list_head dma_queue; 129 spinlock_t irqlock; 130 /* IRQ lock for DMA queue */ 131 spinlock_t dma_queue_lock; 132 /* lock used to access this structure */ 133 struct mutex lock; 134 /* number of users performing IO */ 135 u32 io_usrs; 136 /* Currently selected or default standard */ 137 v4l2_std_id stdid; 138 /* 139 * offset where second field starts from the starting of the 140 * buffer for field separated YCbCr formats 141 */ 142 u32 field_off; 143 }; 144 145 int vpfe_video_is_pipe_ready(struct vpfe_pipeline *pipe); 146 void vpfe_video_unregister(struct vpfe_video_device *video); 147 int vpfe_video_register(struct vpfe_video_device *video, 148 struct v4l2_device *vdev); 149 int vpfe_video_init(struct vpfe_video_device *video, const char *name); 150 void vpfe_video_process_buffer_complete(struct vpfe_video_device *video); 151 void vpfe_video_schedule_bottom_field(struct vpfe_video_device *video); 152 void vpfe_video_schedule_next_buffer(struct vpfe_video_device *video); 153 154 #endif /* _DAVINCI_VPFE_VIDEO_H */ 155