cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vi.c (54281B)


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