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(¶ms_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(¶ms_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(¶ms_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
160 params_vdev->first_params = false;
161 wake_up(¶ms_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(¶ms_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(¶ms_vdev->config_lock, flags);
179 list_add_tail(¶ms_buf->queue, ¶ms_vdev->params);
180 spin_unlock_irqrestore(¶ms_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(¶ms_vdev->config_lock, flags);
193 params_vdev->streamon = false;
194 wake_up(&dev->sync_onoff);
195 spin_unlock_irqrestore(¶ms_vdev->config_lock, flags);
196
197 for (i = 0; i < RKISP_ISP_PARAMS_REQ_BUFS_MAX; i++) {
198 spin_lock_irqsave(¶ms_vdev->config_lock, flags);
199 if (!list_empty(¶ms_vdev->params)) {
200 buf = list_first_entry(¶ms_vdev->params,
201 struct rkisp_buffer, queue);
202 list_del(&buf->queue);
203 spin_unlock_irqrestore(¶ms_vdev->config_lock,
204 flags);
205 } else {
206 spin_unlock_irqrestore(¶ms_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(¶ms_vdev->config_lock, flags);
242 params_vdev->streamon = true;
243 spin_unlock_irqrestore(¶ms_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(¶ms->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(¶ms->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 = ¶ms_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 ¶ms_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 = ¶ms_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(¶ms_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 = ¶ms_vdev->vnode.vdev.entity;
520 sink = ¶ms_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 = ¶ms_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