linux/drivers/media/pci/ivtv/ivtv-ioctl.c
<<
>>
Prefs
   1/*
   2    ioctl system call
   3    Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
   4    Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
   5
   6    This program is free software; you can redistribute it and/or modify
   7    it under the terms of the GNU General Public License as published by
   8    the Free Software Foundation; either version 2 of the License, or
   9    (at your option) any later version.
  10
  11    This program is distributed in the hope that it will be useful,
  12    but WITHOUT ANY WARRANTY; without even the implied warranty of
  13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14    GNU General Public License for more details.
  15
  16    You should have received a copy of the GNU General Public License
  17    along with this program; if not, write to the Free Software
  18    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19 */
  20
  21#include "ivtv-driver.h"
  22#include "ivtv-version.h"
  23#include "ivtv-mailbox.h"
  24#include "ivtv-i2c.h"
  25#include "ivtv-queue.h"
  26#include "ivtv-fileops.h"
  27#include "ivtv-vbi.h"
  28#include "ivtv-routing.h"
  29#include "ivtv-streams.h"
  30#include "ivtv-yuv.h"
  31#include "ivtv-ioctl.h"
  32#include "ivtv-gpio.h"
  33#include "ivtv-controls.h"
  34#include "ivtv-cards.h"
  35#include <media/saa7127.h>
  36#include <media/tveeprom.h>
  37#include <media/v4l2-event.h>
  38#include <linux/dvb/audio.h>
  39
  40u16 ivtv_service2vbi(int type)
  41{
  42        switch (type) {
  43                case V4L2_SLICED_TELETEXT_B:
  44                        return IVTV_SLICED_TYPE_TELETEXT_B;
  45                case V4L2_SLICED_CAPTION_525:
  46                        return IVTV_SLICED_TYPE_CAPTION_525;
  47                case V4L2_SLICED_WSS_625:
  48                        return IVTV_SLICED_TYPE_WSS_625;
  49                case V4L2_SLICED_VPS:
  50                        return IVTV_SLICED_TYPE_VPS;
  51                default:
  52                        return 0;
  53        }
  54}
  55
  56static int valid_service_line(int field, int line, int is_pal)
  57{
  58        return (is_pal && line >= 6 && (line != 23 || field == 0)) ||
  59               (!is_pal && line >= 10 && line < 22);
  60}
  61
  62static u16 select_service_from_set(int field, int line, u16 set, int is_pal)
  63{
  64        u16 valid_set = (is_pal ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525);
  65        int i;
  66
  67        set = set & valid_set;
  68        if (set == 0 || !valid_service_line(field, line, is_pal)) {
  69                return 0;
  70        }
  71        if (!is_pal) {
  72                if (line == 21 && (set & V4L2_SLICED_CAPTION_525))
  73                        return V4L2_SLICED_CAPTION_525;
  74        }
  75        else {
  76                if (line == 16 && field == 0 && (set & V4L2_SLICED_VPS))
  77                        return V4L2_SLICED_VPS;
  78                if (line == 23 && field == 0 && (set & V4L2_SLICED_WSS_625))
  79                        return V4L2_SLICED_WSS_625;
  80                if (line == 23)
  81                        return 0;
  82        }
  83        for (i = 0; i < 32; i++) {
  84                if ((1 << i) & set)
  85                        return 1 << i;
  86        }
  87        return 0;
  88}
  89
  90void ivtv_expand_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
  91{
  92        u16 set = fmt->service_set;
  93        int f, l;
  94
  95        fmt->service_set = 0;
  96        for (f = 0; f < 2; f++) {
  97                for (l = 0; l < 24; l++) {
  98                        fmt->service_lines[f][l] = select_service_from_set(f, l, set, is_pal);
  99                }
 100        }
 101}
 102
 103static void check_service_set(struct v4l2_sliced_vbi_format *fmt, int is_pal)
 104{
 105        int f, l;
 106
 107        for (f = 0; f < 2; f++) {
 108                for (l = 0; l < 24; l++) {
 109                        fmt->service_lines[f][l] = select_service_from_set(f, l, fmt->service_lines[f][l], is_pal);
 110                }
 111        }
 112}
 113
 114u16 ivtv_get_service_set(struct v4l2_sliced_vbi_format *fmt)
 115{
 116        int f, l;
 117        u16 set = 0;
 118
 119        for (f = 0; f < 2; f++) {
 120                for (l = 0; l < 24; l++) {
 121                        set |= fmt->service_lines[f][l];
 122                }
 123        }
 124        return set;
 125}
 126
 127void ivtv_set_osd_alpha(struct ivtv *itv)
 128{
 129        ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
 130                itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
 131        ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
 132}
 133
 134int ivtv_set_speed(struct ivtv *itv, int speed)
 135{
 136        u32 data[CX2341X_MBOX_MAX_DATA];
 137        int single_step = (speed == 1 || speed == -1);
 138        DEFINE_WAIT(wait);
 139
 140        if (speed == 0) speed = 1000;
 141
 142        /* No change? */
 143        if (speed == itv->speed && !single_step)
 144                return 0;
 145
 146        if (single_step && (speed < 0) == (itv->speed < 0)) {
 147                /* Single step video and no need to change direction */
 148                ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
 149                itv->speed = speed;
 150                return 0;
 151        }
 152        if (single_step)
 153                /* Need to change direction */
 154                speed = speed < 0 ? -1000 : 1000;
 155
 156        data[0] = (speed > 1000 || speed < -1000) ? 0x80000000 : 0;
 157        data[0] |= (speed > 1000 || speed < -1500) ? 0x40000000 : 0;
 158        data[1] = (speed < 0);
 159        data[2] = speed < 0 ? 3 : 7;
 160        data[3] = v4l2_ctrl_g_ctrl(itv->cxhdl.video_b_frames);
 161        data[4] = (speed == 1500 || speed == 500) ? itv->speed_mute_audio : 0;
 162        data[5] = 0;
 163        data[6] = 0;
 164
 165        if (speed == 1500 || speed == -1500) data[0] |= 1;
 166        else if (speed == 2000 || speed == -2000) data[0] |= 2;
 167        else if (speed > -1000 && speed < 0) data[0] |= (-1000 / speed);
 168        else if (speed < 1000 && speed > 0) data[0] |= (1000 / speed);
 169
 170        /* If not decoding, just change speed setting */
 171        if (atomic_read(&itv->decoding) > 0) {
 172                int got_sig = 0;
 173
 174                /* Stop all DMA and decoding activity */
 175                ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1, 0);
 176
 177                /* Wait for any DMA to finish */
 178                mutex_unlock(&itv->serialize_lock);
 179                prepare_to_wait(&itv->dma_waitq, &wait, TASK_INTERRUPTIBLE);
 180                while (test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
 181                        got_sig = signal_pending(current);
 182                        if (got_sig)
 183                                break;
 184                        got_sig = 0;
 185                        schedule();
 186                }
 187                finish_wait(&itv->dma_waitq, &wait);
 188                mutex_lock(&itv->serialize_lock);
 189                if (got_sig)
 190                        return -EINTR;
 191
 192                /* Change Speed safely */
 193                ivtv_api(itv, CX2341X_DEC_SET_PLAYBACK_SPEED, 7, data);
 194                IVTV_DEBUG_INFO("Setting Speed to 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x 0x%08x\n",
 195                                data[0], data[1], data[2], data[3], data[4], data[5], data[6]);
 196        }
 197        if (single_step) {
 198                speed = (speed < 0) ? -1 : 1;
 199                ivtv_vapi(itv, CX2341X_DEC_STEP_VIDEO, 1, 0);
 200        }
 201        itv->speed = speed;
 202        return 0;
 203}
 204
 205static int ivtv_validate_speed(int cur_speed, int new_speed)
 206{
 207        int fact = new_speed < 0 ? -1 : 1;
 208        int s;
 209
 210        if (cur_speed == 0)
 211                cur_speed = 1000;
 212        if (new_speed < 0)
 213                new_speed = -new_speed;
 214        if (cur_speed < 0)
 215                cur_speed = -cur_speed;
 216
 217        if (cur_speed <= new_speed) {
 218                if (new_speed > 1500)
 219                        return fact * 2000;
 220                if (new_speed > 1000)
 221                        return fact * 1500;
 222        }
 223        else {
 224                if (new_speed >= 2000)
 225                        return fact * 2000;
 226                if (new_speed >= 1500)
 227                        return fact * 1500;
 228                if (new_speed >= 1000)
 229                        return fact * 1000;
 230        }
 231        if (new_speed == 0)
 232                return 1000;
 233        if (new_speed == 1 || new_speed == 1000)
 234                return fact * new_speed;
 235
 236        s = new_speed;
 237        new_speed = 1000 / new_speed;
 238        if (1000 / cur_speed == new_speed)
 239                new_speed += (cur_speed < s) ? -1 : 1;
 240        if (new_speed > 60) return 1000 / (fact * 60);
 241        return 1000 / (fact * new_speed);
 242}
 243
 244static int ivtv_video_command(struct ivtv *itv, struct ivtv_open_id *id,
 245                struct v4l2_decoder_cmd *dc, int try)
 246{
 247        struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
 248
 249        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
 250                return -EINVAL;
 251
 252        switch (dc->cmd) {
 253        case V4L2_DEC_CMD_START: {
 254                dc->flags &= V4L2_DEC_CMD_START_MUTE_AUDIO;
 255                dc->start.speed = ivtv_validate_speed(itv->speed, dc->start.speed);
 256                if (dc->start.speed < 0)
 257                        dc->start.format = V4L2_DEC_START_FMT_GOP;
 258                else
 259                        dc->start.format = V4L2_DEC_START_FMT_NONE;
 260                if (dc->start.speed != 500 && dc->start.speed != 1500)
 261                        dc->flags = dc->start.speed == 1000 ? 0 :
 262                                        V4L2_DEC_CMD_START_MUTE_AUDIO;
 263                if (try) break;
 264
 265                itv->speed_mute_audio = dc->flags & V4L2_DEC_CMD_START_MUTE_AUDIO;
 266                if (ivtv_set_output_mode(itv, OUT_MPG) != OUT_MPG)
 267                        return -EBUSY;
 268                if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
 269                        /* forces ivtv_set_speed to be called */
 270                        itv->speed = 0;
 271                }
 272                return ivtv_start_decoding(id, dc->start.speed);
 273        }
 274
 275        case V4L2_DEC_CMD_STOP:
 276                dc->flags &= V4L2_DEC_CMD_STOP_IMMEDIATELY | V4L2_DEC_CMD_STOP_TO_BLACK;
 277                if (dc->flags & V4L2_DEC_CMD_STOP_IMMEDIATELY)
 278                        dc->stop.pts = 0;
 279                if (try) break;
 280                if (atomic_read(&itv->decoding) == 0)
 281                        return 0;
 282                if (itv->output_mode != OUT_MPG)
 283                        return -EBUSY;
 284
 285                itv->output_mode = OUT_NONE;
 286                return ivtv_stop_v4l2_decode_stream(s, dc->flags, dc->stop.pts);
 287
 288        case V4L2_DEC_CMD_PAUSE:
 289                dc->flags &= V4L2_DEC_CMD_PAUSE_TO_BLACK;
 290                if (try) break;
 291                if (!atomic_read(&itv->decoding))
 292                        return -EPERM;
 293                if (itv->output_mode != OUT_MPG)
 294                        return -EBUSY;
 295                if (atomic_read(&itv->decoding) > 0) {
 296                        ivtv_vapi(itv, CX2341X_DEC_PAUSE_PLAYBACK, 1,
 297                                (dc->flags & V4L2_DEC_CMD_PAUSE_TO_BLACK) ? 1 : 0);
 298                        set_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags);
 299                }
 300                break;
 301
 302        case V4L2_DEC_CMD_RESUME:
 303                dc->flags = 0;
 304                if (try) break;
 305                if (!atomic_read(&itv->decoding))
 306                        return -EPERM;
 307                if (itv->output_mode != OUT_MPG)
 308                        return -EBUSY;
 309                if (test_and_clear_bit(IVTV_F_I_DEC_PAUSED, &itv->i_flags)) {
 310                        int speed = itv->speed;
 311                        itv->speed = 0;
 312                        return ivtv_start_decoding(id, speed);
 313                }
 314                break;
 315
 316        default:
 317                return -EINVAL;
 318        }
 319        return 0;
 320}
 321
 322static int ivtv_g_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
 323{
 324        struct ivtv *itv = fh2id(fh)->itv;
 325        struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
 326
 327        vbifmt->reserved[0] = 0;
 328        vbifmt->reserved[1] = 0;
 329        if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
 330                return -EINVAL;
 331        vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
 332        memset(vbifmt->service_lines, 0, sizeof(vbifmt->service_lines));
 333        if (itv->is_60hz) {
 334                vbifmt->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
 335                vbifmt->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
 336        } else {
 337                vbifmt->service_lines[0][23] = V4L2_SLICED_WSS_625;
 338                vbifmt->service_lines[0][16] = V4L2_SLICED_VPS;
 339        }
 340        vbifmt->service_set = ivtv_get_service_set(vbifmt);
 341        return 0;
 342}
 343
 344static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 345{
 346        struct ivtv_open_id *id = fh2id(fh);
 347        struct ivtv *itv = id->itv;
 348        struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
 349
 350        pixfmt->width = itv->cxhdl.width;
 351        pixfmt->height = itv->cxhdl.height;
 352        pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
 353        pixfmt->field = V4L2_FIELD_INTERLACED;
 354        pixfmt->priv = 0;
 355        if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
 356                pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
 357                /* YUV size is (Y=(h*720) + UV=(h*(720/2))) */
 358                pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2;
 359                pixfmt->bytesperline = 720;
 360        } else {
 361                pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
 362                pixfmt->sizeimage = 128 * 1024;
 363                pixfmt->bytesperline = 0;
 364        }
 365        return 0;
 366}
 367
 368static int ivtv_g_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 369{
 370        struct ivtv *itv = fh2id(fh)->itv;
 371        struct v4l2_vbi_format *vbifmt = &fmt->fmt.vbi;
 372
 373        vbifmt->sampling_rate = 27000000;
 374        vbifmt->offset = 248;
 375        vbifmt->samples_per_line = itv->vbi.raw_decoder_line_size - 4;
 376        vbifmt->sample_format = V4L2_PIX_FMT_GREY;
 377        vbifmt->start[0] = itv->vbi.start[0];
 378        vbifmt->start[1] = itv->vbi.start[1];
 379        vbifmt->count[0] = vbifmt->count[1] = itv->vbi.count;
 380        vbifmt->flags = 0;
 381        vbifmt->reserved[0] = 0;
 382        vbifmt->reserved[1] = 0;
 383        return 0;
 384}
 385
 386static int ivtv_g_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 387{
 388        struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
 389        struct ivtv_open_id *id = fh2id(fh);
 390        struct ivtv *itv = id->itv;
 391
 392        vbifmt->reserved[0] = 0;
 393        vbifmt->reserved[1] = 0;
 394        vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
 395
 396        if (id->type == IVTV_DEC_STREAM_TYPE_VBI) {
 397                vbifmt->service_set = itv->is_50hz ? V4L2_SLICED_VBI_625 :
 398                        V4L2_SLICED_VBI_525;
 399                ivtv_expand_service_set(vbifmt, itv->is_50hz);
 400                vbifmt->service_set = ivtv_get_service_set(vbifmt);
 401                return 0;
 402        }
 403
 404        v4l2_subdev_call(itv->sd_video, vbi, g_sliced_fmt, vbifmt);
 405        vbifmt->service_set = ivtv_get_service_set(vbifmt);
 406        return 0;
 407}
 408
 409static int ivtv_g_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
 410{
 411        struct ivtv_open_id *id = fh2id(fh);
 412        struct ivtv *itv = id->itv;
 413        struct v4l2_pix_format *pixfmt = &fmt->fmt.pix;
 414
 415        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
 416                return -EINVAL;
 417        pixfmt->width = itv->main_rect.width;
 418        pixfmt->height = itv->main_rect.height;
 419        pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M;
 420        pixfmt->field = V4L2_FIELD_INTERLACED;
 421        pixfmt->priv = 0;
 422        if (id->type == IVTV_DEC_STREAM_TYPE_YUV) {
 423                switch (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) {
 424                case IVTV_YUV_MODE_INTERLACED:
 425                        pixfmt->field = (itv->yuv_info.lace_mode & IVTV_YUV_SYNC_MASK) ?
 426                                V4L2_FIELD_INTERLACED_BT : V4L2_FIELD_INTERLACED_TB;
 427                        break;
 428                case IVTV_YUV_MODE_PROGRESSIVE:
 429                        pixfmt->field = V4L2_FIELD_NONE;
 430                        break;
 431                default:
 432                        pixfmt->field = V4L2_FIELD_ANY;
 433                        break;
 434                }
 435                pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
 436                pixfmt->bytesperline = 720;
 437                pixfmt->width = itv->yuv_info.v4l2_src_w;
 438                pixfmt->height = itv->yuv_info.v4l2_src_h;
 439                /* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
 440                pixfmt->sizeimage =
 441                        1080 * ((pixfmt->height + 31) & ~31);
 442        } else {
 443                pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
 444                pixfmt->sizeimage = 128 * 1024;
 445                pixfmt->bytesperline = 0;
 446        }
 447        return 0;
 448}
 449
 450static int ivtv_g_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
 451{
 452        struct ivtv *itv = fh2id(fh)->itv;
 453        struct v4l2_window *winfmt = &fmt->fmt.win;
 454
 455        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
 456                return -EINVAL;
 457        winfmt->chromakey = itv->osd_chroma_key;
 458        winfmt->global_alpha = itv->osd_global_alpha;
 459        winfmt->field = V4L2_FIELD_INTERLACED;
 460        winfmt->clips = NULL;
 461        winfmt->clipcount = 0;
 462        winfmt->bitmap = NULL;
 463        winfmt->w.top = winfmt->w.left = 0;
 464        winfmt->w.width = itv->osd_rect.width;
 465        winfmt->w.height = itv->osd_rect.height;
 466        return 0;
 467}
 468
 469static int ivtv_try_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
 470{
 471        return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
 472}
 473
 474static int ivtv_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 475{
 476        struct ivtv_open_id *id = fh2id(fh);
 477        struct ivtv *itv = id->itv;
 478        int w = fmt->fmt.pix.width;
 479        int h = fmt->fmt.pix.height;
 480        int min_h = 2;
 481
 482        w = min(w, 720);
 483        w = max(w, 2);
 484        if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
 485                /* YUV height must be a multiple of 32 */
 486                h &= ~0x1f;
 487                min_h = 32;
 488        }
 489        h = min(h, itv->is_50hz ? 576 : 480);
 490        h = max(h, min_h);
 491        ivtv_g_fmt_vid_cap(file, fh, fmt);
 492        fmt->fmt.pix.width = w;
 493        fmt->fmt.pix.height = h;
 494        return 0;
 495}
 496
 497static int ivtv_try_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 498{
 499        return ivtv_g_fmt_vbi_cap(file, fh, fmt);
 500}
 501
 502static int ivtv_try_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 503{
 504        struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
 505        struct ivtv_open_id *id = fh2id(fh);
 506        struct ivtv *itv = id->itv;
 507
 508        if (id->type == IVTV_DEC_STREAM_TYPE_VBI)
 509                return ivtv_g_fmt_sliced_vbi_cap(file, fh, fmt);
 510
 511        /* set sliced VBI capture format */
 512        vbifmt->io_size = sizeof(struct v4l2_sliced_vbi_data) * 36;
 513        vbifmt->reserved[0] = 0;
 514        vbifmt->reserved[1] = 0;
 515
 516        if (vbifmt->service_set)
 517                ivtv_expand_service_set(vbifmt, itv->is_50hz);
 518        check_service_set(vbifmt, itv->is_50hz);
 519        vbifmt->service_set = ivtv_get_service_set(vbifmt);
 520        return 0;
 521}
 522
 523static int ivtv_try_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
 524{
 525        struct ivtv_open_id *id = fh2id(fh);
 526        s32 w = fmt->fmt.pix.width;
 527        s32 h = fmt->fmt.pix.height;
 528        int field = fmt->fmt.pix.field;
 529        int ret = ivtv_g_fmt_vid_out(file, fh, fmt);
 530
 531        w = min(w, 720);
 532        w = max(w, 2);
 533        /* Why can the height be 576 even when the output is NTSC?
 534
 535           Internally the buffers of the PVR350 are always set to 720x576. The
 536           decoded video frame will always be placed in the top left corner of
 537           this buffer. For any video which is not 720x576, the buffer will
 538           then be cropped to remove the unused right and lower areas, with
 539           the remaining image being scaled by the hardware to fit the display
 540           area. The video can be scaled both up and down, so a 720x480 video
 541           can be displayed full-screen on PAL and a 720x576 video can be
 542           displayed without cropping on NTSC.
 543
 544           Note that the scaling only occurs on the video stream, the osd
 545           resolution is locked to the broadcast standard and not scaled.
 546
 547           Thanks to Ian Armstrong for this explanation. */
 548        h = min(h, 576);
 549        h = max(h, 2);
 550        if (id->type == IVTV_DEC_STREAM_TYPE_YUV)
 551                fmt->fmt.pix.field = field;
 552        fmt->fmt.pix.width = w;
 553        fmt->fmt.pix.height = h;
 554        return ret;
 555}
 556
 557static int ivtv_try_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
 558{
 559        struct ivtv *itv = fh2id(fh)->itv;
 560        u32 chromakey = fmt->fmt.win.chromakey;
 561        u8 global_alpha = fmt->fmt.win.global_alpha;
 562
 563        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
 564                return -EINVAL;
 565        ivtv_g_fmt_vid_out_overlay(file, fh, fmt);
 566        fmt->fmt.win.chromakey = chromakey;
 567        fmt->fmt.win.global_alpha = global_alpha;
 568        return 0;
 569}
 570
 571static int ivtv_s_fmt_sliced_vbi_out(struct file *file, void *fh, struct v4l2_format *fmt)
 572{
 573        return ivtv_g_fmt_sliced_vbi_out(file, fh, fmt);
 574}
 575
 576static int ivtv_s_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 577{
 578        struct ivtv_open_id *id = fh2id(fh);
 579        struct ivtv *itv = id->itv;
 580        struct v4l2_mbus_framefmt mbus_fmt;
 581        int ret = ivtv_try_fmt_vid_cap(file, fh, fmt);
 582        int w = fmt->fmt.pix.width;
 583        int h = fmt->fmt.pix.height;
 584
 585        if (ret)
 586                return ret;
 587
 588        if (itv->cxhdl.width == w && itv->cxhdl.height == h)
 589                return 0;
 590
 591        if (atomic_read(&itv->capturing) > 0)
 592                return -EBUSY;
 593
 594        itv->cxhdl.width = w;
 595        itv->cxhdl.height = h;
 596        if (v4l2_ctrl_g_ctrl(itv->cxhdl.video_encoding) == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
 597                fmt->fmt.pix.width /= 2;
 598        mbus_fmt.width = fmt->fmt.pix.width;
 599        mbus_fmt.height = h;
 600        mbus_fmt.code = V4L2_MBUS_FMT_FIXED;
 601        v4l2_subdev_call(itv->sd_video, video, s_mbus_fmt, &mbus_fmt);
 602        return ivtv_g_fmt_vid_cap(file, fh, fmt);
 603}
 604
 605static int ivtv_s_fmt_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 606{
 607        struct ivtv *itv = fh2id(fh)->itv;
 608
 609        if (!ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
 610                return -EBUSY;
 611        itv->vbi.sliced_in->service_set = 0;
 612        itv->vbi.in.type = V4L2_BUF_TYPE_VBI_CAPTURE;
 613        v4l2_subdev_call(itv->sd_video, vbi, s_raw_fmt, &fmt->fmt.vbi);
 614        return ivtv_g_fmt_vbi_cap(file, fh, fmt);
 615}
 616
 617static int ivtv_s_fmt_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_format *fmt)
 618{
 619        struct v4l2_sliced_vbi_format *vbifmt = &fmt->fmt.sliced;
 620        struct ivtv_open_id *id = fh2id(fh);
 621        struct ivtv *itv = id->itv;
 622        int ret = ivtv_try_fmt_sliced_vbi_cap(file, fh, fmt);
 623
 624        if (ret || id->type == IVTV_DEC_STREAM_TYPE_VBI)
 625                return ret;
 626
 627        check_service_set(vbifmt, itv->is_50hz);
 628        if (ivtv_raw_vbi(itv) && atomic_read(&itv->capturing) > 0)
 629                return -EBUSY;
 630        itv->vbi.in.type = V4L2_BUF_TYPE_SLICED_VBI_CAPTURE;
 631        v4l2_subdev_call(itv->sd_video, vbi, s_sliced_fmt, vbifmt);
 632        memcpy(itv->vbi.sliced_in, vbifmt, sizeof(*itv->vbi.sliced_in));
 633        return 0;
 634}
 635
 636static int ivtv_s_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *fmt)
 637{
 638        struct ivtv_open_id *id = fh2id(fh);
 639        struct ivtv *itv = id->itv;
 640        struct yuv_playback_info *yi = &itv->yuv_info;
 641        int ret = ivtv_try_fmt_vid_out(file, fh, fmt);
 642
 643        if (ret)
 644                return ret;
 645
 646        if (id->type != IVTV_DEC_STREAM_TYPE_YUV)
 647                return 0;
 648
 649        /* Return now if we already have some frame data */
 650        if (yi->stream_size)
 651                return -EBUSY;
 652
 653        yi->v4l2_src_w = fmt->fmt.pix.width;
 654        yi->v4l2_src_h = fmt->fmt.pix.height;
 655
 656        switch (fmt->fmt.pix.field) {
 657        case V4L2_FIELD_NONE:
 658                yi->lace_mode = IVTV_YUV_MODE_PROGRESSIVE;
 659                break;
 660        case V4L2_FIELD_ANY:
 661                yi->lace_mode = IVTV_YUV_MODE_AUTO;
 662                break;
 663        case V4L2_FIELD_INTERLACED_BT:
 664                yi->lace_mode =
 665                        IVTV_YUV_MODE_INTERLACED|IVTV_YUV_SYNC_ODD;
 666                break;
 667        case V4L2_FIELD_INTERLACED_TB:
 668        default:
 669                yi->lace_mode = IVTV_YUV_MODE_INTERLACED;
 670                break;
 671        }
 672        yi->lace_sync_field = (yi->lace_mode & IVTV_YUV_SYNC_MASK) == IVTV_YUV_SYNC_EVEN ? 0 : 1;
 673
 674        if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
 675                itv->dma_data_req_size =
 676                        1080 * ((yi->v4l2_src_h + 31) & ~31);
 677
 678        return 0;
 679}
 680
 681static int ivtv_s_fmt_vid_out_overlay(struct file *file, void *fh, struct v4l2_format *fmt)
 682{
 683        struct ivtv *itv = fh2id(fh)->itv;
 684        int ret = ivtv_try_fmt_vid_out_overlay(file, fh, fmt);
 685
 686        if (ret == 0) {
 687                itv->osd_chroma_key = fmt->fmt.win.chromakey;
 688                itv->osd_global_alpha = fmt->fmt.win.global_alpha;
 689                ivtv_set_osd_alpha(itv);
 690        }
 691        return ret;
 692}
 693
 694#ifdef CONFIG_VIDEO_ADV_DEBUG
 695static int ivtv_itvc(struct ivtv *itv, bool get, u64 reg, u64 *val)
 696{
 697        volatile u8 __iomem *reg_start;
 698
 699        if (reg & 0x3)
 700                return -EINVAL;
 701        if (reg >= IVTV_REG_OFFSET && reg < IVTV_REG_OFFSET + IVTV_REG_SIZE)
 702                reg_start = itv->reg_mem - IVTV_REG_OFFSET;
 703        else if (itv->has_cx23415 && reg >= IVTV_DECODER_OFFSET &&
 704                        reg < IVTV_DECODER_OFFSET + IVTV_DECODER_SIZE)
 705                reg_start = itv->dec_mem - IVTV_DECODER_OFFSET;
 706        else if (reg < IVTV_ENCODER_SIZE)
 707                reg_start = itv->enc_mem;
 708        else
 709                return -EINVAL;
 710
 711        if (get)
 712                *val = readl(reg + reg_start);
 713        else
 714                writel(*val, reg + reg_start);
 715        return 0;
 716}
 717
 718static int ivtv_g_register(struct file *file, void *fh, struct v4l2_dbg_register *reg)
 719{
 720        struct ivtv *itv = fh2id(fh)->itv;
 721
 722        reg->size = 4;
 723        return ivtv_itvc(itv, true, reg->reg, &reg->val);
 724}
 725
 726static int ivtv_s_register(struct file *file, void *fh, const struct v4l2_dbg_register *reg)
 727{
 728        struct ivtv *itv = fh2id(fh)->itv;
 729        u64 val = reg->val;
 730
 731        return ivtv_itvc(itv, false, reg->reg, &val);
 732}
 733#endif
 734
 735static int ivtv_querycap(struct file *file, void *fh, struct v4l2_capability *vcap)
 736{
 737        struct ivtv_open_id *id = fh2id(file->private_data);
 738        struct ivtv *itv = id->itv;
 739        struct ivtv_stream *s = &itv->streams[id->type];
 740
 741        strlcpy(vcap->driver, IVTV_DRIVER_NAME, sizeof(vcap->driver));
 742        strlcpy(vcap->card, itv->card_name, sizeof(vcap->card));
 743        snprintf(vcap->bus_info, sizeof(vcap->bus_info), "PCI:%s", pci_name(itv->pdev));
 744        vcap->capabilities = itv->v4l2_cap | V4L2_CAP_DEVICE_CAPS;
 745        vcap->device_caps = s->caps;
 746        return 0;
 747}
 748
 749static int ivtv_enumaudio(struct file *file, void *fh, struct v4l2_audio *vin)
 750{
 751        struct ivtv *itv = fh2id(fh)->itv;
 752
 753        return ivtv_get_audio_input(itv, vin->index, vin);
 754}
 755
 756static int ivtv_g_audio(struct file *file, void *fh, struct v4l2_audio *vin)
 757{
 758        struct ivtv *itv = fh2id(fh)->itv;
 759
 760        vin->index = itv->audio_input;
 761        return ivtv_get_audio_input(itv, vin->index, vin);
 762}
 763
 764static int ivtv_s_audio(struct file *file, void *fh, const struct v4l2_audio *vout)
 765{
 766        struct ivtv *itv = fh2id(fh)->itv;
 767
 768        if (vout->index >= itv->nof_audio_inputs)
 769                return -EINVAL;
 770
 771        itv->audio_input = vout->index;
 772        ivtv_audio_set_io(itv);
 773
 774        return 0;
 775}
 776
 777static int ivtv_enumaudout(struct file *file, void *fh, struct v4l2_audioout *vin)
 778{
 779        struct ivtv *itv = fh2id(fh)->itv;
 780
 781        /* set it to defaults from our table */
 782        return ivtv_get_audio_output(itv, vin->index, vin);
 783}
 784
 785static int ivtv_g_audout(struct file *file, void *fh, struct v4l2_audioout *vin)
 786{
 787        struct ivtv *itv = fh2id(fh)->itv;
 788
 789        vin->index = 0;
 790        return ivtv_get_audio_output(itv, vin->index, vin);
 791}
 792
 793static int ivtv_s_audout(struct file *file, void *fh, const struct v4l2_audioout *vout)
 794{
 795        struct ivtv *itv = fh2id(fh)->itv;
 796
 797        if (itv->card->video_outputs == NULL || vout->index != 0)
 798                return -EINVAL;
 799        return 0;
 800}
 801
 802static int ivtv_enum_input(struct file *file, void *fh, struct v4l2_input *vin)
 803{
 804        struct ivtv *itv = fh2id(fh)->itv;
 805
 806        /* set it to defaults from our table */
 807        return ivtv_get_input(itv, vin->index, vin);
 808}
 809
 810static int ivtv_enum_output(struct file *file, void *fh, struct v4l2_output *vout)
 811{
 812        struct ivtv *itv = fh2id(fh)->itv;
 813
 814        return ivtv_get_output(itv, vout->index, vout);
 815}
 816
 817static int ivtv_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropcap)
 818{
 819        struct ivtv_open_id *id = fh2id(fh);
 820        struct ivtv *itv = id->itv;
 821        struct yuv_playback_info *yi = &itv->yuv_info;
 822        int streamtype;
 823
 824        streamtype = id->type;
 825
 826        if (cropcap->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
 827                return -EINVAL;
 828        cropcap->bounds.top = cropcap->bounds.left = 0;
 829        cropcap->bounds.width = 720;
 830        if (cropcap->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
 831                cropcap->bounds.height = itv->is_50hz ? 576 : 480;
 832                cropcap->pixelaspect.numerator = itv->is_50hz ? 59 : 10;
 833                cropcap->pixelaspect.denominator = itv->is_50hz ? 54 : 11;
 834        } else if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
 835                if (yi->track_osd) {
 836                        cropcap->bounds.width = yi->osd_full_w;
 837                        cropcap->bounds.height = yi->osd_full_h;
 838                } else {
 839                        cropcap->bounds.width = 720;
 840                        cropcap->bounds.height =
 841                                        itv->is_out_50hz ? 576 : 480;
 842                }
 843                cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
 844                cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
 845        } else {
 846                cropcap->bounds.height = itv->is_out_50hz ? 576 : 480;
 847                cropcap->pixelaspect.numerator = itv->is_out_50hz ? 59 : 10;
 848                cropcap->pixelaspect.denominator = itv->is_out_50hz ? 54 : 11;
 849        }
 850        cropcap->defrect = cropcap->bounds;
 851        return 0;
 852}
 853
 854static int ivtv_s_crop(struct file *file, void *fh, const struct v4l2_crop *crop)
 855{
 856        struct ivtv_open_id *id = fh2id(fh);
 857        struct ivtv *itv = id->itv;
 858        struct yuv_playback_info *yi = &itv->yuv_info;
 859        int streamtype;
 860
 861        streamtype = id->type;
 862
 863        if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
 864            (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
 865                if (streamtype == IVTV_DEC_STREAM_TYPE_YUV) {
 866                        yi->main_rect = crop->c;
 867                        return 0;
 868                } else {
 869                        if (!ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
 870                                crop->c.width, crop->c.height, crop->c.left, crop->c.top)) {
 871                                itv->main_rect = crop->c;
 872                                return 0;
 873                        }
 874                }
 875                return -EINVAL;
 876        }
 877        return -EINVAL;
 878}
 879
 880static int ivtv_g_crop(struct file *file, void *fh, struct v4l2_crop *crop)
 881{
 882        struct ivtv_open_id *id = fh2id(fh);
 883        struct ivtv *itv = id->itv;
 884        struct yuv_playback_info *yi = &itv->yuv_info;
 885        int streamtype;
 886
 887        streamtype = id->type;
 888
 889        if (crop->type == V4L2_BUF_TYPE_VIDEO_OUTPUT &&
 890            (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) {
 891                if (streamtype == IVTV_DEC_STREAM_TYPE_YUV)
 892                        crop->c = yi->main_rect;
 893                else
 894                        crop->c = itv->main_rect;
 895                return 0;
 896        }
 897        return -EINVAL;
 898}
 899
 900static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
 901{
 902        static const struct v4l2_fmtdesc hm12 = {
 903                0, V4L2_BUF_TYPE_VIDEO_CAPTURE, 0,
 904                "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
 905                { 0, 0, 0, 0 }
 906        };
 907        static const struct v4l2_fmtdesc mpeg = {
 908                0, V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FMT_FLAG_COMPRESSED,
 909                "MPEG", V4L2_PIX_FMT_MPEG,
 910                { 0, 0, 0, 0 }
 911        };
 912        struct ivtv *itv = fh2id(fh)->itv;
 913        struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
 914
 915        if (fmt->index)
 916                return -EINVAL;
 917        if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
 918                *fmt = mpeg;
 919        else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
 920                *fmt = hm12;
 921        else
 922                return -EINVAL;
 923        return 0;
 924}
 925
 926static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdesc *fmt)
 927{
 928        static const struct v4l2_fmtdesc hm12 = {
 929                0, V4L2_BUF_TYPE_VIDEO_OUTPUT, 0,
 930                "HM12 (YUV 4:2:0)", V4L2_PIX_FMT_HM12,
 931                { 0, 0, 0, 0 }
 932        };
 933        static const struct v4l2_fmtdesc mpeg = {
 934                0, V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_FMT_FLAG_COMPRESSED,
 935                "MPEG", V4L2_PIX_FMT_MPEG,
 936                { 0, 0, 0, 0 }
 937        };
 938        struct ivtv *itv = fh2id(fh)->itv;
 939        struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
 940
 941        if (fmt->index)
 942                return -EINVAL;
 943        if (s->type == IVTV_DEC_STREAM_TYPE_MPG)
 944                *fmt = mpeg;
 945        else if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
 946                *fmt = hm12;
 947        else
 948                return -EINVAL;
 949        return 0;
 950}
 951
 952static int ivtv_g_input(struct file *file, void *fh, unsigned int *i)
 953{
 954        struct ivtv *itv = fh2id(fh)->itv;
 955
 956        *i = itv->active_input;
 957
 958        return 0;
 959}
 960
 961int ivtv_s_input(struct file *file, void *fh, unsigned int inp)
 962{
 963        struct ivtv *itv = fh2id(fh)->itv;
 964        v4l2_std_id std;
 965        int i;
 966
 967        if (inp >= itv->nof_inputs)
 968                return -EINVAL;
 969
 970        if (inp == itv->active_input) {
 971                IVTV_DEBUG_INFO("Input unchanged\n");
 972                return 0;
 973        }
 974
 975        if (atomic_read(&itv->capturing) > 0) {
 976                return -EBUSY;
 977        }
 978
 979        IVTV_DEBUG_INFO("Changing input from %d to %d\n",
 980                        itv->active_input, inp);
 981
 982        itv->active_input = inp;
 983        /* Set the audio input to whatever is appropriate for the
 984           input type. */
 985        itv->audio_input = itv->card->video_inputs[inp].audio_index;
 986
 987        if (itv->card->video_inputs[inp].video_type == IVTV_CARD_INPUT_VID_TUNER)
 988                std = itv->tuner_std;
 989        else
 990                std = V4L2_STD_ALL;
 991        for (i = 0; i <= IVTV_ENC_STREAM_TYPE_VBI; i++)
 992                itv->streams[i].vdev->tvnorms = std;
 993
 994        /* prevent others from messing with the streams until
 995           we're finished changing inputs. */
 996        ivtv_mute(itv);
 997        ivtv_video_set_io(itv);
 998        ivtv_audio_set_io(itv);
 999        ivtv_unmute(itv);
1000
1001        return 0;
1002}
1003
1004static int ivtv_g_output(struct file *file, void *fh, unsigned int *i)
1005{
1006        struct ivtv *itv = fh2id(fh)->itv;
1007
1008        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1009                return -EINVAL;
1010
1011        *i = itv->active_output;
1012
1013        return 0;
1014}
1015
1016static int ivtv_s_output(struct file *file, void *fh, unsigned int outp)
1017{
1018        struct ivtv *itv = fh2id(fh)->itv;
1019
1020        if (outp >= itv->card->nof_outputs)
1021                return -EINVAL;
1022
1023        if (outp == itv->active_output) {
1024                IVTV_DEBUG_INFO("Output unchanged\n");
1025                return 0;
1026        }
1027        IVTV_DEBUG_INFO("Changing output from %d to %d\n",
1028                   itv->active_output, outp);
1029
1030        itv->active_output = outp;
1031        ivtv_call_hw(itv, IVTV_HW_SAA7127, video, s_routing,
1032                        SAA7127_INPUT_TYPE_NORMAL,
1033                        itv->card->video_outputs[outp].video_output, 0);
1034
1035        return 0;
1036}
1037
1038static int ivtv_g_frequency(struct file *file, void *fh, struct v4l2_frequency *vf)
1039{
1040        struct ivtv *itv = fh2id(fh)->itv;
1041        struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
1042
1043        if (s->vdev->vfl_dir)
1044                return -ENOTTY;
1045        if (vf->tuner != 0)
1046                return -EINVAL;
1047
1048        ivtv_call_all(itv, tuner, g_frequency, vf);
1049        return 0;
1050}
1051
1052int ivtv_s_frequency(struct file *file, void *fh, const struct v4l2_frequency *vf)
1053{
1054        struct ivtv *itv = fh2id(fh)->itv;
1055        struct ivtv_stream *s = &itv->streams[fh2id(fh)->type];
1056
1057        if (s->vdev->vfl_dir)
1058                return -ENOTTY;
1059        if (vf->tuner != 0)
1060                return -EINVAL;
1061
1062        ivtv_mute(itv);
1063        IVTV_DEBUG_INFO("v4l2 ioctl: set frequency %d\n", vf->frequency);
1064        ivtv_call_all(itv, tuner, s_frequency, vf);
1065        ivtv_unmute(itv);
1066        return 0;
1067}
1068
1069static int ivtv_g_std(struct file *file, void *fh, v4l2_std_id *std)
1070{
1071        struct ivtv *itv = fh2id(fh)->itv;
1072
1073        *std = itv->std;
1074        return 0;
1075}
1076
1077void ivtv_s_std_enc(struct ivtv *itv, v4l2_std_id std)
1078{
1079        itv->std = std;
1080        itv->is_60hz = (std & V4L2_STD_525_60) ? 1 : 0;
1081        itv->is_50hz = !itv->is_60hz;
1082        cx2341x_handler_set_50hz(&itv->cxhdl, itv->is_50hz);
1083        itv->cxhdl.width = 720;
1084        itv->cxhdl.height = itv->is_50hz ? 576 : 480;
1085        itv->vbi.count = itv->is_50hz ? 18 : 12;
1086        itv->vbi.start[0] = itv->is_50hz ? 6 : 10;
1087        itv->vbi.start[1] = itv->is_50hz ? 318 : 273;
1088
1089        if (itv->hw_flags & IVTV_HW_CX25840)
1090                itv->vbi.sliced_decoder_line_size = itv->is_60hz ? 272 : 284;
1091
1092        /* Tuner */
1093        ivtv_call_all(itv, core, s_std, itv->std);
1094}
1095
1096void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id std)
1097{
1098        struct yuv_playback_info *yi = &itv->yuv_info;
1099        DEFINE_WAIT(wait);
1100        int f;
1101
1102        /* set display standard */
1103        itv->std_out = std;
1104        itv->is_out_60hz = (std & V4L2_STD_525_60) ? 1 : 0;
1105        itv->is_out_50hz = !itv->is_out_60hz;
1106        ivtv_call_all(itv, video, s_std_output, itv->std_out);
1107
1108        /*
1109         * The next firmware call is time sensitive. Time it to
1110         * avoid risk of a hard lock, by trying to ensure the call
1111         * happens within the first 100 lines of the top field.
1112         * Make 4 attempts to sync to the decoder before giving up.
1113         */
1114        mutex_unlock(&itv->serialize_lock);
1115        for (f = 0; f < 4; f++) {
1116                prepare_to_wait(&itv->vsync_waitq, &wait,
1117                                TASK_UNINTERRUPTIBLE);
1118                if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100)
1119                        break;
1120                schedule_timeout(msecs_to_jiffies(25));
1121        }
1122        finish_wait(&itv->vsync_waitq, &wait);
1123        mutex_lock(&itv->serialize_lock);
1124
1125        if (f == 4)
1126                IVTV_WARN("Mode change failed to sync to decoder\n");
1127
1128        ivtv_vapi(itv, CX2341X_DEC_SET_STANDARD, 1, itv->is_out_50hz);
1129        itv->main_rect.left = 0;
1130        itv->main_rect.top = 0;
1131        itv->main_rect.width = 720;
1132        itv->main_rect.height = itv->is_out_50hz ? 576 : 480;
1133        ivtv_vapi(itv, CX2341X_OSD_SET_FRAMEBUFFER_WINDOW, 4,
1134                720, itv->main_rect.height, 0, 0);
1135        yi->main_rect = itv->main_rect;
1136        if (!itv->osd_info) {
1137                yi->osd_full_w = 720;
1138                yi->osd_full_h = itv->is_out_50hz ? 576 : 480;
1139        }
1140}
1141
1142static int ivtv_s_std(struct file *file, void *fh, v4l2_std_id std)
1143{
1144        struct ivtv *itv = fh2id(fh)->itv;
1145
1146        if ((std & V4L2_STD_ALL) == 0)
1147                return -EINVAL;
1148
1149        if (std == itv->std)
1150                return 0;
1151
1152        if (test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ||
1153            atomic_read(&itv->capturing) > 0 ||
1154            atomic_read(&itv->decoding) > 0) {
1155                /* Switching standard would mess with already running
1156                   streams, prevent that by returning EBUSY. */
1157                return -EBUSY;
1158        }
1159
1160        IVTV_DEBUG_INFO("Switching standard to %llx.\n",
1161                (unsigned long long)itv->std);
1162
1163        ivtv_s_std_enc(itv, std);
1164        if (itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)
1165                ivtv_s_std_dec(itv, std);
1166
1167        return 0;
1168}
1169
1170static int ivtv_s_tuner(struct file *file, void *fh, const struct v4l2_tuner *vt)
1171{
1172        struct ivtv_open_id *id = fh2id(fh);
1173        struct ivtv *itv = id->itv;
1174
1175        if (vt->index != 0)
1176                return -EINVAL;
1177
1178        ivtv_call_all(itv, tuner, s_tuner, vt);
1179
1180        return 0;
1181}
1182
1183static int ivtv_g_tuner(struct file *file, void *fh, struct v4l2_tuner *vt)
1184{
1185        struct ivtv *itv = fh2id(fh)->itv;
1186
1187        if (vt->index != 0)
1188                return -EINVAL;
1189
1190        ivtv_call_all(itv, tuner, g_tuner, vt);
1191
1192        if (vt->type == V4L2_TUNER_RADIO)
1193                strlcpy(vt->name, "ivtv Radio Tuner", sizeof(vt->name));
1194        else
1195                strlcpy(vt->name, "ivtv TV Tuner", sizeof(vt->name));
1196        return 0;
1197}
1198
1199static int ivtv_g_sliced_vbi_cap(struct file *file, void *fh, struct v4l2_sliced_vbi_cap *cap)
1200{
1201        struct ivtv *itv = fh2id(fh)->itv;
1202        int set = itv->is_50hz ? V4L2_SLICED_VBI_625 : V4L2_SLICED_VBI_525;
1203        int f, l;
1204
1205        if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_CAPTURE) {
1206                for (f = 0; f < 2; f++) {
1207                        for (l = 0; l < 24; l++) {
1208                                if (valid_service_line(f, l, itv->is_50hz))
1209                                        cap->service_lines[f][l] = set;
1210                        }
1211                }
1212        } else if (cap->type == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT) {
1213                if (!(itv->v4l2_cap & V4L2_CAP_SLICED_VBI_OUTPUT))
1214                        return -EINVAL;
1215                if (itv->is_60hz) {
1216                        cap->service_lines[0][21] = V4L2_SLICED_CAPTION_525;
1217                        cap->service_lines[1][21] = V4L2_SLICED_CAPTION_525;
1218                } else {
1219                        cap->service_lines[0][23] = V4L2_SLICED_WSS_625;
1220                        cap->service_lines[0][16] = V4L2_SLICED_VPS;
1221                }
1222        } else {
1223                return -EINVAL;
1224        }
1225
1226        set = 0;
1227        for (f = 0; f < 2; f++)
1228                for (l = 0; l < 24; l++)
1229                        set |= cap->service_lines[f][l];
1230        cap->service_set = set;
1231        return 0;
1232}
1233
1234static int ivtv_g_enc_index(struct file *file, void *fh, struct v4l2_enc_idx *idx)
1235{
1236        struct ivtv *itv = fh2id(fh)->itv;
1237        struct v4l2_enc_idx_entry *e = idx->entry;
1238        int entries;
1239        int i;
1240
1241        entries = (itv->pgm_info_write_idx + IVTV_MAX_PGM_INDEX - itv->pgm_info_read_idx) %
1242                                IVTV_MAX_PGM_INDEX;
1243        if (entries > V4L2_ENC_IDX_ENTRIES)
1244                entries = V4L2_ENC_IDX_ENTRIES;
1245        idx->entries = 0;
1246        idx->entries_cap = IVTV_MAX_PGM_INDEX;
1247        if (!atomic_read(&itv->capturing))
1248                return 0;
1249        for (i = 0; i < entries; i++) {
1250                *e = itv->pgm_info[(itv->pgm_info_read_idx + i) % IVTV_MAX_PGM_INDEX];
1251                if ((e->flags & V4L2_ENC_IDX_FRAME_MASK) <= V4L2_ENC_IDX_FRAME_B) {
1252                        idx->entries++;
1253                        e++;
1254                }
1255        }
1256        itv->pgm_info_read_idx = (itv->pgm_info_read_idx + idx->entries) % IVTV_MAX_PGM_INDEX;
1257        return 0;
1258}
1259
1260static int ivtv_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1261{
1262        struct ivtv_open_id *id = fh2id(fh);
1263        struct ivtv *itv = id->itv;
1264
1265
1266        switch (enc->cmd) {
1267        case V4L2_ENC_CMD_START:
1268                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1269                enc->flags = 0;
1270                return ivtv_start_capture(id);
1271
1272        case V4L2_ENC_CMD_STOP:
1273                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1274                enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1275                ivtv_stop_capture(id, enc->flags & V4L2_ENC_CMD_STOP_AT_GOP_END);
1276                return 0;
1277
1278        case V4L2_ENC_CMD_PAUSE:
1279                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1280                enc->flags = 0;
1281
1282                if (!atomic_read(&itv->capturing))
1283                        return -EPERM;
1284                if (test_and_set_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1285                        return 0;
1286
1287                ivtv_mute(itv);
1288                ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 0);
1289                break;
1290
1291        case V4L2_ENC_CMD_RESUME:
1292                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1293                enc->flags = 0;
1294
1295                if (!atomic_read(&itv->capturing))
1296                        return -EPERM;
1297
1298                if (!test_and_clear_bit(IVTV_F_I_ENC_PAUSED, &itv->i_flags))
1299                        return 0;
1300
1301                ivtv_vapi(itv, CX2341X_ENC_PAUSE_ENCODER, 1, 1);
1302                ivtv_unmute(itv);
1303                break;
1304        default:
1305                IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1306                return -EINVAL;
1307        }
1308
1309        return 0;
1310}
1311
1312static int ivtv_try_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *enc)
1313{
1314        struct ivtv *itv = fh2id(fh)->itv;
1315
1316        switch (enc->cmd) {
1317        case V4L2_ENC_CMD_START:
1318                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_START\n");
1319                enc->flags = 0;
1320                return 0;
1321
1322        case V4L2_ENC_CMD_STOP:
1323                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_STOP\n");
1324                enc->flags &= V4L2_ENC_CMD_STOP_AT_GOP_END;
1325                return 0;
1326
1327        case V4L2_ENC_CMD_PAUSE:
1328                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_PAUSE\n");
1329                enc->flags = 0;
1330                return 0;
1331
1332        case V4L2_ENC_CMD_RESUME:
1333                IVTV_DEBUG_IOCTL("V4L2_ENC_CMD_RESUME\n");
1334                enc->flags = 0;
1335                return 0;
1336        default:
1337                IVTV_DEBUG_IOCTL("Unknown cmd %d\n", enc->cmd);
1338                return -EINVAL;
1339        }
1340}
1341
1342static int ivtv_g_fbuf(struct file *file, void *fh, struct v4l2_framebuffer *fb)
1343{
1344        struct ivtv *itv = fh2id(fh)->itv;
1345        u32 data[CX2341X_MBOX_MAX_DATA];
1346        struct yuv_playback_info *yi = &itv->yuv_info;
1347
1348        int pixfmt;
1349        static u32 pixel_format[16] = {
1350                V4L2_PIX_FMT_PAL8, /* Uses a 256-entry RGB colormap */
1351                V4L2_PIX_FMT_RGB565,
1352                V4L2_PIX_FMT_RGB555,
1353                V4L2_PIX_FMT_RGB444,
1354                V4L2_PIX_FMT_RGB32,
1355                0,
1356                0,
1357                0,
1358                V4L2_PIX_FMT_PAL8, /* Uses a 256-entry YUV colormap */
1359                V4L2_PIX_FMT_YUV565,
1360                V4L2_PIX_FMT_YUV555,
1361                V4L2_PIX_FMT_YUV444,
1362                V4L2_PIX_FMT_YUV32,
1363                0,
1364                0,
1365                0,
1366        };
1367
1368        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1369                return -EINVAL;
1370        if (!itv->osd_video_pbase)
1371                return -EINVAL;
1372
1373        fb->capability = V4L2_FBUF_CAP_EXTERNOVERLAY | V4L2_FBUF_CAP_CHROMAKEY |
1374                V4L2_FBUF_CAP_GLOBAL_ALPHA;
1375
1376        ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1377        data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1378        pixfmt = (data[0] >> 3) & 0xf;
1379
1380        fb->fmt.pixelformat = pixel_format[pixfmt];
1381        fb->fmt.width = itv->osd_rect.width;
1382        fb->fmt.height = itv->osd_rect.height;
1383        fb->fmt.field = V4L2_FIELD_INTERLACED;
1384        fb->fmt.bytesperline = fb->fmt.width;
1385        fb->fmt.colorspace = V4L2_COLORSPACE_SMPTE170M;
1386        fb->fmt.field = V4L2_FIELD_INTERLACED;
1387        fb->fmt.priv = 0;
1388        if (fb->fmt.pixelformat != V4L2_PIX_FMT_PAL8)
1389                fb->fmt.bytesperline *= 2;
1390        if (fb->fmt.pixelformat == V4L2_PIX_FMT_RGB32 ||
1391            fb->fmt.pixelformat == V4L2_PIX_FMT_YUV32)
1392                fb->fmt.bytesperline *= 2;
1393        fb->fmt.sizeimage = fb->fmt.bytesperline * fb->fmt.height;
1394        fb->base = (void *)itv->osd_video_pbase;
1395        fb->flags = 0;
1396
1397        if (itv->osd_chroma_key_state)
1398                fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
1399
1400        if (itv->osd_global_alpha_state)
1401                fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
1402
1403        if (yi->track_osd)
1404                fb->flags |= V4L2_FBUF_FLAG_OVERLAY;
1405
1406        pixfmt &= 7;
1407
1408        /* no local alpha for RGB565 or unknown formats */
1409        if (pixfmt == 1 || pixfmt > 4)
1410                return 0;
1411
1412        /* 16-bit formats have inverted local alpha */
1413        if (pixfmt == 2 || pixfmt == 3)
1414                fb->capability |= V4L2_FBUF_CAP_LOCAL_INV_ALPHA;
1415        else
1416                fb->capability |= V4L2_FBUF_CAP_LOCAL_ALPHA;
1417
1418        if (itv->osd_local_alpha_state) {
1419                /* 16-bit formats have inverted local alpha */
1420                if (pixfmt == 2 || pixfmt == 3)
1421                        fb->flags |= V4L2_FBUF_FLAG_LOCAL_INV_ALPHA;
1422                else
1423                        fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
1424        }
1425
1426        return 0;
1427}
1428
1429static int ivtv_s_fbuf(struct file *file, void *fh, const struct v4l2_framebuffer *fb)
1430{
1431        struct ivtv_open_id *id = fh2id(fh);
1432        struct ivtv *itv = id->itv;
1433        struct yuv_playback_info *yi = &itv->yuv_info;
1434
1435        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1436                return -EINVAL;
1437        if (!itv->osd_video_pbase)
1438                return -EINVAL;
1439
1440        itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
1441        itv->osd_local_alpha_state =
1442                (fb->flags & (V4L2_FBUF_FLAG_LOCAL_ALPHA|V4L2_FBUF_FLAG_LOCAL_INV_ALPHA)) != 0;
1443        itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
1444        ivtv_set_osd_alpha(itv);
1445        yi->track_osd = (fb->flags & V4L2_FBUF_FLAG_OVERLAY) != 0;
1446        return 0;
1447}
1448
1449static int ivtv_overlay(struct file *file, void *fh, unsigned int on)
1450{
1451        struct ivtv_open_id *id = fh2id(fh);
1452        struct ivtv *itv = id->itv;
1453
1454        if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT_OVERLAY))
1455                return -EINVAL;
1456
1457        ivtv_vapi(itv, CX2341X_OSD_SET_STATE, 1, on != 0);
1458
1459        return 0;
1460}
1461
1462static int ivtv_subscribe_event(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub)
1463{
1464        switch (sub->type) {
1465        case V4L2_EVENT_VSYNC:
1466        case V4L2_EVENT_EOS:
1467                return v4l2_event_subscribe(fh, sub, 0, NULL);
1468        case V4L2_EVENT_CTRL:
1469                return v4l2_event_subscribe(fh, sub, 0, &v4l2_ctrl_sub_ev_ops);
1470        default:
1471                return -EINVAL;
1472        }
1473}
1474
1475static int ivtv_log_status(struct file *file, void *fh)
1476{
1477        struct ivtv *itv = fh2id(fh)->itv;
1478        u32 data[CX2341X_MBOX_MAX_DATA];
1479
1480        int has_output = itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT;
1481        struct v4l2_input vidin;
1482        struct v4l2_audio audin;
1483        int i;
1484
1485        IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
1486        if (itv->hw_flags & IVTV_HW_TVEEPROM) {
1487                struct tveeprom tv;
1488
1489                ivtv_read_eeprom(itv, &tv);
1490        }
1491        ivtv_call_all(itv, core, log_status);
1492        ivtv_get_input(itv, itv->active_input, &vidin);
1493        ivtv_get_audio_input(itv, itv->audio_input, &audin);
1494        IVTV_INFO("Video Input:  %s\n", vidin.name);
1495        IVTV_INFO("Audio Input:  %s%s\n", audin.name,
1496                (itv->dualwatch_stereo_mode & ~0x300) == 0x200 ? " (Bilingual)" : "");
1497        if (has_output) {
1498                struct v4l2_output vidout;
1499                struct v4l2_audioout audout;
1500                int mode = itv->output_mode;
1501                static const char * const output_modes[5] = {
1502                        "None",
1503                        "MPEG Streaming",
1504                        "YUV Streaming",
1505                        "YUV Frames",
1506                        "Passthrough",
1507                };
1508                static const char * const alpha_mode[4] = {
1509                        "None",
1510                        "Global",
1511                        "Local",
1512                        "Global and Local"
1513                };
1514                static const char * const pixel_format[16] = {
1515                        "ARGB Indexed",
1516                        "RGB 5:6:5",
1517                        "ARGB 1:5:5:5",
1518                        "ARGB 1:4:4:4",
1519                        "ARGB 8:8:8:8",
1520                        "5",
1521                        "6",
1522                        "7",
1523                        "AYUV Indexed",
1524                        "YUV 5:6:5",
1525                        "AYUV 1:5:5:5",
1526                        "AYUV 1:4:4:4",
1527                        "AYUV 8:8:8:8",
1528                        "13",
1529                        "14",
1530                        "15",
1531                };
1532
1533                ivtv_get_output(itv, itv->active_output, &vidout);
1534                ivtv_get_audio_output(itv, 0, &audout);
1535                IVTV_INFO("Video Output: %s\n", vidout.name);
1536                if (mode < 0 || mode > OUT_PASSTHROUGH)
1537                        mode = OUT_NONE;
1538                IVTV_INFO("Output Mode:  %s\n", output_modes[mode]);
1539                ivtv_vapi_result(itv, data, CX2341X_OSD_GET_STATE, 0);
1540                data[0] |= (read_reg(0x2a00) >> 7) & 0x40;
1541                IVTV_INFO("Overlay:      %s, Alpha: %s, Pixel Format: %s\n",
1542                        data[0] & 1 ? "On" : "Off",
1543                        alpha_mode[(data[0] >> 1) & 0x3],
1544                        pixel_format[(data[0] >> 3) & 0xf]);
1545        }
1546        IVTV_INFO("Tuner:  %s\n",
1547                test_bit(IVTV_F_I_RADIO_USER, &itv->i_flags) ? "Radio" : "TV");
1548        v4l2_ctrl_handler_log_status(&itv->cxhdl.hdl, itv->v4l2_dev.name);
1549        IVTV_INFO("Status flags:    0x%08lx\n", itv->i_flags);
1550        for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1551                struct ivtv_stream *s = &itv->streams[i];
1552
1553                if (s->vdev == NULL || s->buffers == 0)
1554                        continue;
1555                IVTV_INFO("Stream %s: status 0x%04lx, %d%% of %d KiB (%d buffers) in use\n", s->name, s->s_flags,
1556                                (s->buffers - s->q_free.buffers) * 100 / s->buffers,
1557                                (s->buffers * s->buf_size) / 1024, s->buffers);
1558        }
1559
1560        IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
1561                        (long long)itv->mpg_data_received,
1562                        (long long)itv->vbi_data_inserted);
1563        return 0;
1564}
1565
1566static int ivtv_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *dec)
1567{
1568        struct ivtv_open_id *id = fh2id(file->private_data);
1569        struct ivtv *itv = id->itv;
1570
1571        IVTV_DEBUG_IOCTL("VIDIOC_DECODER_CMD %d\n", dec->cmd);
1572        return ivtv_video_command(itv, id, dec, false);
1573}
1574
1575static int ivtv_try_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *dec)
1576{
1577        struct ivtv_open_id *id = fh2id(file->private_data);
1578        struct ivtv *itv = id->itv;
1579
1580        IVTV_DEBUG_IOCTL("VIDIOC_TRY_DECODER_CMD %d\n", dec->cmd);
1581        return ivtv_video_command(itv, id, dec, true);
1582}
1583
1584static int ivtv_decoder_ioctls(struct file *filp, unsigned int cmd, void *arg)
1585{
1586        struct ivtv_open_id *id = fh2id(filp->private_data);
1587        struct ivtv *itv = id->itv;
1588        int nonblocking = filp->f_flags & O_NONBLOCK;
1589        struct ivtv_stream *s = &itv->streams[id->type];
1590        unsigned long iarg = (unsigned long)arg;
1591
1592        switch (cmd) {
1593        case IVTV_IOC_DMA_FRAME: {
1594                struct ivtv_dma_frame *args = arg;
1595
1596                IVTV_DEBUG_IOCTL("IVTV_IOC_DMA_FRAME\n");
1597                if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1598                        return -EINVAL;
1599                if (args->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
1600                        return -EINVAL;
1601                if (itv->output_mode == OUT_UDMA_YUV && args->y_source == NULL)
1602                        return 0;
1603                if (ivtv_start_decoding(id, id->type)) {
1604                        return -EBUSY;
1605                }
1606                if (ivtv_set_output_mode(itv, OUT_UDMA_YUV) != OUT_UDMA_YUV) {
1607                        ivtv_release_stream(s);
1608                        return -EBUSY;
1609                }
1610                /* Mark that this file handle started the UDMA_YUV mode */
1611                id->yuv_frames = 1;
1612                if (args->y_source == NULL)
1613                        return 0;
1614                return ivtv_yuv_prep_frame(itv, args);
1615        }
1616
1617        case IVTV_IOC_PASSTHROUGH_MODE:
1618                IVTV_DEBUG_IOCTL("IVTV_IOC_PASSTHROUGH_MODE\n");
1619                if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1620                        return -EINVAL;
1621                return ivtv_passthrough_mode(itv, *(int *)arg != 0);
1622
1623        case VIDEO_GET_PTS: {
1624                s64 *pts = arg;
1625                s64 frame;
1626
1627                IVTV_DEBUG_IOCTL("VIDEO_GET_PTS\n");
1628                if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1629                        *pts = s->dma_pts;
1630                        break;
1631                }
1632                if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1633                        return -EINVAL;
1634                return ivtv_g_pts_frame(itv, pts, &frame);
1635        }
1636
1637        case VIDEO_GET_FRAME_COUNT: {
1638                s64 *frame = arg;
1639                s64 pts;
1640
1641                IVTV_DEBUG_IOCTL("VIDEO_GET_FRAME_COUNT\n");
1642                if (s->type < IVTV_DEC_STREAM_TYPE_MPG) {
1643                        *frame = 0;
1644                        break;
1645                }
1646                if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1647                        return -EINVAL;
1648                return ivtv_g_pts_frame(itv, &pts, frame);
1649        }
1650
1651        case VIDEO_PLAY: {
1652                struct v4l2_decoder_cmd dc;
1653
1654                IVTV_DEBUG_IOCTL("VIDEO_PLAY\n");
1655                memset(&dc, 0, sizeof(dc));
1656                dc.cmd = V4L2_DEC_CMD_START;
1657                return ivtv_video_command(itv, id, &dc, 0);
1658        }
1659
1660        case VIDEO_STOP: {
1661                struct v4l2_decoder_cmd dc;
1662
1663                IVTV_DEBUG_IOCTL("VIDEO_STOP\n");
1664                memset(&dc, 0, sizeof(dc));
1665                dc.cmd = V4L2_DEC_CMD_STOP;
1666                dc.flags = V4L2_DEC_CMD_STOP_TO_BLACK | V4L2_DEC_CMD_STOP_IMMEDIATELY;
1667                return ivtv_video_command(itv, id, &dc, 0);
1668        }
1669
1670        case VIDEO_FREEZE: {
1671                struct v4l2_decoder_cmd dc;
1672
1673                IVTV_DEBUG_IOCTL("VIDEO_FREEZE\n");
1674                memset(&dc, 0, sizeof(dc));
1675                dc.cmd = V4L2_DEC_CMD_PAUSE;
1676                return ivtv_video_command(itv, id, &dc, 0);
1677        }
1678
1679        case VIDEO_CONTINUE: {
1680                struct v4l2_decoder_cmd dc;
1681
1682                IVTV_DEBUG_IOCTL("VIDEO_CONTINUE\n");
1683                memset(&dc, 0, sizeof(dc));
1684                dc.cmd = V4L2_DEC_CMD_RESUME;
1685                return ivtv_video_command(itv, id, &dc, 0);
1686        }
1687
1688        case VIDEO_COMMAND:
1689        case VIDEO_TRY_COMMAND: {
1690                /* Note: struct v4l2_decoder_cmd has the same layout as
1691                   struct video_command */
1692                struct v4l2_decoder_cmd *dc = arg;
1693                int try = (cmd == VIDEO_TRY_COMMAND);
1694
1695                if (try)
1696                        IVTV_DEBUG_IOCTL("VIDEO_TRY_COMMAND %d\n", dc->cmd);
1697                else
1698                        IVTV_DEBUG_IOCTL("VIDEO_COMMAND %d\n", dc->cmd);
1699                return ivtv_video_command(itv, id, dc, try);
1700        }
1701
1702        case VIDEO_GET_EVENT: {
1703                struct video_event *ev = arg;
1704                DEFINE_WAIT(wait);
1705
1706                IVTV_DEBUG_IOCTL("VIDEO_GET_EVENT\n");
1707                if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1708                        return -EINVAL;
1709                memset(ev, 0, sizeof(*ev));
1710                set_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags);
1711
1712                while (1) {
1713                        if (test_and_clear_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags))
1714                                ev->type = VIDEO_EVENT_DECODER_STOPPED;
1715                        else if (test_and_clear_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags)) {
1716                                ev->type = VIDEO_EVENT_VSYNC;
1717                                ev->u.vsync_field = test_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags) ?
1718                                        VIDEO_VSYNC_FIELD_ODD : VIDEO_VSYNC_FIELD_EVEN;
1719                                if (itv->output_mode == OUT_UDMA_YUV &&
1720                                        (itv->yuv_info.lace_mode & IVTV_YUV_MODE_MASK) ==
1721                                                                IVTV_YUV_MODE_PROGRESSIVE) {
1722                                        ev->u.vsync_field = VIDEO_VSYNC_FIELD_PROGRESSIVE;
1723                                }
1724                        }
1725                        if (ev->type)
1726                                return 0;
1727                        if (nonblocking)
1728                                return -EAGAIN;
1729                        /* Wait for event. Note that serialize_lock is locked,
1730                           so to allow other processes to access the driver while
1731                           we are waiting unlock first and later lock again. */
1732                        mutex_unlock(&itv->serialize_lock);
1733                        prepare_to_wait(&itv->event_waitq, &wait, TASK_INTERRUPTIBLE);
1734                        if (!test_bit(IVTV_F_I_EV_DEC_STOPPED, &itv->i_flags) &&
1735                            !test_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags))
1736                                schedule();
1737                        finish_wait(&itv->event_waitq, &wait);
1738                        mutex_lock(&itv->serialize_lock);
1739                        if (signal_pending(current)) {
1740                                /* return if a signal was received */
1741                                IVTV_DEBUG_INFO("User stopped wait for event\n");
1742                                return -EINTR;
1743                        }
1744                }
1745                break;
1746        }
1747
1748        case VIDEO_SELECT_SOURCE:
1749                IVTV_DEBUG_IOCTL("VIDEO_SELECT_SOURCE\n");
1750                if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
1751                        return -EINVAL;
1752                return ivtv_passthrough_mode(itv, iarg == VIDEO_SOURCE_DEMUX);
1753
1754        case AUDIO_SET_MUTE:
1755                IVTV_DEBUG_IOCTL("AUDIO_SET_MUTE\n");
1756                itv->speed_mute_audio = iarg;
1757                return 0;
1758
1759        case AUDIO_CHANNEL_SELECT:
1760                IVTV_DEBUG_IOCTL("AUDIO_CHANNEL_SELECT\n");
1761                if (iarg > AUDIO_STEREO_SWAPPED)
1762                        return -EINVAL;
1763                return v4l2_ctrl_s_ctrl(itv->ctrl_audio_playback, iarg + 1);
1764
1765        case AUDIO_BILINGUAL_CHANNEL_SELECT:
1766                IVTV_DEBUG_IOCTL("AUDIO_BILINGUAL_CHANNEL_SELECT\n");
1767                if (iarg > AUDIO_STEREO_SWAPPED)
1768                        return -EINVAL;
1769                return v4l2_ctrl_s_ctrl(itv->ctrl_audio_multilingual_playback, iarg + 1);
1770
1771        default:
1772                return -EINVAL;
1773        }
1774        return 0;
1775}
1776
1777static long ivtv_default(struct file *file, void *fh, bool valid_prio,
1778                         unsigned int cmd, void *arg)
1779{
1780        struct ivtv *itv = fh2id(fh)->itv;
1781
1782        if (!valid_prio) {
1783                switch (cmd) {
1784                case IVTV_IOC_PASSTHROUGH_MODE:
1785                case VIDEO_PLAY:
1786                case VIDEO_STOP:
1787                case VIDEO_FREEZE:
1788                case VIDEO_CONTINUE:
1789                case VIDEO_COMMAND:
1790                case VIDEO_SELECT_SOURCE:
1791                case AUDIO_SET_MUTE:
1792                case AUDIO_CHANNEL_SELECT:
1793                case AUDIO_BILINGUAL_CHANNEL_SELECT:
1794                        return -EBUSY;
1795                }
1796        }
1797
1798        switch (cmd) {
1799        case VIDIOC_INT_RESET: {
1800                u32 val = *(u32 *)arg;
1801
1802                if ((val == 0 && itv->options.newi2c) || (val & 0x01))
1803                        ivtv_reset_ir_gpio(itv);
1804                if (val & 0x02)
1805                        v4l2_subdev_call(itv->sd_video, core, reset, 0);
1806                break;
1807        }
1808
1809        case IVTV_IOC_DMA_FRAME:
1810        case IVTV_IOC_PASSTHROUGH_MODE:
1811        case VIDEO_GET_PTS:
1812        case VIDEO_GET_FRAME_COUNT:
1813        case VIDEO_GET_EVENT:
1814        case VIDEO_PLAY:
1815        case VIDEO_STOP:
1816        case VIDEO_FREEZE:
1817        case VIDEO_CONTINUE:
1818        case VIDEO_COMMAND:
1819        case VIDEO_TRY_COMMAND:
1820        case VIDEO_SELECT_SOURCE:
1821        case AUDIO_SET_MUTE:
1822        case AUDIO_CHANNEL_SELECT:
1823        case AUDIO_BILINGUAL_CHANNEL_SELECT:
1824                return ivtv_decoder_ioctls(file, cmd, (void *)arg);
1825
1826        default:
1827                return -ENOTTY;
1828        }
1829        return 0;
1830}
1831
1832static const struct v4l2_ioctl_ops ivtv_ioctl_ops = {
1833        .vidioc_querycap                    = ivtv_querycap,
1834        .vidioc_s_audio                     = ivtv_s_audio,
1835        .vidioc_g_audio                     = ivtv_g_audio,
1836        .vidioc_enumaudio                   = ivtv_enumaudio,
1837        .vidioc_s_audout                    = ivtv_s_audout,
1838        .vidioc_g_audout                    = ivtv_g_audout,
1839        .vidioc_enum_input                  = ivtv_enum_input,
1840        .vidioc_enum_output                 = ivtv_enum_output,
1841        .vidioc_enumaudout                  = ivtv_enumaudout,
1842        .vidioc_cropcap                     = ivtv_cropcap,
1843        .vidioc_s_crop                      = ivtv_s_crop,
1844        .vidioc_g_crop                      = ivtv_g_crop,
1845        .vidioc_g_input                     = ivtv_g_input,
1846        .vidioc_s_input                     = ivtv_s_input,
1847        .vidioc_g_output                    = ivtv_g_output,
1848        .vidioc_s_output                    = ivtv_s_output,
1849        .vidioc_g_frequency                 = ivtv_g_frequency,
1850        .vidioc_s_frequency                 = ivtv_s_frequency,
1851        .vidioc_s_tuner                     = ivtv_s_tuner,
1852        .vidioc_g_tuner                     = ivtv_g_tuner,
1853        .vidioc_g_enc_index                 = ivtv_g_enc_index,
1854        .vidioc_g_fbuf                      = ivtv_g_fbuf,
1855        .vidioc_s_fbuf                      = ivtv_s_fbuf,
1856        .vidioc_g_std                       = ivtv_g_std,
1857        .vidioc_s_std                       = ivtv_s_std,
1858        .vidioc_overlay                     = ivtv_overlay,
1859        .vidioc_log_status                  = ivtv_log_status,
1860        .vidioc_enum_fmt_vid_cap            = ivtv_enum_fmt_vid_cap,
1861        .vidioc_encoder_cmd                 = ivtv_encoder_cmd,
1862        .vidioc_try_encoder_cmd             = ivtv_try_encoder_cmd,
1863        .vidioc_decoder_cmd                 = ivtv_decoder_cmd,
1864        .vidioc_try_decoder_cmd             = ivtv_try_decoder_cmd,
1865        .vidioc_enum_fmt_vid_out            = ivtv_enum_fmt_vid_out,
1866        .vidioc_g_fmt_vid_cap               = ivtv_g_fmt_vid_cap,
1867        .vidioc_g_fmt_vbi_cap               = ivtv_g_fmt_vbi_cap,
1868        .vidioc_g_fmt_sliced_vbi_cap        = ivtv_g_fmt_sliced_vbi_cap,
1869        .vidioc_g_fmt_vid_out               = ivtv_g_fmt_vid_out,
1870        .vidioc_g_fmt_vid_out_overlay       = ivtv_g_fmt_vid_out_overlay,
1871        .vidioc_g_fmt_sliced_vbi_out        = ivtv_g_fmt_sliced_vbi_out,
1872        .vidioc_s_fmt_vid_cap               = ivtv_s_fmt_vid_cap,
1873        .vidioc_s_fmt_vbi_cap               = ivtv_s_fmt_vbi_cap,
1874        .vidioc_s_fmt_sliced_vbi_cap        = ivtv_s_fmt_sliced_vbi_cap,
1875        .vidioc_s_fmt_vid_out               = ivtv_s_fmt_vid_out,
1876        .vidioc_s_fmt_vid_out_overlay       = ivtv_s_fmt_vid_out_overlay,
1877        .vidioc_s_fmt_sliced_vbi_out        = ivtv_s_fmt_sliced_vbi_out,
1878        .vidioc_try_fmt_vid_cap             = ivtv_try_fmt_vid_cap,
1879        .vidioc_try_fmt_vbi_cap             = ivtv_try_fmt_vbi_cap,
1880        .vidioc_try_fmt_sliced_vbi_cap      = ivtv_try_fmt_sliced_vbi_cap,
1881        .vidioc_try_fmt_vid_out             = ivtv_try_fmt_vid_out,
1882        .vidioc_try_fmt_vid_out_overlay     = ivtv_try_fmt_vid_out_overlay,
1883        .vidioc_try_fmt_sliced_vbi_out      = ivtv_try_fmt_sliced_vbi_out,
1884        .vidioc_g_sliced_vbi_cap            = ivtv_g_sliced_vbi_cap,
1885#ifdef CONFIG_VIDEO_ADV_DEBUG
1886        .vidioc_g_register                  = ivtv_g_register,
1887        .vidioc_s_register                  = ivtv_s_register,
1888#endif
1889        .vidioc_default                     = ivtv_default,
1890        .vidioc_subscribe_event             = ivtv_subscribe_event,
1891        .vidioc_unsubscribe_event           = v4l2_event_unsubscribe,
1892};
1893
1894void ivtv_set_funcs(struct video_device *vdev)
1895{
1896        vdev->ioctl_ops = &ivtv_ioctl_ops;
1897}
1898