These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / media / platform / sti / bdisp / bdisp.h
1 /*
2  * Copyright (C) STMicroelectronics SA 2014
3  * Authors: Fabien Dessenne <fabien.dessenne@st.com> for STMicroelectronics.
4  * License terms:  GNU General Public License (GPL), version 2
5  */
6
7 #include <linux/clk.h>
8 #include <linux/ktime.h>
9 #include <linux/platform_device.h>
10 #include <linux/spinlock.h>
11
12 #include <media/v4l2-ctrls.h>
13 #include <media/v4l2-device.h>
14 #include <media/v4l2-mem2mem.h>
15
16 #include <media/videobuf2-dma-contig.h>
17
18 #define BDISP_NAME              "bdisp"
19
20 /*
21  *  Max nb of nodes in node-list:
22  *   - 2 nodes to handle wide 4K pictures
23  *   - 2 nodes to handle two planes (Y & CbCr) */
24 #define MAX_OUTPUT_PLANES       2
25 #define MAX_VERTICAL_STRIDES    2
26 #define MAX_NB_NODE             (MAX_OUTPUT_PLANES * MAX_VERTICAL_STRIDES)
27
28 /* struct bdisp_ctrls - bdisp control set
29  * @hflip:      horizontal flip
30  * @vflip:      vertical flip
31  */
32 struct bdisp_ctrls {
33         struct v4l2_ctrl        *hflip;
34         struct v4l2_ctrl        *vflip;
35 };
36
37 /**
38  * struct bdisp_fmt - driver's internal color format data
39  * @pixelformat:fourcc code for this format
40  * @nb_planes:  number of planes  (ex: [0]=RGB/Y - [1]=Cb/Cr, ...)
41  * @bpp:        bits per pixel (general)
42  * @bpp_plane0: byte per pixel for the 1st plane
43  * @w_align:    width alignment in pixel (multiple of)
44  * @h_align:    height alignment in pixel (multiple of)
45  */
46 struct bdisp_fmt {
47         u32                     pixelformat;
48         u8                      nb_planes;
49         u8                      bpp;
50         u8                      bpp_plane0;
51         u8                      w_align;
52         u8                      h_align;
53 };
54
55 /**
56  * struct bdisp_frame - frame properties
57  *
58  * @width:      frame width (including padding)
59  * @height:     frame height (including padding)
60  * @fmt:        pointer to frame format descriptor
61  * @field:      frame / field type
62  * @bytesperline: stride of the 1st plane
63  * @sizeimage:  image size in bytes
64  * @colorspace: colorspace
65  * @crop:       crop area
66  * @paddr:      image physical addresses per plane ([0]=RGB/Y - [1]=Cb/Cr, ...)
67  */
68 struct bdisp_frame {
69         u32                     width;
70         u32                     height;
71         const struct bdisp_fmt  *fmt;
72         enum v4l2_field         field;
73         u32                     bytesperline;
74         u32                     sizeimage;
75         enum v4l2_colorspace    colorspace;
76         struct v4l2_rect        crop;
77         dma_addr_t              paddr[4];
78 };
79
80 /**
81  * struct bdisp_request - bdisp request
82  *
83  * @src:        source frame properties
84  * @dst:        destination frame properties
85  * @hflip:      horizontal flip
86  * @vflip:      vertical flip
87  * @nb_req:     number of run request
88  */
89 struct bdisp_request {
90         struct bdisp_frame      src;
91         struct bdisp_frame      dst;
92         unsigned int            hflip:1;
93         unsigned int            vflip:1;
94         int                     nb_req;
95 };
96
97 /**
98  * struct bdisp_ctx - device context data
99  *
100  * @src:        source frame properties
101  * @dst:        destination frame properties
102  * @state:      flags to keep track of user configuration
103  * @hflip:      horizontal flip
104  * @vflip:      vertical flip
105  * @bdisp_dev:  the device this context applies to
106  * @node:       node array
107  * @node_paddr: node physical address array
108  * @fh:         v4l2 file handle
109  * @ctrl_handler: v4l2 controls handler
110  * @bdisp_ctrls: bdisp control set
111  * @ctrls_rdy:  true if the control handler is initialized
112  */
113 struct bdisp_ctx {
114         struct bdisp_frame      src;
115         struct bdisp_frame      dst;
116         u32                     state;
117         unsigned int            hflip:1;
118         unsigned int            vflip:1;
119         struct bdisp_dev        *bdisp_dev;
120         struct bdisp_node       *node[MAX_NB_NODE];
121         dma_addr_t              node_paddr[MAX_NB_NODE];
122         struct v4l2_fh          fh;
123         struct v4l2_ctrl_handler ctrl_handler;
124         struct bdisp_ctrls      bdisp_ctrls;
125         bool                    ctrls_rdy;
126 };
127
128 /**
129  * struct bdisp_m2m_device - v4l2 memory-to-memory device data
130  *
131  * @vdev:       video device node for v4l2 m2m mode
132  * @m2m_dev:    v4l2 m2m device data
133  * @ctx:        hardware context data
134  * @refcnt:     reference counter
135  */
136 struct bdisp_m2m_device {
137         struct video_device     *vdev;
138         struct v4l2_m2m_dev     *m2m_dev;
139         struct bdisp_ctx        *ctx;
140         int                     refcnt;
141 };
142
143 /**
144  * struct bdisp_dbg - debug info
145  *
146  * @debugfs_entry: debugfs
147  * @copy_node:     array of last used nodes
148  * @copy_request:  last bdisp request
149  * @hw_start:      start time of last HW request
150  * @last_duration: last HW processing duration in microsecs
151  * @min_duration:  min HW processing duration in microsecs
152  * @max_duration:  max HW processing duration in microsecs
153  * @tot_duration:  total HW processing duration in microsecs
154  */
155 struct bdisp_dbg {
156         struct dentry           *debugfs_entry;
157         struct bdisp_node       *copy_node[MAX_NB_NODE];
158         struct bdisp_request    copy_request;
159         ktime_t                 hw_start;
160         s64                     last_duration;
161         s64                     min_duration;
162         s64                     max_duration;
163         s64                     tot_duration;
164 };
165
166 /**
167  * struct bdisp_dev - abstraction for bdisp entity
168  *
169  * @v4l2_dev:   v4l2 device
170  * @vdev:       video device
171  * @pdev:       platform device
172  * @dev:        device
173  * @lock:       mutex protecting this data structure
174  * @slock:      spinlock protecting this data structure
175  * @id:         device index
176  * @m2m:        memory-to-memory V4L2 device information
177  * @state:      flags used to synchronize m2m and capture mode operation
178  * @alloc_ctx:  videobuf2 memory allocator context
179  * @clock:      IP clock
180  * @regs:       registers
181  * @irq_queue:  interrupt handler waitqueue
182  * @work_queue: workqueue to handle timeouts
183  * @timeout_work: IRQ timeout structure
184  * @dbg:        debug info
185  */
186 struct bdisp_dev {
187         struct v4l2_device      v4l2_dev;
188         struct video_device     vdev;
189         struct platform_device  *pdev;
190         struct device           *dev;
191         spinlock_t              slock;
192         struct mutex            lock;
193         u16                     id;
194         struct bdisp_m2m_device m2m;
195         unsigned long           state;
196         struct vb2_alloc_ctx    *alloc_ctx;
197         struct clk              *clock;
198         void __iomem            *regs;
199         wait_queue_head_t       irq_queue;
200         struct workqueue_struct *work_queue;
201         struct delayed_work     timeout_work;
202         struct bdisp_dbg        dbg;
203 };
204
205 void bdisp_hw_free_nodes(struct bdisp_ctx *ctx);
206 int bdisp_hw_alloc_nodes(struct bdisp_ctx *ctx);
207 void bdisp_hw_free_filters(struct device *dev);
208 int bdisp_hw_alloc_filters(struct device *dev);
209 int bdisp_hw_reset(struct bdisp_dev *bdisp);
210 int bdisp_hw_get_and_clear_irq(struct bdisp_dev *bdisp);
211 int bdisp_hw_update(struct bdisp_ctx *ctx);
212
213 void bdisp_debugfs_remove(struct bdisp_dev *bdisp);
214 int bdisp_debugfs_create(struct bdisp_dev *bdisp);
215 void bdisp_dbg_perf_begin(struct bdisp_dev *bdisp);
216 void bdisp_dbg_perf_end(struct bdisp_dev *bdisp);