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-dma-contig.h>
26 
27 struct vpfe_device;
28 
29 /*
30  * struct vpfe_video_operations - VPFE video operations
31  * @queue:	Resume streaming when a buffer is queued. Called on VIDIOC_QBUF
32  *		if there was no buffer previously queued.
33  */
34 struct vpfe_video_operations {
35 	int (*queue)(struct vpfe_device *vpfe_dev, unsigned long addr);
36 };
37 
38 enum vpfe_pipeline_stream_state {
39 	VPFE_PIPELINE_STREAM_STOPPED = 0,
40 	VPFE_PIPELINE_STREAM_CONTINUOUS = 1,
41 	VPFE_PIPELINE_STREAM_SINGLESHOT = 2,
42 };
43 
44 enum vpfe_video_state {
45 	/* indicates that buffer is not queued */
46 	VPFE_VIDEO_BUFFER_NOT_QUEUED = 0,
47 	/* indicates that buffer is queued */
48 	VPFE_VIDEO_BUFFER_QUEUED = 1,
49 };
50 
51 struct vpfe_pipeline {
52 	/* media pipeline */
53 	struct media_pipeline		*pipe;
54 	/* state of the pipeline, continuous,
55 	 * single-shot or stopped
56 	 */
57 	enum vpfe_pipeline_stream_state	state;
58 	/* number of active input video entities */
59 	unsigned int			input_num;
60 	/* number of active output video entities */
61 	unsigned int			output_num;
62 	/* input video nodes in case of single-shot mode */
63 	struct vpfe_video_device	*inputs[10];
64 	/* capturing video nodes */
65 	struct vpfe_video_device	*outputs[10];
66 };
67 
68 #define to_vpfe_pipeline(__e) \
69 	container_of((__e)->pipe, struct vpfe_pipeline, pipe)
70 
71 #define to_vpfe_video(vdev) \
72 	container_of(vdev, struct vpfe_video_device, video_dev)
73 
74 struct vpfe_cap_buffer {
75 	struct vb2_buffer vb;
76 	struct list_head list;
77 };
78 
79 struct vpfe_video_device {
80 	/* vpfe device */
81 	struct vpfe_device			*vpfe_dev;
82 	/* video dev */
83 	struct video_device			video_dev;
84 	/* media pad of video entity */
85 	struct media_pad			pad;
86 	/* video operations supported by video device */
87 	const struct vpfe_video_operations	*ops;
88 	/* type of the video buffers used by user */
89 	enum v4l2_buf_type			type;
90 	/* Indicates id of the field which is being captured */
91 	u32					field_id;
92 	/* pipeline for which video device is part of */
93 	struct vpfe_pipeline			pipe;
94 	/* Indicates whether streaming started */
95 	u8					started;
96 	/* Indicates state of the stream */
97 	unsigned int				state;
98 	/* current input at the sub device */
99 	int					current_input;
100 	/*
101 	 * This field keeps track of type of buffer exchange mechanism
102 	 * user has selected
103 	 */
104 	enum v4l2_memory			memory;
105 	/* number of open instances of the channel */
106 	u32					usrs;
107 	/* flag to indicate whether decoder is initialized */
108 	u8					initialized;
109 	/* skip frame count */
110 	u8					skip_frame_count;
111 	/* skip frame count init value */
112 	u8					skip_frame_count_init;
113 	/* time per frame for skipping */
114 	struct v4l2_fract			timeperframe;
115 	/* ptr to currently selected sub device */
116 	struct vpfe_ext_subdev_info		*current_ext_subdev;
117 	/* Pointer pointing to current vpfe_cap_buffer */
118 	struct vpfe_cap_buffer			*cur_frm;
119 	/* Pointer pointing to next vpfe_cap_buffer */
120 	struct vpfe_cap_buffer			*next_frm;
121 	/* Used to store pixel format */
122 	struct v4l2_format			fmt;
123 	struct vb2_queue			buffer_queue;
124 	/* allocator-specific contexts for each plane */
125 	struct vb2_alloc_ctx *alloc_ctx;
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 access this structure */
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