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

vivid-vid-cap.c (54593B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * vivid-vid-cap.c - video capture support functions.
      4 *
      5 * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
      6 */
      7
      8#include <linux/errno.h>
      9#include <linux/kernel.h>
     10#include <linux/sched.h>
     11#include <linux/vmalloc.h>
     12#include <linux/videodev2.h>
     13#include <linux/v4l2-dv-timings.h>
     14#include <media/v4l2-common.h>
     15#include <media/v4l2-event.h>
     16#include <media/v4l2-dv-timings.h>
     17#include <media/v4l2-rect.h>
     18
     19#include "vivid-core.h"
     20#include "vivid-vid-common.h"
     21#include "vivid-kthread-cap.h"
     22#include "vivid-vid-cap.h"
     23
     24static const struct vivid_fmt formats_ovl[] = {
     25	{
     26		.fourcc   = V4L2_PIX_FMT_RGB565, /* gggbbbbb rrrrrggg */
     27		.vdownsampling = { 1 },
     28		.bit_depth = { 16 },
     29		.planes   = 1,
     30		.buffers = 1,
     31	},
     32	{
     33		.fourcc   = V4L2_PIX_FMT_XRGB555, /* gggbbbbb arrrrrgg */
     34		.vdownsampling = { 1 },
     35		.bit_depth = { 16 },
     36		.planes   = 1,
     37		.buffers = 1,
     38	},
     39	{
     40		.fourcc   = V4L2_PIX_FMT_ARGB555, /* gggbbbbb arrrrrgg */
     41		.vdownsampling = { 1 },
     42		.bit_depth = { 16 },
     43		.planes   = 1,
     44		.buffers = 1,
     45	},
     46};
     47
     48/* The number of discrete webcam framesizes */
     49#define VIVID_WEBCAM_SIZES 6
     50/* The number of discrete webcam frameintervals */
     51#define VIVID_WEBCAM_IVALS (VIVID_WEBCAM_SIZES * 2)
     52
     53/* Sizes must be in increasing order */
     54static const struct v4l2_frmsize_discrete webcam_sizes[VIVID_WEBCAM_SIZES] = {
     55	{  320, 180 },
     56	{  640, 360 },
     57	{  640, 480 },
     58	{ 1280, 720 },
     59	{ 1920, 1080 },
     60	{ 3840, 2160 },
     61};
     62
     63/*
     64 * Intervals must be in increasing order and there must be twice as many
     65 * elements in this array as there are in webcam_sizes.
     66 */
     67static const struct v4l2_fract webcam_intervals[VIVID_WEBCAM_IVALS] = {
     68	{  1, 1 },
     69	{  1, 2 },
     70	{  1, 4 },
     71	{  1, 5 },
     72	{  1, 10 },
     73	{  2, 25 },
     74	{  1, 15 },
     75	{  1, 25 },
     76	{  1, 30 },
     77	{  1, 40 },
     78	{  1, 50 },
     79	{  1, 60 },
     80};
     81
     82static int vid_cap_queue_setup(struct vb2_queue *vq,
     83		       unsigned *nbuffers, unsigned *nplanes,
     84		       unsigned sizes[], struct device *alloc_devs[])
     85{
     86	struct vivid_dev *dev = vb2_get_drv_priv(vq);
     87	unsigned buffers = tpg_g_buffers(&dev->tpg);
     88	unsigned h = dev->fmt_cap_rect.height;
     89	unsigned p;
     90
     91	if (dev->field_cap == V4L2_FIELD_ALTERNATE) {
     92		/*
     93		 * You cannot use read() with FIELD_ALTERNATE since the field
     94		 * information (TOP/BOTTOM) cannot be passed back to the user.
     95		 */
     96		if (vb2_fileio_is_active(vq))
     97			return -EINVAL;
     98	}
     99
    100	if (dev->queue_setup_error) {
    101		/*
    102		 * Error injection: test what happens if queue_setup() returns
    103		 * an error.
    104		 */
    105		dev->queue_setup_error = false;
    106		return -EINVAL;
    107	}
    108	if (*nplanes) {
    109		/*
    110		 * Check if the number of requested planes match
    111		 * the number of buffers in the current format. You can't mix that.
    112		 */
    113		if (*nplanes != buffers)
    114			return -EINVAL;
    115		for (p = 0; p < buffers; p++) {
    116			if (sizes[p] < tpg_g_line_width(&dev->tpg, p) * h +
    117						dev->fmt_cap->data_offset[p])
    118				return -EINVAL;
    119		}
    120	} else {
    121		for (p = 0; p < buffers; p++)
    122			sizes[p] = (tpg_g_line_width(&dev->tpg, p) * h) /
    123					dev->fmt_cap->vdownsampling[p] +
    124					dev->fmt_cap->data_offset[p];
    125	}
    126
    127	if (vq->num_buffers + *nbuffers < 2)
    128		*nbuffers = 2 - vq->num_buffers;
    129
    130	*nplanes = buffers;
    131
    132	dprintk(dev, 1, "%s: count=%d\n", __func__, *nbuffers);
    133	for (p = 0; p < buffers; p++)
    134		dprintk(dev, 1, "%s: size[%u]=%u\n", __func__, p, sizes[p]);
    135
    136	return 0;
    137}
    138
    139static int vid_cap_buf_prepare(struct vb2_buffer *vb)
    140{
    141	struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
    142	unsigned long size;
    143	unsigned buffers = tpg_g_buffers(&dev->tpg);
    144	unsigned p;
    145
    146	dprintk(dev, 1, "%s\n", __func__);
    147
    148	if (WARN_ON(NULL == dev->fmt_cap))
    149		return -EINVAL;
    150
    151	if (dev->buf_prepare_error) {
    152		/*
    153		 * Error injection: test what happens if buf_prepare() returns
    154		 * an error.
    155		 */
    156		dev->buf_prepare_error = false;
    157		return -EINVAL;
    158	}
    159	for (p = 0; p < buffers; p++) {
    160		size = (tpg_g_line_width(&dev->tpg, p) *
    161			dev->fmt_cap_rect.height) /
    162			dev->fmt_cap->vdownsampling[p] +
    163			dev->fmt_cap->data_offset[p];
    164
    165		if (vb2_plane_size(vb, p) < size) {
    166			dprintk(dev, 1, "%s data will not fit into plane %u (%lu < %lu)\n",
    167					__func__, p, vb2_plane_size(vb, p), size);
    168			return -EINVAL;
    169		}
    170
    171		vb2_set_plane_payload(vb, p, size);
    172		vb->planes[p].data_offset = dev->fmt_cap->data_offset[p];
    173	}
    174
    175	return 0;
    176}
    177
    178static void vid_cap_buf_finish(struct vb2_buffer *vb)
    179{
    180	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
    181	struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
    182	struct v4l2_timecode *tc = &vbuf->timecode;
    183	unsigned fps = 25;
    184	unsigned seq = vbuf->sequence;
    185
    186	if (!vivid_is_sdtv_cap(dev))
    187		return;
    188
    189	/*
    190	 * Set the timecode. Rarely used, so it is interesting to
    191	 * test this.
    192	 */
    193	vbuf->flags |= V4L2_BUF_FLAG_TIMECODE;
    194	if (dev->std_cap[dev->input] & V4L2_STD_525_60)
    195		fps = 30;
    196	tc->type = (fps == 30) ? V4L2_TC_TYPE_30FPS : V4L2_TC_TYPE_25FPS;
    197	tc->flags = 0;
    198	tc->frames = seq % fps;
    199	tc->seconds = (seq / fps) % 60;
    200	tc->minutes = (seq / (60 * fps)) % 60;
    201	tc->hours = (seq / (60 * 60 * fps)) % 24;
    202}
    203
    204static void vid_cap_buf_queue(struct vb2_buffer *vb)
    205{
    206	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
    207	struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
    208	struct vivid_buffer *buf = container_of(vbuf, struct vivid_buffer, vb);
    209
    210	dprintk(dev, 1, "%s\n", __func__);
    211
    212	spin_lock(&dev->slock);
    213	list_add_tail(&buf->list, &dev->vid_cap_active);
    214	spin_unlock(&dev->slock);
    215}
    216
    217static int vid_cap_start_streaming(struct vb2_queue *vq, unsigned count)
    218{
    219	struct vivid_dev *dev = vb2_get_drv_priv(vq);
    220	unsigned i;
    221	int err;
    222
    223	if (vb2_is_streaming(&dev->vb_vid_out_q))
    224		dev->can_loop_video = vivid_vid_can_loop(dev);
    225
    226	dev->vid_cap_seq_count = 0;
    227	dprintk(dev, 1, "%s\n", __func__);
    228	for (i = 0; i < VIDEO_MAX_FRAME; i++)
    229		dev->must_blank[i] = tpg_g_perc_fill(&dev->tpg) < 100;
    230	if (dev->start_streaming_error) {
    231		dev->start_streaming_error = false;
    232		err = -EINVAL;
    233	} else {
    234		err = vivid_start_generating_vid_cap(dev, &dev->vid_cap_streaming);
    235	}
    236	if (err) {
    237		struct vivid_buffer *buf, *tmp;
    238
    239		list_for_each_entry_safe(buf, tmp, &dev->vid_cap_active, list) {
    240			list_del(&buf->list);
    241			vb2_buffer_done(&buf->vb.vb2_buf,
    242					VB2_BUF_STATE_QUEUED);
    243		}
    244	}
    245	return err;
    246}
    247
    248/* abort streaming and wait for last buffer */
    249static void vid_cap_stop_streaming(struct vb2_queue *vq)
    250{
    251	struct vivid_dev *dev = vb2_get_drv_priv(vq);
    252
    253	dprintk(dev, 1, "%s\n", __func__);
    254	vivid_stop_generating_vid_cap(dev, &dev->vid_cap_streaming);
    255	dev->can_loop_video = false;
    256}
    257
    258static void vid_cap_buf_request_complete(struct vb2_buffer *vb)
    259{
    260	struct vivid_dev *dev = vb2_get_drv_priv(vb->vb2_queue);
    261
    262	v4l2_ctrl_request_complete(vb->req_obj.req, &dev->ctrl_hdl_vid_cap);
    263}
    264
    265const struct vb2_ops vivid_vid_cap_qops = {
    266	.queue_setup		= vid_cap_queue_setup,
    267	.buf_prepare		= vid_cap_buf_prepare,
    268	.buf_finish		= vid_cap_buf_finish,
    269	.buf_queue		= vid_cap_buf_queue,
    270	.start_streaming	= vid_cap_start_streaming,
    271	.stop_streaming		= vid_cap_stop_streaming,
    272	.buf_request_complete	= vid_cap_buf_request_complete,
    273	.wait_prepare		= vb2_ops_wait_prepare,
    274	.wait_finish		= vb2_ops_wait_finish,
    275};
    276
    277/*
    278 * Determine the 'picture' quality based on the current TV frequency: either
    279 * COLOR for a good 'signal', GRAY (grayscale picture) for a slightly off
    280 * signal or NOISE for no signal.
    281 */
    282void vivid_update_quality(struct vivid_dev *dev)
    283{
    284	unsigned freq_modulus;
    285
    286	if (dev->loop_video && (vivid_is_svid_cap(dev) || vivid_is_hdmi_cap(dev))) {
    287		/*
    288		 * The 'noise' will only be replaced by the actual video
    289		 * if the output video matches the input video settings.
    290		 */
    291		tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE, 0);
    292		return;
    293	}
    294	if (vivid_is_hdmi_cap(dev) &&
    295	    VIVID_INVALID_SIGNAL(dev->dv_timings_signal_mode[dev->input])) {
    296		tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE, 0);
    297		return;
    298	}
    299	if (vivid_is_sdtv_cap(dev) &&
    300	    VIVID_INVALID_SIGNAL(dev->std_signal_mode[dev->input])) {
    301		tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE, 0);
    302		return;
    303	}
    304	if (!vivid_is_tv_cap(dev)) {
    305		tpg_s_quality(&dev->tpg, TPG_QUAL_COLOR, 0);
    306		return;
    307	}
    308
    309	/*
    310	 * There is a fake channel every 6 MHz at 49.25, 55.25, etc.
    311	 * From +/- 0.25 MHz around the channel there is color, and from
    312	 * +/- 1 MHz there is grayscale (chroma is lost).
    313	 * Everywhere else it is just noise.
    314	 */
    315	freq_modulus = (dev->tv_freq - 676 /* (43.25-1) * 16 */) % (6 * 16);
    316	if (freq_modulus > 2 * 16) {
    317		tpg_s_quality(&dev->tpg, TPG_QUAL_NOISE,
    318			next_pseudo_random32(dev->tv_freq ^ 0x55) & 0x3f);
    319		return;
    320	}
    321	if (freq_modulus < 12 /*0.75 * 16*/ || freq_modulus > 20 /*1.25 * 16*/)
    322		tpg_s_quality(&dev->tpg, TPG_QUAL_GRAY, 0);
    323	else
    324		tpg_s_quality(&dev->tpg, TPG_QUAL_COLOR, 0);
    325}
    326
    327/*
    328 * Get the current picture quality and the associated afc value.
    329 */
    330static enum tpg_quality vivid_get_quality(struct vivid_dev *dev, s32 *afc)
    331{
    332	unsigned freq_modulus;
    333
    334	if (afc)
    335		*afc = 0;
    336	if (tpg_g_quality(&dev->tpg) == TPG_QUAL_COLOR ||
    337	    tpg_g_quality(&dev->tpg) == TPG_QUAL_NOISE)
    338		return tpg_g_quality(&dev->tpg);
    339
    340	/*
    341	 * There is a fake channel every 6 MHz at 49.25, 55.25, etc.
    342	 * From +/- 0.25 MHz around the channel there is color, and from
    343	 * +/- 1 MHz there is grayscale (chroma is lost).
    344	 * Everywhere else it is just gray.
    345	 */
    346	freq_modulus = (dev->tv_freq - 676 /* (43.25-1) * 16 */) % (6 * 16);
    347	if (afc)
    348		*afc = freq_modulus - 1 * 16;
    349	return TPG_QUAL_GRAY;
    350}
    351
    352enum tpg_video_aspect vivid_get_video_aspect(const struct vivid_dev *dev)
    353{
    354	if (vivid_is_sdtv_cap(dev))
    355		return dev->std_aspect_ratio[dev->input];
    356
    357	if (vivid_is_hdmi_cap(dev))
    358		return dev->dv_timings_aspect_ratio[dev->input];
    359
    360	return TPG_VIDEO_ASPECT_IMAGE;
    361}
    362
    363static enum tpg_pixel_aspect vivid_get_pixel_aspect(const struct vivid_dev *dev)
    364{
    365	if (vivid_is_sdtv_cap(dev))
    366		return (dev->std_cap[dev->input] & V4L2_STD_525_60) ?
    367			TPG_PIXEL_ASPECT_NTSC : TPG_PIXEL_ASPECT_PAL;
    368
    369	if (vivid_is_hdmi_cap(dev) &&
    370	    dev->src_rect.width == 720 && dev->src_rect.height <= 576)
    371		return dev->src_rect.height == 480 ?
    372			TPG_PIXEL_ASPECT_NTSC : TPG_PIXEL_ASPECT_PAL;
    373
    374	return TPG_PIXEL_ASPECT_SQUARE;
    375}
    376
    377/*
    378 * Called whenever the format has to be reset which can occur when
    379 * changing inputs, standard, timings, etc.
    380 */
    381void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls)
    382{
    383	struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt;
    384	unsigned size;
    385	u64 pixelclock;
    386
    387	switch (dev->input_type[dev->input]) {
    388	case WEBCAM:
    389	default:
    390		dev->src_rect.width = webcam_sizes[dev->webcam_size_idx].width;
    391		dev->src_rect.height = webcam_sizes[dev->webcam_size_idx].height;
    392		dev->timeperframe_vid_cap = webcam_intervals[dev->webcam_ival_idx];
    393		dev->field_cap = V4L2_FIELD_NONE;
    394		tpg_s_rgb_range(&dev->tpg, V4L2_DV_RGB_RANGE_AUTO);
    395		break;
    396	case TV:
    397	case SVID:
    398		dev->field_cap = dev->tv_field_cap;
    399		dev->src_rect.width = 720;
    400		if (dev->std_cap[dev->input] & V4L2_STD_525_60) {
    401			dev->src_rect.height = 480;
    402			dev->timeperframe_vid_cap = (struct v4l2_fract) { 1001, 30000 };
    403			dev->service_set_cap = V4L2_SLICED_CAPTION_525;
    404		} else {
    405			dev->src_rect.height = 576;
    406			dev->timeperframe_vid_cap = (struct v4l2_fract) { 1000, 25000 };
    407			dev->service_set_cap = V4L2_SLICED_WSS_625 | V4L2_SLICED_TELETEXT_B;
    408		}
    409		tpg_s_rgb_range(&dev->tpg, V4L2_DV_RGB_RANGE_AUTO);
    410		break;
    411	case HDMI:
    412		dev->src_rect.width = bt->width;
    413		dev->src_rect.height = bt->height;
    414		size = V4L2_DV_BT_FRAME_WIDTH(bt) * V4L2_DV_BT_FRAME_HEIGHT(bt);
    415		if (dev->reduced_fps && can_reduce_fps(bt)) {
    416			pixelclock = div_u64(bt->pixelclock * 1000, 1001);
    417			bt->flags |= V4L2_DV_FL_REDUCED_FPS;
    418		} else {
    419			pixelclock = bt->pixelclock;
    420			bt->flags &= ~V4L2_DV_FL_REDUCED_FPS;
    421		}
    422		dev->timeperframe_vid_cap = (struct v4l2_fract) {
    423			size / 100, (u32)pixelclock / 100
    424		};
    425		if (bt->interlaced)
    426			dev->field_cap = V4L2_FIELD_ALTERNATE;
    427		else
    428			dev->field_cap = V4L2_FIELD_NONE;
    429
    430		/*
    431		 * We can be called from within s_ctrl, in that case we can't
    432		 * set/get controls. Luckily we don't need to in that case.
    433		 */
    434		if (keep_controls || !dev->colorspace)
    435			break;
    436		if (bt->flags & V4L2_DV_FL_IS_CE_VIDEO) {
    437			if (bt->width == 720 && bt->height <= 576)
    438				v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M);
    439			else
    440				v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_709);
    441			v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 1);
    442		} else {
    443			v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB);
    444			v4l2_ctrl_s_ctrl(dev->real_rgb_range_cap, 0);
    445		}
    446		tpg_s_rgb_range(&dev->tpg, v4l2_ctrl_g_ctrl(dev->rgb_range_cap));
    447		break;
    448	}
    449	vfree(dev->bitmap_cap);
    450	dev->bitmap_cap = NULL;
    451	vivid_update_quality(dev);
    452	tpg_reset_source(&dev->tpg, dev->src_rect.width, dev->src_rect.height, dev->field_cap);
    453	dev->crop_cap = dev->src_rect;
    454	dev->crop_bounds_cap = dev->src_rect;
    455	dev->compose_cap = dev->crop_cap;
    456	if (V4L2_FIELD_HAS_T_OR_B(dev->field_cap))
    457		dev->compose_cap.height /= 2;
    458	dev->fmt_cap_rect = dev->compose_cap;
    459	tpg_s_video_aspect(&dev->tpg, vivid_get_video_aspect(dev));
    460	tpg_s_pixel_aspect(&dev->tpg, vivid_get_pixel_aspect(dev));
    461	tpg_update_mv_step(&dev->tpg);
    462}
    463
    464/* Map the field to something that is valid for the current input */
    465static enum v4l2_field vivid_field_cap(struct vivid_dev *dev, enum v4l2_field field)
    466{
    467	if (vivid_is_sdtv_cap(dev)) {
    468		switch (field) {
    469		case V4L2_FIELD_INTERLACED_TB:
    470		case V4L2_FIELD_INTERLACED_BT:
    471		case V4L2_FIELD_SEQ_TB:
    472		case V4L2_FIELD_SEQ_BT:
    473		case V4L2_FIELD_TOP:
    474		case V4L2_FIELD_BOTTOM:
    475		case V4L2_FIELD_ALTERNATE:
    476			return field;
    477		case V4L2_FIELD_INTERLACED:
    478		default:
    479			return V4L2_FIELD_INTERLACED;
    480		}
    481	}
    482	if (vivid_is_hdmi_cap(dev))
    483		return dev->dv_timings_cap[dev->input].bt.interlaced ?
    484			V4L2_FIELD_ALTERNATE : V4L2_FIELD_NONE;
    485	return V4L2_FIELD_NONE;
    486}
    487
    488static unsigned vivid_colorspace_cap(struct vivid_dev *dev)
    489{
    490	if (!dev->loop_video || vivid_is_webcam(dev) || vivid_is_tv_cap(dev))
    491		return tpg_g_colorspace(&dev->tpg);
    492	return dev->colorspace_out;
    493}
    494
    495static unsigned vivid_xfer_func_cap(struct vivid_dev *dev)
    496{
    497	if (!dev->loop_video || vivid_is_webcam(dev) || vivid_is_tv_cap(dev))
    498		return tpg_g_xfer_func(&dev->tpg);
    499	return dev->xfer_func_out;
    500}
    501
    502static unsigned vivid_ycbcr_enc_cap(struct vivid_dev *dev)
    503{
    504	if (!dev->loop_video || vivid_is_webcam(dev) || vivid_is_tv_cap(dev))
    505		return tpg_g_ycbcr_enc(&dev->tpg);
    506	return dev->ycbcr_enc_out;
    507}
    508
    509static unsigned int vivid_hsv_enc_cap(struct vivid_dev *dev)
    510{
    511	if (!dev->loop_video || vivid_is_webcam(dev) || vivid_is_tv_cap(dev))
    512		return tpg_g_hsv_enc(&dev->tpg);
    513	return dev->hsv_enc_out;
    514}
    515
    516static unsigned vivid_quantization_cap(struct vivid_dev *dev)
    517{
    518	if (!dev->loop_video || vivid_is_webcam(dev) || vivid_is_tv_cap(dev))
    519		return tpg_g_quantization(&dev->tpg);
    520	return dev->quantization_out;
    521}
    522
    523int vivid_g_fmt_vid_cap(struct file *file, void *priv,
    524					struct v4l2_format *f)
    525{
    526	struct vivid_dev *dev = video_drvdata(file);
    527	struct v4l2_pix_format_mplane *mp = &f->fmt.pix_mp;
    528	unsigned p;
    529
    530	mp->width        = dev->fmt_cap_rect.width;
    531	mp->height       = dev->fmt_cap_rect.height;
    532	mp->field        = dev->field_cap;
    533	mp->pixelformat  = dev->fmt_cap->fourcc;
    534	mp->colorspace   = vivid_colorspace_cap(dev);
    535	mp->xfer_func    = vivid_xfer_func_cap(dev);
    536	if (dev->fmt_cap->color_enc == TGP_COLOR_ENC_HSV)
    537		mp->hsv_enc    = vivid_hsv_enc_cap(dev);
    538	else
    539		mp->ycbcr_enc    = vivid_ycbcr_enc_cap(dev);
    540	mp->quantization = vivid_quantization_cap(dev);
    541	mp->num_planes = dev->fmt_cap->buffers;
    542	for (p = 0; p < mp->num_planes; p++) {
    543		mp->plane_fmt[p].bytesperline = tpg_g_bytesperline(&dev->tpg, p);
    544		mp->plane_fmt[p].sizeimage =
    545			(tpg_g_line_width(&dev->tpg, p) * mp->height) /
    546			dev->fmt_cap->vdownsampling[p] +
    547			dev->fmt_cap->data_offset[p];
    548	}
    549	return 0;
    550}
    551
    552int vivid_try_fmt_vid_cap(struct file *file, void *priv,
    553			struct v4l2_format *f)
    554{
    555	struct v4l2_pix_format_mplane *mp = &f->fmt.pix_mp;
    556	struct v4l2_plane_pix_format *pfmt = mp->plane_fmt;
    557	struct vivid_dev *dev = video_drvdata(file);
    558	const struct vivid_fmt *fmt;
    559	unsigned bytesperline, max_bpl;
    560	unsigned factor = 1;
    561	unsigned w, h;
    562	unsigned p;
    563	bool user_set_csc = !!(mp->flags & V4L2_PIX_FMT_FLAG_SET_CSC);
    564
    565	fmt = vivid_get_format(dev, mp->pixelformat);
    566	if (!fmt) {
    567		dprintk(dev, 1, "Fourcc format (0x%08x) unknown.\n",
    568			mp->pixelformat);
    569		mp->pixelformat = V4L2_PIX_FMT_YUYV;
    570		fmt = vivid_get_format(dev, mp->pixelformat);
    571	}
    572
    573	mp->field = vivid_field_cap(dev, mp->field);
    574	if (vivid_is_webcam(dev)) {
    575		const struct v4l2_frmsize_discrete *sz =
    576			v4l2_find_nearest_size(webcam_sizes,
    577					       VIVID_WEBCAM_SIZES, width,
    578					       height, mp->width, mp->height);
    579
    580		w = sz->width;
    581		h = sz->height;
    582	} else if (vivid_is_sdtv_cap(dev)) {
    583		w = 720;
    584		h = (dev->std_cap[dev->input] & V4L2_STD_525_60) ? 480 : 576;
    585	} else {
    586		w = dev->src_rect.width;
    587		h = dev->src_rect.height;
    588	}
    589	if (V4L2_FIELD_HAS_T_OR_B(mp->field))
    590		factor = 2;
    591	if (vivid_is_webcam(dev) ||
    592	    (!dev->has_scaler_cap && !dev->has_crop_cap && !dev->has_compose_cap)) {
    593		mp->width = w;
    594		mp->height = h / factor;
    595	} else {
    596		struct v4l2_rect r = { 0, 0, mp->width, mp->height * factor };
    597
    598		v4l2_rect_set_min_size(&r, &vivid_min_rect);
    599		v4l2_rect_set_max_size(&r, &vivid_max_rect);
    600		if (dev->has_scaler_cap && !dev->has_compose_cap) {
    601			struct v4l2_rect max_r = { 0, 0, MAX_ZOOM * w, MAX_ZOOM * h };
    602
    603			v4l2_rect_set_max_size(&r, &max_r);
    604		} else if (!dev->has_scaler_cap && dev->has_crop_cap && !dev->has_compose_cap) {
    605			v4l2_rect_set_max_size(&r, &dev->src_rect);
    606		} else if (!dev->has_scaler_cap && !dev->has_crop_cap) {
    607			v4l2_rect_set_min_size(&r, &dev->src_rect);
    608		}
    609		mp->width = r.width;
    610		mp->height = r.height / factor;
    611	}
    612
    613	/* This driver supports custom bytesperline values */
    614
    615	mp->num_planes = fmt->buffers;
    616	for (p = 0; p < fmt->buffers; p++) {
    617		/* Calculate the minimum supported bytesperline value */
    618		bytesperline = (mp->width * fmt->bit_depth[p]) >> 3;
    619		/* Calculate the maximum supported bytesperline value */
    620		max_bpl = (MAX_ZOOM * MAX_WIDTH * fmt->bit_depth[p]) >> 3;
    621
    622		if (pfmt[p].bytesperline > max_bpl)
    623			pfmt[p].bytesperline = max_bpl;
    624		if (pfmt[p].bytesperline < bytesperline)
    625			pfmt[p].bytesperline = bytesperline;
    626
    627		pfmt[p].sizeimage = (pfmt[p].bytesperline * mp->height) /
    628				fmt->vdownsampling[p] + fmt->data_offset[p];
    629
    630		memset(pfmt[p].reserved, 0, sizeof(pfmt[p].reserved));
    631	}
    632	for (p = fmt->buffers; p < fmt->planes; p++)
    633		pfmt[0].sizeimage += (pfmt[0].bytesperline * mp->height *
    634			(fmt->bit_depth[p] / fmt->vdownsampling[p])) /
    635			(fmt->bit_depth[0] / fmt->vdownsampling[0]);
    636
    637	if (!user_set_csc || !v4l2_is_colorspace_valid(mp->colorspace))
    638		mp->colorspace = vivid_colorspace_cap(dev);
    639
    640	if (!user_set_csc || !v4l2_is_xfer_func_valid(mp->xfer_func))
    641		mp->xfer_func = vivid_xfer_func_cap(dev);
    642
    643	if (fmt->color_enc == TGP_COLOR_ENC_HSV) {
    644		if (!user_set_csc || !v4l2_is_hsv_enc_valid(mp->hsv_enc))
    645			mp->hsv_enc = vivid_hsv_enc_cap(dev);
    646	} else if (fmt->color_enc == TGP_COLOR_ENC_YCBCR) {
    647		if (!user_set_csc || !v4l2_is_ycbcr_enc_valid(mp->ycbcr_enc))
    648			mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev);
    649	} else {
    650		mp->ycbcr_enc = vivid_ycbcr_enc_cap(dev);
    651	}
    652
    653	if (fmt->color_enc == TGP_COLOR_ENC_YCBCR ||
    654	    fmt->color_enc == TGP_COLOR_ENC_RGB) {
    655		if (!user_set_csc || !v4l2_is_quant_valid(mp->quantization))
    656			mp->quantization = vivid_quantization_cap(dev);
    657	} else {
    658		mp->quantization = vivid_quantization_cap(dev);
    659	}
    660
    661	memset(mp->reserved, 0, sizeof(mp->reserved));
    662	return 0;
    663}
    664
    665int vivid_s_fmt_vid_cap(struct file *file, void *priv,
    666					struct v4l2_format *f)
    667{
    668	struct v4l2_pix_format_mplane *mp = &f->fmt.pix_mp;
    669	struct vivid_dev *dev = video_drvdata(file);
    670	struct v4l2_rect *crop = &dev->crop_cap;
    671	struct v4l2_rect *compose = &dev->compose_cap;
    672	struct vb2_queue *q = &dev->vb_vid_cap_q;
    673	int ret = vivid_try_fmt_vid_cap(file, priv, f);
    674	unsigned factor = 1;
    675	unsigned p;
    676	unsigned i;
    677
    678	if (ret < 0)
    679		return ret;
    680
    681	if (vb2_is_busy(q)) {
    682		dprintk(dev, 1, "%s device busy\n", __func__);
    683		return -EBUSY;
    684	}
    685
    686	if (dev->overlay_cap_owner && dev->fb_cap.fmt.pixelformat != mp->pixelformat) {
    687		dprintk(dev, 1, "overlay is active, can't change pixelformat\n");
    688		return -EBUSY;
    689	}
    690
    691	dev->fmt_cap = vivid_get_format(dev, mp->pixelformat);
    692	if (V4L2_FIELD_HAS_T_OR_B(mp->field))
    693		factor = 2;
    694
    695	/* Note: the webcam input doesn't support scaling, cropping or composing */
    696
    697	if (!vivid_is_webcam(dev) &&
    698	    (dev->has_scaler_cap || dev->has_crop_cap || dev->has_compose_cap)) {
    699		struct v4l2_rect r = { 0, 0, mp->width, mp->height };
    700
    701		if (dev->has_scaler_cap) {
    702			if (dev->has_compose_cap)
    703				v4l2_rect_map_inside(compose, &r);
    704			else
    705				*compose = r;
    706			if (dev->has_crop_cap && !dev->has_compose_cap) {
    707				struct v4l2_rect min_r = {
    708					0, 0,
    709					r.width / MAX_ZOOM,
    710					factor * r.height / MAX_ZOOM
    711				};
    712				struct v4l2_rect max_r = {
    713					0, 0,
    714					r.width * MAX_ZOOM,
    715					factor * r.height * MAX_ZOOM
    716				};
    717
    718				v4l2_rect_set_min_size(crop, &min_r);
    719				v4l2_rect_set_max_size(crop, &max_r);
    720				v4l2_rect_map_inside(crop, &dev->crop_bounds_cap);
    721			} else if (dev->has_crop_cap) {
    722				struct v4l2_rect min_r = {
    723					0, 0,
    724					compose->width / MAX_ZOOM,
    725					factor * compose->height / MAX_ZOOM
    726				};
    727				struct v4l2_rect max_r = {
    728					0, 0,
    729					compose->width * MAX_ZOOM,
    730					factor * compose->height * MAX_ZOOM
    731				};
    732
    733				v4l2_rect_set_min_size(crop, &min_r);
    734				v4l2_rect_set_max_size(crop, &max_r);
    735				v4l2_rect_map_inside(crop, &dev->crop_bounds_cap);
    736			}
    737		} else if (dev->has_crop_cap && !dev->has_compose_cap) {
    738			r.height *= factor;
    739			v4l2_rect_set_size_to(crop, &r);
    740			v4l2_rect_map_inside(crop, &dev->crop_bounds_cap);
    741			r = *crop;
    742			r.height /= factor;
    743			v4l2_rect_set_size_to(compose, &r);
    744		} else if (!dev->has_crop_cap) {
    745			v4l2_rect_map_inside(compose, &r);
    746		} else {
    747			r.height *= factor;
    748			v4l2_rect_set_max_size(crop, &r);
    749			v4l2_rect_map_inside(crop, &dev->crop_bounds_cap);
    750			compose->top *= factor;
    751			compose->height *= factor;
    752			v4l2_rect_set_size_to(compose, crop);
    753			v4l2_rect_map_inside(compose, &r);
    754			compose->top /= factor;
    755			compose->height /= factor;
    756		}
    757	} else if (vivid_is_webcam(dev)) {
    758		/* Guaranteed to be a match */
    759		for (i = 0; i < ARRAY_SIZE(webcam_sizes); i++)
    760			if (webcam_sizes[i].width == mp->width &&
    761					webcam_sizes[i].height == mp->height)
    762				break;
    763		dev->webcam_size_idx = i;
    764		if (dev->webcam_ival_idx >= 2 * (VIVID_WEBCAM_SIZES - i))
    765			dev->webcam_ival_idx = 2 * (VIVID_WEBCAM_SIZES - i) - 1;
    766		vivid_update_format_cap(dev, false);
    767	} else {
    768		struct v4l2_rect r = { 0, 0, mp->width, mp->height };
    769
    770		v4l2_rect_set_size_to(compose, &r);
    771		r.height *= factor;
    772		v4l2_rect_set_size_to(crop, &r);
    773	}
    774
    775	dev->fmt_cap_rect.width = mp->width;
    776	dev->fmt_cap_rect.height = mp->height;
    777	tpg_s_buf_height(&dev->tpg, mp->height);
    778	tpg_s_fourcc(&dev->tpg, dev->fmt_cap->fourcc);
    779	for (p = 0; p < tpg_g_buffers(&dev->tpg); p++)
    780		tpg_s_bytesperline(&dev->tpg, p, mp->plane_fmt[p].bytesperline);
    781	dev->field_cap = mp->field;
    782	if (dev->field_cap == V4L2_FIELD_ALTERNATE)
    783		tpg_s_field(&dev->tpg, V4L2_FIELD_TOP, true);
    784	else
    785		tpg_s_field(&dev->tpg, dev->field_cap, false);
    786	tpg_s_crop_compose(&dev->tpg, &dev->crop_cap, &dev->compose_cap);
    787	if (vivid_is_sdtv_cap(dev))
    788		dev->tv_field_cap = mp->field;
    789	tpg_update_mv_step(&dev->tpg);
    790	dev->tpg.colorspace = mp->colorspace;
    791	dev->tpg.xfer_func = mp->xfer_func;
    792	if (dev->fmt_cap->color_enc == TGP_COLOR_ENC_YCBCR)
    793		dev->tpg.ycbcr_enc = mp->ycbcr_enc;
    794	else
    795		dev->tpg.hsv_enc = mp->hsv_enc;
    796	dev->tpg.quantization = mp->quantization;
    797
    798	return 0;
    799}
    800
    801int vidioc_g_fmt_vid_cap_mplane(struct file *file, void *priv,
    802					struct v4l2_format *f)
    803{
    804	struct vivid_dev *dev = video_drvdata(file);
    805
    806	if (!dev->multiplanar)
    807		return -ENOTTY;
    808	return vivid_g_fmt_vid_cap(file, priv, f);
    809}
    810
    811int vidioc_try_fmt_vid_cap_mplane(struct file *file, void *priv,
    812			struct v4l2_format *f)
    813{
    814	struct vivid_dev *dev = video_drvdata(file);
    815
    816	if (!dev->multiplanar)
    817		return -ENOTTY;
    818	return vivid_try_fmt_vid_cap(file, priv, f);
    819}
    820
    821int vidioc_s_fmt_vid_cap_mplane(struct file *file, void *priv,
    822			struct v4l2_format *f)
    823{
    824	struct vivid_dev *dev = video_drvdata(file);
    825
    826	if (!dev->multiplanar)
    827		return -ENOTTY;
    828	return vivid_s_fmt_vid_cap(file, priv, f);
    829}
    830
    831int vidioc_g_fmt_vid_cap(struct file *file, void *priv,
    832					struct v4l2_format *f)
    833{
    834	struct vivid_dev *dev = video_drvdata(file);
    835
    836	if (dev->multiplanar)
    837		return -ENOTTY;
    838	return fmt_sp2mp_func(file, priv, f, vivid_g_fmt_vid_cap);
    839}
    840
    841int vidioc_try_fmt_vid_cap(struct file *file, void *priv,
    842			struct v4l2_format *f)
    843{
    844	struct vivid_dev *dev = video_drvdata(file);
    845
    846	if (dev->multiplanar)
    847		return -ENOTTY;
    848	return fmt_sp2mp_func(file, priv, f, vivid_try_fmt_vid_cap);
    849}
    850
    851int vidioc_s_fmt_vid_cap(struct file *file, void *priv,
    852			struct v4l2_format *f)
    853{
    854	struct vivid_dev *dev = video_drvdata(file);
    855
    856	if (dev->multiplanar)
    857		return -ENOTTY;
    858	return fmt_sp2mp_func(file, priv, f, vivid_s_fmt_vid_cap);
    859}
    860
    861int vivid_vid_cap_g_selection(struct file *file, void *priv,
    862			      struct v4l2_selection *sel)
    863{
    864	struct vivid_dev *dev = video_drvdata(file);
    865
    866	if (!dev->has_crop_cap && !dev->has_compose_cap)
    867		return -ENOTTY;
    868	if (sel->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
    869		return -EINVAL;
    870	if (vivid_is_webcam(dev))
    871		return -ENODATA;
    872
    873	sel->r.left = sel->r.top = 0;
    874	switch (sel->target) {
    875	case V4L2_SEL_TGT_CROP:
    876		if (!dev->has_crop_cap)
    877			return -EINVAL;
    878		sel->r = dev->crop_cap;
    879		break;
    880	case V4L2_SEL_TGT_CROP_DEFAULT:
    881	case V4L2_SEL_TGT_CROP_BOUNDS:
    882		if (!dev->has_crop_cap)
    883			return -EINVAL;
    884		sel->r = dev->src_rect;
    885		break;
    886	case V4L2_SEL_TGT_COMPOSE_BOUNDS:
    887		if (!dev->has_compose_cap)
    888			return -EINVAL;
    889		sel->r = vivid_max_rect;
    890		break;
    891	case V4L2_SEL_TGT_COMPOSE:
    892		if (!dev->has_compose_cap)
    893			return -EINVAL;
    894		sel->r = dev->compose_cap;
    895		break;
    896	case V4L2_SEL_TGT_COMPOSE_DEFAULT:
    897		if (!dev->has_compose_cap)
    898			return -EINVAL;
    899		sel->r = dev->fmt_cap_rect;
    900		break;
    901	default:
    902		return -EINVAL;
    903	}
    904	return 0;
    905}
    906
    907int vivid_vid_cap_s_selection(struct file *file, void *fh, struct v4l2_selection *s)
    908{
    909	struct vivid_dev *dev = video_drvdata(file);
    910	struct v4l2_rect *crop = &dev->crop_cap;
    911	struct v4l2_rect *compose = &dev->compose_cap;
    912	unsigned factor = V4L2_FIELD_HAS_T_OR_B(dev->field_cap) ? 2 : 1;
    913	int ret;
    914
    915	if (!dev->has_crop_cap && !dev->has_compose_cap)
    916		return -ENOTTY;
    917	if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
    918		return -EINVAL;
    919	if (vivid_is_webcam(dev))
    920		return -ENODATA;
    921
    922	switch (s->target) {
    923	case V4L2_SEL_TGT_CROP:
    924		if (!dev->has_crop_cap)
    925			return -EINVAL;
    926		ret = vivid_vid_adjust_sel(s->flags, &s->r);
    927		if (ret)
    928			return ret;
    929		v4l2_rect_set_min_size(&s->r, &vivid_min_rect);
    930		v4l2_rect_set_max_size(&s->r, &dev->src_rect);
    931		v4l2_rect_map_inside(&s->r, &dev->crop_bounds_cap);
    932		s->r.top /= factor;
    933		s->r.height /= factor;
    934		if (dev->has_scaler_cap) {
    935			struct v4l2_rect fmt = dev->fmt_cap_rect;
    936			struct v4l2_rect max_rect = {
    937				0, 0,
    938				s->r.width * MAX_ZOOM,
    939				s->r.height * MAX_ZOOM
    940			};
    941			struct v4l2_rect min_rect = {
    942				0, 0,
    943				s->r.width / MAX_ZOOM,
    944				s->r.height / MAX_ZOOM
    945			};
    946
    947			v4l2_rect_set_min_size(&fmt, &min_rect);
    948			if (!dev->has_compose_cap)
    949				v4l2_rect_set_max_size(&fmt, &max_rect);
    950			if (!v4l2_rect_same_size(&dev->fmt_cap_rect, &fmt) &&
    951			    vb2_is_busy(&dev->vb_vid_cap_q))
    952				return -EBUSY;
    953			if (dev->has_compose_cap) {
    954				v4l2_rect_set_min_size(compose, &min_rect);
    955				v4l2_rect_set_max_size(compose, &max_rect);
    956			}
    957			dev->fmt_cap_rect = fmt;
    958			tpg_s_buf_height(&dev->tpg, fmt.height);
    959		} else if (dev->has_compose_cap) {
    960			struct v4l2_rect fmt = dev->fmt_cap_rect;
    961
    962			v4l2_rect_set_min_size(&fmt, &s->r);
    963			if (!v4l2_rect_same_size(&dev->fmt_cap_rect, &fmt) &&
    964			    vb2_is_busy(&dev->vb_vid_cap_q))
    965				return -EBUSY;
    966			dev->fmt_cap_rect = fmt;
    967			tpg_s_buf_height(&dev->tpg, fmt.height);
    968			v4l2_rect_set_size_to(compose, &s->r);
    969			v4l2_rect_map_inside(compose, &dev->fmt_cap_rect);
    970		} else {
    971			if (!v4l2_rect_same_size(&s->r, &dev->fmt_cap_rect) &&
    972			    vb2_is_busy(&dev->vb_vid_cap_q))
    973				return -EBUSY;
    974			v4l2_rect_set_size_to(&dev->fmt_cap_rect, &s->r);
    975			v4l2_rect_set_size_to(compose, &s->r);
    976			v4l2_rect_map_inside(compose, &dev->fmt_cap_rect);
    977			tpg_s_buf_height(&dev->tpg, dev->fmt_cap_rect.height);
    978		}
    979		s->r.top *= factor;
    980		s->r.height *= factor;
    981		*crop = s->r;
    982		break;
    983	case V4L2_SEL_TGT_COMPOSE:
    984		if (!dev->has_compose_cap)
    985			return -EINVAL;
    986		ret = vivid_vid_adjust_sel(s->flags, &s->r);
    987		if (ret)
    988			return ret;
    989		v4l2_rect_set_min_size(&s->r, &vivid_min_rect);
    990		v4l2_rect_set_max_size(&s->r, &dev->fmt_cap_rect);
    991		if (dev->has_scaler_cap) {
    992			struct v4l2_rect max_rect = {
    993				0, 0,
    994				dev->src_rect.width * MAX_ZOOM,
    995				(dev->src_rect.height / factor) * MAX_ZOOM
    996			};
    997
    998			v4l2_rect_set_max_size(&s->r, &max_rect);
    999			if (dev->has_crop_cap) {
   1000				struct v4l2_rect min_rect = {
   1001					0, 0,
   1002					s->r.width / MAX_ZOOM,
   1003					(s->r.height * factor) / MAX_ZOOM
   1004				};
   1005				struct v4l2_rect max_rect = {
   1006					0, 0,
   1007					s->r.width * MAX_ZOOM,
   1008					(s->r.height * factor) * MAX_ZOOM
   1009				};
   1010
   1011				v4l2_rect_set_min_size(crop, &min_rect);
   1012				v4l2_rect_set_max_size(crop, &max_rect);
   1013				v4l2_rect_map_inside(crop, &dev->crop_bounds_cap);
   1014			}
   1015		} else if (dev->has_crop_cap) {
   1016			s->r.top *= factor;
   1017			s->r.height *= factor;
   1018			v4l2_rect_set_max_size(&s->r, &dev->src_rect);
   1019			v4l2_rect_set_size_to(crop, &s->r);
   1020			v4l2_rect_map_inside(crop, &dev->crop_bounds_cap);
   1021			s->r.top /= factor;
   1022			s->r.height /= factor;
   1023		} else {
   1024			v4l2_rect_set_size_to(&s->r, &dev->src_rect);
   1025			s->r.height /= factor;
   1026		}
   1027		v4l2_rect_map_inside(&s->r, &dev->fmt_cap_rect);
   1028		if (dev->bitmap_cap && (compose->width != s->r.width ||
   1029					compose->height != s->r.height)) {
   1030			vfree(dev->bitmap_cap);
   1031			dev->bitmap_cap = NULL;
   1032		}
   1033		*compose = s->r;
   1034		break;
   1035	default:
   1036		return -EINVAL;
   1037	}
   1038
   1039	tpg_s_crop_compose(&dev->tpg, crop, compose);
   1040	return 0;
   1041}
   1042
   1043int vivid_vid_cap_g_pixelaspect(struct file *file, void *priv,
   1044				int type, struct v4l2_fract *f)
   1045{
   1046	struct vivid_dev *dev = video_drvdata(file);
   1047
   1048	if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
   1049		return -EINVAL;
   1050
   1051	switch (vivid_get_pixel_aspect(dev)) {
   1052	case TPG_PIXEL_ASPECT_NTSC:
   1053		f->numerator = 11;
   1054		f->denominator = 10;
   1055		break;
   1056	case TPG_PIXEL_ASPECT_PAL:
   1057		f->numerator = 54;
   1058		f->denominator = 59;
   1059		break;
   1060	default:
   1061		break;
   1062	}
   1063	return 0;
   1064}
   1065
   1066int vidioc_enum_fmt_vid_overlay(struct file *file, void  *priv,
   1067					struct v4l2_fmtdesc *f)
   1068{
   1069	struct vivid_dev *dev = video_drvdata(file);
   1070	const struct vivid_fmt *fmt;
   1071
   1072	if (dev->multiplanar)
   1073		return -ENOTTY;
   1074
   1075	if (f->index >= ARRAY_SIZE(formats_ovl))
   1076		return -EINVAL;
   1077
   1078	fmt = &formats_ovl[f->index];
   1079
   1080	f->pixelformat = fmt->fourcc;
   1081	return 0;
   1082}
   1083
   1084int vidioc_g_fmt_vid_overlay(struct file *file, void *priv,
   1085					struct v4l2_format *f)
   1086{
   1087	struct vivid_dev *dev = video_drvdata(file);
   1088	const struct v4l2_rect *compose = &dev->compose_cap;
   1089	struct v4l2_window *win = &f->fmt.win;
   1090	unsigned clipcount = win->clipcount;
   1091
   1092	if (dev->multiplanar)
   1093		return -ENOTTY;
   1094
   1095	win->w.top = dev->overlay_cap_top;
   1096	win->w.left = dev->overlay_cap_left;
   1097	win->w.width = compose->width;
   1098	win->w.height = compose->height;
   1099	win->field = dev->overlay_cap_field;
   1100	win->clipcount = dev->clipcount_cap;
   1101	if (clipcount > dev->clipcount_cap)
   1102		clipcount = dev->clipcount_cap;
   1103	if (dev->bitmap_cap == NULL)
   1104		win->bitmap = NULL;
   1105	else if (win->bitmap) {
   1106		if (copy_to_user(win->bitmap, dev->bitmap_cap,
   1107		    ((compose->width + 7) / 8) * compose->height))
   1108			return -EFAULT;
   1109	}
   1110	if (clipcount && win->clips)
   1111		memcpy(win->clips, dev->clips_cap,
   1112		       clipcount * sizeof(dev->clips_cap[0]));
   1113	return 0;
   1114}
   1115
   1116int vidioc_try_fmt_vid_overlay(struct file *file, void *priv,
   1117					struct v4l2_format *f)
   1118{
   1119	struct vivid_dev *dev = video_drvdata(file);
   1120	const struct v4l2_rect *compose = &dev->compose_cap;
   1121	struct v4l2_window *win = &f->fmt.win;
   1122	int i, j;
   1123
   1124	if (dev->multiplanar)
   1125		return -ENOTTY;
   1126
   1127	win->w.left = clamp_t(int, win->w.left,
   1128			      -dev->fb_cap.fmt.width, dev->fb_cap.fmt.width);
   1129	win->w.top = clamp_t(int, win->w.top,
   1130			     -dev->fb_cap.fmt.height, dev->fb_cap.fmt.height);
   1131	win->w.width = compose->width;
   1132	win->w.height = compose->height;
   1133	if (win->field != V4L2_FIELD_BOTTOM && win->field != V4L2_FIELD_TOP)
   1134		win->field = V4L2_FIELD_ANY;
   1135	win->chromakey = 0;
   1136	win->global_alpha = 0;
   1137	if (win->clipcount && !win->clips)
   1138		win->clipcount = 0;
   1139	if (win->clipcount > MAX_CLIPS)
   1140		win->clipcount = MAX_CLIPS;
   1141	if (win->clipcount) {
   1142		memcpy(dev->try_clips_cap, win->clips,
   1143		       win->clipcount * sizeof(dev->clips_cap[0]));
   1144		for (i = 0; i < win->clipcount; i++) {
   1145			struct v4l2_rect *r = &dev->try_clips_cap[i].c;
   1146
   1147			r->top = clamp_t(s32, r->top, 0, dev->fb_cap.fmt.height - 1);
   1148			r->height = clamp_t(s32, r->height, 1, dev->fb_cap.fmt.height - r->top);
   1149			r->left = clamp_t(u32, r->left, 0, dev->fb_cap.fmt.width - 1);
   1150			r->width = clamp_t(u32, r->width, 1, dev->fb_cap.fmt.width - r->left);
   1151		}
   1152		/*
   1153		 * Yeah, so sue me, it's an O(n^2) algorithm. But n is a small
   1154		 * number and it's typically a one-time deal.
   1155		 */
   1156		for (i = 0; i < win->clipcount - 1; i++) {
   1157			struct v4l2_rect *r1 = &dev->try_clips_cap[i].c;
   1158
   1159			for (j = i + 1; j < win->clipcount; j++) {
   1160				struct v4l2_rect *r2 = &dev->try_clips_cap[j].c;
   1161
   1162				if (v4l2_rect_overlap(r1, r2))
   1163					return -EINVAL;
   1164			}
   1165		}
   1166		memcpy(win->clips, dev->try_clips_cap,
   1167		       win->clipcount * sizeof(dev->clips_cap[0]));
   1168	}
   1169	return 0;
   1170}
   1171
   1172int vidioc_s_fmt_vid_overlay(struct file *file, void *priv,
   1173					struct v4l2_format *f)
   1174{
   1175	struct vivid_dev *dev = video_drvdata(file);
   1176	const struct v4l2_rect *compose = &dev->compose_cap;
   1177	struct v4l2_window *win = &f->fmt.win;
   1178	int ret = vidioc_try_fmt_vid_overlay(file, priv, f);
   1179	unsigned bitmap_size = ((compose->width + 7) / 8) * compose->height;
   1180	unsigned clips_size = win->clipcount * sizeof(dev->clips_cap[0]);
   1181	void *new_bitmap = NULL;
   1182
   1183	if (ret)
   1184		return ret;
   1185
   1186	if (win->bitmap) {
   1187		new_bitmap = vzalloc(bitmap_size);
   1188
   1189		if (new_bitmap == NULL)
   1190			return -ENOMEM;
   1191		if (copy_from_user(new_bitmap, win->bitmap, bitmap_size)) {
   1192			vfree(new_bitmap);
   1193			return -EFAULT;
   1194		}
   1195	}
   1196
   1197	dev->overlay_cap_top = win->w.top;
   1198	dev->overlay_cap_left = win->w.left;
   1199	dev->overlay_cap_field = win->field;
   1200	vfree(dev->bitmap_cap);
   1201	dev->bitmap_cap = new_bitmap;
   1202	dev->clipcount_cap = win->clipcount;
   1203	if (dev->clipcount_cap)
   1204		memcpy(dev->clips_cap, dev->try_clips_cap, clips_size);
   1205	return 0;
   1206}
   1207
   1208int vivid_vid_cap_overlay(struct file *file, void *fh, unsigned i)
   1209{
   1210	struct vivid_dev *dev = video_drvdata(file);
   1211
   1212	if (dev->multiplanar)
   1213		return -ENOTTY;
   1214
   1215	if (i && dev->fb_vbase_cap == NULL)
   1216		return -EINVAL;
   1217
   1218	if (i && dev->fb_cap.fmt.pixelformat != dev->fmt_cap->fourcc) {
   1219		dprintk(dev, 1, "mismatch between overlay and video capture pixelformats\n");
   1220		return -EINVAL;
   1221	}
   1222
   1223	if (dev->overlay_cap_owner && dev->overlay_cap_owner != fh)
   1224		return -EBUSY;
   1225	dev->overlay_cap_owner = i ? fh : NULL;
   1226	return 0;
   1227}
   1228
   1229int vivid_vid_cap_g_fbuf(struct file *file, void *fh,
   1230				struct v4l2_framebuffer *a)
   1231{
   1232	struct vivid_dev *dev = video_drvdata(file);
   1233
   1234	if (dev->multiplanar)
   1235		return -ENOTTY;
   1236
   1237	*a = dev->fb_cap;
   1238	a->capability = V4L2_FBUF_CAP_BITMAP_CLIPPING |
   1239			V4L2_FBUF_CAP_LIST_CLIPPING;
   1240	a->flags = V4L2_FBUF_FLAG_PRIMARY;
   1241	a->fmt.field = V4L2_FIELD_NONE;
   1242	a->fmt.colorspace = V4L2_COLORSPACE_SRGB;
   1243	a->fmt.priv = 0;
   1244	return 0;
   1245}
   1246
   1247int vivid_vid_cap_s_fbuf(struct file *file, void *fh,
   1248				const struct v4l2_framebuffer *a)
   1249{
   1250	struct vivid_dev *dev = video_drvdata(file);
   1251	const struct vivid_fmt *fmt;
   1252
   1253	if (dev->multiplanar)
   1254		return -ENOTTY;
   1255
   1256	if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RAWIO))
   1257		return -EPERM;
   1258
   1259	if (dev->overlay_cap_owner)
   1260		return -EBUSY;
   1261
   1262	if (a->base == NULL) {
   1263		dev->fb_cap.base = NULL;
   1264		dev->fb_vbase_cap = NULL;
   1265		return 0;
   1266	}
   1267
   1268	if (a->fmt.width < 48 || a->fmt.height < 32)
   1269		return -EINVAL;
   1270	fmt = vivid_get_format(dev, a->fmt.pixelformat);
   1271	if (!fmt || !fmt->can_do_overlay)
   1272		return -EINVAL;
   1273	if (a->fmt.bytesperline < (a->fmt.width * fmt->bit_depth[0]) / 8)
   1274		return -EINVAL;
   1275	if (a->fmt.height * a->fmt.bytesperline < a->fmt.sizeimage)
   1276		return -EINVAL;
   1277
   1278	dev->fb_vbase_cap = phys_to_virt((unsigned long)a->base);
   1279	dev->fb_cap = *a;
   1280	dev->overlay_cap_left = clamp_t(int, dev->overlay_cap_left,
   1281				    -dev->fb_cap.fmt.width, dev->fb_cap.fmt.width);
   1282	dev->overlay_cap_top = clamp_t(int, dev->overlay_cap_top,
   1283				   -dev->fb_cap.fmt.height, dev->fb_cap.fmt.height);
   1284	return 0;
   1285}
   1286
   1287static const struct v4l2_audio vivid_audio_inputs[] = {
   1288	{ 0, "TV", V4L2_AUDCAP_STEREO },
   1289	{ 1, "Line-In", V4L2_AUDCAP_STEREO },
   1290};
   1291
   1292int vidioc_enum_input(struct file *file, void *priv,
   1293				struct v4l2_input *inp)
   1294{
   1295	struct vivid_dev *dev = video_drvdata(file);
   1296
   1297	if (inp->index >= dev->num_inputs)
   1298		return -EINVAL;
   1299
   1300	inp->type = V4L2_INPUT_TYPE_CAMERA;
   1301	switch (dev->input_type[inp->index]) {
   1302	case WEBCAM:
   1303		snprintf(inp->name, sizeof(inp->name), "Webcam %u",
   1304				dev->input_name_counter[inp->index]);
   1305		inp->capabilities = 0;
   1306		break;
   1307	case TV:
   1308		snprintf(inp->name, sizeof(inp->name), "TV %u",
   1309				dev->input_name_counter[inp->index]);
   1310		inp->type = V4L2_INPUT_TYPE_TUNER;
   1311		inp->std = V4L2_STD_ALL;
   1312		if (dev->has_audio_inputs)
   1313			inp->audioset = (1 << ARRAY_SIZE(vivid_audio_inputs)) - 1;
   1314		inp->capabilities = V4L2_IN_CAP_STD;
   1315		break;
   1316	case SVID:
   1317		snprintf(inp->name, sizeof(inp->name), "S-Video %u",
   1318				dev->input_name_counter[inp->index]);
   1319		inp->std = V4L2_STD_ALL;
   1320		if (dev->has_audio_inputs)
   1321			inp->audioset = (1 << ARRAY_SIZE(vivid_audio_inputs)) - 1;
   1322		inp->capabilities = V4L2_IN_CAP_STD;
   1323		break;
   1324	case HDMI:
   1325		snprintf(inp->name, sizeof(inp->name), "HDMI %u",
   1326				dev->input_name_counter[inp->index]);
   1327		inp->capabilities = V4L2_IN_CAP_DV_TIMINGS;
   1328		if (dev->edid_blocks == 0 ||
   1329		    dev->dv_timings_signal_mode[dev->input] == NO_SIGNAL)
   1330			inp->status |= V4L2_IN_ST_NO_SIGNAL;
   1331		else if (dev->dv_timings_signal_mode[dev->input] == NO_LOCK ||
   1332			 dev->dv_timings_signal_mode[dev->input] == OUT_OF_RANGE)
   1333			inp->status |= V4L2_IN_ST_NO_H_LOCK;
   1334		break;
   1335	}
   1336	if (dev->sensor_hflip)
   1337		inp->status |= V4L2_IN_ST_HFLIP;
   1338	if (dev->sensor_vflip)
   1339		inp->status |= V4L2_IN_ST_VFLIP;
   1340	if (dev->input == inp->index && vivid_is_sdtv_cap(dev)) {
   1341		if (dev->std_signal_mode[dev->input] == NO_SIGNAL) {
   1342			inp->status |= V4L2_IN_ST_NO_SIGNAL;
   1343		} else if (dev->std_signal_mode[dev->input] == NO_LOCK) {
   1344			inp->status |= V4L2_IN_ST_NO_H_LOCK;
   1345		} else if (vivid_is_tv_cap(dev)) {
   1346			switch (tpg_g_quality(&dev->tpg)) {
   1347			case TPG_QUAL_GRAY:
   1348				inp->status |= V4L2_IN_ST_COLOR_KILL;
   1349				break;
   1350			case TPG_QUAL_NOISE:
   1351				inp->status |= V4L2_IN_ST_NO_H_LOCK;
   1352				break;
   1353			default:
   1354				break;
   1355			}
   1356		}
   1357	}
   1358	return 0;
   1359}
   1360
   1361int vidioc_g_input(struct file *file, void *priv, unsigned *i)
   1362{
   1363	struct vivid_dev *dev = video_drvdata(file);
   1364
   1365	*i = dev->input;
   1366	return 0;
   1367}
   1368
   1369int vidioc_s_input(struct file *file, void *priv, unsigned i)
   1370{
   1371	struct vivid_dev *dev = video_drvdata(file);
   1372	struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt;
   1373	unsigned brightness;
   1374
   1375	if (i >= dev->num_inputs)
   1376		return -EINVAL;
   1377
   1378	if (i == dev->input)
   1379		return 0;
   1380
   1381	if (vb2_is_busy(&dev->vb_vid_cap_q) ||
   1382	    vb2_is_busy(&dev->vb_vbi_cap_q) ||
   1383	    vb2_is_busy(&dev->vb_meta_cap_q))
   1384		return -EBUSY;
   1385
   1386	dev->input = i;
   1387	dev->vid_cap_dev.tvnorms = 0;
   1388	if (dev->input_type[i] == TV || dev->input_type[i] == SVID) {
   1389		dev->tv_audio_input = (dev->input_type[i] == TV) ? 0 : 1;
   1390		dev->vid_cap_dev.tvnorms = V4L2_STD_ALL;
   1391	}
   1392	dev->vbi_cap_dev.tvnorms = dev->vid_cap_dev.tvnorms;
   1393	dev->meta_cap_dev.tvnorms = dev->vid_cap_dev.tvnorms;
   1394	vivid_update_format_cap(dev, false);
   1395
   1396	if (dev->colorspace) {
   1397		switch (dev->input_type[i]) {
   1398		case WEBCAM:
   1399			v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB);
   1400			break;
   1401		case TV:
   1402		case SVID:
   1403			v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M);
   1404			break;
   1405		case HDMI:
   1406			if (bt->flags & V4L2_DV_FL_IS_CE_VIDEO) {
   1407				if (dev->src_rect.width == 720 && dev->src_rect.height <= 576)
   1408					v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_170M);
   1409				else
   1410					v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_709);
   1411			} else {
   1412				v4l2_ctrl_s_ctrl(dev->colorspace, VIVID_CS_SRGB);
   1413			}
   1414			break;
   1415		}
   1416	}
   1417
   1418	/*
   1419	 * Modify the brightness range depending on the input.
   1420	 * This makes it easy to use vivid to test if applications can
   1421	 * handle control range modifications and is also how this is
   1422	 * typically used in practice as different inputs may be hooked
   1423	 * up to different receivers with different control ranges.
   1424	 */
   1425	brightness = 128 * i + dev->input_brightness[i];
   1426	v4l2_ctrl_modify_range(dev->brightness,
   1427			128 * i, 255 + 128 * i, 1, 128 + 128 * i);
   1428	v4l2_ctrl_s_ctrl(dev->brightness, brightness);
   1429
   1430	/* Restore per-input states. */
   1431	v4l2_ctrl_activate(dev->ctrl_dv_timings_signal_mode,
   1432			   vivid_is_hdmi_cap(dev));
   1433	v4l2_ctrl_activate(dev->ctrl_dv_timings, vivid_is_hdmi_cap(dev) &&
   1434			   dev->dv_timings_signal_mode[dev->input] ==
   1435			   SELECTED_DV_TIMINGS);
   1436	v4l2_ctrl_activate(dev->ctrl_std_signal_mode, vivid_is_sdtv_cap(dev));
   1437	v4l2_ctrl_activate(dev->ctrl_standard, vivid_is_sdtv_cap(dev) &&
   1438			   dev->std_signal_mode[dev->input]);
   1439
   1440	if (vivid_is_hdmi_cap(dev)) {
   1441		v4l2_ctrl_s_ctrl(dev->ctrl_dv_timings_signal_mode,
   1442				 dev->dv_timings_signal_mode[dev->input]);
   1443		v4l2_ctrl_s_ctrl(dev->ctrl_dv_timings,
   1444				 dev->query_dv_timings[dev->input]);
   1445	} else if (vivid_is_sdtv_cap(dev)) {
   1446		v4l2_ctrl_s_ctrl(dev->ctrl_std_signal_mode,
   1447				 dev->std_signal_mode[dev->input]);
   1448		v4l2_ctrl_s_ctrl(dev->ctrl_standard,
   1449				 dev->std_signal_mode[dev->input]);
   1450	}
   1451
   1452	return 0;
   1453}
   1454
   1455int vidioc_enumaudio(struct file *file, void *fh, struct v4l2_audio *vin)
   1456{
   1457	if (vin->index >= ARRAY_SIZE(vivid_audio_inputs))
   1458		return -EINVAL;
   1459	*vin = vivid_audio_inputs[vin->index];
   1460	return 0;
   1461}
   1462
   1463int vidioc_g_audio(struct file *file, void *fh, struct v4l2_audio *vin)
   1464{
   1465	struct vivid_dev *dev = video_drvdata(file);
   1466
   1467	if (!vivid_is_sdtv_cap(dev))
   1468		return -EINVAL;
   1469	*vin = vivid_audio_inputs[dev->tv_audio_input];
   1470	return 0;
   1471}
   1472
   1473int vidioc_s_audio(struct file *file, void *fh, const struct v4l2_audio *vin)
   1474{
   1475	struct vivid_dev *dev = video_drvdata(file);
   1476
   1477	if (!vivid_is_sdtv_cap(dev))
   1478		return -EINVAL;
   1479	if (vin->index >= ARRAY_SIZE(vivid_audio_inputs))
   1480		return -EINVAL;
   1481	dev->tv_audio_input = vin->index;
   1482	return 0;
   1483}
   1484
   1485int vivid_video_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
   1486{
   1487	struct vivid_dev *dev = video_drvdata(file);
   1488
   1489	if (vf->tuner != 0)
   1490		return -EINVAL;
   1491	vf->frequency = dev->tv_freq;
   1492	return 0;
   1493}
   1494
   1495int vivid_video_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *vf)
   1496{
   1497	struct vivid_dev *dev = video_drvdata(file);
   1498
   1499	if (vf->tuner != 0)
   1500		return -EINVAL;
   1501	dev->tv_freq = clamp_t(unsigned, vf->frequency, MIN_TV_FREQ, MAX_TV_FREQ);
   1502	if (vivid_is_tv_cap(dev))
   1503		vivid_update_quality(dev);
   1504	return 0;
   1505}
   1506
   1507int vivid_video_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *vt)
   1508{
   1509	struct vivid_dev *dev = video_drvdata(file);
   1510
   1511	if (vt->index != 0)
   1512		return -EINVAL;
   1513	if (vt->audmode > V4L2_TUNER_MODE_LANG1_LANG2)
   1514		return -EINVAL;
   1515	dev->tv_audmode = vt->audmode;
   1516	return 0;
   1517}
   1518
   1519int vivid_video_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
   1520{
   1521	struct vivid_dev *dev = video_drvdata(file);
   1522	enum tpg_quality qual;
   1523
   1524	if (vt->index != 0)
   1525		return -EINVAL;
   1526
   1527	vt->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO |
   1528			 V4L2_TUNER_CAP_LANG1 | V4L2_TUNER_CAP_LANG2;
   1529	vt->audmode = dev->tv_audmode;
   1530	vt->rangelow = MIN_TV_FREQ;
   1531	vt->rangehigh = MAX_TV_FREQ;
   1532	qual = vivid_get_quality(dev, &vt->afc);
   1533	if (qual == TPG_QUAL_COLOR)
   1534		vt->signal = 0xffff;
   1535	else if (qual == TPG_QUAL_GRAY)
   1536		vt->signal = 0x8000;
   1537	else
   1538		vt->signal = 0;
   1539	if (qual == TPG_QUAL_NOISE) {
   1540		vt->rxsubchans = 0;
   1541	} else if (qual == TPG_QUAL_GRAY) {
   1542		vt->rxsubchans = V4L2_TUNER_SUB_MONO;
   1543	} else {
   1544		unsigned int channel_nr = dev->tv_freq / (6 * 16);
   1545		unsigned int options =
   1546			(dev->std_cap[dev->input] & V4L2_STD_NTSC_M) ? 4 : 3;
   1547
   1548		switch (channel_nr % options) {
   1549		case 0:
   1550			vt->rxsubchans = V4L2_TUNER_SUB_MONO;
   1551			break;
   1552		case 1:
   1553			vt->rxsubchans = V4L2_TUNER_SUB_STEREO;
   1554			break;
   1555		case 2:
   1556			if (dev->std_cap[dev->input] & V4L2_STD_NTSC_M)
   1557				vt->rxsubchans = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_SAP;
   1558			else
   1559				vt->rxsubchans = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
   1560			break;
   1561		case 3:
   1562			vt->rxsubchans = V4L2_TUNER_SUB_STEREO | V4L2_TUNER_SUB_SAP;
   1563			break;
   1564		}
   1565	}
   1566	strscpy(vt->name, "TV Tuner", sizeof(vt->name));
   1567	return 0;
   1568}
   1569
   1570/* Must remain in sync with the vivid_ctrl_standard_strings array */
   1571const v4l2_std_id vivid_standard[] = {
   1572	V4L2_STD_NTSC_M,
   1573	V4L2_STD_NTSC_M_JP,
   1574	V4L2_STD_NTSC_M_KR,
   1575	V4L2_STD_NTSC_443,
   1576	V4L2_STD_PAL_BG | V4L2_STD_PAL_H,
   1577	V4L2_STD_PAL_I,
   1578	V4L2_STD_PAL_DK,
   1579	V4L2_STD_PAL_M,
   1580	V4L2_STD_PAL_N,
   1581	V4L2_STD_PAL_Nc,
   1582	V4L2_STD_PAL_60,
   1583	V4L2_STD_SECAM_B | V4L2_STD_SECAM_G | V4L2_STD_SECAM_H,
   1584	V4L2_STD_SECAM_DK,
   1585	V4L2_STD_SECAM_L,
   1586	V4L2_STD_SECAM_LC,
   1587	V4L2_STD_UNKNOWN
   1588};
   1589
   1590/* Must remain in sync with the vivid_standard array */
   1591const char * const vivid_ctrl_standard_strings[] = {
   1592	"NTSC-M",
   1593	"NTSC-M-JP",
   1594	"NTSC-M-KR",
   1595	"NTSC-443",
   1596	"PAL-BGH",
   1597	"PAL-I",
   1598	"PAL-DK",
   1599	"PAL-M",
   1600	"PAL-N",
   1601	"PAL-Nc",
   1602	"PAL-60",
   1603	"SECAM-BGH",
   1604	"SECAM-DK",
   1605	"SECAM-L",
   1606	"SECAM-Lc",
   1607	NULL,
   1608};
   1609
   1610int vidioc_querystd(struct file *file, void *priv, v4l2_std_id *id)
   1611{
   1612	struct vivid_dev *dev = video_drvdata(file);
   1613	unsigned int last = dev->query_std_last[dev->input];
   1614
   1615	if (!vivid_is_sdtv_cap(dev))
   1616		return -ENODATA;
   1617	if (dev->std_signal_mode[dev->input] == NO_SIGNAL ||
   1618	    dev->std_signal_mode[dev->input] == NO_LOCK) {
   1619		*id = V4L2_STD_UNKNOWN;
   1620		return 0;
   1621	}
   1622	if (vivid_is_tv_cap(dev) && tpg_g_quality(&dev->tpg) == TPG_QUAL_NOISE) {
   1623		*id = V4L2_STD_UNKNOWN;
   1624	} else if (dev->std_signal_mode[dev->input] == CURRENT_STD) {
   1625		*id = dev->std_cap[dev->input];
   1626	} else if (dev->std_signal_mode[dev->input] == SELECTED_STD) {
   1627		*id = dev->query_std[dev->input];
   1628	} else {
   1629		*id = vivid_standard[last];
   1630		dev->query_std_last[dev->input] =
   1631			(last + 1) % ARRAY_SIZE(vivid_standard);
   1632	}
   1633
   1634	return 0;
   1635}
   1636
   1637int vivid_vid_cap_s_std(struct file *file, void *priv, v4l2_std_id id)
   1638{
   1639	struct vivid_dev *dev = video_drvdata(file);
   1640
   1641	if (!vivid_is_sdtv_cap(dev))
   1642		return -ENODATA;
   1643	if (dev->std_cap[dev->input] == id)
   1644		return 0;
   1645	if (vb2_is_busy(&dev->vb_vid_cap_q) || vb2_is_busy(&dev->vb_vbi_cap_q))
   1646		return -EBUSY;
   1647	dev->std_cap[dev->input] = id;
   1648	vivid_update_format_cap(dev, false);
   1649	return 0;
   1650}
   1651
   1652static void find_aspect_ratio(u32 width, u32 height,
   1653			       u32 *num, u32 *denom)
   1654{
   1655	if (!(height % 3) && ((height * 4 / 3) == width)) {
   1656		*num = 4;
   1657		*denom = 3;
   1658	} else if (!(height % 9) && ((height * 16 / 9) == width)) {
   1659		*num = 16;
   1660		*denom = 9;
   1661	} else if (!(height % 10) && ((height * 16 / 10) == width)) {
   1662		*num = 16;
   1663		*denom = 10;
   1664	} else if (!(height % 4) && ((height * 5 / 4) == width)) {
   1665		*num = 5;
   1666		*denom = 4;
   1667	} else if (!(height % 9) && ((height * 15 / 9) == width)) {
   1668		*num = 15;
   1669		*denom = 9;
   1670	} else { /* default to 16:9 */
   1671		*num = 16;
   1672		*denom = 9;
   1673	}
   1674}
   1675
   1676static bool valid_cvt_gtf_timings(struct v4l2_dv_timings *timings)
   1677{
   1678	struct v4l2_bt_timings *bt = &timings->bt;
   1679	u32 total_h_pixel;
   1680	u32 total_v_lines;
   1681	u32 h_freq;
   1682
   1683	if (!v4l2_valid_dv_timings(timings, &vivid_dv_timings_cap,
   1684				NULL, NULL))
   1685		return false;
   1686
   1687	total_h_pixel = V4L2_DV_BT_FRAME_WIDTH(bt);
   1688	total_v_lines = V4L2_DV_BT_FRAME_HEIGHT(bt);
   1689
   1690	h_freq = (u32)bt->pixelclock / total_h_pixel;
   1691
   1692	if (bt->standards == 0 || (bt->standards & V4L2_DV_BT_STD_CVT)) {
   1693		if (v4l2_detect_cvt(total_v_lines, h_freq, bt->vsync, bt->width,
   1694				    bt->polarities, bt->interlaced, timings))
   1695			return true;
   1696	}
   1697
   1698	if (bt->standards == 0 || (bt->standards & V4L2_DV_BT_STD_GTF)) {
   1699		struct v4l2_fract aspect_ratio;
   1700
   1701		find_aspect_ratio(bt->width, bt->height,
   1702				  &aspect_ratio.numerator,
   1703				  &aspect_ratio.denominator);
   1704		if (v4l2_detect_gtf(total_v_lines, h_freq, bt->vsync,
   1705				    bt->polarities, bt->interlaced,
   1706				    aspect_ratio, timings))
   1707			return true;
   1708	}
   1709	return false;
   1710}
   1711
   1712int vivid_vid_cap_s_dv_timings(struct file *file, void *_fh,
   1713				    struct v4l2_dv_timings *timings)
   1714{
   1715	struct vivid_dev *dev = video_drvdata(file);
   1716
   1717	if (!vivid_is_hdmi_cap(dev))
   1718		return -ENODATA;
   1719	if (!v4l2_find_dv_timings_cap(timings, &vivid_dv_timings_cap,
   1720				      0, NULL, NULL) &&
   1721	    !valid_cvt_gtf_timings(timings))
   1722		return -EINVAL;
   1723
   1724	if (v4l2_match_dv_timings(timings, &dev->dv_timings_cap[dev->input],
   1725				  0, false))
   1726		return 0;
   1727	if (vb2_is_busy(&dev->vb_vid_cap_q))
   1728		return -EBUSY;
   1729
   1730	dev->dv_timings_cap[dev->input] = *timings;
   1731	vivid_update_format_cap(dev, false);
   1732	return 0;
   1733}
   1734
   1735int vidioc_query_dv_timings(struct file *file, void *_fh,
   1736				    struct v4l2_dv_timings *timings)
   1737{
   1738	struct vivid_dev *dev = video_drvdata(file);
   1739	unsigned int input = dev->input;
   1740	unsigned int last = dev->query_dv_timings_last[input];
   1741
   1742	if (!vivid_is_hdmi_cap(dev))
   1743		return -ENODATA;
   1744	if (dev->dv_timings_signal_mode[input] == NO_SIGNAL ||
   1745	    dev->edid_blocks == 0)
   1746		return -ENOLINK;
   1747	if (dev->dv_timings_signal_mode[input] == NO_LOCK)
   1748		return -ENOLCK;
   1749	if (dev->dv_timings_signal_mode[input] == OUT_OF_RANGE) {
   1750		timings->bt.pixelclock = vivid_dv_timings_cap.bt.max_pixelclock * 2;
   1751		return -ERANGE;
   1752	}
   1753	if (dev->dv_timings_signal_mode[input] == CURRENT_DV_TIMINGS) {
   1754		*timings = dev->dv_timings_cap[input];
   1755	} else if (dev->dv_timings_signal_mode[input] ==
   1756		   SELECTED_DV_TIMINGS) {
   1757		*timings =
   1758			v4l2_dv_timings_presets[dev->query_dv_timings[input]];
   1759	} else {
   1760		*timings =
   1761			v4l2_dv_timings_presets[last];
   1762		dev->query_dv_timings_last[input] =
   1763			(last + 1) % dev->query_dv_timings_size;
   1764	}
   1765	return 0;
   1766}
   1767
   1768int vidioc_s_edid(struct file *file, void *_fh,
   1769			 struct v4l2_edid *edid)
   1770{
   1771	struct vivid_dev *dev = video_drvdata(file);
   1772	u16 phys_addr;
   1773	u32 display_present = 0;
   1774	unsigned int i, j;
   1775	int ret;
   1776
   1777	memset(edid->reserved, 0, sizeof(edid->reserved));
   1778	if (edid->pad >= dev->num_inputs)
   1779		return -EINVAL;
   1780	if (dev->input_type[edid->pad] != HDMI || edid->start_block)
   1781		return -EINVAL;
   1782	if (edid->blocks == 0) {
   1783		dev->edid_blocks = 0;
   1784		v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, 0);
   1785		v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, 0);
   1786		phys_addr = CEC_PHYS_ADDR_INVALID;
   1787		goto set_phys_addr;
   1788	}
   1789	if (edid->blocks > dev->edid_max_blocks) {
   1790		edid->blocks = dev->edid_max_blocks;
   1791		return -E2BIG;
   1792	}
   1793	phys_addr = cec_get_edid_phys_addr(edid->edid, edid->blocks * 128, NULL);
   1794	ret = v4l2_phys_addr_validate(phys_addr, &phys_addr, NULL);
   1795	if (ret)
   1796		return ret;
   1797
   1798	if (vb2_is_busy(&dev->vb_vid_cap_q))
   1799		return -EBUSY;
   1800
   1801	dev->edid_blocks = edid->blocks;
   1802	memcpy(dev->edid, edid->edid, edid->blocks * 128);
   1803
   1804	for (i = 0, j = 0; i < dev->num_outputs; i++)
   1805		if (dev->output_type[i] == HDMI)
   1806			display_present |=
   1807				dev->display_present[i] << j++;
   1808
   1809	v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, display_present);
   1810	v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, display_present);
   1811
   1812set_phys_addr:
   1813	/* TODO: a proper hotplug detect cycle should be emulated here */
   1814	cec_s_phys_addr(dev->cec_rx_adap, phys_addr, false);
   1815
   1816	for (i = 0; i < MAX_OUTPUTS && dev->cec_tx_adap[i]; i++)
   1817		cec_s_phys_addr(dev->cec_tx_adap[i],
   1818				dev->display_present[i] ?
   1819				v4l2_phys_addr_for_input(phys_addr, i + 1) :
   1820				CEC_PHYS_ADDR_INVALID,
   1821				false);
   1822	return 0;
   1823}
   1824
   1825int vidioc_enum_framesizes(struct file *file, void *fh,
   1826					 struct v4l2_frmsizeenum *fsize)
   1827{
   1828	struct vivid_dev *dev = video_drvdata(file);
   1829
   1830	if (!vivid_is_webcam(dev) && !dev->has_scaler_cap)
   1831		return -EINVAL;
   1832	if (vivid_get_format(dev, fsize->pixel_format) == NULL)
   1833		return -EINVAL;
   1834	if (vivid_is_webcam(dev)) {
   1835		if (fsize->index >= ARRAY_SIZE(webcam_sizes))
   1836			return -EINVAL;
   1837		fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
   1838		fsize->discrete = webcam_sizes[fsize->index];
   1839		return 0;
   1840	}
   1841	if (fsize->index)
   1842		return -EINVAL;
   1843	fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
   1844	fsize->stepwise.min_width = MIN_WIDTH;
   1845	fsize->stepwise.max_width = MAX_WIDTH * MAX_ZOOM;
   1846	fsize->stepwise.step_width = 2;
   1847	fsize->stepwise.min_height = MIN_HEIGHT;
   1848	fsize->stepwise.max_height = MAX_HEIGHT * MAX_ZOOM;
   1849	fsize->stepwise.step_height = 2;
   1850	return 0;
   1851}
   1852
   1853/* timeperframe is arbitrary and continuous */
   1854int vidioc_enum_frameintervals(struct file *file, void *priv,
   1855					     struct v4l2_frmivalenum *fival)
   1856{
   1857	struct vivid_dev *dev = video_drvdata(file);
   1858	const struct vivid_fmt *fmt;
   1859	int i;
   1860
   1861	fmt = vivid_get_format(dev, fival->pixel_format);
   1862	if (!fmt)
   1863		return -EINVAL;
   1864
   1865	if (!vivid_is_webcam(dev)) {
   1866		if (fival->index)
   1867			return -EINVAL;
   1868		if (fival->width < MIN_WIDTH || fival->width > MAX_WIDTH * MAX_ZOOM)
   1869			return -EINVAL;
   1870		if (fival->height < MIN_HEIGHT || fival->height > MAX_HEIGHT * MAX_ZOOM)
   1871			return -EINVAL;
   1872		fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
   1873		fival->discrete = dev->timeperframe_vid_cap;
   1874		return 0;
   1875	}
   1876
   1877	for (i = 0; i < ARRAY_SIZE(webcam_sizes); i++)
   1878		if (fival->width == webcam_sizes[i].width &&
   1879		    fival->height == webcam_sizes[i].height)
   1880			break;
   1881	if (i == ARRAY_SIZE(webcam_sizes))
   1882		return -EINVAL;
   1883	if (fival->index >= 2 * (VIVID_WEBCAM_SIZES - i))
   1884		return -EINVAL;
   1885	fival->type = V4L2_FRMIVAL_TYPE_DISCRETE;
   1886	fival->discrete = webcam_intervals[fival->index];
   1887	return 0;
   1888}
   1889
   1890int vivid_vid_cap_g_parm(struct file *file, void *priv,
   1891			  struct v4l2_streamparm *parm)
   1892{
   1893	struct vivid_dev *dev = video_drvdata(file);
   1894
   1895	if (parm->type != (dev->multiplanar ?
   1896			   V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE :
   1897			   V4L2_BUF_TYPE_VIDEO_CAPTURE))
   1898		return -EINVAL;
   1899
   1900	parm->parm.capture.capability   = V4L2_CAP_TIMEPERFRAME;
   1901	parm->parm.capture.timeperframe = dev->timeperframe_vid_cap;
   1902	parm->parm.capture.readbuffers  = 1;
   1903	return 0;
   1904}
   1905
   1906int vivid_vid_cap_s_parm(struct file *file, void *priv,
   1907			  struct v4l2_streamparm *parm)
   1908{
   1909	struct vivid_dev *dev = video_drvdata(file);
   1910	unsigned ival_sz = 2 * (VIVID_WEBCAM_SIZES - dev->webcam_size_idx);
   1911	struct v4l2_fract tpf;
   1912	unsigned i;
   1913
   1914	if (parm->type != (dev->multiplanar ?
   1915			   V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE :
   1916			   V4L2_BUF_TYPE_VIDEO_CAPTURE))
   1917		return -EINVAL;
   1918	if (!vivid_is_webcam(dev))
   1919		return vivid_vid_cap_g_parm(file, priv, parm);
   1920
   1921	tpf = parm->parm.capture.timeperframe;
   1922
   1923	if (tpf.denominator == 0)
   1924		tpf = webcam_intervals[ival_sz - 1];
   1925	for (i = 0; i < ival_sz; i++)
   1926		if (V4L2_FRACT_COMPARE(tpf, >=, webcam_intervals[i]))
   1927			break;
   1928	if (i == ival_sz)
   1929		i = ival_sz - 1;
   1930	dev->webcam_ival_idx = i;
   1931	tpf = webcam_intervals[dev->webcam_ival_idx];
   1932
   1933	/* resync the thread's timings */
   1934	dev->cap_seq_resync = true;
   1935	dev->timeperframe_vid_cap = tpf;
   1936	parm->parm.capture.capability   = V4L2_CAP_TIMEPERFRAME;
   1937	parm->parm.capture.timeperframe = tpf;
   1938	parm->parm.capture.readbuffers  = 1;
   1939	return 0;
   1940}