root/drivers/media/pci/saa7164/saa7164-encoder.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. saa7164_encoder_configure
  2. saa7164_encoder_buffers_dealloc
  3. saa7164_encoder_buffers_alloc
  4. saa7164_encoder_initialize
  5. saa7164_s_std
  6. vidioc_s_std
  7. saa7164_g_std
  8. vidioc_g_std
  9. saa7164_enum_input
  10. saa7164_g_input
  11. vidioc_g_input
  12. saa7164_s_input
  13. vidioc_s_input
  14. saa7164_g_tuner
  15. saa7164_s_tuner
  16. saa7164_g_frequency
  17. vidioc_g_frequency
  18. saa7164_s_frequency
  19. vidioc_s_frequency
  20. saa7164_s_ctrl
  21. vidioc_querycap
  22. vidioc_enum_fmt_vid_cap
  23. vidioc_fmt_vid_cap
  24. saa7164_encoder_stop_port
  25. saa7164_encoder_acquire_port
  26. saa7164_encoder_pause_port
  27. saa7164_encoder_stop_streaming
  28. saa7164_encoder_start_streaming
  29. fops_open
  30. fops_release
  31. saa7164_enc_next_buf
  32. fops_read
  33. fops_poll
  34. saa7164_encoder_alloc
  35. saa7164_encoder_register
  36. saa7164_encoder_unregister

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  *  Driver for the NXP SAA7164 PCIe bridge
   4  *
   5  *  Copyright (c) 2010-2015 Steven Toth <stoth@kernellabs.com>
   6  */
   7 
   8 #include "saa7164.h"
   9 
  10 #define ENCODER_MAX_BITRATE 6500000
  11 #define ENCODER_MIN_BITRATE 1000000
  12 #define ENCODER_DEF_BITRATE 5000000
  13 
  14 /*
  15  * This is a dummy non-zero value for the sizeimage field of v4l2_pix_format.
  16  * It is not actually used for anything since this driver does not support
  17  * stream I/O, only read(), and because this driver produces an MPEG stream
  18  * and not discrete frames. But the V4L2 spec doesn't allow for this value
  19  * to be 0, so set it to 0x10000 instead.
  20  *
  21  * If we ever change this driver to support stream I/O, then this field
  22  * will be the size of the streaming buffers.
  23  */
  24 #define SAA7164_SIZEIMAGE (0x10000)
  25 
  26 static struct saa7164_tvnorm saa7164_tvnorms[] = {
  27         {
  28                 .name      = "NTSC-M",
  29                 .id        = V4L2_STD_NTSC_M,
  30         }, {
  31                 .name      = "NTSC-JP",
  32                 .id        = V4L2_STD_NTSC_M_JP,
  33         }
  34 };
  35 
  36 /* Take the encoder configuration form the port struct and
  37  * flush it to the hardware.
  38  */
  39 static void saa7164_encoder_configure(struct saa7164_port *port)
  40 {
  41         struct saa7164_dev *dev = port->dev;
  42         dprintk(DBGLVL_ENC, "%s()\n", __func__);
  43 
  44         port->encoder_params.width = port->width;
  45         port->encoder_params.height = port->height;
  46         port->encoder_params.is_50hz =
  47                 (port->encodernorm.id & V4L2_STD_625_50) != 0;
  48 
  49         /* Set up the DIF (enable it) for analog mode by default */
  50         saa7164_api_initialize_dif(port);
  51 
  52         /* Configure the correct video standard */
  53         saa7164_api_configure_dif(port, port->encodernorm.id);
  54 
  55         /* Ensure the audio decoder is correct configured */
  56         saa7164_api_set_audio_std(port);
  57 }
  58 
  59 static int saa7164_encoder_buffers_dealloc(struct saa7164_port *port)
  60 {
  61         struct list_head *c, *n, *p, *q, *l, *v;
  62         struct saa7164_dev *dev = port->dev;
  63         struct saa7164_buffer *buf;
  64         struct saa7164_user_buffer *ubuf;
  65 
  66         /* Remove any allocated buffers */
  67         mutex_lock(&port->dmaqueue_lock);
  68 
  69         dprintk(DBGLVL_ENC, "%s(port=%d) dmaqueue\n", __func__, port->nr);
  70         list_for_each_safe(c, n, &port->dmaqueue.list) {
  71                 buf = list_entry(c, struct saa7164_buffer, list);
  72                 list_del(c);
  73                 saa7164_buffer_dealloc(buf);
  74         }
  75 
  76         dprintk(DBGLVL_ENC, "%s(port=%d) used\n", __func__, port->nr);
  77         list_for_each_safe(p, q, &port->list_buf_used.list) {
  78                 ubuf = list_entry(p, struct saa7164_user_buffer, list);
  79                 list_del(p);
  80                 saa7164_buffer_dealloc_user(ubuf);
  81         }
  82 
  83         dprintk(DBGLVL_ENC, "%s(port=%d) free\n", __func__, port->nr);
  84         list_for_each_safe(l, v, &port->list_buf_free.list) {
  85                 ubuf = list_entry(l, struct saa7164_user_buffer, list);
  86                 list_del(l);
  87                 saa7164_buffer_dealloc_user(ubuf);
  88         }
  89 
  90         mutex_unlock(&port->dmaqueue_lock);
  91         dprintk(DBGLVL_ENC, "%s(port=%d) done\n", __func__, port->nr);
  92 
  93         return 0;
  94 }
  95 
  96 /* Dynamic buffer switch at encoder start time */
  97 static int saa7164_encoder_buffers_alloc(struct saa7164_port *port)
  98 {
  99         struct saa7164_dev *dev = port->dev;
 100         struct saa7164_buffer *buf;
 101         struct saa7164_user_buffer *ubuf;
 102         struct tmHWStreamParameters *params = &port->hw_streamingparams;
 103         int result = -ENODEV, i;
 104         int len = 0;
 105 
 106         dprintk(DBGLVL_ENC, "%s()\n", __func__);
 107 
 108         if (port->encoder_params.stream_type ==
 109                 V4L2_MPEG_STREAM_TYPE_MPEG2_PS) {
 110                 dprintk(DBGLVL_ENC,
 111                         "%s() type=V4L2_MPEG_STREAM_TYPE_MPEG2_PS\n",
 112                         __func__);
 113                 params->samplesperline = 128;
 114                 params->numberoflines = 256;
 115                 params->pitch = 128;
 116                 params->numpagetables = 2 +
 117                         ((SAA7164_PS_NUMBER_OF_LINES * 128) / PAGE_SIZE);
 118         } else
 119         if (port->encoder_params.stream_type ==
 120                 V4L2_MPEG_STREAM_TYPE_MPEG2_TS) {
 121                 dprintk(DBGLVL_ENC,
 122                         "%s() type=V4L2_MPEG_STREAM_TYPE_MPEG2_TS\n",
 123                         __func__);
 124                 params->samplesperline = 188;
 125                 params->numberoflines = 312;
 126                 params->pitch = 188;
 127                 params->numpagetables = 2 +
 128                         ((SAA7164_TS_NUMBER_OF_LINES * 188) / PAGE_SIZE);
 129         } else
 130                 BUG();
 131 
 132         /* Init and establish defaults */
 133         params->bitspersample = 8;
 134         params->linethreshold = 0;
 135         params->pagetablelistvirt = NULL;
 136         params->pagetablelistphys = NULL;
 137         params->numpagetableentries = port->hwcfg.buffercount;
 138 
 139         /* Allocate the PCI resources, buffers (hard) */
 140         for (i = 0; i < port->hwcfg.buffercount; i++) {
 141                 buf = saa7164_buffer_alloc(port,
 142                         params->numberoflines *
 143                         params->pitch);
 144 
 145                 if (!buf) {
 146                         printk(KERN_ERR "%s() failed (errno = %d), unable to allocate buffer\n",
 147                                 __func__, result);
 148                         result = -ENOMEM;
 149                         goto failed;
 150                 } else {
 151 
 152                         mutex_lock(&port->dmaqueue_lock);
 153                         list_add_tail(&buf->list, &port->dmaqueue.list);
 154                         mutex_unlock(&port->dmaqueue_lock);
 155 
 156                 }
 157         }
 158 
 159         /* Allocate some kernel buffers for copying
 160          * to userpsace.
 161          */
 162         len = params->numberoflines * params->pitch;
 163 
 164         if (encoder_buffers < 16)
 165                 encoder_buffers = 16;
 166         if (encoder_buffers > 512)
 167                 encoder_buffers = 512;
 168 
 169         for (i = 0; i < encoder_buffers; i++) {
 170 
 171                 ubuf = saa7164_buffer_alloc_user(dev, len);
 172                 if (ubuf) {
 173                         mutex_lock(&port->dmaqueue_lock);
 174                         list_add_tail(&ubuf->list, &port->list_buf_free.list);
 175                         mutex_unlock(&port->dmaqueue_lock);
 176                 }
 177 
 178         }
 179 
 180         result = 0;
 181 
 182 failed:
 183         return result;
 184 }
 185 
 186 static int saa7164_encoder_initialize(struct saa7164_port *port)
 187 {
 188         saa7164_encoder_configure(port);
 189         return 0;
 190 }
 191 
 192 /* -- V4L2 --------------------------------------------------------- */
 193 int saa7164_s_std(struct saa7164_port *port, v4l2_std_id id)
 194 {
 195         struct saa7164_dev *dev = port->dev;
 196         unsigned int i;
 197 
 198         dprintk(DBGLVL_ENC, "%s(id=0x%x)\n", __func__, (u32)id);
 199 
 200         for (i = 0; i < ARRAY_SIZE(saa7164_tvnorms); i++) {
 201                 if (id & saa7164_tvnorms[i].id)
 202                         break;
 203         }
 204         if (i == ARRAY_SIZE(saa7164_tvnorms))
 205                 return -EINVAL;
 206 
 207         port->encodernorm = saa7164_tvnorms[i];
 208         port->std = id;
 209 
 210         /* Update the audio decoder while is not running in
 211          * auto detect mode.
 212          */
 213         saa7164_api_set_audio_std(port);
 214 
 215         dprintk(DBGLVL_ENC, "%s(id=0x%x) OK\n", __func__, (u32)id);
 216 
 217         return 0;
 218 }
 219 
 220 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id id)
 221 {
 222         struct saa7164_encoder_fh *fh = file->private_data;
 223 
 224         return saa7164_s_std(fh->port, id);
 225 }
 226 
 227 int saa7164_g_std(struct saa7164_port *port, v4l2_std_id *id)
 228 {
 229         *id = port->std;
 230         return 0;
 231 }
 232 
 233 static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *id)
 234 {
 235         struct saa7164_encoder_fh *fh = file->private_data;
 236 
 237         return saa7164_g_std(fh->port, id);
 238 }
 239 
 240 int saa7164_enum_input(struct file *file, void *priv, struct v4l2_input *i)
 241 {
 242         static const char * const inputs[] = {
 243                 "tuner", "composite", "svideo", "aux",
 244                 "composite 2", "svideo 2", "aux 2"
 245         };
 246         int n;
 247 
 248         if (i->index >= 7)
 249                 return -EINVAL;
 250 
 251         strscpy(i->name, inputs[i->index], sizeof(i->name));
 252 
 253         if (i->index == 0)
 254                 i->type = V4L2_INPUT_TYPE_TUNER;
 255         else
 256                 i->type  = V4L2_INPUT_TYPE_CAMERA;
 257 
 258         for (n = 0; n < ARRAY_SIZE(saa7164_tvnorms); n++)
 259                 i->std |= saa7164_tvnorms[n].id;
 260 
 261         return 0;
 262 }
 263 
 264 int saa7164_g_input(struct saa7164_port *port, unsigned int *i)
 265 {
 266         struct saa7164_dev *dev = port->dev;
 267 
 268         if (saa7164_api_get_videomux(port) != SAA_OK)
 269                 return -EIO;
 270 
 271         *i = (port->mux_input - 1);
 272 
 273         dprintk(DBGLVL_ENC, "%s() input=%d\n", __func__, *i);
 274 
 275         return 0;
 276 }
 277 
 278 static int vidioc_g_input(struct file *file, void *priv, unsigned int *i)
 279 {
 280         struct saa7164_encoder_fh *fh = file->private_data;
 281 
 282         return saa7164_g_input(fh->port, i);
 283 }
 284 
 285 int saa7164_s_input(struct saa7164_port *port, unsigned int i)
 286 {
 287         struct saa7164_dev *dev = port->dev;
 288 
 289         dprintk(DBGLVL_ENC, "%s() input=%d\n", __func__, i);
 290 
 291         if (i >= 7)
 292                 return -EINVAL;
 293 
 294         port->mux_input = i + 1;
 295 
 296         if (saa7164_api_set_videomux(port) != SAA_OK)
 297                 return -EIO;
 298 
 299         return 0;
 300 }
 301 
 302 static int vidioc_s_input(struct file *file, void *priv, unsigned int i)
 303 {
 304         struct saa7164_encoder_fh *fh = file->private_data;
 305 
 306         return saa7164_s_input(fh->port, i);
 307 }
 308 
 309 int saa7164_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t)
 310 {
 311         struct saa7164_encoder_fh *fh = file->private_data;
 312         struct saa7164_port *port = fh->port;
 313         struct saa7164_dev *dev = port->dev;
 314 
 315         if (0 != t->index)
 316                 return -EINVAL;
 317 
 318         strscpy(t->name, "tuner", sizeof(t->name));
 319         t->capability = V4L2_TUNER_CAP_NORM | V4L2_TUNER_CAP_STEREO;
 320         t->rangelow = SAA7164_TV_MIN_FREQ;
 321         t->rangehigh = SAA7164_TV_MAX_FREQ;
 322 
 323         dprintk(DBGLVL_ENC, "VIDIOC_G_TUNER: tuner type %d\n", t->type);
 324 
 325         return 0;
 326 }
 327 
 328 int saa7164_s_tuner(struct file *file, void *priv,
 329                            const struct v4l2_tuner *t)
 330 {
 331         if (0 != t->index)
 332                 return -EINVAL;
 333 
 334         /* Update the A/V core */
 335         return 0;
 336 }
 337 
 338 int saa7164_g_frequency(struct saa7164_port *port, struct v4l2_frequency *f)
 339 {
 340         if (f->tuner)
 341                 return -EINVAL;
 342 
 343         f->frequency = port->freq;
 344         return 0;
 345 }
 346 
 347 static int vidioc_g_frequency(struct file *file, void *priv,
 348         struct v4l2_frequency *f)
 349 {
 350         struct saa7164_encoder_fh *fh = file->private_data;
 351 
 352         return saa7164_g_frequency(fh->port, f);
 353 }
 354 
 355 int saa7164_s_frequency(struct saa7164_port *port,
 356                         const struct v4l2_frequency *f)
 357 {
 358         struct saa7164_dev *dev = port->dev;
 359         struct saa7164_port *tsport;
 360         struct dvb_frontend *fe;
 361 
 362         /* TODO: Pull this for the std */
 363         struct analog_parameters params = {
 364                 .mode      = V4L2_TUNER_ANALOG_TV,
 365                 .audmode   = V4L2_TUNER_MODE_STEREO,
 366                 .std       = port->encodernorm.id,
 367                 .frequency = f->frequency
 368         };
 369 
 370         /* Stop the encoder */
 371         dprintk(DBGLVL_ENC, "%s() frequency=%d tuner=%d\n", __func__,
 372                 f->frequency, f->tuner);
 373 
 374         if (f->tuner != 0)
 375                 return -EINVAL;
 376 
 377         port->freq = clamp(f->frequency,
 378                            SAA7164_TV_MIN_FREQ, SAA7164_TV_MAX_FREQ);
 379 
 380         /* Update the hardware */
 381         if (port->nr == SAA7164_PORT_ENC1)
 382                 tsport = &dev->ports[SAA7164_PORT_TS1];
 383         else if (port->nr == SAA7164_PORT_ENC2)
 384                 tsport = &dev->ports[SAA7164_PORT_TS2];
 385         else
 386                 BUG();
 387 
 388         fe = tsport->dvb.frontend;
 389 
 390         if (fe && fe->ops.tuner_ops.set_analog_params)
 391                 fe->ops.tuner_ops.set_analog_params(fe, &params);
 392         else
 393                 printk(KERN_ERR "%s() No analog tuner, aborting\n", __func__);
 394 
 395         saa7164_encoder_initialize(port);
 396 
 397         return 0;
 398 }
 399 
 400 static int vidioc_s_frequency(struct file *file, void *priv,
 401                               const struct v4l2_frequency *f)
 402 {
 403         struct saa7164_encoder_fh *fh = file->private_data;
 404 
 405         return saa7164_s_frequency(fh->port, f);
 406 }
 407 
 408 static int saa7164_s_ctrl(struct v4l2_ctrl *ctrl)
 409 {
 410         struct saa7164_port *port =
 411                 container_of(ctrl->handler, struct saa7164_port, ctrl_handler);
 412         struct saa7164_encoder_params *params = &port->encoder_params;
 413         int ret = 0;
 414 
 415         switch (ctrl->id) {
 416         case V4L2_CID_BRIGHTNESS:
 417                 port->ctl_brightness = ctrl->val;
 418                 saa7164_api_set_usercontrol(port, PU_BRIGHTNESS_CONTROL);
 419                 break;
 420         case V4L2_CID_CONTRAST:
 421                 port->ctl_contrast = ctrl->val;
 422                 saa7164_api_set_usercontrol(port, PU_CONTRAST_CONTROL);
 423                 break;
 424         case V4L2_CID_SATURATION:
 425                 port->ctl_saturation = ctrl->val;
 426                 saa7164_api_set_usercontrol(port, PU_SATURATION_CONTROL);
 427                 break;
 428         case V4L2_CID_HUE:
 429                 port->ctl_hue = ctrl->val;
 430                 saa7164_api_set_usercontrol(port, PU_HUE_CONTROL);
 431                 break;
 432         case V4L2_CID_SHARPNESS:
 433                 port->ctl_sharpness = ctrl->val;
 434                 saa7164_api_set_usercontrol(port, PU_SHARPNESS_CONTROL);
 435                 break;
 436         case V4L2_CID_AUDIO_VOLUME:
 437                 port->ctl_volume = ctrl->val;
 438                 saa7164_api_set_audio_volume(port, port->ctl_volume);
 439                 break;
 440         case V4L2_CID_MPEG_VIDEO_BITRATE:
 441                 params->bitrate = ctrl->val;
 442                 break;
 443         case V4L2_CID_MPEG_STREAM_TYPE:
 444                 params->stream_type = ctrl->val;
 445                 break;
 446         case V4L2_CID_MPEG_AUDIO_MUTE:
 447                 params->ctl_mute = ctrl->val;
 448                 ret = saa7164_api_audio_mute(port, params->ctl_mute);
 449                 if (ret != SAA_OK) {
 450                         printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__,
 451                                 ret);
 452                         ret = -EIO;
 453                 }
 454                 break;
 455         case V4L2_CID_MPEG_VIDEO_ASPECT:
 456                 params->ctl_aspect = ctrl->val;
 457                 ret = saa7164_api_set_aspect_ratio(port);
 458                 if (ret != SAA_OK) {
 459                         printk(KERN_ERR "%s() error, ret = 0x%x\n", __func__,
 460                                 ret);
 461                         ret = -EIO;
 462                 }
 463                 break;
 464         case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
 465                 params->bitrate_mode = ctrl->val;
 466                 break;
 467         case V4L2_CID_MPEG_VIDEO_B_FRAMES:
 468                 params->refdist = ctrl->val;
 469                 break;
 470         case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
 471                 params->bitrate_peak = ctrl->val;
 472                 break;
 473         case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
 474                 params->gop_size = ctrl->val;
 475                 break;
 476         default:
 477                 ret = -EINVAL;
 478         }
 479 
 480         return ret;
 481 }
 482 
 483 static int vidioc_querycap(struct file *file, void  *priv,
 484         struct v4l2_capability *cap)
 485 {
 486         struct saa7164_encoder_fh *fh = file->private_data;
 487         struct saa7164_port *port = fh->port;
 488         struct saa7164_dev *dev = port->dev;
 489 
 490         strscpy(cap->driver, dev->name, sizeof(cap->driver));
 491         strscpy(cap->card, saa7164_boards[dev->board].name,
 492                 sizeof(cap->card));
 493         sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
 494         cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
 495                             V4L2_CAP_TUNER | V4L2_CAP_VBI_CAPTURE |
 496                             V4L2_CAP_DEVICE_CAPS;
 497         return 0;
 498 }
 499 
 500 static int vidioc_enum_fmt_vid_cap(struct file *file, void  *priv,
 501         struct v4l2_fmtdesc *f)
 502 {
 503         if (f->index != 0)
 504                 return -EINVAL;
 505 
 506         f->pixelformat = V4L2_PIX_FMT_MPEG;
 507 
 508         return 0;
 509 }
 510 
 511 static int vidioc_fmt_vid_cap(struct file *file, void *priv,
 512                                 struct v4l2_format *f)
 513 {
 514         struct saa7164_encoder_fh *fh = file->private_data;
 515         struct saa7164_port *port = fh->port;
 516 
 517         f->fmt.pix.pixelformat  = V4L2_PIX_FMT_MPEG;
 518         f->fmt.pix.bytesperline = 0;
 519         f->fmt.pix.sizeimage    = SAA7164_SIZEIMAGE;
 520         f->fmt.pix.field        = V4L2_FIELD_INTERLACED;
 521         f->fmt.pix.colorspace   = V4L2_COLORSPACE_SMPTE170M;
 522         f->fmt.pix.width        = port->width;
 523         f->fmt.pix.height       = port->height;
 524         return 0;
 525 }
 526 
 527 static int saa7164_encoder_stop_port(struct saa7164_port *port)
 528 {
 529         struct saa7164_dev *dev = port->dev;
 530         int ret;
 531 
 532         ret = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
 533         if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
 534                 printk(KERN_ERR "%s() stop transition failed, ret = 0x%x\n",
 535                         __func__, ret);
 536                 ret = -EIO;
 537         } else {
 538                 dprintk(DBGLVL_ENC, "%s()    Stopped\n", __func__);
 539                 ret = 0;
 540         }
 541 
 542         return ret;
 543 }
 544 
 545 static int saa7164_encoder_acquire_port(struct saa7164_port *port)
 546 {
 547         struct saa7164_dev *dev = port->dev;
 548         int ret;
 549 
 550         ret = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
 551         if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
 552                 printk(KERN_ERR "%s() acquire transition failed, ret = 0x%x\n",
 553                         __func__, ret);
 554                 ret = -EIO;
 555         } else {
 556                 dprintk(DBGLVL_ENC, "%s() Acquired\n", __func__);
 557                 ret = 0;
 558         }
 559 
 560         return ret;
 561 }
 562 
 563 static int saa7164_encoder_pause_port(struct saa7164_port *port)
 564 {
 565         struct saa7164_dev *dev = port->dev;
 566         int ret;
 567 
 568         ret = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
 569         if ((ret != SAA_OK) && (ret != SAA_ERR_ALREADY_STOPPED)) {
 570                 printk(KERN_ERR "%s() pause transition failed, ret = 0x%x\n",
 571                         __func__, ret);
 572                 ret = -EIO;
 573         } else {
 574                 dprintk(DBGLVL_ENC, "%s()   Paused\n", __func__);
 575                 ret = 0;
 576         }
 577 
 578         return ret;
 579 }
 580 
 581 /* Firmware is very windows centric, meaning you have to transition
 582  * the part through AVStream / KS Windows stages, forwards or backwards.
 583  * States are: stopped, acquired (h/w), paused, started.
 584  * We have to leave here will all of the soft buffers on the free list,
 585  * else the cfg_post() func won't have soft buffers to correctly configure.
 586  */
 587 static int saa7164_encoder_stop_streaming(struct saa7164_port *port)
 588 {
 589         struct saa7164_dev *dev = port->dev;
 590         struct saa7164_buffer *buf;
 591         struct saa7164_user_buffer *ubuf;
 592         struct list_head *c, *n;
 593         int ret;
 594 
 595         dprintk(DBGLVL_ENC, "%s(port=%d)\n", __func__, port->nr);
 596 
 597         ret = saa7164_encoder_pause_port(port);
 598         ret = saa7164_encoder_acquire_port(port);
 599         ret = saa7164_encoder_stop_port(port);
 600 
 601         dprintk(DBGLVL_ENC, "%s(port=%d) Hardware stopped\n", __func__,
 602                 port->nr);
 603 
 604         /* Reset the state of any allocated buffer resources */
 605         mutex_lock(&port->dmaqueue_lock);
 606 
 607         /* Reset the hard and soft buffer state */
 608         list_for_each_safe(c, n, &port->dmaqueue.list) {
 609                 buf = list_entry(c, struct saa7164_buffer, list);
 610                 buf->flags = SAA7164_BUFFER_FREE;
 611                 buf->pos = 0;
 612         }
 613 
 614         list_for_each_safe(c, n, &port->list_buf_used.list) {
 615                 ubuf = list_entry(c, struct saa7164_user_buffer, list);
 616                 ubuf->pos = 0;
 617                 list_move_tail(&ubuf->list, &port->list_buf_free.list);
 618         }
 619 
 620         mutex_unlock(&port->dmaqueue_lock);
 621 
 622         /* Free any allocated resources */
 623         saa7164_encoder_buffers_dealloc(port);
 624 
 625         dprintk(DBGLVL_ENC, "%s(port=%d) Released\n", __func__, port->nr);
 626 
 627         return ret;
 628 }
 629 
 630 static int saa7164_encoder_start_streaming(struct saa7164_port *port)
 631 {
 632         struct saa7164_dev *dev = port->dev;
 633         int result, ret = 0;
 634 
 635         dprintk(DBGLVL_ENC, "%s(port=%d)\n", __func__, port->nr);
 636 
 637         port->done_first_interrupt = 0;
 638 
 639         /* allocate all of the PCIe DMA buffer resources on the fly,
 640          * allowing switching between TS and PS payloads without
 641          * requiring a complete driver reload.
 642          */
 643         saa7164_encoder_buffers_alloc(port);
 644 
 645         /* Configure the encoder with any cache values */
 646         saa7164_api_set_encoder(port);
 647         saa7164_api_get_encoder(port);
 648 
 649         /* Place the empty buffers on the hardware */
 650         saa7164_buffer_cfg_port(port);
 651 
 652         /* Acquire the hardware */
 653         result = saa7164_api_transition_port(port, SAA_DMASTATE_ACQUIRE);
 654         if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
 655                 printk(KERN_ERR "%s() acquire transition failed, res = 0x%x\n",
 656                         __func__, result);
 657 
 658                 /* Stop the hardware, regardless */
 659                 result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
 660                 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
 661                         printk(KERN_ERR "%s() acquire/forced stop transition failed, res = 0x%x\n",
 662                                __func__, result);
 663                 }
 664                 ret = -EIO;
 665                 goto out;
 666         } else
 667                 dprintk(DBGLVL_ENC, "%s()   Acquired\n", __func__);
 668 
 669         /* Pause the hardware */
 670         result = saa7164_api_transition_port(port, SAA_DMASTATE_PAUSE);
 671         if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
 672                 printk(KERN_ERR "%s() pause transition failed, res = 0x%x\n",
 673                                 __func__, result);
 674 
 675                 /* Stop the hardware, regardless */
 676                 result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
 677                 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
 678                         printk(KERN_ERR "%s() pause/forced stop transition failed, res = 0x%x\n",
 679                                __func__, result);
 680                 }
 681 
 682                 ret = -EIO;
 683                 goto out;
 684         } else
 685                 dprintk(DBGLVL_ENC, "%s()   Paused\n", __func__);
 686 
 687         /* Start the hardware */
 688         result = saa7164_api_transition_port(port, SAA_DMASTATE_RUN);
 689         if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
 690                 printk(KERN_ERR "%s() run transition failed, result = 0x%x\n",
 691                                 __func__, result);
 692 
 693                 /* Stop the hardware, regardless */
 694                 result = saa7164_api_transition_port(port, SAA_DMASTATE_STOP);
 695                 if ((result != SAA_OK) && (result != SAA_ERR_ALREADY_STOPPED)) {
 696                         printk(KERN_ERR "%s() run/forced stop transition failed, res = 0x%x\n",
 697                                __func__, result);
 698                 }
 699 
 700                 ret = -EIO;
 701         } else
 702                 dprintk(DBGLVL_ENC, "%s()   Running\n", __func__);
 703 
 704 out:
 705         return ret;
 706 }
 707 
 708 static int fops_open(struct file *file)
 709 {
 710         struct saa7164_dev *dev;
 711         struct saa7164_port *port;
 712         struct saa7164_encoder_fh *fh;
 713 
 714         port = (struct saa7164_port *)video_get_drvdata(video_devdata(file));
 715         if (!port)
 716                 return -ENODEV;
 717 
 718         dev = port->dev;
 719 
 720         dprintk(DBGLVL_ENC, "%s()\n", __func__);
 721 
 722         /* allocate + initialize per filehandle data */
 723         fh = kzalloc(sizeof(*fh), GFP_KERNEL);
 724         if (NULL == fh)
 725                 return -ENOMEM;
 726 
 727         fh->port = port;
 728         v4l2_fh_init(&fh->fh, video_devdata(file));
 729         v4l2_fh_add(&fh->fh);
 730         file->private_data = fh;
 731 
 732         return 0;
 733 }
 734 
 735 static int fops_release(struct file *file)
 736 {
 737         struct saa7164_encoder_fh *fh = file->private_data;
 738         struct saa7164_port *port = fh->port;
 739         struct saa7164_dev *dev = port->dev;
 740 
 741         dprintk(DBGLVL_ENC, "%s()\n", __func__);
 742 
 743         /* Shut device down on last close */
 744         if (atomic_cmpxchg(&fh->v4l_reading, 1, 0) == 1) {
 745                 if (atomic_dec_return(&port->v4l_reader_count) == 0) {
 746                         /* stop mpeg capture then cancel buffers */
 747                         saa7164_encoder_stop_streaming(port);
 748                 }
 749         }
 750 
 751         v4l2_fh_del(&fh->fh);
 752         v4l2_fh_exit(&fh->fh);
 753         kfree(fh);
 754 
 755         return 0;
 756 }
 757 
 758 static struct
 759 saa7164_user_buffer *saa7164_enc_next_buf(struct saa7164_port *port)
 760 {
 761         struct saa7164_user_buffer *ubuf = NULL;
 762         struct saa7164_dev *dev = port->dev;
 763         u32 crc;
 764 
 765         mutex_lock(&port->dmaqueue_lock);
 766         if (!list_empty(&port->list_buf_used.list)) {
 767                 ubuf = list_first_entry(&port->list_buf_used.list,
 768                         struct saa7164_user_buffer, list);
 769 
 770                 if (crc_checking) {
 771                         crc = crc32(0, ubuf->data, ubuf->actual_size);
 772                         if (crc != ubuf->crc) {
 773                                 printk(KERN_ERR
 774                 "%s() ubuf %p crc became invalid, was 0x%x became 0x%x\n",
 775                                         __func__,
 776                                         ubuf, ubuf->crc, crc);
 777                         }
 778                 }
 779 
 780         }
 781         mutex_unlock(&port->dmaqueue_lock);
 782 
 783         dprintk(DBGLVL_ENC, "%s() returns %p\n", __func__, ubuf);
 784 
 785         return ubuf;
 786 }
 787 
 788 static ssize_t fops_read(struct file *file, char __user *buffer,
 789         size_t count, loff_t *pos)
 790 {
 791         struct saa7164_encoder_fh *fh = file->private_data;
 792         struct saa7164_port *port = fh->port;
 793         struct saa7164_user_buffer *ubuf = NULL;
 794         struct saa7164_dev *dev = port->dev;
 795         int ret = 0;
 796         int rem, cnt;
 797         u8 *p;
 798 
 799         port->last_read_msecs_diff = port->last_read_msecs;
 800         port->last_read_msecs = jiffies_to_msecs(jiffies);
 801         port->last_read_msecs_diff = port->last_read_msecs -
 802                 port->last_read_msecs_diff;
 803 
 804         saa7164_histogram_update(&port->read_interval,
 805                 port->last_read_msecs_diff);
 806 
 807         if (*pos) {
 808                 printk(KERN_ERR "%s() ESPIPE\n", __func__);
 809                 return -ESPIPE;
 810         }
 811 
 812         if (atomic_cmpxchg(&fh->v4l_reading, 0, 1) == 0) {
 813                 if (atomic_inc_return(&port->v4l_reader_count) == 1) {
 814 
 815                         if (saa7164_encoder_initialize(port) < 0) {
 816                                 printk(KERN_ERR "%s() EINVAL\n", __func__);
 817                                 return -EINVAL;
 818                         }
 819 
 820                         saa7164_encoder_start_streaming(port);
 821                         msleep(200);
 822                 }
 823         }
 824 
 825         /* blocking wait for buffer */
 826         if ((file->f_flags & O_NONBLOCK) == 0) {
 827                 if (wait_event_interruptible(port->wait_read,
 828                         saa7164_enc_next_buf(port))) {
 829                                 printk(KERN_ERR "%s() ERESTARTSYS\n", __func__);
 830                                 return -ERESTARTSYS;
 831                 }
 832         }
 833 
 834         /* Pull the first buffer from the used list */
 835         ubuf = saa7164_enc_next_buf(port);
 836 
 837         while ((count > 0) && ubuf) {
 838 
 839                 /* set remaining bytes to copy */
 840                 rem = ubuf->actual_size - ubuf->pos;
 841                 cnt = rem > count ? count : rem;
 842 
 843                 p = ubuf->data + ubuf->pos;
 844 
 845                 dprintk(DBGLVL_ENC,
 846                         "%s() count=%d cnt=%d rem=%d buf=%p buf->pos=%d\n",
 847                         __func__, (int)count, cnt, rem, ubuf, ubuf->pos);
 848 
 849                 if (copy_to_user(buffer, p, cnt)) {
 850                         printk(KERN_ERR "%s() copy_to_user failed\n", __func__);
 851                         if (!ret) {
 852                                 printk(KERN_ERR "%s() EFAULT\n", __func__);
 853                                 ret = -EFAULT;
 854                         }
 855                         goto err;
 856                 }
 857 
 858                 ubuf->pos += cnt;
 859                 count -= cnt;
 860                 buffer += cnt;
 861                 ret += cnt;
 862 
 863                 if (ubuf->pos > ubuf->actual_size)
 864                         printk(KERN_ERR "read() pos > actual, huh?\n");
 865 
 866                 if (ubuf->pos == ubuf->actual_size) {
 867 
 868                         /* finished with current buffer, take next buffer */
 869 
 870                         /* Requeue the buffer on the free list */
 871                         ubuf->pos = 0;
 872 
 873                         mutex_lock(&port->dmaqueue_lock);
 874                         list_move_tail(&ubuf->list, &port->list_buf_free.list);
 875                         mutex_unlock(&port->dmaqueue_lock);
 876 
 877                         /* Dequeue next */
 878                         if ((file->f_flags & O_NONBLOCK) == 0) {
 879                                 if (wait_event_interruptible(port->wait_read,
 880                                         saa7164_enc_next_buf(port))) {
 881                                                 break;
 882                                 }
 883                         }
 884                         ubuf = saa7164_enc_next_buf(port);
 885                 }
 886         }
 887 err:
 888         if (!ret && !ubuf)
 889                 ret = -EAGAIN;
 890 
 891         return ret;
 892 }
 893 
 894 static __poll_t fops_poll(struct file *file, poll_table *wait)
 895 {
 896         __poll_t req_events = poll_requested_events(wait);
 897         struct saa7164_encoder_fh *fh =
 898                 (struct saa7164_encoder_fh *)file->private_data;
 899         struct saa7164_port *port = fh->port;
 900         __poll_t mask = v4l2_ctrl_poll(file, wait);
 901 
 902         port->last_poll_msecs_diff = port->last_poll_msecs;
 903         port->last_poll_msecs = jiffies_to_msecs(jiffies);
 904         port->last_poll_msecs_diff = port->last_poll_msecs -
 905                 port->last_poll_msecs_diff;
 906 
 907         saa7164_histogram_update(&port->poll_interval,
 908                 port->last_poll_msecs_diff);
 909 
 910         if (!(req_events & (EPOLLIN | EPOLLRDNORM)))
 911                 return mask;
 912 
 913         if (atomic_cmpxchg(&fh->v4l_reading, 0, 1) == 0) {
 914                 if (atomic_inc_return(&port->v4l_reader_count) == 1) {
 915                         if (saa7164_encoder_initialize(port) < 0)
 916                                 return mask | EPOLLERR;
 917                         saa7164_encoder_start_streaming(port);
 918                         msleep(200);
 919                 }
 920         }
 921 
 922         /* Pull the first buffer from the used list */
 923         if (!list_empty(&port->list_buf_used.list))
 924                 mask |= EPOLLIN | EPOLLRDNORM;
 925 
 926         return mask;
 927 }
 928 
 929 static const struct v4l2_ctrl_ops saa7164_ctrl_ops = {
 930         .s_ctrl = saa7164_s_ctrl,
 931 };
 932 
 933 static const struct v4l2_file_operations mpeg_fops = {
 934         .owner          = THIS_MODULE,
 935         .open           = fops_open,
 936         .release        = fops_release,
 937         .read           = fops_read,
 938         .poll           = fops_poll,
 939         .unlocked_ioctl = video_ioctl2,
 940 };
 941 
 942 static const struct v4l2_ioctl_ops mpeg_ioctl_ops = {
 943         .vidioc_s_std            = vidioc_s_std,
 944         .vidioc_g_std            = vidioc_g_std,
 945         .vidioc_enum_input       = saa7164_enum_input,
 946         .vidioc_g_input          = vidioc_g_input,
 947         .vidioc_s_input          = vidioc_s_input,
 948         .vidioc_g_tuner          = saa7164_g_tuner,
 949         .vidioc_s_tuner          = saa7164_s_tuner,
 950         .vidioc_g_frequency      = vidioc_g_frequency,
 951         .vidioc_s_frequency      = vidioc_s_frequency,
 952         .vidioc_querycap         = vidioc_querycap,
 953         .vidioc_enum_fmt_vid_cap = vidioc_enum_fmt_vid_cap,
 954         .vidioc_g_fmt_vid_cap    = vidioc_fmt_vid_cap,
 955         .vidioc_try_fmt_vid_cap  = vidioc_fmt_vid_cap,
 956         .vidioc_s_fmt_vid_cap    = vidioc_fmt_vid_cap,
 957         .vidioc_log_status       = v4l2_ctrl_log_status,
 958         .vidioc_subscribe_event  = v4l2_ctrl_subscribe_event,
 959         .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
 960 };
 961 
 962 static struct video_device saa7164_mpeg_template = {
 963         .name          = "saa7164",
 964         .fops          = &mpeg_fops,
 965         .ioctl_ops     = &mpeg_ioctl_ops,
 966         .minor         = -1,
 967         .tvnorms       = SAA7164_NORMS,
 968         .device_caps   = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_READWRITE |
 969                          V4L2_CAP_TUNER,
 970 };
 971 
 972 static struct video_device *saa7164_encoder_alloc(
 973         struct saa7164_port *port,
 974         struct pci_dev *pci,
 975         struct video_device *template,
 976         char *type)
 977 {
 978         struct video_device *vfd;
 979         struct saa7164_dev *dev = port->dev;
 980 
 981         dprintk(DBGLVL_ENC, "%s()\n", __func__);
 982 
 983         vfd = video_device_alloc();
 984         if (NULL == vfd)
 985                 return NULL;
 986 
 987         *vfd = *template;
 988         snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", dev->name,
 989                 type, saa7164_boards[dev->board].name);
 990 
 991         vfd->v4l2_dev  = &dev->v4l2_dev;
 992         vfd->release = video_device_release;
 993         return vfd;
 994 }
 995 
 996 int saa7164_encoder_register(struct saa7164_port *port)
 997 {
 998         struct saa7164_dev *dev = port->dev;
 999         struct v4l2_ctrl_handler *hdl = &port->ctrl_handler;
1000         int result = -ENODEV;
1001 
1002         dprintk(DBGLVL_ENC, "%s()\n", __func__);
1003 
1004         BUG_ON(port->type != SAA7164_MPEG_ENCODER);
1005 
1006         /* Sanity check that the PCI configuration space is active */
1007         if (port->hwcfg.BARLocation == 0) {
1008                 printk(KERN_ERR "%s() failed (errno = %d), NO PCI configuration\n",
1009                         __func__, result);
1010                 result = -ENOMEM;
1011                 goto failed;
1012         }
1013 
1014         /* Establish encoder defaults here */
1015         /* Set default TV standard */
1016         port->encodernorm = saa7164_tvnorms[0];
1017         port->width = 720;
1018         port->mux_input = 1; /* Composite */
1019         port->video_format = EU_VIDEO_FORMAT_MPEG_2;
1020         port->audio_format = 0;
1021         port->video_resolution = 0;
1022         port->freq = SAA7164_TV_MIN_FREQ;
1023 
1024         v4l2_ctrl_handler_init(hdl, 14);
1025         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1026                           V4L2_CID_BRIGHTNESS, 0, 255, 1, 127);
1027         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1028                           V4L2_CID_CONTRAST, 0, 255, 1, 66);
1029         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1030                           V4L2_CID_SATURATION, 0, 255, 1, 62);
1031         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1032                           V4L2_CID_HUE, 0, 255, 1, 128);
1033         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1034                           V4L2_CID_SHARPNESS, 0x0, 0x0f, 1, 8);
1035         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1036                           V4L2_CID_MPEG_AUDIO_MUTE, 0x0, 0x01, 1, 0);
1037         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1038                           V4L2_CID_AUDIO_VOLUME, -83, 24, 1, 20);
1039         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1040                           V4L2_CID_MPEG_VIDEO_BITRATE,
1041                           ENCODER_MIN_BITRATE, ENCODER_MAX_BITRATE,
1042                           100000, ENCODER_DEF_BITRATE);
1043         v4l2_ctrl_new_std_menu(hdl, &saa7164_ctrl_ops,
1044                                V4L2_CID_MPEG_STREAM_TYPE,
1045                                V4L2_MPEG_STREAM_TYPE_MPEG2_TS, 0,
1046                                V4L2_MPEG_STREAM_TYPE_MPEG2_PS);
1047         v4l2_ctrl_new_std_menu(hdl, &saa7164_ctrl_ops,
1048                                V4L2_CID_MPEG_VIDEO_ASPECT,
1049                                V4L2_MPEG_VIDEO_ASPECT_221x100, 0,
1050                                V4L2_MPEG_VIDEO_ASPECT_4x3);
1051         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1052                           V4L2_CID_MPEG_VIDEO_GOP_SIZE, 1, 255, 1, 15);
1053         v4l2_ctrl_new_std_menu(hdl, &saa7164_ctrl_ops,
1054                                V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
1055                                V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 0,
1056                                V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
1057         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1058                           V4L2_CID_MPEG_VIDEO_B_FRAMES, 1, 3, 1, 1);
1059         v4l2_ctrl_new_std(hdl, &saa7164_ctrl_ops,
1060                           V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
1061                           ENCODER_MIN_BITRATE, ENCODER_MAX_BITRATE,
1062                           100000, ENCODER_DEF_BITRATE);
1063         if (hdl->error) {
1064                 result = hdl->error;
1065                 goto failed;
1066         }
1067 
1068         port->std = V4L2_STD_NTSC_M;
1069 
1070         if (port->encodernorm.id & V4L2_STD_525_60)
1071                 port->height = 480;
1072         else
1073                 port->height = 576;
1074 
1075         /* Allocate and register the video device node */
1076         port->v4l_device = saa7164_encoder_alloc(port,
1077                 dev->pci, &saa7164_mpeg_template, "mpeg");
1078 
1079         if (!port->v4l_device) {
1080                 printk(KERN_INFO "%s: can't allocate mpeg device\n",
1081                         dev->name);
1082                 result = -ENOMEM;
1083                 goto failed;
1084         }
1085 
1086         port->v4l_device->ctrl_handler = hdl;
1087         v4l2_ctrl_handler_setup(hdl);
1088         video_set_drvdata(port->v4l_device, port);
1089         result = video_register_device(port->v4l_device,
1090                 VFL_TYPE_GRABBER, -1);
1091         if (result < 0) {
1092                 printk(KERN_INFO "%s: can't register mpeg device\n",
1093                         dev->name);
1094                 /* TODO: We're going to leak here if we don't dealloc
1095                  The buffers above. The unreg function can't deal wit it.
1096                 */
1097                 goto failed;
1098         }
1099 
1100         printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
1101                 dev->name, port->v4l_device->num);
1102 
1103         /* Configure the hardware defaults */
1104         saa7164_api_set_videomux(port);
1105         saa7164_api_set_usercontrol(port, PU_BRIGHTNESS_CONTROL);
1106         saa7164_api_set_usercontrol(port, PU_CONTRAST_CONTROL);
1107         saa7164_api_set_usercontrol(port, PU_HUE_CONTROL);
1108         saa7164_api_set_usercontrol(port, PU_SATURATION_CONTROL);
1109         saa7164_api_set_usercontrol(port, PU_SHARPNESS_CONTROL);
1110         saa7164_api_audio_mute(port, 0);
1111         saa7164_api_set_audio_volume(port, 20);
1112         saa7164_api_set_aspect_ratio(port);
1113 
1114         /* Disable audio standard detection, it's buggy */
1115         saa7164_api_set_audio_detection(port, 0);
1116 
1117         saa7164_api_set_encoder(port);
1118         saa7164_api_get_encoder(port);
1119 
1120         result = 0;
1121 failed:
1122         return result;
1123 }
1124 
1125 void saa7164_encoder_unregister(struct saa7164_port *port)
1126 {
1127         struct saa7164_dev *dev = port->dev;
1128 
1129         dprintk(DBGLVL_ENC, "%s(port=%d)\n", __func__, port->nr);
1130 
1131         BUG_ON(port->type != SAA7164_MPEG_ENCODER);
1132 
1133         if (port->v4l_device) {
1134                 if (port->v4l_device->minor != -1)
1135                         video_unregister_device(port->v4l_device);
1136                 else
1137                         video_device_release(port->v4l_device);
1138 
1139                 port->v4l_device = NULL;
1140         }
1141         v4l2_ctrl_handler_free(&port->ctrl_handler);
1142 
1143         dprintk(DBGLVL_ENC, "%s(port=%d) done\n", __func__, port->nr);
1144 }
1145 

/* [<][>][^][v][top][bottom][index][help] */