xref: /OK3568_Linux_fs/kernel/drivers/media/platform/rockchip/isp/isp_params.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. */
3 
4 #include <media/v4l2-common.h>
5 #include <media/v4l2-ioctl.h>
6 #include <media/videobuf2-core.h>
7 #include <media/videobuf2-vmalloc.h>	/* for ISP params */
8 #include <media/v4l2-event.h>
9 #include <linux/rk-preisp.h>
10 #include "dev.h"
11 #include "isp_params.h"
12 #include "isp_params_v1x.h"
13 #include "isp_params_v2x.h"
14 #include "isp_params_v21.h"
15 #include "isp_params_v3x.h"
16 #include "isp_params_v32.h"
17 #include "regs.h"
18 
19 #define PARAMS_NAME DRIVER_NAME "-input-params"
20 #define RKISP_ISP_PARAMS_REQ_BUFS_MIN	2
21 #define RKISP_ISP_PARAMS_REQ_BUFS_MAX	8
22 
rkisp_params_enum_fmt_meta_out(struct file * file,void * priv,struct v4l2_fmtdesc * f)23 static int rkisp_params_enum_fmt_meta_out(struct file *file, void *priv,
24 					  struct v4l2_fmtdesc *f)
25 {
26 	struct video_device *video = video_devdata(file);
27 	struct rkisp_isp_params_vdev *params_vdev = video_get_drvdata(video);
28 
29 	if (f->index > 0 || f->type != video->queue->type)
30 		return -EINVAL;
31 
32 	f->pixelformat = params_vdev->vdev_fmt.fmt.meta.dataformat;
33 
34 	return 0;
35 }
36 
rkisp_params_g_fmt_meta_out(struct file * file,void * fh,struct v4l2_format * f)37 static int rkisp_params_g_fmt_meta_out(struct file *file, void *fh,
38 				       struct v4l2_format *f)
39 {
40 	struct video_device *video = video_devdata(file);
41 	struct rkisp_isp_params_vdev *params_vdev = video_get_drvdata(video);
42 	struct v4l2_meta_format *meta = &f->fmt.meta;
43 
44 	if (f->type != video->queue->type)
45 		return -EINVAL;
46 
47 	memset(meta, 0, sizeof(*meta));
48 	meta->dataformat = params_vdev->vdev_fmt.fmt.meta.dataformat;
49 	meta->buffersize = params_vdev->vdev_fmt.fmt.meta.buffersize;
50 
51 	return 0;
52 }
53 
rkisp_params_querycap(struct file * file,void * priv,struct v4l2_capability * cap)54 static int rkisp_params_querycap(struct file *file,
55 				 void *priv, struct v4l2_capability *cap)
56 {
57 	struct video_device *vdev = video_devdata(file);
58 	struct rkisp_isp_params_vdev *params_vdev = video_get_drvdata(vdev);
59 
60 	snprintf(cap->driver, sizeof(cap->driver),
61 		 "%s_v%d", DRIVER_NAME,
62 		 params_vdev->dev->isp_ver >> 4);
63 	strlcpy(cap->card, vdev->name, sizeof(cap->card));
64 	strlcpy(cap->bus_info, "platform: " DRIVER_NAME, sizeof(cap->bus_info));
65 	cap->version = RKISP_DRIVER_VERSION;
66 	return 0;
67 }
68 
rkisp_params_subs_evt(struct v4l2_fh * fh,const struct v4l2_event_subscription * sub)69 static int rkisp_params_subs_evt(struct v4l2_fh *fh,
70 				 const struct v4l2_event_subscription *sub)
71 {
72 	struct rkisp_isp_params_vdev *params_vdev = video_get_drvdata(fh->vdev);
73 
74 	if (sub->id != 0)
75 		return -EINVAL;
76 
77 	switch (sub->type) {
78 	case CIFISP_V4L2_EVENT_STREAM_START:
79 	case CIFISP_V4L2_EVENT_STREAM_STOP:
80 		params_vdev->is_subs_evt = true;
81 		return v4l2_event_subscribe(fh, sub, 0, NULL);
82 	default:
83 		return -EINVAL;
84 	}
85 }
86 
rkisp_params_unsubs_evt(struct v4l2_fh * fh,const struct v4l2_event_subscription * sub)87 static int rkisp_params_unsubs_evt(struct v4l2_fh *fh,
88 				   const struct v4l2_event_subscription *sub)
89 {
90 	struct rkisp_isp_params_vdev *params_vdev = video_get_drvdata(fh->vdev);
91 
92 	params_vdev->is_subs_evt = false;
93 	return v4l2_event_unsubscribe(fh, sub);
94 }
95 
96 /* ISP params video device IOCTLs */
97 static const struct v4l2_ioctl_ops rkisp_params_ioctl = {
98 	.vidioc_reqbufs = vb2_ioctl_reqbufs,
99 	.vidioc_querybuf = vb2_ioctl_querybuf,
100 	.vidioc_create_bufs = vb2_ioctl_create_bufs,
101 	.vidioc_qbuf = vb2_ioctl_qbuf,
102 	.vidioc_dqbuf = vb2_ioctl_dqbuf,
103 	.vidioc_prepare_buf = vb2_ioctl_prepare_buf,
104 	.vidioc_expbuf = vb2_ioctl_expbuf,
105 	.vidioc_streamon = vb2_ioctl_streamon,
106 	.vidioc_streamoff = vb2_ioctl_streamoff,
107 	.vidioc_enum_fmt_meta_out = rkisp_params_enum_fmt_meta_out,
108 	.vidioc_g_fmt_meta_out = rkisp_params_g_fmt_meta_out,
109 	.vidioc_s_fmt_meta_out = rkisp_params_g_fmt_meta_out,
110 	.vidioc_try_fmt_meta_out = rkisp_params_g_fmt_meta_out,
111 	.vidioc_querycap = rkisp_params_querycap,
112 	.vidioc_subscribe_event = rkisp_params_subs_evt,
113 	.vidioc_unsubscribe_event = rkisp_params_unsubs_evt,
114 };
115 
rkisp_params_vb2_queue_setup(struct vb2_queue * vq,unsigned int * num_buffers,unsigned int * num_planes,unsigned int sizes[],struct device * alloc_ctxs[])116 static int rkisp_params_vb2_queue_setup(struct vb2_queue *vq,
117 					unsigned int *num_buffers,
118 					unsigned int *num_planes,
119 					unsigned int sizes[],
120 					struct device *alloc_ctxs[])
121 {
122 	struct rkisp_isp_params_vdev *params_vdev = vq->drv_priv;
123 
124 	*num_buffers = clamp_t(u32, *num_buffers,
125 			       RKISP_ISP_PARAMS_REQ_BUFS_MIN,
126 			       RKISP_ISP_PARAMS_REQ_BUFS_MAX);
127 
128 	*num_planes = 1;
129 	params_vdev->ops->get_param_size(params_vdev, sizes);
130 
131 	INIT_LIST_HEAD(&params_vdev->params);
132 
133 	if (params_vdev->first_cfg_params) {
134 		params_vdev->first_cfg_params = false;
135 		return 0;
136 	}
137 
138 	params_vdev->first_params = true;
139 
140 	return 0;
141 }
142 
rkisp_params_vb2_buf_queue(struct vb2_buffer * vb)143 static void rkisp_params_vb2_buf_queue(struct vb2_buffer *vb)
144 {
145 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
146 	struct rkisp_buffer *params_buf = to_rkisp_buffer(vbuf);
147 	struct vb2_queue *vq = vb->vb2_queue;
148 	struct rkisp_isp_params_vdev *params_vdev = vq->drv_priv;
149 	void *first_param;
150 	unsigned long flags;
151 	unsigned int cur_frame_id = -1;
152 
153 	cur_frame_id = atomic_read(&params_vdev->dev->isp_sdev.frm_sync_seq) - 1;
154 	if (params_vdev->first_params) {
155 		first_param = vb2_plane_vaddr(vb, 0);
156 		params_vdev->ops->save_first_param(params_vdev, first_param);
157 		params_vdev->is_first_cfg = true;
158 		vbuf->sequence = cur_frame_id;
159 		vb2_buffer_done(&params_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
160 		params_vdev->first_params = false;
161 		wake_up(&params_vdev->dev->sync_onoff);
162 		if (params_vdev->dev->is_first_double) {
163 			dev_info(params_vdev->dev->dev, "first params for fast\n");
164 			params_vdev->dev->is_first_double = false;
165 			rkisp_trigger_read_back(params_vdev->dev, false, false, false);
166 		}
167 		dev_info(params_vdev->dev->dev, "first params buf queue\n");
168 		return;
169 	}
170 
171 	if (params_vdev->dev->procfs.mode &
172 	    (RKISP_PROCFS_FIL_AIQ | RKISP_PROCFS_FIL_SW)) {
173 		vb2_buffer_done(&params_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
174 		return;
175 	}
176 
177 	params_buf->vaddr[0] = vb2_plane_vaddr(vb, 0);
178 	spin_lock_irqsave(&params_vdev->config_lock, flags);
179 	list_add_tail(&params_buf->queue, &params_vdev->params);
180 	spin_unlock_irqrestore(&params_vdev->config_lock, flags);
181 }
182 
rkisp_params_vb2_stop_streaming(struct vb2_queue * vq)183 static void rkisp_params_vb2_stop_streaming(struct vb2_queue *vq)
184 {
185 	struct rkisp_isp_params_vdev *params_vdev = vq->drv_priv;
186 	struct rkisp_device *dev = params_vdev->dev;
187 	struct rkisp_buffer *buf;
188 	unsigned long flags;
189 	int i;
190 
191 	/* stop params input firstly */
192 	spin_lock_irqsave(&params_vdev->config_lock, flags);
193 	params_vdev->streamon = false;
194 	wake_up(&dev->sync_onoff);
195 	spin_unlock_irqrestore(&params_vdev->config_lock, flags);
196 
197 	for (i = 0; i < RKISP_ISP_PARAMS_REQ_BUFS_MAX; i++) {
198 		spin_lock_irqsave(&params_vdev->config_lock, flags);
199 		if (!list_empty(&params_vdev->params)) {
200 			buf = list_first_entry(&params_vdev->params,
201 					       struct rkisp_buffer, queue);
202 			list_del(&buf->queue);
203 			spin_unlock_irqrestore(&params_vdev->config_lock,
204 					       flags);
205 		} else {
206 			spin_unlock_irqrestore(&params_vdev->config_lock,
207 					       flags);
208 			break;
209 		}
210 
211 		if (buf)
212 			vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
213 		buf = NULL;
214 	}
215 
216 	if (params_vdev->cur_buf) {
217 		buf = params_vdev->cur_buf;
218 		vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
219 		params_vdev->cur_buf = NULL;
220 	}
221 
222 	if (dev->is_pre_on) {
223 		params_vdev->first_cfg_params = true;
224 		return;
225 	}
226 	rkisp_params_disable_isp(params_vdev);
227 	/* clean module params */
228 	params_vdev->ops->clear_first_param(params_vdev);
229 	params_vdev->rdbk_times = 0;
230 }
231 
232 static int
rkisp_params_vb2_start_streaming(struct vb2_queue * queue,unsigned int count)233 rkisp_params_vb2_start_streaming(struct vb2_queue *queue, unsigned int count)
234 {
235 	struct rkisp_isp_params_vdev *params_vdev = queue->drv_priv;
236 	unsigned long flags;
237 
238 	params_vdev->hdrtmo_en = false;
239 	params_vdev->afaemode_en = false;
240 	params_vdev->cur_buf = NULL;
241 	spin_lock_irqsave(&params_vdev->config_lock, flags);
242 	params_vdev->streamon = true;
243 	spin_unlock_irqrestore(&params_vdev->config_lock, flags);
244 
245 	return 0;
246 }
247 
248 static struct vb2_ops rkisp_params_vb2_ops = {
249 	.queue_setup = rkisp_params_vb2_queue_setup,
250 	.wait_prepare = vb2_ops_wait_prepare,
251 	.wait_finish = vb2_ops_wait_finish,
252 	.buf_queue = rkisp_params_vb2_buf_queue,
253 	.start_streaming = rkisp_params_vb2_start_streaming,
254 	.stop_streaming = rkisp_params_vb2_stop_streaming,
255 
256 };
257 
rkisp_params_fh_open(struct file * filp)258 static int rkisp_params_fh_open(struct file *filp)
259 {
260 	struct rkisp_isp_params_vdev *params = video_drvdata(filp);
261 	int ret;
262 
263 	if (!params->dev->is_probe_end)
264 		return -EINVAL;
265 
266 	ret = v4l2_fh_open(filp);
267 	if (!ret) {
268 		ret = v4l2_pipeline_pm_get(&params->vnode.vdev.entity);
269 		if (ret < 0)
270 			vb2_fop_release(filp);
271 	}
272 
273 	return ret;
274 }
275 
rkisp_params_fop_release(struct file * file)276 static int rkisp_params_fop_release(struct file *file)
277 {
278 	struct rkisp_isp_params_vdev *params = video_drvdata(file);
279 	int ret;
280 
281 	ret = vb2_fop_release(file);
282 	if (!ret)
283 		v4l2_pipeline_pm_put(&params->vnode.vdev.entity);
284 	return ret;
285 }
286 
rkisp_params_fop_poll(struct file * file,poll_table * wait)287 static __poll_t rkisp_params_fop_poll(struct file *file, poll_table *wait)
288 {
289 	struct video_device *vdev = video_devdata(file);
290 
291 	/* buf done or subscribe event */
292 	if (vdev->queue->owner == file->private_data)
293 		return vb2_fop_poll(file, wait);
294 	else
295 		return v4l2_ctrl_poll(file, wait);
296 }
297 
298 struct v4l2_file_operations rkisp_params_fops = {
299 	.mmap = vb2_fop_mmap,
300 	.unlocked_ioctl = video_ioctl2,
301 	.poll = rkisp_params_fop_poll,
302 	.open = rkisp_params_fh_open,
303 	.release = rkisp_params_fop_release
304 };
305 
306 static int
rkisp_params_init_vb2_queue(struct vb2_queue * q,struct rkisp_isp_params_vdev * params_vdev)307 rkisp_params_init_vb2_queue(struct vb2_queue *q,
308 			    struct rkisp_isp_params_vdev *params_vdev)
309 {
310 	q->type = V4L2_BUF_TYPE_META_OUTPUT;
311 	q->io_modes = VB2_MMAP | VB2_USERPTR;
312 	q->drv_priv = params_vdev;
313 	q->ops = &rkisp_params_vb2_ops;
314 	q->mem_ops = &vb2_vmalloc_memops;
315 	q->buf_struct_size = sizeof(struct rkisp_buffer);
316 	q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
317 	q->lock = &params_vdev->dev->iqlock;
318 	q->dev = params_vdev->dev->dev;
319 
320 	return vb2_queue_init(q);
321 }
322 
rkisp_init_params_vdev(struct rkisp_isp_params_vdev * params_vdev)323 static int rkisp_init_params_vdev(struct rkisp_isp_params_vdev *params_vdev)
324 {
325 	int ret;
326 
327 	if (params_vdev->dev->isp_ver <= ISP_V13)
328 		ret = rkisp_init_params_vdev_v1x(params_vdev);
329 	else if (params_vdev->dev->isp_ver == ISP_V21)
330 		ret = rkisp_init_params_vdev_v21(params_vdev);
331 	else if (params_vdev->dev->isp_ver == ISP_V20)
332 		ret = rkisp_init_params_vdev_v2x(params_vdev);
333 	else if (params_vdev->dev->isp_ver == ISP_V30)
334 		ret = rkisp_init_params_vdev_v3x(params_vdev);
335 	else
336 		ret = rkisp_init_params_vdev_v32(params_vdev);
337 
338 	params_vdev->vdev_fmt.fmt.meta.dataformat =
339 		V4L2_META_FMT_RK_ISP1_PARAMS;
340 	if (params_vdev->ops && params_vdev->ops->get_param_size)
341 		params_vdev->ops->get_param_size(params_vdev,
342 			&params_vdev->vdev_fmt.fmt.meta.buffersize);
343 	return ret;
344 }
345 
rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev * params_vdev)346 static void rkisp_uninit_params_vdev(struct rkisp_isp_params_vdev *params_vdev)
347 {
348 	if (params_vdev->dev->isp_ver <= ISP_V13)
349 		rkisp_uninit_params_vdev_v1x(params_vdev);
350 	else if (params_vdev->dev->isp_ver == ISP_V21)
351 		rkisp_uninit_params_vdev_v21(params_vdev);
352 	else if (params_vdev->dev->isp_ver == ISP_V20)
353 		rkisp_uninit_params_vdev_v2x(params_vdev);
354 	else if (params_vdev->dev->isp_ver == ISP_V30)
355 		rkisp_uninit_params_vdev_v3x(params_vdev);
356 	else
357 		rkisp_uninit_params_vdev_v32(params_vdev);
358 }
359 
rkisp_params_cfg(struct rkisp_isp_params_vdev * params_vdev,u32 frame_id)360 void rkisp_params_cfg(struct rkisp_isp_params_vdev *params_vdev, u32 frame_id)
361 {
362 	if (params_vdev->ops->param_cfg)
363 		params_vdev->ops->param_cfg(params_vdev, frame_id, RKISP_PARAMS_IMD);
364 }
365 
rkisp_params_cfgsram(struct rkisp_isp_params_vdev * params_vdev)366 void rkisp_params_cfgsram(struct rkisp_isp_params_vdev *params_vdev)
367 {
368 	if (params_vdev->dev->procfs.mode & RKISP_PROCFS_FIL_SW)
369 		return;
370 
371 	/* multi device to switch sram config */
372 	if (params_vdev->dev->hw_dev->is_single)
373 		return;
374 
375 	if (params_vdev->ops->param_cfgsram)
376 		params_vdev->ops->param_cfgsram(params_vdev);
377 }
378 
rkisp_params_isr(struct rkisp_isp_params_vdev * params_vdev,u32 isp_mis)379 void rkisp_params_isr(struct rkisp_isp_params_vdev *params_vdev,
380 		      u32 isp_mis)
381 {
382 	params_vdev->ops->isr_hdl(params_vdev, isp_mis);
383 }
384 
385 /* Not called when the camera active, thus not isr protection. */
rkisp_params_first_cfg(struct rkisp_isp_params_vdev * params_vdev,struct ispsd_in_fmt * in_fmt,enum v4l2_quantization quantization)386 void rkisp_params_first_cfg(struct rkisp_isp_params_vdev *params_vdev,
387 			    struct ispsd_in_fmt *in_fmt,
388 			    enum v4l2_quantization quantization)
389 {
390 	struct rkisp_device *dev = params_vdev->dev;
391 
392 	if (!params_vdev->is_first_cfg)
393 		return;
394 	params_vdev->is_first_cfg = false;
395 	params_vdev->quantization = quantization;
396 	params_vdev->raw_type = in_fmt->bayer_pat;
397 	params_vdev->in_mbus_code = in_fmt->mbus_code;
398 	params_vdev->ops->first_cfg(params_vdev);
399 	/* update selfpath range if it output rgb format */
400 	if (params_vdev->quantization != quantization) {
401 		struct rkisp_stream *stream = &dev->cap_dev.stream[RKISP_STREAM_SP];
402 		u32 mask = CIF_MI_SP_Y_FULL_YUV2RGB | CIF_MI_SP_CBCR_FULL_YUV2RGB;
403 
404 		quantization = params_vdev->quantization;
405 		if (stream->streaming &&
406 		    stream->out_isp_fmt.fmt_type == FMT_RGB)
407 			rkisp_unite_set_bits(dev, ISP3X_MI_WR_CTRL, mask,
408 					     quantization == V4L2_QUANTIZATION_FULL_RANGE ?
409 					     mask : 0,
410 					     false, dev->hw_dev->is_unite);
411 		dev->isp_sdev.quantization = quantization;
412 	}
413 }
414 
415 /* Not called when the camera active, thus not isr protection. */
rkisp_params_disable_isp(struct rkisp_isp_params_vdev * params_vdev)416 void rkisp_params_disable_isp(struct rkisp_isp_params_vdev *params_vdev)
417 {
418 	if (params_vdev->ops->disable_isp)
419 		params_vdev->ops->disable_isp(params_vdev);
420 }
421 
rkisp_params_get_meshbuf_inf(struct rkisp_isp_params_vdev * params_vdev,void * meshbuf)422 void rkisp_params_get_meshbuf_inf(struct rkisp_isp_params_vdev *params_vdev,
423 				  void *meshbuf)
424 {
425 	if (params_vdev->ops->get_meshbuf_inf)
426 		params_vdev->ops->get_meshbuf_inf(params_vdev, meshbuf);
427 }
428 
rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev * params_vdev,void * meshsize)429 int rkisp_params_set_meshbuf_size(struct rkisp_isp_params_vdev *params_vdev,
430 				  void *meshsize)
431 {
432 	if (params_vdev->ops->set_meshbuf_size)
433 		return params_vdev->ops->set_meshbuf_size(params_vdev,
434 							  meshsize);
435 	else
436 		return -EINVAL;
437 }
438 
rkisp_params_meshbuf_free(struct rkisp_isp_params_vdev * params_vdev,u64 id)439 void rkisp_params_meshbuf_free(struct rkisp_isp_params_vdev *params_vdev, u64 id)
440 {
441 	/* isp working no to free buf */
442 	if (params_vdev->ops->free_meshbuf &&
443 	    !(params_vdev->dev->isp_state & ISP_START))
444 		params_vdev->ops->free_meshbuf(params_vdev, id);
445 }
446 
rkisp_params_stream_stop(struct rkisp_isp_params_vdev * params_vdev)447 void rkisp_params_stream_stop(struct rkisp_isp_params_vdev *params_vdev)
448 {
449 	/* isp stop to free buf */
450 	if (params_vdev->ops->stream_stop)
451 		params_vdev->ops->stream_stop(params_vdev);
452 	if (params_vdev->ops->fop_release)
453 		params_vdev->ops->fop_release(params_vdev);
454 }
455 
rkisp_params_check_bigmode(struct rkisp_isp_params_vdev * params_vdev)456 bool rkisp_params_check_bigmode(struct rkisp_isp_params_vdev *params_vdev)
457 {
458 	if (params_vdev->ops->check_bigmode)
459 		return params_vdev->ops->check_bigmode(params_vdev);
460 
461 	return 0;
462 }
463 
rkisp_params_info2ddr_cfg(struct rkisp_isp_params_vdev * params_vdev,void * arg)464 int rkisp_params_info2ddr_cfg(struct rkisp_isp_params_vdev *params_vdev,
465 			       void *arg)
466 {
467 	int ret = -EINVAL;
468 
469 	if (params_vdev->ops->info2ddr_cfg)
470 		ret = params_vdev->ops->info2ddr_cfg(params_vdev, arg);
471 
472 	return ret;
473 }
474 
rkisp_register_params_vdev(struct rkisp_isp_params_vdev * params_vdev,struct v4l2_device * v4l2_dev,struct rkisp_device * dev)475 int rkisp_register_params_vdev(struct rkisp_isp_params_vdev *params_vdev,
476 				struct v4l2_device *v4l2_dev,
477 				struct rkisp_device *dev)
478 {
479 	int ret;
480 	struct rkisp_vdev_node *node = &params_vdev->vnode;
481 	struct video_device *vdev = &node->vdev;
482 	struct media_entity *source, *sink;
483 
484 	params_vdev->dev = dev;
485 	params_vdev->is_subs_evt = false;
486 	spin_lock_init(&params_vdev->config_lock);
487 
488 	strlcpy(vdev->name, PARAMS_NAME, sizeof(vdev->name));
489 
490 	vdev->ioctl_ops = &rkisp_params_ioctl;
491 	vdev->fops = &rkisp_params_fops;
492 	vdev->release = video_device_release_empty;
493 	/*
494 	 * Provide a mutex to v4l2 core. It will be used
495 	 * to protect all fops and v4l2 ioctls.
496 	 */
497 	vdev->lock = &dev->iqlock;
498 	vdev->v4l2_dev = v4l2_dev;
499 	vdev->queue = &node->buf_queue;
500 	vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_META_OUTPUT;
501 	vdev->vfl_dir = VFL_DIR_TX;
502 	rkisp_params_init_vb2_queue(vdev->queue, params_vdev);
503 	ret = rkisp_init_params_vdev(params_vdev);
504 	if (ret < 0)
505 		goto err_release_queue;
506 	video_set_drvdata(vdev, params_vdev);
507 
508 	node->pad.flags = MEDIA_PAD_FL_SOURCE;
509 	ret = media_entity_pads_init(&vdev->entity, 1, &node->pad);
510 	if (ret < 0)
511 		goto err_release_queue;
512 	ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1);
513 	if (ret < 0) {
514 		dev_err(&vdev->dev,
515 			"could not register Video for Linux device\n");
516 		goto err_cleanup_media_entity;
517 	}
518 
519 	source = &params_vdev->vnode.vdev.entity;
520 	sink = &params_vdev->dev->isp_sdev.sd.entity;
521 	ret = media_create_pad_link(source, 0, sink,
522 		RKISP_ISP_PAD_SINK_PARAMS, MEDIA_LNK_FL_ENABLED);
523 	if (ret < 0)
524 		goto err_unregister_video;
525 
526 	return 0;
527 
528 err_unregister_video:
529 	video_unregister_device(vdev);
530 err_cleanup_media_entity:
531 	media_entity_cleanup(&vdev->entity);
532 err_release_queue:
533 	vb2_queue_release(vdev->queue);
534 	rkisp_uninit_params_vdev(params_vdev);
535 	return ret;
536 }
537 
rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev * params_vdev)538 void rkisp_unregister_params_vdev(struct rkisp_isp_params_vdev *params_vdev)
539 {
540 	struct rkisp_vdev_node *node = &params_vdev->vnode;
541 	struct video_device *vdev = &node->vdev;
542 
543 	video_unregister_device(vdev);
544 	media_entity_cleanup(&vdev->entity);
545 	vb2_queue_release(vdev->queue);
546 	rkisp_uninit_params_vdev(params_vdev);
547 }
548 
549