1 #include <media/saa7146_vv.h>
 
   3 static int vbi_pixel_to_capture = 720 * 2;
 
   5 static int vbi_workaround(struct saa7146_dev *dev)
 
   7         struct saa7146_vv *vv = dev->vv_data;
 
  15         DECLARE_WAITQUEUE(wait, current);
 
  17         DEB_VBI(("dev:%p\n",dev));
 
  19         /* once again, a bug in the saa7146: the brs acquisition
 
  20            is buggy and especially the BXO-counter does not work
 
  21            as specified. there is this workaround, but please
 
  22            don't let me explain it. ;-) */
 
  24         cpu = pci_alloc_consistent(dev->pci, 4096, &dma_addr);
 
  28         /* setup some basic programming, just for the workaround */
 
  29         saa7146_write(dev, BASE_EVEN3,  dma_addr);
 
  30         saa7146_write(dev, BASE_ODD3,   dma_addr+vbi_pixel_to_capture);
 
  31         saa7146_write(dev, PROT_ADDR3,  dma_addr+4096);
 
  32         saa7146_write(dev, PITCH3,      vbi_pixel_to_capture);
 
  33         saa7146_write(dev, BASE_PAGE3,  0x0);
 
  34         saa7146_write(dev, NUM_LINE_BYTE3, (2<<16)|((vbi_pixel_to_capture)<<0));
 
  35         saa7146_write(dev, MC2, MASK_04|MASK_20);
 
  37         /* load brs-control register */
 
  38         WRITE_RPS1(CMD_WR_REG | (1 << 8) | (BRS_CTRL/4));
 
  39         /* BXO = 1h, BRS to outbound */
 
  40         WRITE_RPS1(0xc000008c);
 
  41         /* wait for vbi_a or vbi_b*/
 
  42         if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
 
  43                 DEB_D(("...using port b\n"));
 
  44                 WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_E_FID_B);
 
  45                 WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | CMD_O_FID_B);
 
  47                 WRITE_RPS1(CMD_PAUSE | MASK_09);
 
  50                 DEB_D(("...using port a\n"));
 
  51                 WRITE_RPS1(CMD_PAUSE | MASK_10);
 
  54         WRITE_RPS1(CMD_UPLOAD | MASK_08);
 
  55         /* load brs-control register */
 
  56         WRITE_RPS1(CMD_WR_REG | (1 << 8) | (BRS_CTRL/4));
 
  57         /* BYO = 1, BXO = NQBIL (=1728 for PAL, for NTSC this is 858*2) - NumByte3 (=1440) = 288 */
 
  58         WRITE_RPS1(((1728-(vbi_pixel_to_capture)) << 7) | MASK_19);
 
  59         /* wait for brs_done */
 
  60         WRITE_RPS1(CMD_PAUSE | MASK_08);
 
  62         WRITE_RPS1(CMD_UPLOAD | MASK_08);
 
  63         /* load video-dma3 NumLines3 and NumBytes3 */
 
  64         WRITE_RPS1(CMD_WR_REG | (1 << 8) | (NUM_LINE_BYTE3/4));
 
  65         /* dev->vbi_count*2 lines, 720 pixel (= 1440 Bytes) */
 
  66         WRITE_RPS1((2 << 16) | (vbi_pixel_to_capture));
 
  67         /* load brs-control register */
 
  68         WRITE_RPS1(CMD_WR_REG | (1 << 8) | (BRS_CTRL/4));
 
  69         /* Set BRS right: note: this is an experimental value for BXO (=> PAL!) */
 
  70         WRITE_RPS1((540 << 7) | (5 << 19));  // 5 == vbi_start
 
  71         /* wait for brs_done */
 
  72         WRITE_RPS1(CMD_PAUSE | MASK_08);
 
  73         /* upload brs and video-dma3*/
 
  74         WRITE_RPS1(CMD_UPLOAD | MASK_08 | MASK_04);
 
  75         /* load mc2 register: enable dma3 */
 
  76         WRITE_RPS1(CMD_WR_REG | (1 << 8) | (MC1/4));
 
  77         WRITE_RPS1(MASK_20 | MASK_04);
 
  78         /* generate interrupt */
 
  79         WRITE_RPS1(CMD_INTERRUPT);
 
  83         /* we have to do the workaround twice to be sure that
 
  85         for(i = 0; i < 2; i++) {
 
  87                 /* indicate to the irq handler that we do the workaround */
 
  88                 saa7146_write(dev, MC2, MASK_31|MASK_15);
 
  90                 saa7146_write(dev, NUM_LINE_BYTE3, (1<<16)|(2<<0));
 
  91                 saa7146_write(dev, MC2, MASK_04|MASK_20);
 
  93                 /* enable rps1 irqs */
 
  94                 SAA7146_IER_ENABLE(dev,MASK_28);
 
  96                 /* prepare to wait to be woken up by the irq-handler */
 
  97                 add_wait_queue(&vv->vbi_wq, &wait);
 
  98                 current->state = TASK_INTERRUPTIBLE;
 
 100                 /* start rps1 to enable workaround */
 
 101                 saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
 
 102                 saa7146_write(dev, MC1, (MASK_13 | MASK_29));
 
 106                 DEB_VBI(("brs bug workaround %d/1.\n",i));
 
 108                 remove_wait_queue(&vv->vbi_wq, &wait);
 
 109                 current->state = TASK_RUNNING;
 
 111                 /* disable rps1 irqs */
 
 112                 SAA7146_IER_DISABLE(dev,MASK_28);
 
 114                 /* stop video-dma3 */
 
 115                 saa7146_write(dev, MC1, MASK_20);
 
 117                 if(signal_pending(current)) {
 
 119                         DEB_VBI(("aborted (rps:0x%08x).\n",saa7146_read(dev,RPS_ADDR1)));
 
 121                         /* stop rps1 for sure */
 
 122                         saa7146_write(dev, MC1, MASK_29);
 
 124                         pci_free_consistent(dev->pci, 4096, cpu, dma_addr);
 
 129         pci_free_consistent(dev->pci, 4096, cpu, dma_addr);
 
 133 static void saa7146_set_vbi_capture(struct saa7146_dev *dev, struct saa7146_buf *buf, struct saa7146_buf *next)
 
 135         struct saa7146_vv *vv = dev->vv_data;
 
 137         struct saa7146_video_dma vdma3;
 
 140         unsigned long e_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_E_FID_A : CMD_E_FID_B;
 
 141         unsigned long o_wait = vv->current_hps_sync == SAA7146_HPS_SYNC_PORT_A ? CMD_O_FID_A : CMD_O_FID_B;
 
 144         vdma3.base_even = 0xc8000000+2560*70;
 
 145         vdma3.base_odd  = 0xc8000000;
 
 146         vdma3.prot_addr = 0xc8000000+2560*164;
 
 149         vdma3.num_line_byte = (64<<16)|((vbi_pixel_to_capture)<<0); // set above!
 
 151         vdma3.base_even = buf->pt[2].offset;
 
 152         vdma3.base_odd  = buf->pt[2].offset + 16 * vbi_pixel_to_capture;
 
 153         vdma3.prot_addr = buf->pt[2].offset + 16 * 2 * vbi_pixel_to_capture;
 
 154         vdma3.pitch     = vbi_pixel_to_capture;
 
 155         vdma3.base_page = buf->pt[2].dma | ME1;
 
 156         vdma3.num_line_byte = (16 << 16) | vbi_pixel_to_capture;
 
 158         saa7146_write_out_dma(dev, 3, &vdma3);
 
 160         /* write beginning of rps-program */
 
 163         /* wait for o_fid_a/b / e_fid_a/b toggle only if bit 1 is not set */
 
 165         /* we don't wait here for the first field anymore. this is different from the video
 
 166            capture and might cause that the first buffer is only half filled (with only
 
 167            one field). but since this is some sort of streaming data, this is not that negative.
 
 168            but by doing this, we can use the whole engine from video-buf.c... */
 
 171         WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | e_wait);
 
 172         WRITE_RPS1(CMD_PAUSE | CMD_OAN | CMD_SIG1 | o_wait);
 
 175         WRITE_RPS1(CMD_WR_REG | (1 << 8) | (MC2/4));
 
 176         WRITE_RPS1(MASK_28 | MASK_12);
 
 178         /* turn on video-dma3 */
 
 179         WRITE_RPS1(CMD_WR_REG_MASK | (MC1/4));
 
 180         WRITE_RPS1(MASK_04 | MASK_20);                  /* => mask */
 
 181         WRITE_RPS1(MASK_04 | MASK_20);                  /* => values */
 
 183         /* wait for o_fid_a/b / e_fid_a/b toggle */
 
 184         WRITE_RPS1(CMD_PAUSE | o_wait);
 
 185         WRITE_RPS1(CMD_PAUSE | e_wait);
 
 187         /* generate interrupt */
 
 188         WRITE_RPS1(CMD_INTERRUPT);
 
 191         WRITE_RPS1(CMD_STOP);
 
 193         /* enable rps1 irqs */
 
 194         SAA7146_IER_ENABLE(dev, MASK_28);
 
 196         /* write the address of the rps-program */
 
 197         saa7146_write(dev, RPS_ADDR1, dev->d_rps1.dma_handle);
 
 200         saa7146_write(dev, MC1, (MASK_13 | MASK_29));
 
 203 static int buffer_activate(struct saa7146_dev *dev,
 
 204                            struct saa7146_buf *buf,
 
 205                            struct saa7146_buf *next)
 
 207         struct saa7146_vv *vv = dev->vv_data;
 
 208         buf->vb.state = STATE_ACTIVE;
 
 210         DEB_VBI(("dev:%p, buf:%p, next:%p\n",dev,buf,next));
 
 211         saa7146_set_vbi_capture(dev,buf,next);
 
 213         mod_timer(&vv->vbi_q.timeout, jiffies+BUFFER_TIMEOUT);
 
 217 static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,enum v4l2_field field)
 
 219         struct file *file = q->priv_data;
 
 220         struct saa7146_fh *fh = file->private_data;
 
 221         struct saa7146_dev *dev = fh->dev;
 
 222         struct saa7146_buf *buf = (struct saa7146_buf *)vb;
 
 225         int lines, llength, size;
 
 227         lines   = 16 * 2 ; /* 2 fields */
 
 228         llength = vbi_pixel_to_capture;
 
 229         size = lines * llength;
 
 231         DEB_VBI(("vb:%p\n",vb));
 
 233         if (0 != buf->vb.baddr  &&  buf->vb.bsize < size) {
 
 234                 DEB_VBI(("size mismatch.\n"));
 
 238         if (buf->vb.size != size)
 
 239                 saa7146_dma_free(dev,q,buf);
 
 241         if (STATE_NEEDS_INIT == buf->vb.state) {
 
 242                 buf->vb.width  = llength;
 
 243                 buf->vb.height = lines;
 
 245                 buf->vb.field  = field; // FIXME: check this
 
 247                 saa7146_pgtable_free(dev->pci, &buf->pt[2]);
 
 248                 saa7146_pgtable_alloc(dev->pci, &buf->pt[2]);
 
 250                 err = videobuf_iolock(q,&buf->vb, NULL);
 
 253                 err = saa7146_pgtable_build_single(dev->pci, &buf->pt[2], buf->vb.dma.sglist, buf->vb.dma.sglen);
 
 257         buf->vb.state = STATE_PREPARED;
 
 258         buf->activate = buffer_activate;
 
 263         DEB_VBI(("error out.\n"));
 
 264         saa7146_dma_free(dev,q,buf);
 
 269 static int buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
 
 273         lines   = 16 * 2 ; /* 2 fields */
 
 274         llength = vbi_pixel_to_capture;
 
 276         *size = lines * llength;
 
 279         DEB_VBI(("count:%d, size:%d\n",*count,*size));
 
 284 static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
 
 286         struct file *file = q->priv_data;
 
 287         struct saa7146_fh *fh = file->private_data;
 
 288         struct saa7146_dev *dev = fh->dev;
 
 289         struct saa7146_vv *vv = dev->vv_data;
 
 290         struct saa7146_buf *buf = (struct saa7146_buf *)vb;
 
 292         DEB_VBI(("vb:%p\n",vb));
 
 293         saa7146_buffer_queue(dev,&vv->vbi_q,buf);
 
 296 static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
 
 298         struct file *file = q->priv_data;
 
 299         struct saa7146_fh *fh   = file->private_data;
 
 300         struct saa7146_dev *dev = fh->dev;
 
 301         struct saa7146_buf *buf = (struct saa7146_buf *)vb;
 
 303         DEB_VBI(("vb:%p\n",vb));
 
 304         saa7146_dma_free(dev,q,buf);
 
 307 static struct videobuf_queue_ops vbi_qops = {
 
 308         .buf_setup    = buffer_setup,
 
 309         .buf_prepare  = buffer_prepare,
 
 310         .buf_queue    = buffer_queue,
 
 311         .buf_release  = buffer_release,
 
 314 /* ------------------------------------------------------------------ */
 
 316 static void vbi_stop(struct saa7146_fh *fh, struct file *file)
 
 318         struct saa7146_dev *dev = fh->dev;
 
 319         struct saa7146_vv *vv = dev->vv_data;
 
 321         DEB_VBI(("dev:%p, fh:%p\n",dev, fh));
 
 323         spin_lock_irqsave(&dev->slock,flags);
 
 326         saa7146_write(dev, MC1, MASK_29);
 
 328         /* disable rps1 irqs */
 
 329         SAA7146_IER_DISABLE(dev, MASK_28);
 
 331         /* shut down dma 3 transfers */
 
 332         saa7146_write(dev, MC1, MASK_20);
 
 334         if (vv->vbi_q.curr) {
 
 335                 saa7146_buffer_finish(dev,&vv->vbi_q,STATE_DONE);
 
 338         videobuf_queue_cancel(&fh->vbi_q);
 
 340         vv->vbi_streaming = NULL;
 
 342         del_timer(&vv->vbi_q.timeout);
 
 343         del_timer(&fh->vbi_read_timeout);
 
 345         spin_unlock_irqrestore(&dev->slock, flags);
 
 348 static void vbi_read_timeout(unsigned long data)
 
 350         struct file *file = (struct file*)data;
 
 351         struct saa7146_fh *fh = file->private_data;
 
 352         struct saa7146_dev *dev = fh->dev;
 
 354         DEB_VBI(("dev:%p, fh:%p\n",dev, fh));
 
 359 static void vbi_init(struct saa7146_dev *dev, struct saa7146_vv *vv)
 
 361         DEB_VBI(("dev:%p\n",dev));
 
 363         INIT_LIST_HEAD(&vv->vbi_q.queue);
 
 365         init_timer(&vv->vbi_q.timeout);
 
 366         vv->vbi_q.timeout.function = saa7146_buffer_timeout;
 
 367         vv->vbi_q.timeout.data     = (unsigned long)(&vv->vbi_q);
 
 370         init_waitqueue_head(&vv->vbi_wq);
 
 373 static int vbi_open(struct saa7146_dev *dev, struct file *file)
 
 375         struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 
 377         u32 arbtr_ctrl  = saa7146_read(dev, PCI_BT_V1);
 
 380         DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
 
 382         ret = saa7146_res_get(fh, RESOURCE_DMA3_BRS);
 
 384                 DEB_S(("cannot get vbi RESOURCE_DMA3_BRS resource\n"));
 
 388         /* adjust arbitrition control for video dma 3 */
 
 389         arbtr_ctrl &= ~0x1f0000;
 
 390         arbtr_ctrl |=  0x1d0000;
 
 391         saa7146_write(dev, PCI_BT_V1, arbtr_ctrl);
 
 392         saa7146_write(dev, MC2, (MASK_04|MASK_20));
 
 394         memset(&fh->vbi_fmt,0,sizeof(fh->vbi_fmt));
 
 396         fh->vbi_fmt.sampling_rate       = 27000000;
 
 397         fh->vbi_fmt.offset              = 248; /* todo */
 
 398         fh->vbi_fmt.samples_per_line    = vbi_pixel_to_capture;
 
 399         fh->vbi_fmt.sample_format       = V4L2_PIX_FMT_GREY;
 
 401         /* fixme: this only works for PAL */
 
 402         fh->vbi_fmt.start[0] = 5;
 
 403         fh->vbi_fmt.count[0] = 16;
 
 404         fh->vbi_fmt.start[1] = 312;
 
 405         fh->vbi_fmt.count[1] = 16;
 
 407         videobuf_queue_init(&fh->vbi_q, &vbi_qops,
 
 408                             dev->pci, &dev->slock,
 
 409                             V4L2_BUF_TYPE_VBI_CAPTURE,
 
 410                             V4L2_FIELD_SEQ_TB, // FIXME: does this really work?
 
 411                             sizeof(struct saa7146_buf),
 
 413         mutex_init(&fh->vbi_q.lock);
 
 415         init_timer(&fh->vbi_read_timeout);
 
 416         fh->vbi_read_timeout.function = vbi_read_timeout;
 
 417         fh->vbi_read_timeout.data = (unsigned long)file;
 
 419         /* initialize the brs */
 
 420         if ( 0 != (SAA7146_USE_PORT_B_FOR_VBI & dev->ext_vv_data->flags)) {
 
 421                 saa7146_write(dev, BRS_CTRL, MASK_30|MASK_29 | (7 << 19));
 
 423                 saa7146_write(dev, BRS_CTRL, 0x00000001);
 
 425                 if (0 != (ret = vbi_workaround(dev))) {
 
 426                         DEB_VBI(("vbi workaround failed!\n"));
 
 431         /* upload brs register */
 
 432         saa7146_write(dev, MC2, (MASK_08|MASK_24));
 
 436 static void vbi_close(struct saa7146_dev *dev, struct file *file)
 
 438         struct saa7146_fh *fh = (struct saa7146_fh *)file->private_data;
 
 439         struct saa7146_vv *vv = dev->vv_data;
 
 440         DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
 
 442         if( fh == vv->vbi_streaming ) {
 
 445         saa7146_res_free(fh, RESOURCE_DMA3_BRS);
 
 448 static void vbi_irq_done(struct saa7146_dev *dev, unsigned long status)
 
 450         struct saa7146_vv *vv = dev->vv_data;
 
 451         spin_lock(&dev->slock);
 
 453         if (vv->vbi_q.curr) {
 
 454                 DEB_VBI(("dev:%p, curr:%p\n",dev,vv->vbi_q.curr));
 
 455                 /* this must be += 2, one count for each field */
 
 456                 vv->vbi_fieldcount+=2;
 
 457                 vv->vbi_q.curr->vb.field_count = vv->vbi_fieldcount;
 
 458                 saa7146_buffer_finish(dev,&vv->vbi_q,STATE_DONE);
 
 460                 DEB_VBI(("dev:%p\n",dev));
 
 462         saa7146_buffer_next(dev,&vv->vbi_q,1);
 
 464         spin_unlock(&dev->slock);
 
 467 static ssize_t vbi_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
 
 469         struct saa7146_fh *fh = file->private_data;
 
 470         struct saa7146_dev *dev = fh->dev;
 
 471         struct saa7146_vv *vv = dev->vv_data;
 
 474         DEB_VBI(("dev:%p, fh:%p\n",dev,fh));
 
 476         if( NULL == vv->vbi_streaming ) {
 
 477                 // fixme: check if dma3 is available
 
 478                 // fixme: activate vbi engine here if necessary. (really?)
 
 479                 vv->vbi_streaming = fh;
 
 482         if( fh != vv->vbi_streaming ) {
 
 483                 DEB_VBI(("open %p is already using vbi capture.",vv->vbi_streaming));
 
 487         mod_timer(&fh->vbi_read_timeout, jiffies+BUFFER_TIMEOUT);
 
 488         ret = videobuf_read_stream(&fh->vbi_q, data, count, ppos, 1,
 
 489                                    file->f_flags & O_NONBLOCK);
 
 491         printk("BASE_ODD3:      0x%08x\n", saa7146_read(dev, BASE_ODD3));
 
 492         printk("BASE_EVEN3:     0x%08x\n", saa7146_read(dev, BASE_EVEN3));
 
 493         printk("PROT_ADDR3:     0x%08x\n", saa7146_read(dev, PROT_ADDR3));
 
 494         printk("PITCH3:         0x%08x\n", saa7146_read(dev, PITCH3));
 
 495         printk("BASE_PAGE3:     0x%08x\n", saa7146_read(dev, BASE_PAGE3));
 
 496         printk("NUM_LINE_BYTE3: 0x%08x\n", saa7146_read(dev, NUM_LINE_BYTE3));
 
 497         printk("BRS_CTRL:       0x%08x\n", saa7146_read(dev, BRS_CTRL));
 
 502 struct saa7146_use_ops saa7146_vbi_uops = {
 
 505         .release        = vbi_close,
 
 506         .irq_done       = vbi_irq_done,