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 struct media_graph graph; 56 /* state of the pipeline, continuous, 57 * single-shot or stopped 58 */ 59 enum vpfe_pipeline_stream_state state; 60 /* number of active input video entities */ 61 unsigned int input_num; 62 /* number of active output video entities */ 63 unsigned int output_num; 64 /* input video nodes in case of single-shot mode */ 65 struct vpfe_video_device *inputs[10]; 66 /* capturing video nodes */ 67 struct vpfe_video_device *outputs[10]; 68 }; 69 70 #define to_vpfe_pipeline(__e) \ 71 container_of((__e)->pipe, struct vpfe_pipeline, pipe) 72 73 #define to_vpfe_video(vdev) \ 74 container_of(vdev, struct vpfe_video_device, video_dev) 75 76 struct vpfe_cap_buffer { 77 struct vb2_v4l2_buffer vb; 78 struct list_head list; 79 }; 80 81 struct vpfe_video_device { 82 /* vpfe device */ 83 struct vpfe_device *vpfe_dev; 84 /* video dev */ 85 struct video_device video_dev; 86 /* media pad of video entity */ 87 struct media_pad pad; 88 /* video operations supported by video device */ 89 const struct vpfe_video_operations *ops; 90 /* type of the video buffers used by user */ 91 enum v4l2_buf_type type; 92 /* Indicates id of the field which is being captured */ 93 u32 field_id; 94 /* pipeline for which video device is part of */ 95 struct vpfe_pipeline pipe; 96 /* Indicates whether streaming started */ 97 u8 started; 98 /* Indicates state of the stream */ 99 unsigned int state; 100 /* current input at the sub device */ 101 int current_input; 102 /* 103 * This field keeps track of type of buffer exchange mechanism 104 * user has selected 105 */ 106 enum v4l2_memory memory; 107 /* number of open instances of the channel */ 108 u32 usrs; 109 /* flag to indicate whether decoder is initialized */ 110 u8 initialized; 111 /* skip frame count */ 112 u8 skip_frame_count; 113 /* skip frame count init value */ 114 u8 skip_frame_count_init; 115 /* time per frame for skipping */ 116 struct v4l2_fract timeperframe; 117 /* ptr to currently selected sub device */ 118 struct vpfe_ext_subdev_info *current_ext_subdev; 119 /* Pointer pointing to current vpfe_cap_buffer */ 120 struct vpfe_cap_buffer *cur_frm; 121 /* Pointer pointing to next vpfe_cap_buffer */ 122 struct vpfe_cap_buffer *next_frm; 123 /* Used to store pixel format */ 124 struct v4l2_format fmt; 125 struct vb2_queue buffer_queue; 126 /* Queue of filled frames */ 127 struct list_head dma_queue; 128 spinlock_t irqlock; 129 /* IRQ lock for DMA queue */ 130 spinlock_t dma_queue_lock; 131 /* lock used to serialize all video4linux ioctls */ 132 struct mutex lock; 133 /* number of users performing IO */ 134 u32 io_usrs; 135 /* Currently selected or default standard */ 136 v4l2_std_id stdid; 137 /* 138 * offset where second field starts from the starting of the 139 * buffer for field separated YCbCr formats 140 */ 141 u32 field_off; 142 }; 143 144 int vpfe_video_is_pipe_ready(struct vpfe_pipeline *pipe); 145 void vpfe_video_unregister(struct vpfe_video_device *video); 146 int vpfe_video_register(struct vpfe_video_device *video, 147 struct v4l2_device *vdev); 148 int vpfe_video_init(struct vpfe_video_device *video, const char *name); 149 void vpfe_video_process_buffer_complete(struct vpfe_video_device *video); 150 void vpfe_video_schedule_bottom_field(struct vpfe_video_device *video); 151 void vpfe_video_schedule_next_buffer(struct vpfe_video_device *video); 152 153 #endif /* _DAVINCI_VPFE_VIDEO_H */ 154