Merge tag '4.3-rc-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6
[linux-2.6-microblaze.git] / drivers / staging / media / imx / imx-media.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * V4L2 Media Controller Driver for Freescale i.MX5/6 SOC
4  *
5  * Copyright (c) 2016 Mentor Graphics Inc.
6  */
7 #ifndef _IMX_MEDIA_H
8 #define _IMX_MEDIA_H
9
10 #include <linux/platform_device.h>
11 #include <media/v4l2-ctrls.h>
12 #include <media/v4l2-device.h>
13 #include <media/v4l2-fwnode.h>
14 #include <media/v4l2-subdev.h>
15 #include <media/videobuf2-dma-contig.h>
16 #include <video/imx-ipu-v3.h>
17
18 /*
19  * Enumeration of the IPU internal sub-devices
20  */
21 enum {
22         IPU_CSI0 = 0,
23         IPU_CSI1,
24         IPU_VDIC,
25         IPU_IC_PRP,
26         IPU_IC_PRPENC,
27         IPU_IC_PRPVF,
28         NUM_IPU_SUBDEVS,
29 };
30
31 /*
32  * Pad definitions for the subdevs with multiple source or
33  * sink pads
34  */
35
36 /* ipu_csi */
37 enum {
38         CSI_SINK_PAD = 0,
39         CSI_SRC_PAD_DIRECT,
40         CSI_SRC_PAD_IDMAC,
41         CSI_NUM_PADS,
42 };
43
44 /* ipu_vdic */
45 enum {
46         VDIC_SINK_PAD_DIRECT = 0,
47         VDIC_SINK_PAD_IDMAC,
48         VDIC_SRC_PAD_DIRECT,
49         VDIC_NUM_PADS,
50 };
51
52 /* ipu_ic_prp */
53 enum {
54         PRP_SINK_PAD = 0,
55         PRP_SRC_PAD_PRPENC,
56         PRP_SRC_PAD_PRPVF,
57         PRP_NUM_PADS,
58 };
59
60 /* ipu_ic_prpencvf */
61 enum {
62         PRPENCVF_SINK_PAD = 0,
63         PRPENCVF_SRC_PAD,
64         PRPENCVF_NUM_PADS,
65 };
66
67 /* How long to wait for EOF interrupts in the buffer-capture subdevs */
68 #define IMX_MEDIA_EOF_TIMEOUT       1000
69
70 struct imx_media_pixfmt {
71         u32     fourcc;
72         u32     codes[4];
73         int     bpp;     /* total bpp */
74         /* cycles per pixel for generic (bayer) formats for the parallel bus */
75         int     cycles;
76         enum ipu_color_space cs;
77         bool    planar;  /* is a planar format */
78         bool    bayer;   /* is a raw bayer format */
79         bool    ipufmt;  /* is one of the IPU internal formats */
80 };
81
82 struct imx_media_buffer {
83         struct vb2_v4l2_buffer vbuf; /* v4l buffer must be first */
84         struct list_head  list;
85 };
86
87 struct imx_media_video_dev {
88         struct video_device *vfd;
89
90         /* the user format */
91         struct v4l2_format fmt;
92         /* the compose rectangle */
93         struct v4l2_rect compose;
94         const struct imx_media_pixfmt *cc;
95
96         /* links this vdev to master list */
97         struct list_head list;
98 };
99
100 static inline struct imx_media_buffer *to_imx_media_vb(struct vb2_buffer *vb)
101 {
102         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
103
104         return container_of(vbuf, struct imx_media_buffer, vbuf);
105 }
106
107 /*
108  * to support control inheritance to video devices, this
109  * retrieves a pad's list_head of video devices that can
110  * be reached from the pad. Note that only the lists in
111  * source pads get populated, sink pads have empty lists.
112  */
113 static inline struct list_head *
114 to_pad_vdev_list(struct v4l2_subdev *sd, int pad_index)
115 {
116         struct list_head *vdev_list = sd->host_priv;
117
118         return vdev_list ? &vdev_list[pad_index] : NULL;
119 }
120
121 /* an entry in a pad's video device list */
122 struct imx_media_pad_vdev {
123         struct imx_media_video_dev *vdev;
124         struct list_head list;
125 };
126
127 struct imx_media_dev {
128         struct media_device md;
129         struct v4l2_device  v4l2_dev;
130
131         /* the pipeline object */
132         struct media_pipeline pipe;
133
134         struct mutex mutex; /* protect elements below */
135
136         /* master video device list */
137         struct list_head vdev_list;
138
139         /* for async subdev registration */
140         struct v4l2_async_notifier notifier;
141
142         /* the IPU internal subdev's registered synchronously */
143         struct v4l2_subdev *sync_sd[2][NUM_IPU_SUBDEVS];
144 };
145
146 enum codespace_sel {
147         CS_SEL_YUV = 0,
148         CS_SEL_RGB,
149         CS_SEL_ANY,
150 };
151
152 /* imx-media-utils.c */
153 const struct imx_media_pixfmt *
154 imx_media_find_format(u32 fourcc, enum codespace_sel cs_sel, bool allow_bayer);
155 int imx_media_enum_format(u32 *fourcc, u32 index, enum codespace_sel cs_sel);
156 const struct imx_media_pixfmt *
157 imx_media_find_mbus_format(u32 code, enum codespace_sel cs_sel,
158                            bool allow_bayer);
159 int imx_media_enum_mbus_format(u32 *code, u32 index, enum codespace_sel cs_sel,
160                                bool allow_bayer);
161 const struct imx_media_pixfmt *
162 imx_media_find_ipu_format(u32 code, enum codespace_sel cs_sel);
163 int imx_media_enum_ipu_format(u32 *code, u32 index, enum codespace_sel cs_sel);
164 int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
165                             u32 width, u32 height, u32 code, u32 field,
166                             const struct imx_media_pixfmt **cc);
167 int imx_media_init_cfg(struct v4l2_subdev *sd,
168                        struct v4l2_subdev_pad_config *cfg);
169 void imx_media_try_colorimetry(struct v4l2_mbus_framefmt *tryfmt,
170                                bool ic_route);
171 int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
172                                   struct v4l2_mbus_framefmt *mbus,
173                                   const struct imx_media_pixfmt *cc);
174 int imx_media_mbus_fmt_to_ipu_image(struct ipu_image *image,
175                                     struct v4l2_mbus_framefmt *mbus);
176 int imx_media_ipu_image_to_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
177                                     struct ipu_image *image);
178 void imx_media_grp_id_to_sd_name(char *sd_name, int sz,
179                                  u32 grp_id, int ipu_id);
180 struct v4l2_subdev *
181 imx_media_find_subdev_by_fwnode(struct imx_media_dev *imxmd,
182                                 struct fwnode_handle *fwnode);
183 struct v4l2_subdev *
184 imx_media_find_subdev_by_devname(struct imx_media_dev *imxmd,
185                                  const char *devname);
186 void imx_media_add_video_device(struct imx_media_dev *imxmd,
187                                 struct imx_media_video_dev *vdev);
188 int imx_media_pipeline_csi2_channel(struct media_entity *start_entity);
189 struct media_pad *
190 imx_media_pipeline_pad(struct media_entity *start_entity, u32 grp_id,
191                        enum v4l2_buf_type buftype, bool upstream);
192 struct v4l2_subdev *
193 imx_media_pipeline_subdev(struct media_entity *start_entity, u32 grp_id,
194                           bool upstream);
195 struct video_device *
196 imx_media_pipeline_video_device(struct media_entity *start_entity,
197                                 enum v4l2_buf_type buftype, bool upstream);
198
199 struct imx_media_dma_buf {
200         void          *virt;
201         dma_addr_t     phys;
202         unsigned long  len;
203 };
204
205 void imx_media_free_dma_buf(struct device *dev,
206                             struct imx_media_dma_buf *buf);
207 int imx_media_alloc_dma_buf(struct device *dev,
208                             struct imx_media_dma_buf *buf,
209                             int size);
210
211 int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd,
212                                   struct media_entity *entity,
213                                   bool on);
214
215 /* imx-media-dev-common.c */
216 int imx_media_probe_complete(struct v4l2_async_notifier *notifier);
217 struct imx_media_dev *imx_media_dev_init(struct device *dev,
218                                          const struct media_device_ops *ops);
219 int imx_media_dev_notifier_register(struct imx_media_dev *imxmd,
220                             const struct v4l2_async_notifier_operations *ops);
221
222 /* imx-media-fim.c */
223 struct imx_media_fim;
224 void imx_media_fim_eof_monitor(struct imx_media_fim *fim, ktime_t timestamp);
225 int imx_media_fim_set_stream(struct imx_media_fim *fim,
226                              const struct v4l2_fract *frame_interval,
227                              bool on);
228 int imx_media_fim_add_controls(struct imx_media_fim *fim);
229 struct imx_media_fim *imx_media_fim_init(struct v4l2_subdev *sd);
230 void imx_media_fim_free(struct imx_media_fim *fim);
231
232 /* imx-media-internal-sd.c */
233 int imx_media_register_ipu_internal_subdevs(struct imx_media_dev *imxmd,
234                                             struct v4l2_subdev *csi);
235 void imx_media_unregister_ipu_internal_subdevs(struct imx_media_dev *imxmd);
236
237 /* imx-media-of.c */
238 int imx_media_add_of_subdevs(struct imx_media_dev *dev,
239                              struct device_node *np);
240 int imx_media_create_of_links(struct imx_media_dev *imxmd,
241                               struct v4l2_subdev *sd);
242 int imx_media_create_csi_of_links(struct imx_media_dev *imxmd,
243                                   struct v4l2_subdev *csi);
244 int imx_media_of_add_csi(struct imx_media_dev *imxmd,
245                          struct device_node *csi_np);
246
247 /* imx-media-vdic.c */
248 struct v4l2_subdev *imx_media_vdic_register(struct v4l2_device *v4l2_dev,
249                                             struct device *ipu_dev,
250                                             struct ipu_soc *ipu,
251                                             u32 grp_id);
252 int imx_media_vdic_unregister(struct v4l2_subdev *sd);
253
254 /* imx-ic-common.c */
255 struct v4l2_subdev *imx_media_ic_register(struct v4l2_device *v4l2_dev,
256                                           struct device *ipu_dev,
257                                           struct ipu_soc *ipu,
258                                           u32 grp_id);
259 int imx_media_ic_unregister(struct v4l2_subdev *sd);
260
261 /* imx-media-capture.c */
262 struct imx_media_video_dev *
263 imx_media_capture_device_init(struct device *dev, struct v4l2_subdev *src_sd,
264                               int pad);
265 void imx_media_capture_device_remove(struct imx_media_video_dev *vdev);
266 int imx_media_capture_device_register(struct imx_media_video_dev *vdev);
267 void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev);
268 struct imx_media_buffer *
269 imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev);
270 void imx_media_capture_device_error(struct imx_media_video_dev *vdev);
271
272 /* subdev group ids */
273 #define IMX_MEDIA_GRP_ID_CSI2          BIT(8)
274 #define IMX_MEDIA_GRP_ID_CSI           BIT(9)
275 #define IMX_MEDIA_GRP_ID_IPU_CSI_BIT   10
276 #define IMX_MEDIA_GRP_ID_IPU_CSI       (0x3 << IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
277 #define IMX_MEDIA_GRP_ID_IPU_CSI0      BIT(IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
278 #define IMX_MEDIA_GRP_ID_IPU_CSI1      (2 << IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
279 #define IMX_MEDIA_GRP_ID_IPU_VDIC      BIT(12)
280 #define IMX_MEDIA_GRP_ID_IPU_IC_PRP    BIT(13)
281 #define IMX_MEDIA_GRP_ID_IPU_IC_PRPENC BIT(14)
282 #define IMX_MEDIA_GRP_ID_IPU_IC_PRPVF  BIT(15)
283
284 #endif