GNU Linux-libre 6.8.7-gnu
[releases.git] / drivers / staging / media / tegra-video / vi.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2020 NVIDIA CORPORATION.  All rights reserved.
4  */
5
6 #include <linux/bitmap.h>
7 #include <linux/clk.h>
8 #include <linux/delay.h>
9 #include <linux/host1x.h>
10 #include <linux/lcm.h>
11 #include <linux/list.h>
12 #include <linux/module.h>
13 #include <linux/of.h>
14 #include <linux/of_graph.h>
15 #include <linux/of_platform.h>
16 #include <linux/platform_device.h>
17 #include <linux/regulator/consumer.h>
18 #include <linux/pm_runtime.h>
19 #include <linux/slab.h>
20
21 #include <media/v4l2-dv-timings.h>
22 #include <media/v4l2-event.h>
23 #include <media/v4l2-fh.h>
24 #include <media/v4l2-fwnode.h>
25 #include <media/v4l2-ioctl.h>
26 #include <media/videobuf2-dma-contig.h>
27
28 #include <soc/tegra/pmc.h>
29
30 #include "vi.h"
31 #include "video.h"
32
33 #define MAX_CID_CONTROLS                3
34
35 /**
36  * struct tegra_vi_graph_entity - Entity in the video graph
37  *
38  * @asd: subdev asynchronous registration information
39  * @entity: media entity from the corresponding V4L2 subdev
40  * @subdev: V4L2 subdev
41  */
42 struct tegra_vi_graph_entity {
43         struct v4l2_async_connection asd;
44         struct media_entity *entity;
45         struct v4l2_subdev *subdev;
46 };
47
48 static inline struct tegra_vi *
49 host1x_client_to_vi(struct host1x_client *client)
50 {
51         return container_of(client, struct tegra_vi, client);
52 }
53
54 static inline struct tegra_channel_buffer *
55 to_tegra_channel_buffer(struct vb2_v4l2_buffer *vb)
56 {
57         return container_of(vb, struct tegra_channel_buffer, buf);
58 }
59
60 static inline struct tegra_vi_graph_entity *
61 to_tegra_vi_graph_entity(struct v4l2_async_connection *asd)
62 {
63         return container_of(asd, struct tegra_vi_graph_entity, asd);
64 }
65
66 static int tegra_get_format_idx_by_code(struct tegra_vi *vi,
67                                         unsigned int code,
68                                         unsigned int offset)
69 {
70         unsigned int i;
71
72         for (i = offset; i < vi->soc->nformats; ++i) {
73                 if (vi->soc->video_formats[i].code == code)
74                         return i;
75         }
76
77         return -1;
78 }
79
80 static u32 tegra_get_format_fourcc_by_idx(struct tegra_vi *vi,
81                                           unsigned int index)
82 {
83         if (index >= vi->soc->nformats)
84                 return -EINVAL;
85
86         return vi->soc->video_formats[index].fourcc;
87 }
88
89 static const struct tegra_video_format *
90 tegra_get_format_by_fourcc(struct tegra_vi *vi, u32 fourcc)
91 {
92         unsigned int i;
93
94         for (i = 0; i < vi->soc->nformats; ++i) {
95                 if (vi->soc->video_formats[i].fourcc == fourcc)
96                         return &vi->soc->video_formats[i];
97         }
98
99         return NULL;
100 }
101
102 /*
103  * videobuf2 queue operations
104  */
105
106 static int tegra_channel_queue_setup(struct vb2_queue *vq,
107                                      unsigned int *nbuffers,
108                                      unsigned int *nplanes,
109                                      unsigned int sizes[],
110                                      struct device *alloc_devs[])
111 {
112         struct tegra_vi_channel *chan = vb2_get_drv_priv(vq);
113
114         if (*nplanes)
115                 return sizes[0] < chan->format.sizeimage ? -EINVAL : 0;
116
117         *nplanes = 1;
118         sizes[0] = chan->format.sizeimage;
119         alloc_devs[0] = chan->vi->dev;
120
121         if (chan->vi->ops->channel_queue_setup)
122                 chan->vi->ops->channel_queue_setup(chan);
123
124         return 0;
125 }
126
127 static int tegra_channel_buffer_prepare(struct vb2_buffer *vb)
128 {
129         struct tegra_vi_channel *chan = vb2_get_drv_priv(vb->vb2_queue);
130         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
131         struct tegra_channel_buffer *buf = to_tegra_channel_buffer(vbuf);
132         unsigned long size = chan->format.sizeimage;
133
134         if (vb2_plane_size(vb, 0) < size) {
135                 v4l2_err(chan->video.v4l2_dev,
136                          "buffer too small (%lu < %lu)\n",
137                          vb2_plane_size(vb, 0), size);
138                 return -EINVAL;
139         }
140
141         vb2_set_plane_payload(vb, 0, size);
142         buf->chan = chan;
143         buf->addr = vb2_dma_contig_plane_dma_addr(vb, 0);
144
145         return 0;
146 }
147
148 static void tegra_channel_buffer_queue(struct vb2_buffer *vb)
149 {
150         struct tegra_vi_channel *chan = vb2_get_drv_priv(vb->vb2_queue);
151         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
152         struct tegra_channel_buffer *buf = to_tegra_channel_buffer(vbuf);
153
154         /* put buffer into the capture queue */
155         spin_lock(&chan->start_lock);
156         list_add_tail(&buf->queue, &chan->capture);
157         spin_unlock(&chan->start_lock);
158
159         /* wait up kthread for capture */
160         wake_up_interruptible(&chan->start_wait);
161 }
162
163 struct v4l2_subdev *
164 tegra_channel_get_remote_csi_subdev(struct tegra_vi_channel *chan)
165 {
166         struct media_pad *pad;
167
168         pad = media_pad_remote_pad_first(&chan->pad);
169         if (!pad)
170                 return NULL;
171
172         return media_entity_to_v4l2_subdev(pad->entity);
173 }
174
175 /*
176  * Walk up the chain until the initial source (e.g. image sensor)
177  */
178 struct v4l2_subdev *
179 tegra_channel_get_remote_source_subdev(struct tegra_vi_channel *chan)
180 {
181         struct media_pad *pad;
182         struct v4l2_subdev *subdev;
183         struct media_entity *entity;
184
185         subdev = tegra_channel_get_remote_csi_subdev(chan);
186         if (!subdev)
187                 return NULL;
188
189         pad = &subdev->entity.pads[0];
190         while (!(pad->flags & MEDIA_PAD_FL_SOURCE)) {
191                 pad = media_pad_remote_pad_first(pad);
192                 if (!pad || !is_media_entity_v4l2_subdev(pad->entity))
193                         break;
194                 entity = pad->entity;
195                 pad = &entity->pads[0];
196                 subdev = media_entity_to_v4l2_subdev(entity);
197         }
198
199         return subdev;
200 }
201
202 static int tegra_channel_enable_stream(struct tegra_vi_channel *chan)
203 {
204         struct v4l2_subdev *subdev;
205         int ret;
206
207         subdev = tegra_channel_get_remote_csi_subdev(chan);
208         ret = v4l2_subdev_call(subdev, video, s_stream, true);
209         if (ret < 0 && ret != -ENOIOCTLCMD)
210                 return ret;
211
212         return 0;
213 }
214
215 static int tegra_channel_disable_stream(struct tegra_vi_channel *chan)
216 {
217         struct v4l2_subdev *subdev;
218         int ret;
219
220         subdev = tegra_channel_get_remote_csi_subdev(chan);
221         ret = v4l2_subdev_call(subdev, video, s_stream, false);
222         if (ret < 0 && ret != -ENOIOCTLCMD)
223                 return ret;
224
225         return 0;
226 }
227
228 int tegra_channel_set_stream(struct tegra_vi_channel *chan, bool on)
229 {
230         int ret;
231
232         if (on)
233                 ret = tegra_channel_enable_stream(chan);
234         else
235                 ret = tegra_channel_disable_stream(chan);
236
237         return ret;
238 }
239
240 void tegra_channel_release_buffers(struct tegra_vi_channel *chan,
241                                    enum vb2_buffer_state state)
242 {
243         struct tegra_channel_buffer *buf, *nbuf;
244
245         spin_lock(&chan->start_lock);
246         list_for_each_entry_safe(buf, nbuf, &chan->capture, queue) {
247                 vb2_buffer_done(&buf->buf.vb2_buf, state);
248                 list_del(&buf->queue);
249         }
250         spin_unlock(&chan->start_lock);
251
252         spin_lock(&chan->done_lock);
253         list_for_each_entry_safe(buf, nbuf, &chan->done, queue) {
254                 vb2_buffer_done(&buf->buf.vb2_buf, state);
255                 list_del(&buf->queue);
256         }
257         spin_unlock(&chan->done_lock);
258 }
259
260 static int tegra_channel_start_streaming(struct vb2_queue *vq, u32 count)
261 {
262         struct tegra_vi_channel *chan = vb2_get_drv_priv(vq);
263         int ret;
264
265         ret = pm_runtime_resume_and_get(chan->vi->dev);
266         if (ret < 0) {
267                 dev_err(chan->vi->dev, "failed to get runtime PM: %d\n", ret);
268                 return ret;
269         }
270
271         ret = chan->vi->ops->vi_start_streaming(vq, count);
272         if (ret < 0)
273                 pm_runtime_put(chan->vi->dev);
274
275         return ret;
276 }
277
278 static void tegra_channel_stop_streaming(struct vb2_queue *vq)
279 {
280         struct tegra_vi_channel *chan = vb2_get_drv_priv(vq);
281
282         chan->vi->ops->vi_stop_streaming(vq);
283         pm_runtime_put(chan->vi->dev);
284 }
285
286 static const struct vb2_ops tegra_channel_queue_qops = {
287         .queue_setup = tegra_channel_queue_setup,
288         .buf_prepare = tegra_channel_buffer_prepare,
289         .buf_queue = tegra_channel_buffer_queue,
290         .wait_prepare = vb2_ops_wait_prepare,
291         .wait_finish = vb2_ops_wait_finish,
292         .start_streaming = tegra_channel_start_streaming,
293         .stop_streaming = tegra_channel_stop_streaming,
294 };
295
296 /*
297  * V4L2 ioctl operations
298  */
299 static int tegra_channel_querycap(struct file *file, void *fh,
300                                   struct v4l2_capability *cap)
301 {
302         struct tegra_vi_channel *chan = video_drvdata(file);
303
304         strscpy(cap->driver, "tegra-video", sizeof(cap->driver));
305         strscpy(cap->card, chan->video.name, sizeof(cap->card));
306         snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s",
307                  dev_name(chan->vi->dev));
308
309         return 0;
310 }
311
312 static int tegra_channel_g_parm(struct file *file, void *fh,
313                                 struct v4l2_streamparm *a)
314 {
315         struct tegra_vi_channel *chan = video_drvdata(file);
316         struct v4l2_subdev *subdev;
317
318         subdev = tegra_channel_get_remote_source_subdev(chan);
319         return v4l2_g_parm_cap(&chan->video, subdev, a);
320 }
321
322 static int tegra_channel_s_parm(struct file *file, void *fh,
323                                 struct v4l2_streamparm *a)
324 {
325         struct tegra_vi_channel *chan = video_drvdata(file);
326         struct v4l2_subdev *subdev;
327
328         subdev = tegra_channel_get_remote_source_subdev(chan);
329         return v4l2_s_parm_cap(&chan->video, subdev, a);
330 }
331
332 static int tegra_channel_enum_framesizes(struct file *file, void *fh,
333                                          struct v4l2_frmsizeenum *sizes)
334 {
335         int ret;
336         struct tegra_vi_channel *chan = video_drvdata(file);
337         struct v4l2_subdev *subdev;
338         const struct tegra_video_format *fmtinfo;
339         struct v4l2_subdev_frame_size_enum fse = {
340                 .index = sizes->index,
341                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
342         };
343
344         fmtinfo = tegra_get_format_by_fourcc(chan->vi, sizes->pixel_format);
345         if (!fmtinfo)
346                 return -EINVAL;
347
348         fse.code = fmtinfo->code;
349
350         subdev = tegra_channel_get_remote_source_subdev(chan);
351         ret = v4l2_subdev_call(subdev, pad, enum_frame_size, NULL, &fse);
352         if (ret)
353                 return ret;
354
355         sizes->type = V4L2_FRMSIZE_TYPE_DISCRETE;
356         sizes->discrete.width = fse.max_width;
357         sizes->discrete.height = fse.max_height;
358
359         return 0;
360 }
361
362 static int tegra_channel_enum_frameintervals(struct file *file, void *fh,
363                                              struct v4l2_frmivalenum *ivals)
364 {
365         int ret;
366         struct tegra_vi_channel *chan = video_drvdata(file);
367         struct v4l2_subdev *subdev;
368         const struct tegra_video_format *fmtinfo;
369         struct v4l2_subdev_frame_interval_enum fie = {
370                 .index = ivals->index,
371                 .width = ivals->width,
372                 .height = ivals->height,
373                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
374         };
375
376         fmtinfo = tegra_get_format_by_fourcc(chan->vi, ivals->pixel_format);
377         if (!fmtinfo)
378                 return -EINVAL;
379
380         fie.code = fmtinfo->code;
381
382         subdev = tegra_channel_get_remote_source_subdev(chan);
383         ret = v4l2_subdev_call(subdev, pad, enum_frame_interval, NULL, &fie);
384         if (ret)
385                 return ret;
386
387         ivals->type = V4L2_FRMIVAL_TYPE_DISCRETE;
388         ivals->discrete.numerator = fie.interval.numerator;
389         ivals->discrete.denominator = fie.interval.denominator;
390
391         return 0;
392 }
393
394 static int tegra_channel_enum_format(struct file *file, void *fh,
395                                      struct v4l2_fmtdesc *f)
396 {
397         struct tegra_vi_channel *chan = video_drvdata(file);
398         unsigned int index = 0, i;
399         unsigned long *fmts_bitmap = chan->tpg_fmts_bitmap;
400
401         if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG))
402                 fmts_bitmap = chan->fmts_bitmap;
403
404         if (f->index >= bitmap_weight(fmts_bitmap, MAX_FORMAT_NUM))
405                 return -EINVAL;
406
407         for (i = 0; i < f->index + 1; i++, index++)
408                 index = find_next_bit(fmts_bitmap, MAX_FORMAT_NUM, index);
409
410         f->pixelformat = tegra_get_format_fourcc_by_idx(chan->vi, index - 1);
411
412         return 0;
413 }
414
415 static int tegra_channel_get_format(struct file *file, void *fh,
416                                     struct v4l2_format *format)
417 {
418         struct tegra_vi_channel *chan = video_drvdata(file);
419
420         format->fmt.pix = chan->format;
421
422         return 0;
423 }
424
425 static int __tegra_channel_try_format(struct tegra_vi_channel *chan,
426                                       struct v4l2_pix_format *pix)
427 {
428         const struct tegra_video_format *fmtinfo;
429         static struct lock_class_key key;
430         struct v4l2_subdev *subdev;
431         struct v4l2_subdev_format fmt = {
432                 .which = V4L2_SUBDEV_FORMAT_TRY,
433         };
434         struct v4l2_subdev_state *sd_state;
435         struct v4l2_subdev_frame_size_enum fse = {
436                 .which = V4L2_SUBDEV_FORMAT_TRY,
437         };
438         struct v4l2_subdev_selection sdsel = {
439                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
440                 .target = V4L2_SEL_TGT_CROP_BOUNDS,
441         };
442         struct v4l2_rect *try_crop;
443         int ret;
444
445         subdev = tegra_channel_get_remote_source_subdev(chan);
446         if (!subdev)
447                 return -ENODEV;
448
449         /*
450          * FIXME: Drop this call, drivers are not supposed to use
451          * __v4l2_subdev_state_alloc().
452          */
453         sd_state = __v4l2_subdev_state_alloc(subdev, "tegra:state->lock",
454                                              &key);
455         if (IS_ERR(sd_state))
456                 return PTR_ERR(sd_state);
457         /*
458          * Retrieve the format information and if requested format isn't
459          * supported, keep the current format.
460          */
461         fmtinfo = tegra_get_format_by_fourcc(chan->vi, pix->pixelformat);
462         if (!fmtinfo) {
463                 pix->pixelformat = chan->format.pixelformat;
464                 pix->colorspace = chan->format.colorspace;
465                 fmtinfo = tegra_get_format_by_fourcc(chan->vi,
466                                                      pix->pixelformat);
467         }
468
469         pix->field = V4L2_FIELD_NONE;
470         fmt.pad = 0;
471         v4l2_fill_mbus_format(&fmt.format, pix, fmtinfo->code);
472
473         /*
474          * Attempt to obtain the format size from subdev.
475          * If not available, try to get crop boundary from subdev.
476          */
477         try_crop = v4l2_subdev_state_get_crop(sd_state, 0);
478         fse.code = fmtinfo->code;
479         ret = v4l2_subdev_call(subdev, pad, enum_frame_size, sd_state, &fse);
480         if (ret) {
481                 if (!v4l2_subdev_has_op(subdev, pad, get_selection)) {
482                         try_crop->width = 0;
483                         try_crop->height = 0;
484                 } else {
485                         ret = v4l2_subdev_call(subdev, pad, get_selection,
486                                                NULL, &sdsel);
487                         if (ret)
488                                 return -EINVAL;
489
490                         try_crop->width = sdsel.r.width;
491                         try_crop->height = sdsel.r.height;
492                 }
493         } else {
494                 try_crop->width = fse.max_width;
495                 try_crop->height = fse.max_height;
496         }
497
498         ret = v4l2_subdev_call(subdev, pad, set_fmt, sd_state, &fmt);
499         if (ret < 0)
500                 return ret;
501
502         v4l2_fill_pix_format(pix, &fmt.format);
503         chan->vi->ops->vi_fmt_align(pix, fmtinfo->bpp);
504
505         __v4l2_subdev_state_free(sd_state);
506
507         return 0;
508 }
509
510 static int tegra_channel_try_format(struct file *file, void *fh,
511                                     struct v4l2_format *format)
512 {
513         struct tegra_vi_channel *chan = video_drvdata(file);
514
515         return __tegra_channel_try_format(chan, &format->fmt.pix);
516 }
517
518 static void tegra_channel_update_gangports(struct tegra_vi_channel *chan)
519 {
520         if (chan->format.width <= 1920)
521                 chan->numgangports = 1;
522         else
523                 chan->numgangports = chan->totalports;
524 }
525
526 static int tegra_channel_set_format(struct file *file, void *fh,
527                                     struct v4l2_format *format)
528 {
529         struct tegra_vi_channel *chan = video_drvdata(file);
530         const struct tegra_video_format *fmtinfo;
531         struct v4l2_subdev_format fmt = {
532                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
533         };
534         struct v4l2_subdev *subdev;
535         struct v4l2_pix_format *pix = &format->fmt.pix;
536         int ret;
537
538         if (vb2_is_busy(&chan->queue))
539                 return -EBUSY;
540
541         /* get supported format by try_fmt */
542         ret = __tegra_channel_try_format(chan, pix);
543         if (ret)
544                 return ret;
545
546         fmtinfo = tegra_get_format_by_fourcc(chan->vi, pix->pixelformat);
547
548         fmt.pad = 0;
549         v4l2_fill_mbus_format(&fmt.format, pix, fmtinfo->code);
550         subdev = tegra_channel_get_remote_source_subdev(chan);
551         ret = v4l2_subdev_call(subdev, pad, set_fmt, NULL, &fmt);
552         if (ret < 0)
553                 return ret;
554
555         v4l2_fill_pix_format(pix, &fmt.format);
556         chan->vi->ops->vi_fmt_align(pix, fmtinfo->bpp);
557
558         chan->format = *pix;
559         chan->fmtinfo = fmtinfo;
560         tegra_channel_update_gangports(chan);
561
562         return 0;
563 }
564
565 static int tegra_channel_set_subdev_active_fmt(struct tegra_vi_channel *chan)
566 {
567         int ret, index;
568         struct v4l2_subdev *subdev;
569         struct v4l2_subdev_format fmt = {
570                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
571         };
572
573         /*
574          * Initialize channel format to the sub-device active format if there
575          * is corresponding match in the Tegra supported video formats.
576          */
577         subdev = tegra_channel_get_remote_source_subdev(chan);
578         ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);
579         if (ret)
580                 return ret;
581
582         index = tegra_get_format_idx_by_code(chan->vi, fmt.format.code, 0);
583         if (index < 0)
584                 return -EINVAL;
585
586         chan->fmtinfo = &chan->vi->soc->video_formats[index];
587         v4l2_fill_pix_format(&chan->format, &fmt.format);
588         chan->format.pixelformat = chan->fmtinfo->fourcc;
589         chan->format.bytesperline = chan->format.width * chan->fmtinfo->bpp;
590         chan->format.sizeimage = chan->format.bytesperline *
591                                  chan->format.height;
592         chan->vi->ops->vi_fmt_align(&chan->format, chan->fmtinfo->bpp);
593         tegra_channel_update_gangports(chan);
594
595         return 0;
596 }
597
598 static int
599 tegra_channel_subscribe_event(struct v4l2_fh *fh,
600                               const struct v4l2_event_subscription *sub)
601 {
602         switch (sub->type) {
603         case V4L2_EVENT_SOURCE_CHANGE:
604                 return v4l2_event_subscribe(fh, sub, 4, NULL);
605         }
606
607         return v4l2_ctrl_subscribe_event(fh, sub);
608 }
609
610 static int tegra_channel_g_selection(struct file *file, void *priv,
611                                      struct v4l2_selection *sel)
612 {
613         struct tegra_vi_channel *chan = video_drvdata(file);
614         struct v4l2_subdev *subdev;
615         struct v4l2_subdev_format fmt = {
616                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
617         };
618         struct v4l2_subdev_selection sdsel = {
619                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
620                 .target = sel->target,
621         };
622         int ret;
623
624         subdev = tegra_channel_get_remote_source_subdev(chan);
625         if (!v4l2_subdev_has_op(subdev, pad, get_selection))
626                 return -ENOTTY;
627
628         if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
629                 return -EINVAL;
630         /*
631          * Try the get selection operation and fallback to get format if not
632          * implemented.
633          */
634         ret = v4l2_subdev_call(subdev, pad, get_selection, NULL, &sdsel);
635         if (!ret)
636                 sel->r = sdsel.r;
637         if (ret != -ENOIOCTLCMD)
638                 return ret;
639
640         ret = v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);
641         if (ret < 0)
642                 return ret;
643
644         sel->r.left = 0;
645         sel->r.top = 0;
646         sel->r.width = fmt.format.width;
647         sel->r.height = fmt.format.height;
648
649         return 0;
650 }
651
652 static int tegra_channel_s_selection(struct file *file, void *fh,
653                                      struct v4l2_selection *sel)
654 {
655         struct tegra_vi_channel *chan = video_drvdata(file);
656         struct v4l2_subdev *subdev;
657         int ret;
658         struct v4l2_subdev_selection sdsel = {
659                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
660                 .target = sel->target,
661                 .flags = sel->flags,
662                 .r = sel->r,
663         };
664
665         subdev = tegra_channel_get_remote_source_subdev(chan);
666         if (!v4l2_subdev_has_op(subdev, pad, set_selection))
667                 return -ENOTTY;
668
669         if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
670                 return -EINVAL;
671
672         if (vb2_is_busy(&chan->queue))
673                 return -EBUSY;
674
675         ret = v4l2_subdev_call(subdev, pad, set_selection, NULL, &sdsel);
676         if (!ret) {
677                 sel->r = sdsel.r;
678                 /*
679                  * Subdev active format resolution may have changed during
680                  * set selection operation. So, update channel format to
681                  * the sub-device active format.
682                  */
683                 return tegra_channel_set_subdev_active_fmt(chan);
684         }
685
686         return ret;
687 }
688
689 static int tegra_channel_g_edid(struct file *file, void *fh,
690                                 struct v4l2_edid *edid)
691 {
692         struct tegra_vi_channel *chan = video_drvdata(file);
693         struct v4l2_subdev *subdev;
694
695         subdev = tegra_channel_get_remote_source_subdev(chan);
696         if (!v4l2_subdev_has_op(subdev, pad, get_edid))
697                 return -ENOTTY;
698
699         return v4l2_subdev_call(subdev, pad, get_edid, edid);
700 }
701
702 static int tegra_channel_s_edid(struct file *file, void *fh,
703                                 struct v4l2_edid *edid)
704 {
705         struct tegra_vi_channel *chan = video_drvdata(file);
706         struct v4l2_subdev *subdev;
707
708         subdev = tegra_channel_get_remote_source_subdev(chan);
709         if (!v4l2_subdev_has_op(subdev, pad, set_edid))
710                 return -ENOTTY;
711
712         return v4l2_subdev_call(subdev, pad, set_edid, edid);
713 }
714
715 static int tegra_channel_g_dv_timings(struct file *file, void *fh,
716                                       struct v4l2_dv_timings *timings)
717 {
718         struct tegra_vi_channel *chan = video_drvdata(file);
719         struct v4l2_subdev *subdev;
720
721         subdev = tegra_channel_get_remote_source_subdev(chan);
722         if (!v4l2_subdev_has_op(subdev, video, g_dv_timings))
723                 return -ENOTTY;
724
725         return v4l2_device_call_until_err(chan->video.v4l2_dev, 0,
726                                           video, g_dv_timings, timings);
727 }
728
729 static int tegra_channel_s_dv_timings(struct file *file, void *fh,
730                                       struct v4l2_dv_timings *timings)
731 {
732         struct tegra_vi_channel *chan = video_drvdata(file);
733         struct v4l2_subdev *subdev;
734         struct v4l2_bt_timings *bt = &timings->bt;
735         struct v4l2_dv_timings curr_timings;
736         int ret;
737
738         subdev = tegra_channel_get_remote_source_subdev(chan);
739         if (!v4l2_subdev_has_op(subdev, video, s_dv_timings))
740                 return -ENOTTY;
741
742         ret = tegra_channel_g_dv_timings(file, fh, &curr_timings);
743         if (ret)
744                 return ret;
745
746         if (v4l2_match_dv_timings(timings, &curr_timings, 0, false))
747                 return 0;
748
749         if (vb2_is_busy(&chan->queue))
750                 return -EBUSY;
751
752         ret = v4l2_device_call_until_err(chan->video.v4l2_dev, 0,
753                                          video, s_dv_timings, timings);
754         if (ret)
755                 return ret;
756
757         chan->format.width = bt->width;
758         chan->format.height = bt->height;
759         chan->format.bytesperline = bt->width * chan->fmtinfo->bpp;
760         chan->format.sizeimage = chan->format.bytesperline * bt->height;
761         chan->vi->ops->vi_fmt_align(&chan->format, chan->fmtinfo->bpp);
762         tegra_channel_update_gangports(chan);
763
764         return 0;
765 }
766
767 static int tegra_channel_query_dv_timings(struct file *file, void *fh,
768                                           struct v4l2_dv_timings *timings)
769 {
770         struct tegra_vi_channel *chan = video_drvdata(file);
771         struct v4l2_subdev *subdev;
772
773         subdev = tegra_channel_get_remote_source_subdev(chan);
774         if (!v4l2_subdev_has_op(subdev, video, query_dv_timings))
775                 return -ENOTTY;
776
777         return v4l2_device_call_until_err(chan->video.v4l2_dev, 0,
778                                           video, query_dv_timings, timings);
779 }
780
781 static int tegra_channel_enum_dv_timings(struct file *file, void *fh,
782                                          struct v4l2_enum_dv_timings *timings)
783 {
784         struct tegra_vi_channel *chan = video_drvdata(file);
785         struct v4l2_subdev *subdev;
786
787         subdev = tegra_channel_get_remote_source_subdev(chan);
788         if (!v4l2_subdev_has_op(subdev, pad, enum_dv_timings))
789                 return -ENOTTY;
790
791         return v4l2_subdev_call(subdev, pad, enum_dv_timings, timings);
792 }
793
794 static int tegra_channel_dv_timings_cap(struct file *file, void *fh,
795                                         struct v4l2_dv_timings_cap *cap)
796 {
797         struct tegra_vi_channel *chan = video_drvdata(file);
798         struct v4l2_subdev *subdev;
799
800         subdev = tegra_channel_get_remote_source_subdev(chan);
801         if (!v4l2_subdev_has_op(subdev, pad, dv_timings_cap))
802                 return -ENOTTY;
803
804         return v4l2_subdev_call(subdev, pad, dv_timings_cap, cap);
805 }
806
807 static int tegra_channel_log_status(struct file *file, void *fh)
808 {
809         struct tegra_vi_channel *chan = video_drvdata(file);
810
811         v4l2_device_call_all(chan->video.v4l2_dev, 0, core, log_status);
812
813         return 0;
814 }
815
816 static int tegra_channel_enum_input(struct file *file, void *fh,
817                                     struct v4l2_input *inp)
818 {
819         struct tegra_vi_channel *chan = video_drvdata(file);
820         struct v4l2_subdev *subdev;
821
822         if (inp->index)
823                 return -EINVAL;
824
825         inp->type = V4L2_INPUT_TYPE_CAMERA;
826         subdev = tegra_channel_get_remote_source_subdev(chan);
827         strscpy(inp->name, subdev->name, sizeof(inp->name));
828         if (v4l2_subdev_has_op(subdev, pad, dv_timings_cap))
829                 inp->capabilities = V4L2_IN_CAP_DV_TIMINGS;
830
831         return 0;
832 }
833
834 static int tegra_channel_g_input(struct file *file, void *priv,
835                                  unsigned int *i)
836 {
837         *i = 0;
838
839         return 0;
840 }
841
842 static int tegra_channel_s_input(struct file *file, void *priv,
843                                  unsigned int input)
844 {
845         if (input > 0)
846                 return -EINVAL;
847
848         return 0;
849 }
850
851 static const struct v4l2_ioctl_ops tegra_channel_ioctl_ops = {
852         .vidioc_querycap                = tegra_channel_querycap,
853         .vidioc_g_parm                  = tegra_channel_g_parm,
854         .vidioc_s_parm                  = tegra_channel_s_parm,
855         .vidioc_enum_framesizes         = tegra_channel_enum_framesizes,
856         .vidioc_enum_frameintervals     = tegra_channel_enum_frameintervals,
857         .vidioc_enum_fmt_vid_cap        = tegra_channel_enum_format,
858         .vidioc_g_fmt_vid_cap           = tegra_channel_get_format,
859         .vidioc_s_fmt_vid_cap           = tegra_channel_set_format,
860         .vidioc_try_fmt_vid_cap         = tegra_channel_try_format,
861         .vidioc_enum_input              = tegra_channel_enum_input,
862         .vidioc_g_input                 = tegra_channel_g_input,
863         .vidioc_s_input                 = tegra_channel_s_input,
864         .vidioc_reqbufs                 = vb2_ioctl_reqbufs,
865         .vidioc_prepare_buf             = vb2_ioctl_prepare_buf,
866         .vidioc_querybuf                = vb2_ioctl_querybuf,
867         .vidioc_qbuf                    = vb2_ioctl_qbuf,
868         .vidioc_dqbuf                   = vb2_ioctl_dqbuf,
869         .vidioc_create_bufs             = vb2_ioctl_create_bufs,
870         .vidioc_expbuf                  = vb2_ioctl_expbuf,
871         .vidioc_streamon                = vb2_ioctl_streamon,
872         .vidioc_streamoff               = vb2_ioctl_streamoff,
873         .vidioc_subscribe_event         = tegra_channel_subscribe_event,
874         .vidioc_unsubscribe_event       = v4l2_event_unsubscribe,
875         .vidioc_g_selection             = tegra_channel_g_selection,
876         .vidioc_s_selection             = tegra_channel_s_selection,
877         .vidioc_g_edid                  = tegra_channel_g_edid,
878         .vidioc_s_edid                  = tegra_channel_s_edid,
879         .vidioc_g_dv_timings            = tegra_channel_g_dv_timings,
880         .vidioc_s_dv_timings            = tegra_channel_s_dv_timings,
881         .vidioc_query_dv_timings        = tegra_channel_query_dv_timings,
882         .vidioc_enum_dv_timings         = tegra_channel_enum_dv_timings,
883         .vidioc_dv_timings_cap          = tegra_channel_dv_timings_cap,
884         .vidioc_log_status              = tegra_channel_log_status,
885 };
886
887 /*
888  * V4L2 file operations
889  */
890 static const struct v4l2_file_operations tegra_channel_fops = {
891         .owner          = THIS_MODULE,
892         .unlocked_ioctl = video_ioctl2,
893         .open           = v4l2_fh_open,
894         .release        = vb2_fop_release,
895         .read           = vb2_fop_read,
896         .poll           = vb2_fop_poll,
897         .mmap           = vb2_fop_mmap,
898 };
899
900 /*
901  * V4L2 control operations
902  */
903 static int vi_s_ctrl(struct v4l2_ctrl *ctrl)
904 {
905         struct tegra_vi_channel *chan = container_of(ctrl->handler,
906                                                      struct tegra_vi_channel,
907                                                      ctrl_handler);
908
909         switch (ctrl->id) {
910         case V4L2_CID_TEST_PATTERN:
911                 /* pattern change takes effect on next stream */
912                 chan->pg_mode = ctrl->val + 1;
913                 break;
914         case V4L2_CID_TEGRA_SYNCPT_TIMEOUT_RETRY:
915                 chan->syncpt_timeout_retry = ctrl->val;
916                 break;
917         case V4L2_CID_HFLIP:
918                 chan->hflip = ctrl->val;
919                 break;
920         case V4L2_CID_VFLIP:
921                 chan->vflip = ctrl->val;
922                 break;
923         default:
924                 return -EINVAL;
925         }
926
927         return 0;
928 }
929
930 static const struct v4l2_ctrl_ops vi_ctrl_ops = {
931         .s_ctrl = vi_s_ctrl,
932 };
933
934 #if IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)
935 static const char *const vi_pattern_strings[] = {
936         "Black/White Direct Mode",
937         "Color Patch Mode",
938 };
939 #else
940 static const struct v4l2_ctrl_config syncpt_timeout_ctrl = {
941         .ops = &vi_ctrl_ops,
942         .id = V4L2_CID_TEGRA_SYNCPT_TIMEOUT_RETRY,
943         .name = "Syncpt timeout retry",
944         .type = V4L2_CTRL_TYPE_INTEGER,
945         .min = 1,
946         .max = 10000,
947         .step = 1,
948         .def = 5,
949 };
950 #endif
951
952 static int tegra_channel_setup_ctrl_handler(struct tegra_vi_channel *chan)
953 {
954         int ret;
955
956 #if IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)
957         /* add test pattern control handler to v4l2 device */
958         v4l2_ctrl_new_std_menu_items(&chan->ctrl_handler, &vi_ctrl_ops,
959                                      V4L2_CID_TEST_PATTERN,
960                                      ARRAY_SIZE(vi_pattern_strings) - 1,
961                                      0, 0, vi_pattern_strings);
962         if (chan->ctrl_handler.error) {
963                 dev_err(chan->vi->dev, "failed to add TPG ctrl handler: %d\n",
964                         chan->ctrl_handler.error);
965                 v4l2_ctrl_handler_free(&chan->ctrl_handler);
966                 return chan->ctrl_handler.error;
967         }
968 #else
969         struct v4l2_subdev *subdev;
970
971         /* custom control */
972         v4l2_ctrl_new_custom(&chan->ctrl_handler, &syncpt_timeout_ctrl, NULL);
973         if (chan->ctrl_handler.error) {
974                 dev_err(chan->vi->dev, "failed to add %s ctrl handler: %d\n",
975                         syncpt_timeout_ctrl.name,
976                         chan->ctrl_handler.error);
977                 v4l2_ctrl_handler_free(&chan->ctrl_handler);
978                 return chan->ctrl_handler.error;
979         }
980
981         subdev = tegra_channel_get_remote_source_subdev(chan);
982         if (!subdev)
983                 return -ENODEV;
984
985         ret = v4l2_ctrl_add_handler(&chan->ctrl_handler, subdev->ctrl_handler,
986                                     NULL, true);
987         if (ret < 0) {
988                 dev_err(chan->vi->dev,
989                         "failed to add subdev %s ctrl handler: %d\n",
990                         subdev->name, ret);
991                 v4l2_ctrl_handler_free(&chan->ctrl_handler);
992                 return ret;
993         }
994
995         if (chan->vi->soc->has_h_v_flip) {
996                 v4l2_ctrl_new_std(&chan->ctrl_handler, &vi_ctrl_ops, V4L2_CID_HFLIP, 0, 1, 1, 0);
997                 v4l2_ctrl_new_std(&chan->ctrl_handler, &vi_ctrl_ops, V4L2_CID_VFLIP, 0, 1, 1, 0);
998         }
999
1000 #endif
1001
1002         /* setup the controls */
1003         ret = v4l2_ctrl_handler_setup(&chan->ctrl_handler);
1004         if (ret < 0) {
1005                 dev_err(chan->vi->dev,
1006                         "failed to setup v4l2 ctrl handler: %d\n", ret);
1007                 return ret;
1008         }
1009
1010         return 0;
1011 }
1012
1013 /* VI only support 2 formats in TPG mode */
1014 static void vi_tpg_fmts_bitmap_init(struct tegra_vi_channel *chan)
1015 {
1016         int index;
1017
1018         bitmap_zero(chan->tpg_fmts_bitmap, MAX_FORMAT_NUM);
1019
1020         index = tegra_get_format_idx_by_code(chan->vi,
1021                                              MEDIA_BUS_FMT_SRGGB10_1X10, 0);
1022         bitmap_set(chan->tpg_fmts_bitmap, index, 1);
1023
1024         index = tegra_get_format_idx_by_code(chan->vi,
1025                                              MEDIA_BUS_FMT_RGB888_1X32_PADHI,
1026                                              0);
1027         bitmap_set(chan->tpg_fmts_bitmap, index, 1);
1028 }
1029
1030 static int vi_fmts_bitmap_init(struct tegra_vi_channel *chan)
1031 {
1032         int index, ret, match_code = 0;
1033         struct v4l2_subdev *subdev;
1034         struct v4l2_subdev_mbus_code_enum code = {
1035                 .which = V4L2_SUBDEV_FORMAT_ACTIVE,
1036         };
1037
1038         bitmap_zero(chan->fmts_bitmap, MAX_FORMAT_NUM);
1039
1040         /*
1041          * Set the bitmap bits based on all the matched formats between the
1042          * available media bus formats of sub-device and the pre-defined Tegra
1043          * supported video formats.
1044          */
1045         subdev = tegra_channel_get_remote_source_subdev(chan);
1046         while (1) {
1047                 ret = v4l2_subdev_call(subdev, pad, enum_mbus_code,
1048                                        NULL, &code);
1049                 if (ret < 0)
1050                         break;
1051
1052                 index = tegra_get_format_idx_by_code(chan->vi, code.code, 0);
1053                 while (index >= 0) {
1054                         bitmap_set(chan->fmts_bitmap, index, 1);
1055                         if (!match_code)
1056                                 match_code = code.code;
1057                         /* look for other formats with same mbus code */
1058                         index = tegra_get_format_idx_by_code(chan->vi,
1059                                                              code.code,
1060                                                              index + 1);
1061                 }
1062
1063                 code.index++;
1064         }
1065
1066         /*
1067          * Set the bitmap bit corresponding to default tegra video format if
1068          * there are no matched formats.
1069          */
1070         if (!match_code) {
1071                 match_code = chan->vi->soc->default_video_format->code;
1072                 index = tegra_get_format_idx_by_code(chan->vi, match_code, 0);
1073                 if (WARN_ON(index < 0))
1074                         return -EINVAL;
1075
1076                 bitmap_set(chan->fmts_bitmap, index, 1);
1077         }
1078
1079         /* initialize channel format to the sub-device active format */
1080         tegra_channel_set_subdev_active_fmt(chan);
1081
1082         return 0;
1083 }
1084
1085 static void tegra_channel_cleanup(struct tegra_vi_channel *chan)
1086 {
1087         v4l2_ctrl_handler_free(&chan->ctrl_handler);
1088         media_entity_cleanup(&chan->video.entity);
1089         chan->vi->ops->channel_host1x_syncpt_free(chan);
1090         mutex_destroy(&chan->video_lock);
1091 }
1092
1093 void tegra_channels_cleanup(struct tegra_vi *vi)
1094 {
1095         struct tegra_vi_channel *chan, *tmp;
1096
1097         if (!vi)
1098                 return;
1099
1100         list_for_each_entry_safe(chan, tmp, &vi->vi_chans, list) {
1101                 tegra_channel_cleanup(chan);
1102                 list_del(&chan->list);
1103                 kfree(chan);
1104         }
1105 }
1106
1107 static int tegra_channel_init(struct tegra_vi_channel *chan)
1108 {
1109         struct tegra_vi *vi = chan->vi;
1110         struct tegra_video_device *vid = dev_get_drvdata(vi->client.host);
1111         int ret;
1112
1113         mutex_init(&chan->video_lock);
1114         INIT_LIST_HEAD(&chan->capture);
1115         INIT_LIST_HEAD(&chan->done);
1116         spin_lock_init(&chan->start_lock);
1117         spin_lock_init(&chan->done_lock);
1118         init_waitqueue_head(&chan->start_wait);
1119         init_waitqueue_head(&chan->done_wait);
1120
1121         /* initialize the video format */
1122         chan->fmtinfo = chan->vi->soc->default_video_format;
1123         chan->format.pixelformat = chan->fmtinfo->fourcc;
1124         chan->format.colorspace = V4L2_COLORSPACE_SRGB;
1125         chan->format.field = V4L2_FIELD_NONE;
1126         chan->format.width = TEGRA_DEF_WIDTH;
1127         chan->format.height = TEGRA_DEF_HEIGHT;
1128         chan->format.bytesperline = TEGRA_DEF_WIDTH * chan->fmtinfo->bpp;
1129         chan->format.sizeimage = chan->format.bytesperline * TEGRA_DEF_HEIGHT;
1130         vi->ops->vi_fmt_align(&chan->format, chan->fmtinfo->bpp);
1131
1132         ret = vi->ops->channel_host1x_syncpt_init(chan);
1133         if (ret)
1134                 return ret;
1135
1136         /* initialize the media entity */
1137         chan->pad.flags = MEDIA_PAD_FL_SINK;
1138         ret = media_entity_pads_init(&chan->video.entity, 1, &chan->pad);
1139         if (ret < 0) {
1140                 dev_err(vi->dev,
1141                         "failed to initialize media entity: %d\n", ret);
1142                 goto free_syncpts;
1143         }
1144
1145         ret = v4l2_ctrl_handler_init(&chan->ctrl_handler, MAX_CID_CONTROLS);
1146         if (chan->ctrl_handler.error) {
1147                 dev_err(vi->dev,
1148                         "failed to initialize v4l2 ctrl handler: %d\n", ret);
1149                 goto cleanup_media;
1150         }
1151
1152         /* initialize the video_device */
1153         chan->video.fops = &tegra_channel_fops;
1154         chan->video.v4l2_dev = &vid->v4l2_dev;
1155         chan->video.release = video_device_release_empty;
1156         chan->video.queue = &chan->queue;
1157         snprintf(chan->video.name, sizeof(chan->video.name), "%s-%s-%u",
1158                  dev_name(vi->dev), "output", chan->portnos[0]);
1159         chan->video.vfl_type = VFL_TYPE_VIDEO;
1160         chan->video.vfl_dir = VFL_DIR_RX;
1161         chan->video.ioctl_ops = &tegra_channel_ioctl_ops;
1162         chan->video.ctrl_handler = &chan->ctrl_handler;
1163         chan->video.lock = &chan->video_lock;
1164         chan->video.device_caps = V4L2_CAP_VIDEO_CAPTURE |
1165                                   V4L2_CAP_STREAMING |
1166                                   V4L2_CAP_READWRITE;
1167         video_set_drvdata(&chan->video, chan);
1168
1169         chan->queue.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1170         chan->queue.io_modes = VB2_MMAP | VB2_DMABUF | VB2_READ;
1171         chan->queue.lock = &chan->video_lock;
1172         chan->queue.drv_priv = chan;
1173         chan->queue.buf_struct_size = sizeof(struct tegra_channel_buffer);
1174         chan->queue.ops = &tegra_channel_queue_qops;
1175         chan->queue.mem_ops = &vb2_dma_contig_memops;
1176         chan->queue.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
1177         chan->queue.min_queued_buffers = 2;
1178         chan->queue.dev = vi->dev;
1179         ret = vb2_queue_init(&chan->queue);
1180         if (ret < 0) {
1181                 dev_err(vi->dev, "failed to initialize vb2 queue: %d\n", ret);
1182                 goto free_v4l2_ctrl_hdl;
1183         }
1184
1185         if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG))
1186                 v4l2_async_nf_init(&chan->notifier, &vid->v4l2_dev);
1187
1188         return 0;
1189
1190 free_v4l2_ctrl_hdl:
1191         v4l2_ctrl_handler_free(&chan->ctrl_handler);
1192 cleanup_media:
1193         media_entity_cleanup(&chan->video.entity);
1194 free_syncpts:
1195         vi->ops->channel_host1x_syncpt_free(chan);
1196         return ret;
1197 }
1198
1199 static int tegra_vi_channel_alloc(struct tegra_vi *vi, unsigned int port_num,
1200                                   struct device_node *node, unsigned int lanes)
1201 {
1202         struct tegra_vi_channel *chan;
1203         unsigned int i;
1204
1205         /*
1206          * Do not use devm_kzalloc as memory is freed immediately
1207          * when device instance is unbound but application might still
1208          * be holding the device node open. Channel memory allocated
1209          * with kzalloc is freed during video device release callback.
1210          */
1211         chan = kzalloc(sizeof(*chan), GFP_KERNEL);
1212         if (!chan)
1213                 return -ENOMEM;
1214
1215         chan->vi = vi;
1216         chan->portnos[0] = port_num;
1217         /*
1218          * For data lanes more than maximum csi lanes per brick, multiple of
1219          * x4 ports are used simultaneously for capture.
1220          */
1221         if (lanes <= CSI_LANES_PER_BRICK)
1222                 chan->totalports = 1;
1223         else
1224                 chan->totalports = lanes / CSI_LANES_PER_BRICK;
1225         chan->numgangports = chan->totalports;
1226
1227         for (i = 1; i < chan->totalports; i++)
1228                 chan->portnos[i] = chan->portnos[0] + i * CSI_PORTS_PER_BRICK;
1229
1230         chan->of_node = node;
1231         list_add_tail(&chan->list, &vi->vi_chans);
1232
1233         return 0;
1234 }
1235
1236 static int tegra_vi_tpg_channels_alloc(struct tegra_vi *vi)
1237 {
1238         unsigned int port_num;
1239         unsigned int nchannels = vi->soc->vi_max_channels;
1240         int ret;
1241
1242         for (port_num = 0; port_num < nchannels; port_num++) {
1243                 ret = tegra_vi_channel_alloc(vi, port_num,
1244                                              vi->dev->of_node, 2);
1245                 if (ret < 0)
1246                         return ret;
1247         }
1248
1249         return 0;
1250 }
1251
1252 static int tegra_vi_channels_alloc(struct tegra_vi *vi)
1253 {
1254         struct device_node *node = vi->dev->of_node;
1255         struct device_node *ep = NULL;
1256         struct device_node *ports;
1257         struct device_node *port = NULL;
1258         unsigned int port_num;
1259         struct device_node *parent;
1260         struct v4l2_fwnode_endpoint v4l2_ep = { .bus_type = 0 };
1261         unsigned int lanes;
1262         int ret = 0;
1263
1264         ports = of_get_child_by_name(node, "ports");
1265         if (!ports)
1266                 return dev_err_probe(vi->dev, -ENODEV, "%pOF: missing 'ports' node\n", node);
1267
1268         for_each_child_of_node(ports, port) {
1269                 if (!of_node_name_eq(port, "port"))
1270                         continue;
1271
1272                 ret = of_property_read_u32(port, "reg", &port_num);
1273                 if (ret < 0)
1274                         continue;
1275
1276                 if (port_num > vi->soc->vi_max_channels) {
1277                         dev_err(vi->dev, "invalid port num %d for %pOF\n",
1278                                 port_num, port);
1279                         ret = -EINVAL;
1280                         goto cleanup;
1281                 }
1282
1283                 ep = of_get_child_by_name(port, "endpoint");
1284                 if (!ep)
1285                         continue;
1286
1287                 parent = of_graph_get_remote_port_parent(ep);
1288                 of_node_put(ep);
1289                 if (!parent)
1290                         continue;
1291
1292                 ep = of_graph_get_endpoint_by_regs(parent, 0, 0);
1293                 of_node_put(parent);
1294                 ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(ep),
1295                                                  &v4l2_ep);
1296                 of_node_put(ep);
1297                 if (ret)
1298                         continue;
1299
1300                 lanes = v4l2_ep.bus.mipi_csi2.num_data_lanes;
1301                 ret = tegra_vi_channel_alloc(vi, port_num, port, lanes);
1302                 if (ret < 0)
1303                         goto cleanup;
1304         }
1305
1306 cleanup:
1307         of_node_put(port);
1308         of_node_put(ports);
1309         return ret;
1310 }
1311
1312 static int tegra_vi_channels_init(struct tegra_vi *vi)
1313 {
1314         struct tegra_vi_channel *chan;
1315         int ret;
1316
1317         list_for_each_entry(chan, &vi->vi_chans, list) {
1318                 ret = tegra_channel_init(chan);
1319                 if (ret < 0) {
1320                         dev_err(vi->dev,
1321                                 "failed to initialize channel-%d: %d\n",
1322                                 chan->portnos[0], ret);
1323                         goto cleanup;
1324                 }
1325         }
1326
1327         return 0;
1328
1329 cleanup:
1330         list_for_each_entry_continue_reverse(chan, &vi->vi_chans, list)
1331                 tegra_channel_cleanup(chan);
1332
1333         return ret;
1334 }
1335
1336 void tegra_v4l2_nodes_cleanup_tpg(struct tegra_video_device *vid)
1337 {
1338         struct tegra_vi *vi = vid->vi;
1339         struct tegra_csi *csi = vid->csi;
1340         struct tegra_csi_channel *csi_chan;
1341         struct tegra_vi_channel *chan;
1342
1343         list_for_each_entry(chan, &vi->vi_chans, list)
1344                 vb2_video_unregister_device(&chan->video);
1345
1346         list_for_each_entry(csi_chan, &csi->csi_chans, list)
1347                 v4l2_device_unregister_subdev(&csi_chan->subdev);
1348 }
1349
1350 int tegra_v4l2_nodes_setup_tpg(struct tegra_video_device *vid)
1351 {
1352         struct tegra_vi *vi = vid->vi;
1353         struct tegra_csi *csi = vid->csi;
1354         struct tegra_vi_channel *vi_chan;
1355         struct tegra_csi_channel *csi_chan;
1356         u32 link_flags = MEDIA_LNK_FL_ENABLED;
1357         int ret;
1358
1359         if (!vi || !csi)
1360                 return -ENODEV;
1361
1362         csi_chan = list_first_entry(&csi->csi_chans,
1363                                     struct tegra_csi_channel, list);
1364
1365         list_for_each_entry(vi_chan, &vi->vi_chans, list) {
1366                 struct media_entity *source = &csi_chan->subdev.entity;
1367                 struct media_entity *sink = &vi_chan->video.entity;
1368                 struct media_pad *source_pad = csi_chan->pads;
1369                 struct media_pad *sink_pad = &vi_chan->pad;
1370
1371                 ret = v4l2_device_register_subdev(&vid->v4l2_dev,
1372                                                   &csi_chan->subdev);
1373                 if (ret) {
1374                         dev_err(vi->dev,
1375                                 "failed to register subdev: %d\n", ret);
1376                         goto cleanup;
1377                 }
1378
1379                 ret = video_register_device(&vi_chan->video,
1380                                             VFL_TYPE_VIDEO, -1);
1381                 if (ret < 0) {
1382                         dev_err(vi->dev,
1383                                 "failed to register video device: %d\n", ret);
1384                         goto cleanup;
1385                 }
1386
1387                 dev_dbg(vi->dev, "creating %s:%u -> %s:%u link\n",
1388                         source->name, source_pad->index,
1389                         sink->name, sink_pad->index);
1390
1391                 ret = media_create_pad_link(source, source_pad->index,
1392                                             sink, sink_pad->index,
1393                                             link_flags);
1394                 if (ret < 0) {
1395                         dev_err(vi->dev,
1396                                 "failed to create %s:%u -> %s:%u link: %d\n",
1397                                 source->name, source_pad->index,
1398                                 sink->name, sink_pad->index, ret);
1399                         goto cleanup;
1400                 }
1401
1402                 ret = tegra_channel_setup_ctrl_handler(vi_chan);
1403                 if (ret < 0)
1404                         goto cleanup;
1405
1406                 v4l2_set_subdev_hostdata(&csi_chan->subdev, vi_chan);
1407                 vi_tpg_fmts_bitmap_init(vi_chan);
1408                 csi_chan = list_next_entry(csi_chan, list);
1409         }
1410
1411         return 0;
1412
1413 cleanup:
1414         tegra_v4l2_nodes_cleanup_tpg(vid);
1415         return ret;
1416 }
1417
1418 static int __maybe_unused vi_runtime_resume(struct device *dev)
1419 {
1420         struct tegra_vi *vi = dev_get_drvdata(dev);
1421         int ret;
1422
1423         ret = regulator_enable(vi->vdd);
1424         if (ret) {
1425                 dev_err(dev, "failed to enable VDD supply: %d\n", ret);
1426                 return ret;
1427         }
1428
1429         ret = clk_set_rate(vi->clk, vi->soc->vi_max_clk_hz);
1430         if (ret) {
1431                 dev_err(dev, "failed to set vi clock rate: %d\n", ret);
1432                 goto disable_vdd;
1433         }
1434
1435         ret = clk_prepare_enable(vi->clk);
1436         if (ret) {
1437                 dev_err(dev, "failed to enable vi clock: %d\n", ret);
1438                 goto disable_vdd;
1439         }
1440
1441         return 0;
1442
1443 disable_vdd:
1444         regulator_disable(vi->vdd);
1445         return ret;
1446 }
1447
1448 static int __maybe_unused vi_runtime_suspend(struct device *dev)
1449 {
1450         struct tegra_vi *vi = dev_get_drvdata(dev);
1451
1452         clk_disable_unprepare(vi->clk);
1453
1454         regulator_disable(vi->vdd);
1455
1456         return 0;
1457 }
1458
1459 /*
1460  * Find the entity matching a given fwnode in an v4l2_async_notifier list
1461  */
1462 static struct tegra_vi_graph_entity *
1463 tegra_vi_graph_find_entity(struct list_head *list,
1464                            const struct fwnode_handle *fwnode)
1465 {
1466         struct tegra_vi_graph_entity *entity;
1467         struct v4l2_async_connection *asd;
1468
1469         list_for_each_entry(asd, list, asc_entry) {
1470                 entity = to_tegra_vi_graph_entity(asd);
1471
1472                 if (entity->asd.match.fwnode == fwnode)
1473                         return entity;
1474         }
1475
1476         return NULL;
1477 }
1478
1479 static int tegra_vi_graph_build(struct tegra_vi_channel *chan,
1480                                 struct tegra_vi_graph_entity *entity)
1481 {
1482         struct tegra_vi *vi = chan->vi;
1483         struct tegra_vi_graph_entity *ent;
1484         struct fwnode_handle *ep = NULL;
1485         struct v4l2_fwnode_link link;
1486         struct media_entity *local = entity->entity;
1487         struct media_entity *remote;
1488         struct media_pad *local_pad;
1489         struct media_pad *remote_pad;
1490         u32 link_flags = MEDIA_LNK_FL_ENABLED;
1491         int ret = 0;
1492
1493         dev_dbg(vi->dev, "creating links for entity %s\n", local->name);
1494
1495         while (1) {
1496                 ep = fwnode_graph_get_next_endpoint(entity->asd.match.fwnode,
1497                                                     ep);
1498                 if (!ep)
1499                         break;
1500
1501                 ret = v4l2_fwnode_parse_link(ep, &link);
1502                 if (ret < 0) {
1503                         dev_err(vi->dev, "failed to parse link for %pOF: %d\n",
1504                                 to_of_node(ep), ret);
1505                         continue;
1506                 }
1507
1508                 if (link.local_port >= local->num_pads) {
1509                         dev_err(vi->dev, "invalid port number %u on %pOF\n",
1510                                 link.local_port, to_of_node(link.local_node));
1511                         v4l2_fwnode_put_link(&link);
1512                         ret = -EINVAL;
1513                         break;
1514                 }
1515
1516                 local_pad = &local->pads[link.local_port];
1517                 /* Remote node is vi node. So use channel video entity and pad
1518                  * as remote/sink.
1519                  */
1520                 if (link.remote_node == of_fwnode_handle(vi->dev->of_node)) {
1521                         remote = &chan->video.entity;
1522                         remote_pad = &chan->pad;
1523                         goto create_link;
1524                 }
1525
1526                 /*
1527                  * Skip sink ports, they will be processed from the other end
1528                  * of the link.
1529                  */
1530                 if (local_pad->flags & MEDIA_PAD_FL_SINK) {
1531                         dev_dbg(vi->dev, "skipping sink port %pOF:%u\n",
1532                                 to_of_node(link.local_node), link.local_port);
1533                         v4l2_fwnode_put_link(&link);
1534                         continue;
1535                 }
1536
1537                 /* find the remote entity from notifier list */
1538                 ent = tegra_vi_graph_find_entity(&chan->notifier.done_list,
1539                                                  link.remote_node);
1540                 if (!ent) {
1541                         dev_err(vi->dev, "no entity found for %pOF\n",
1542                                 to_of_node(link.remote_node));
1543                         v4l2_fwnode_put_link(&link);
1544                         ret = -ENODEV;
1545                         break;
1546                 }
1547
1548                 remote = ent->entity;
1549                 if (link.remote_port >= remote->num_pads) {
1550                         dev_err(vi->dev, "invalid port number %u on %pOF\n",
1551                                 link.remote_port,
1552                                 to_of_node(link.remote_node));
1553                         v4l2_fwnode_put_link(&link);
1554                         ret = -EINVAL;
1555                         break;
1556                 }
1557
1558                 remote_pad = &remote->pads[link.remote_port];
1559
1560 create_link:
1561                 dev_dbg(vi->dev, "creating %s:%u -> %s:%u link\n",
1562                         local->name, local_pad->index,
1563                         remote->name, remote_pad->index);
1564
1565                 ret = media_create_pad_link(local, local_pad->index,
1566                                             remote, remote_pad->index,
1567                                             link_flags);
1568                 v4l2_fwnode_put_link(&link);
1569                 if (ret < 0) {
1570                         dev_err(vi->dev,
1571                                 "failed to create %s:%u -> %s:%u link: %d\n",
1572                                 local->name, local_pad->index,
1573                                 remote->name, remote_pad->index, ret);
1574                         break;
1575                 }
1576         }
1577
1578         fwnode_handle_put(ep);
1579         return ret;
1580 }
1581
1582 static int tegra_vi_graph_notify_complete(struct v4l2_async_notifier *notifier)
1583 {
1584         struct tegra_vi_graph_entity *entity;
1585         struct v4l2_async_connection *asd;
1586         struct v4l2_subdev *subdev;
1587         struct tegra_vi_channel *chan;
1588         struct tegra_vi *vi;
1589         int ret;
1590
1591         chan = container_of(notifier, struct tegra_vi_channel, notifier);
1592         vi = chan->vi;
1593
1594         dev_dbg(vi->dev, "notify complete, all subdevs registered\n");
1595
1596         /*
1597          * Video device node should be created at the end of all the device
1598          * related initialization/setup.
1599          * Current video_register_device() does both initialize and register
1600          * video device in same API.
1601          *
1602          * TODO: Update v4l2-dev driver to split initialize and register into
1603          * separate APIs and then update Tegra video driver to do video device
1604          * initialize followed by all video device related setup and then
1605          * register the video device.
1606          */
1607         ret = video_register_device(&chan->video, VFL_TYPE_VIDEO, -1);
1608         if (ret < 0) {
1609                 dev_err(vi->dev,
1610                         "failed to register video device: %d\n", ret);
1611                 goto unregister_video;
1612         }
1613
1614         /* create links between the entities */
1615         list_for_each_entry(asd, &chan->notifier.done_list, asc_entry) {
1616                 entity = to_tegra_vi_graph_entity(asd);
1617                 ret = tegra_vi_graph_build(chan, entity);
1618                 if (ret < 0)
1619                         goto unregister_video;
1620         }
1621
1622         ret = tegra_channel_setup_ctrl_handler(chan);
1623         if (ret < 0) {
1624                 dev_err(vi->dev,
1625                         "failed to setup channel controls: %d\n", ret);
1626                 goto unregister_video;
1627         }
1628
1629         ret = vi_fmts_bitmap_init(chan);
1630         if (ret < 0) {
1631                 dev_err(vi->dev,
1632                         "failed to initialize formats bitmap: %d\n", ret);
1633                 goto unregister_video;
1634         }
1635
1636         subdev = tegra_channel_get_remote_csi_subdev(chan);
1637         if (!subdev) {
1638                 ret = -ENODEV;
1639                 dev_err(vi->dev,
1640                         "failed to get remote csi subdev: %d\n", ret);
1641                 goto unregister_video;
1642         }
1643
1644         v4l2_set_subdev_hostdata(subdev, chan);
1645
1646         subdev = tegra_channel_get_remote_source_subdev(chan);
1647         v4l2_set_subdev_hostdata(subdev, chan);
1648
1649         return 0;
1650
1651 unregister_video:
1652         vb2_video_unregister_device(&chan->video);
1653         return ret;
1654 }
1655
1656 static int tegra_vi_graph_notify_bound(struct v4l2_async_notifier *notifier,
1657                                        struct v4l2_subdev *subdev,
1658                                        struct v4l2_async_connection *asd)
1659 {
1660         struct tegra_vi_graph_entity *entity;
1661         struct tegra_vi *vi;
1662         struct tegra_vi_channel *chan;
1663
1664         chan = container_of(notifier, struct tegra_vi_channel, notifier);
1665         vi = chan->vi;
1666
1667         /*
1668          * Locate the entity corresponding to the bound subdev and store the
1669          * subdev pointer.
1670          */
1671         entity = tegra_vi_graph_find_entity(&chan->notifier.waiting_list,
1672                                             subdev->fwnode);
1673         if (!entity) {
1674                 dev_err(vi->dev, "no entity for subdev %s\n", subdev->name);
1675                 return -EINVAL;
1676         }
1677
1678         if (entity->subdev) {
1679                 dev_err(vi->dev, "duplicate subdev for node %pOF\n",
1680                         to_of_node(entity->asd.match.fwnode));
1681                 return -EINVAL;
1682         }
1683
1684         dev_dbg(vi->dev, "subdev %s bound\n", subdev->name);
1685         entity->entity = &subdev->entity;
1686         entity->subdev = subdev;
1687
1688         return 0;
1689 }
1690
1691 static const struct v4l2_async_notifier_operations tegra_vi_async_ops = {
1692         .bound = tegra_vi_graph_notify_bound,
1693         .complete = tegra_vi_graph_notify_complete,
1694 };
1695
1696 static int tegra_vi_graph_parse_one(struct tegra_vi_channel *chan,
1697                                     struct fwnode_handle *fwnode)
1698 {
1699         struct tegra_vi *vi = chan->vi;
1700         struct fwnode_handle *ep = NULL;
1701         struct fwnode_handle *remote = NULL;
1702         struct tegra_vi_graph_entity *tvge;
1703         struct device_node *node = NULL;
1704         int ret;
1705
1706         dev_dbg(vi->dev, "parsing node %pOF\n", to_of_node(fwnode));
1707
1708         /* parse all the remote entities and put them into the list */
1709         for_each_endpoint_of_node(to_of_node(fwnode), node) {
1710                 ep = of_fwnode_handle(node);
1711                 remote = fwnode_graph_get_remote_port_parent(ep);
1712                 if (!remote) {
1713                         dev_err(vi->dev,
1714                                 "remote device at %pOF not found\n", node);
1715                         ret = -EINVAL;
1716                         goto cleanup;
1717                 }
1718
1719                 /* skip entities that are already processed */
1720                 if (device_match_fwnode(vi->dev, remote) ||
1721                     tegra_vi_graph_find_entity(&chan->notifier.waiting_list,
1722                                                remote)) {
1723                         fwnode_handle_put(remote);
1724                         continue;
1725                 }
1726
1727                 tvge = v4l2_async_nf_add_fwnode(&chan->notifier, remote,
1728                                                 struct tegra_vi_graph_entity);
1729                 if (IS_ERR(tvge)) {
1730                         ret = PTR_ERR(tvge);
1731                         dev_err(vi->dev,
1732                                 "failed to add subdev to notifier: %d\n", ret);
1733                         fwnode_handle_put(remote);
1734                         goto cleanup;
1735                 }
1736
1737                 ret = tegra_vi_graph_parse_one(chan, remote);
1738                 if (ret < 0) {
1739                         fwnode_handle_put(remote);
1740                         goto cleanup;
1741                 }
1742
1743                 fwnode_handle_put(remote);
1744         }
1745
1746         return 0;
1747
1748 cleanup:
1749         dev_err(vi->dev, "failed parsing the graph: %d\n", ret);
1750         v4l2_async_nf_cleanup(&chan->notifier);
1751         of_node_put(node);
1752         return ret;
1753 }
1754
1755 static int tegra_vi_graph_init(struct tegra_vi *vi)
1756 {
1757         struct tegra_vi_channel *chan;
1758         struct fwnode_handle *fwnode = dev_fwnode(vi->dev);
1759         int ret;
1760
1761         /*
1762          * Walk the links to parse the full graph. Each channel will have
1763          * one endpoint of the composite node. Start by parsing the
1764          * composite node and parse the remote entities in turn.
1765          * Each channel will register a v4l2 async notifier to make the graph
1766          * independent between the channels so we can skip the current channel
1767          * in case of something wrong during graph parsing and continue with
1768          * the next channels.
1769          */
1770         list_for_each_entry(chan, &vi->vi_chans, list) {
1771                 struct fwnode_handle *ep, *remote;
1772
1773                 ep = fwnode_graph_get_endpoint_by_id(fwnode,
1774                                                      chan->portnos[0], 0, 0);
1775                 if (!ep)
1776                         continue;
1777
1778                 remote = fwnode_graph_get_remote_port_parent(ep);
1779                 fwnode_handle_put(ep);
1780
1781                 ret = tegra_vi_graph_parse_one(chan, remote);
1782                 fwnode_handle_put(remote);
1783                 if (ret < 0 || list_empty(&chan->notifier.waiting_list))
1784                         continue;
1785
1786                 chan->notifier.ops = &tegra_vi_async_ops;
1787                 ret = v4l2_async_nf_register(&chan->notifier);
1788                 if (ret < 0) {
1789                         dev_err(vi->dev,
1790                                 "failed to register channel %d notifier: %d\n",
1791                                 chan->portnos[0], ret);
1792                         v4l2_async_nf_cleanup(&chan->notifier);
1793                 }
1794         }
1795
1796         return 0;
1797 }
1798
1799 static void tegra_vi_graph_cleanup(struct tegra_vi *vi)
1800 {
1801         struct tegra_vi_channel *chan;
1802
1803         list_for_each_entry(chan, &vi->vi_chans, list) {
1804                 vb2_video_unregister_device(&chan->video);
1805                 v4l2_async_nf_unregister(&chan->notifier);
1806                 v4l2_async_nf_cleanup(&chan->notifier);
1807         }
1808 }
1809
1810 static int tegra_vi_init(struct host1x_client *client)
1811 {
1812         struct tegra_video_device *vid = dev_get_drvdata(client->host);
1813         struct tegra_vi *vi = host1x_client_to_vi(client);
1814         struct tegra_vi_channel *chan, *tmp;
1815         int ret;
1816
1817         vid->media_dev.hw_revision = vi->soc->hw_revision;
1818         snprintf(vid->media_dev.bus_info, sizeof(vid->media_dev.bus_info),
1819                  "platform:%s", dev_name(vi->dev));
1820
1821         INIT_LIST_HEAD(&vi->vi_chans);
1822
1823         if (IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG))
1824                 ret = tegra_vi_tpg_channels_alloc(vi);
1825         else
1826                 ret = tegra_vi_channels_alloc(vi);
1827         if (ret < 0)
1828                 goto free_chans;
1829
1830         ret = tegra_vi_channels_init(vi);
1831         if (ret < 0)
1832                 goto free_chans;
1833
1834         vid->vi = vi;
1835
1836         if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG)) {
1837                 ret = tegra_vi_graph_init(vi);
1838                 if (ret < 0)
1839                         goto cleanup_chans;
1840         }
1841
1842         return 0;
1843
1844 cleanup_chans:
1845         list_for_each_entry(chan, &vi->vi_chans, list)
1846                 tegra_channel_cleanup(chan);
1847 free_chans:
1848         list_for_each_entry_safe(chan, tmp, &vi->vi_chans, list) {
1849                 list_del(&chan->list);
1850                 kfree(chan);
1851         }
1852
1853         return ret;
1854 }
1855
1856 static int tegra_vi_exit(struct host1x_client *client)
1857 {
1858         struct tegra_vi *vi = host1x_client_to_vi(client);
1859
1860         /*
1861          * Do not cleanup the channels here as application might still be
1862          * holding video device nodes. Channels cleanup will happen during
1863          * v4l2_device release callback which gets called after all video
1864          * device nodes are released.
1865          */
1866
1867         if (!IS_ENABLED(CONFIG_VIDEO_TEGRA_TPG))
1868                 tegra_vi_graph_cleanup(vi);
1869
1870         return 0;
1871 }
1872
1873 static const struct host1x_client_ops vi_client_ops = {
1874         .init = tegra_vi_init,
1875         .exit = tegra_vi_exit,
1876 };
1877
1878 static int tegra_vi_probe(struct platform_device *pdev)
1879 {
1880         struct tegra_vi *vi;
1881         int ret;
1882
1883         vi = devm_kzalloc(&pdev->dev, sizeof(*vi), GFP_KERNEL);
1884         if (!vi)
1885                 return -ENOMEM;
1886
1887         vi->iomem = devm_platform_ioremap_resource(pdev, 0);
1888         if (IS_ERR(vi->iomem))
1889                 return PTR_ERR(vi->iomem);
1890
1891         vi->soc = of_device_get_match_data(&pdev->dev);
1892
1893         vi->clk = devm_clk_get(&pdev->dev, NULL);
1894         if (IS_ERR(vi->clk)) {
1895                 ret = PTR_ERR(vi->clk);
1896                 dev_err(&pdev->dev, "failed to get vi clock: %d\n", ret);
1897                 return ret;
1898         }
1899
1900         vi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi");
1901         if (IS_ERR(vi->vdd)) {
1902                 ret = PTR_ERR(vi->vdd);
1903                 dev_err(&pdev->dev, "failed to get VDD supply: %d\n", ret);
1904                 return ret;
1905         }
1906
1907         if (!pdev->dev.pm_domain) {
1908                 ret = -ENOENT;
1909                 dev_warn(&pdev->dev, "PM domain is not attached: %d\n", ret);
1910                 return ret;
1911         }
1912
1913         ret = devm_of_platform_populate(&pdev->dev);
1914         if (ret < 0) {
1915                 dev_err(&pdev->dev,
1916                         "failed to populate vi child device: %d\n", ret);
1917                 return ret;
1918         }
1919
1920         vi->dev = &pdev->dev;
1921         vi->ops = vi->soc->ops;
1922         platform_set_drvdata(pdev, vi);
1923         pm_runtime_enable(&pdev->dev);
1924
1925         /* initialize host1x interface */
1926         INIT_LIST_HEAD(&vi->client.list);
1927         vi->client.ops = &vi_client_ops;
1928         vi->client.dev = &pdev->dev;
1929
1930         if (vi->ops->vi_enable)
1931                 vi->ops->vi_enable(vi, true);
1932
1933         ret = host1x_client_register(&vi->client);
1934         if (ret < 0) {
1935                 dev_err(&pdev->dev,
1936                         "failed to register host1x client: %d\n", ret);
1937                 goto rpm_disable;
1938         }
1939
1940         return 0;
1941
1942 rpm_disable:
1943         if (vi->ops->vi_enable)
1944                 vi->ops->vi_enable(vi, false);
1945         pm_runtime_disable(&pdev->dev);
1946         return ret;
1947 }
1948
1949 static void tegra_vi_remove(struct platform_device *pdev)
1950 {
1951         struct tegra_vi *vi = platform_get_drvdata(pdev);
1952
1953         host1x_client_unregister(&vi->client);
1954
1955         if (vi->ops->vi_enable)
1956                 vi->ops->vi_enable(vi, false);
1957         pm_runtime_disable(&pdev->dev);
1958 }
1959
1960 static const struct of_device_id tegra_vi_of_id_table[] = {
1961 #if defined(CONFIG_ARCH_TEGRA_2x_SOC)
1962         { .compatible = "nvidia,tegra20-vi",  .data = &tegra20_vi_soc },
1963 #endif
1964 #if defined(CONFIG_ARCH_TEGRA_210_SOC)
1965         { .compatible = "nvidia,tegra210-vi", .data = &tegra210_vi_soc },
1966 #endif
1967         { }
1968 };
1969 MODULE_DEVICE_TABLE(of, tegra_vi_of_id_table);
1970
1971 static const struct dev_pm_ops tegra_vi_pm_ops = {
1972         SET_RUNTIME_PM_OPS(vi_runtime_suspend, vi_runtime_resume, NULL)
1973 };
1974
1975 struct platform_driver tegra_vi_driver = {
1976         .driver = {
1977                 .name = "tegra-vi",
1978                 .of_match_table = tegra_vi_of_id_table,
1979                 .pm = &tegra_vi_pm_ops,
1980         },
1981         .probe = tegra_vi_probe,
1982         .remove_new = tegra_vi_remove,
1983 };