]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/blame - drivers/staging/media/davinci_vpfe/vpfe_video.h
[media] media: videobuf2: Restructure vb2_buffer
[mirror_ubuntu-focal-kernel.git] / drivers / staging / media / davinci_vpfe / vpfe_video.h
CommitLineData
622897da
MH
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
2d700715 25#include <media/videobuf2-v4l2.h>
622897da
MH
26#include <media/videobuf2-dma-contig.h>
27
28struct 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 */
35struct vpfe_video_operations {
a0ecdf06 36 int (*queue)(struct vpfe_device *vpfe_dev, unsigned long addr);
622897da
MH
37};
38
39enum vpfe_pipeline_stream_state {
40 VPFE_PIPELINE_STREAM_STOPPED = 0,
41 VPFE_PIPELINE_STREAM_CONTINUOUS = 1,
42 VPFE_PIPELINE_STREAM_SINGLESHOT = 2,
43};
44
45enum 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
52struct 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
75struct vpfe_cap_buffer {
2d700715 76 struct vb2_v4l2_buffer vb;
622897da
MH
77 struct list_head list;
78};
79
80struct 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;
622897da
MH
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
d88fe15b 140 * buffer for field separated YCbCr formats
622897da
MH
141 */
142 u32 field_off;
143};
144
145int vpfe_video_is_pipe_ready(struct vpfe_pipeline *pipe);
146void vpfe_video_unregister(struct vpfe_video_device *video);
147int vpfe_video_register(struct vpfe_video_device *video,
148 struct v4l2_device *vdev);
149int vpfe_video_init(struct vpfe_video_device *video, const char *name);
150void vpfe_video_process_buffer_complete(struct vpfe_video_device *video);
151void vpfe_video_schedule_bottom_field(struct vpfe_video_device *video);
152void vpfe_video_schedule_next_buffer(struct vpfe_video_device *video);
153
154#endif /* _DAVINCI_VPFE_VIDEO_H */