1
2
3
4
5
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#define IMX_MEDIA_DEF_PIX_WIDTH 640
19#define IMX_MEDIA_DEF_PIX_HEIGHT 480
20
21
22
23
24enum {
25 IPU_CSI0 = 0,
26 IPU_CSI1,
27 IPU_VDIC,
28 IPU_IC_PRP,
29 IPU_IC_PRPENC,
30 IPU_IC_PRPVF,
31 NUM_IPU_SUBDEVS,
32};
33
34
35
36
37
38
39
40enum {
41 CSI_SINK_PAD = 0,
42 CSI_SRC_PAD_DIRECT,
43 CSI_SRC_PAD_IDMAC,
44 CSI_NUM_PADS,
45};
46
47
48enum {
49 VDIC_SINK_PAD_DIRECT = 0,
50 VDIC_SINK_PAD_IDMAC,
51 VDIC_SRC_PAD_DIRECT,
52 VDIC_NUM_PADS,
53};
54
55
56enum {
57 PRP_SINK_PAD = 0,
58 PRP_SRC_PAD_PRPENC,
59 PRP_SRC_PAD_PRPVF,
60 PRP_NUM_PADS,
61};
62
63
64enum {
65 PRPENCVF_SINK_PAD = 0,
66 PRPENCVF_SRC_PAD,
67 PRPENCVF_NUM_PADS,
68};
69
70
71#define IMX_MEDIA_EOF_TIMEOUT 2000
72
73struct imx_media_pixfmt {
74
75 u32 fourcc;
76
77
78
79
80 const u32 *codes;
81 int bpp;
82
83 int cycles;
84 enum ipu_color_space cs;
85 bool planar;
86 bool bayer;
87 bool ipufmt;
88};
89
90enum imx_pixfmt_sel {
91 PIXFMT_SEL_YUV = BIT(0),
92 PIXFMT_SEL_RGB = BIT(1),
93 PIXFMT_SEL_BAYER = BIT(2),
94 PIXFMT_SEL_IPU = BIT(3),
95 PIXFMT_SEL_YUV_RGB = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB,
96 PIXFMT_SEL_ANY = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB | PIXFMT_SEL_BAYER,
97};
98
99struct imx_media_buffer {
100 struct vb2_v4l2_buffer vbuf;
101 struct list_head list;
102};
103
104struct imx_media_video_dev {
105 struct video_device *vfd;
106
107
108 struct v4l2_pix_format fmt;
109
110 struct v4l2_rect compose;
111 const struct imx_media_pixfmt *cc;
112
113
114 struct list_head list;
115};
116
117static inline struct imx_media_buffer *to_imx_media_vb(struct vb2_buffer *vb)
118{
119 struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
120
121 return container_of(vbuf, struct imx_media_buffer, vbuf);
122}
123
124
125
126
127
128
129
130static inline struct list_head *
131to_pad_vdev_list(struct v4l2_subdev *sd, int pad_index)
132{
133 struct list_head *vdev_list = sd->host_priv;
134
135 return vdev_list ? &vdev_list[pad_index] : NULL;
136}
137
138
139struct imx_media_pad_vdev {
140 struct imx_media_video_dev *vdev;
141 struct list_head list;
142};
143
144struct imx_media_dev {
145 struct media_device md;
146 struct v4l2_device v4l2_dev;
147
148
149 struct media_pipeline pipe;
150
151 struct mutex mutex;
152
153
154 struct list_head vdev_list;
155
156
157 struct ipu_soc *ipu[2];
158
159
160 struct v4l2_async_notifier notifier;
161
162
163 struct imx_media_video_dev *m2m_vdev;
164
165
166 struct v4l2_subdev *sync_sd[2][NUM_IPU_SUBDEVS];
167};
168
169
170const struct imx_media_pixfmt *
171imx_media_find_pixel_format(u32 fourcc, enum imx_pixfmt_sel sel);
172int imx_media_enum_pixel_formats(u32 *fourcc, u32 index,
173 enum imx_pixfmt_sel sel, u32 code);
174const struct imx_media_pixfmt *
175imx_media_find_mbus_format(u32 code, enum imx_pixfmt_sel sel);
176int imx_media_enum_mbus_formats(u32 *code, u32 index,
177 enum imx_pixfmt_sel sel);
178
179static inline const struct imx_media_pixfmt *
180imx_media_find_ipu_format(u32 code, enum imx_pixfmt_sel fmt_sel)
181{
182 return imx_media_find_mbus_format(code, fmt_sel | PIXFMT_SEL_IPU);
183}
184
185static inline int imx_media_enum_ipu_formats(u32 *code, u32 index,
186 enum imx_pixfmt_sel fmt_sel)
187{
188 return imx_media_enum_mbus_formats(code, index,
189 fmt_sel | PIXFMT_SEL_IPU);
190}
191
192int imx_media_init_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
193 u32 width, u32 height, u32 code, u32 field,
194 const struct imx_media_pixfmt **cc);
195int imx_media_init_cfg(struct v4l2_subdev *sd,
196 struct v4l2_subdev_state *sd_state);
197void imx_media_try_colorimetry(struct v4l2_mbus_framefmt *tryfmt,
198 bool ic_route);
199int imx_media_mbus_fmt_to_pix_fmt(struct v4l2_pix_format *pix,
200 const struct v4l2_mbus_framefmt *mbus,
201 const struct imx_media_pixfmt *cc);
202int imx_media_mbus_fmt_to_ipu_image(struct ipu_image *image,
203 const struct v4l2_mbus_framefmt *mbus);
204int imx_media_ipu_image_to_mbus_fmt(struct v4l2_mbus_framefmt *mbus,
205 const struct ipu_image *image);
206void imx_media_grp_id_to_sd_name(char *sd_name, int sz,
207 u32 grp_id, int ipu_id);
208struct v4l2_subdev *
209imx_media_find_subdev_by_fwnode(struct imx_media_dev *imxmd,
210 struct fwnode_handle *fwnode);
211struct v4l2_subdev *
212imx_media_find_subdev_by_devname(struct imx_media_dev *imxmd,
213 const char *devname);
214void imx_media_add_video_device(struct imx_media_dev *imxmd,
215 struct imx_media_video_dev *vdev);
216int imx_media_pipeline_csi2_channel(struct media_entity *start_entity);
217struct media_pad *
218imx_media_pipeline_pad(struct media_entity *start_entity, u32 grp_id,
219 enum v4l2_buf_type buftype, bool upstream);
220struct v4l2_subdev *
221imx_media_pipeline_subdev(struct media_entity *start_entity, u32 grp_id,
222 bool upstream);
223struct video_device *
224imx_media_pipeline_video_device(struct media_entity *start_entity,
225 enum v4l2_buf_type buftype, bool upstream);
226struct fwnode_handle *imx_media_get_pad_fwnode(struct media_pad *pad);
227
228struct imx_media_dma_buf {
229 void *virt;
230 dma_addr_t phys;
231 unsigned long len;
232};
233
234void imx_media_free_dma_buf(struct device *dev,
235 struct imx_media_dma_buf *buf);
236int imx_media_alloc_dma_buf(struct device *dev,
237 struct imx_media_dma_buf *buf,
238 int size);
239
240int imx_media_pipeline_set_stream(struct imx_media_dev *imxmd,
241 struct media_entity *entity,
242 bool on);
243
244
245int imx_media_probe_complete(struct v4l2_async_notifier *notifier);
246struct imx_media_dev *imx_media_dev_init(struct device *dev,
247 const struct media_device_ops *ops);
248int imx_media_dev_notifier_register(struct imx_media_dev *imxmd,
249 const struct v4l2_async_notifier_operations *ops);
250
251
252struct imx_media_fim;
253void imx_media_fim_eof_monitor(struct imx_media_fim *fim, ktime_t timestamp);
254int imx_media_fim_set_stream(struct imx_media_fim *fim,
255 const struct v4l2_fract *frame_interval,
256 bool on);
257int imx_media_fim_add_controls(struct imx_media_fim *fim);
258struct imx_media_fim *imx_media_fim_init(struct v4l2_subdev *sd);
259void imx_media_fim_free(struct imx_media_fim *fim);
260
261
262int imx_media_register_ipu_internal_subdevs(struct imx_media_dev *imxmd,
263 struct v4l2_subdev *csi);
264void imx_media_unregister_ipu_internal_subdevs(struct imx_media_dev *imxmd);
265
266
267int imx_media_add_of_subdevs(struct imx_media_dev *dev,
268 struct device_node *np);
269int imx_media_of_add_csi(struct imx_media_dev *imxmd,
270 struct device_node *csi_np);
271
272
273struct v4l2_subdev *imx_media_vdic_register(struct v4l2_device *v4l2_dev,
274 struct device *ipu_dev,
275 struct ipu_soc *ipu,
276 u32 grp_id);
277int imx_media_vdic_unregister(struct v4l2_subdev *sd);
278
279
280struct v4l2_subdev *imx_media_ic_register(struct v4l2_device *v4l2_dev,
281 struct device *ipu_dev,
282 struct ipu_soc *ipu,
283 u32 grp_id);
284int imx_media_ic_unregister(struct v4l2_subdev *sd);
285
286
287struct imx_media_video_dev *
288imx_media_capture_device_init(struct device *dev, struct v4l2_subdev *src_sd,
289 int pad, bool legacy_api);
290void imx_media_capture_device_remove(struct imx_media_video_dev *vdev);
291int imx_media_capture_device_register(struct imx_media_video_dev *vdev,
292 u32 link_flags);
293void imx_media_capture_device_unregister(struct imx_media_video_dev *vdev);
294struct imx_media_buffer *
295imx_media_capture_device_next_buf(struct imx_media_video_dev *vdev);
296void imx_media_capture_device_error(struct imx_media_video_dev *vdev);
297
298
299struct imx_media_video_dev *
300imx_media_csc_scaler_device_init(struct imx_media_dev *dev);
301int imx_media_csc_scaler_device_register(struct imx_media_video_dev *vdev);
302void imx_media_csc_scaler_device_unregister(struct imx_media_video_dev *vdev);
303
304
305#define IMX_MEDIA_GRP_ID_CSI2 BIT(8)
306#define IMX_MEDIA_GRP_ID_CSI BIT(9)
307#define IMX_MEDIA_GRP_ID_IPU_CSI_BIT 10
308#define IMX_MEDIA_GRP_ID_IPU_CSI (0x3 << IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
309#define IMX_MEDIA_GRP_ID_IPU_CSI0 BIT(IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
310#define IMX_MEDIA_GRP_ID_IPU_CSI1 (2 << IMX_MEDIA_GRP_ID_IPU_CSI_BIT)
311#define IMX_MEDIA_GRP_ID_IPU_VDIC BIT(12)
312#define IMX_MEDIA_GRP_ID_IPU_IC_PRP BIT(13)
313#define IMX_MEDIA_GRP_ID_IPU_IC_PRPENC BIT(14)
314#define IMX_MEDIA_GRP_ID_IPU_IC_PRPVF BIT(15)
315#define IMX_MEDIA_GRP_ID_CSI_MUX BIT(16)
316
317#endif
318