linux/drivers/media/test-drivers/vivid/vivid-vid-cap.c
<<
>>
Prefs
   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}
1941