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