root/drivers/media/pci/ivtv/ivtv-irq.c

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

DEFINITIONS

This source file includes following definitions.
  1. ivtv_pcm_work_handler
  2. ivtv_pio_work_handler
  3. ivtv_irq_work_handler
  4. stream_enc_dma_append
  5. dma_post
  6. ivtv_dma_stream_dec_prepare
  7. ivtv_dma_enc_start_xfer
  8. ivtv_dma_dec_start_xfer
  9. ivtv_dma_enc_start
  10. ivtv_dma_dec_start
  11. ivtv_irq_dma_read
  12. ivtv_irq_enc_dma_complete
  13. ivtv_irq_enc_pio_complete
  14. ivtv_irq_dma_err
  15. ivtv_irq_enc_start_cap
  16. ivtv_irq_enc_vbi_cap
  17. ivtv_irq_dec_vbi_reinsert
  18. ivtv_irq_dec_data_req
  19. ivtv_irq_vsync
  20. ivtv_irq_handler
  21. ivtv_unfinished_dma

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /* interrupt handling
   3     Copyright (C) 2003-2004  Kevin Thayer <nufan_wfk at yahoo.com>
   4     Copyright (C) 2004  Chris Kennedy <c@groovy.org>
   5     Copyright (C) 2005-2007  Hans Verkuil <hverkuil@xs4all.nl>
   6 
   7  */
   8 
   9 #include "ivtv-driver.h"
  10 #include "ivtv-queue.h"
  11 #include "ivtv-udma.h"
  12 #include "ivtv-irq.h"
  13 #include "ivtv-mailbox.h"
  14 #include "ivtv-vbi.h"
  15 #include "ivtv-yuv.h"
  16 #include <media/v4l2-event.h>
  17 
  18 #define DMA_MAGIC_COOKIE 0x000001fe
  19 
  20 static void ivtv_dma_dec_start(struct ivtv_stream *s);
  21 
  22 static const int ivtv_stream_map[] = {
  23         IVTV_ENC_STREAM_TYPE_MPG,
  24         IVTV_ENC_STREAM_TYPE_YUV,
  25         IVTV_ENC_STREAM_TYPE_PCM,
  26         IVTV_ENC_STREAM_TYPE_VBI,
  27 };
  28 
  29 static void ivtv_pcm_work_handler(struct ivtv *itv)
  30 {
  31         struct ivtv_stream *s = &itv->streams[IVTV_ENC_STREAM_TYPE_PCM];
  32         struct ivtv_buffer *buf;
  33 
  34         /* Pass the PCM data to ivtv-alsa */
  35 
  36         while (1) {
  37                 /*
  38                  * Users should not be using both the ALSA and V4L2 PCM audio
  39                  * capture interfaces at the same time.  If the user is doing
  40                  * this, there maybe a buffer in q_io to grab, use, and put
  41                  * back in rotation.
  42                  */
  43                 buf = ivtv_dequeue(s, &s->q_io);
  44                 if (buf == NULL)
  45                         buf = ivtv_dequeue(s, &s->q_full);
  46                 if (buf == NULL)
  47                         break;
  48 
  49                 if (buf->readpos < buf->bytesused)
  50                         itv->pcm_announce_callback(itv->alsa,
  51                                 (u8 *)(buf->buf + buf->readpos),
  52                                 (size_t)(buf->bytesused - buf->readpos));
  53 
  54                 ivtv_enqueue(s, buf, &s->q_free);
  55         }
  56 }
  57 
  58 static void ivtv_pio_work_handler(struct ivtv *itv)
  59 {
  60         struct ivtv_stream *s = &itv->streams[itv->cur_pio_stream];
  61         struct ivtv_buffer *buf;
  62         int i = 0;
  63 
  64         IVTV_DEBUG_HI_DMA("ivtv_pio_work_handler\n");
  65         if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS ||
  66                         s->vdev.v4l2_dev == NULL || !ivtv_use_pio(s)) {
  67                 itv->cur_pio_stream = -1;
  68                 /* trigger PIO complete user interrupt */
  69                 write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
  70                 return;
  71         }
  72         IVTV_DEBUG_HI_DMA("Process PIO %s\n", s->name);
  73         list_for_each_entry(buf, &s->q_dma.list, list) {
  74                 u32 size = s->sg_processing[i].size & 0x3ffff;
  75 
  76                 /* Copy the data from the card to the buffer */
  77                 if (s->type == IVTV_DEC_STREAM_TYPE_VBI) {
  78                         memcpy_fromio(buf->buf, itv->dec_mem + s->sg_processing[i].src - IVTV_DECODER_OFFSET, size);
  79                 }
  80                 else {
  81                         memcpy_fromio(buf->buf, itv->enc_mem + s->sg_processing[i].src, size);
  82                 }
  83                 i++;
  84                 if (i == s->sg_processing_size)
  85                         break;
  86         }
  87         write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
  88 }
  89 
  90 void ivtv_irq_work_handler(struct kthread_work *work)
  91 {
  92         struct ivtv *itv = container_of(work, struct ivtv, irq_work);
  93 
  94         if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags))
  95                 ivtv_pio_work_handler(itv);
  96 
  97         if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags))
  98                 ivtv_vbi_work_handler(itv);
  99 
 100         if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags))
 101                 ivtv_yuv_work_handler(itv);
 102 
 103         if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags))
 104                 ivtv_pcm_work_handler(itv);
 105 }
 106 
 107 /* Determine the required DMA size, setup enough buffers in the predma queue and
 108    actually copy the data from the card to the buffers in case a PIO transfer is
 109    required for this stream.
 110  */
 111 static int stream_enc_dma_append(struct ivtv_stream *s, u32 data[CX2341X_MBOX_MAX_DATA])
 112 {
 113         struct ivtv *itv = s->itv;
 114         struct ivtv_buffer *buf;
 115         u32 bytes_needed = 0;
 116         u32 offset, size;
 117         u32 UVoffset = 0, UVsize = 0;
 118         int skip_bufs = s->q_predma.buffers;
 119         int idx = s->sg_pending_size;
 120         int rc;
 121 
 122         /* sanity checks */
 123         if (s->vdev.v4l2_dev == NULL) {
 124                 IVTV_DEBUG_WARN("Stream %s not started\n", s->name);
 125                 return -1;
 126         }
 127         if (!test_bit(IVTV_F_S_CLAIMED, &s->s_flags)) {
 128                 IVTV_DEBUG_WARN("Stream %s not open\n", s->name);
 129                 return -1;
 130         }
 131 
 132         /* determine offset, size and PTS for the various streams */
 133         switch (s->type) {
 134                 case IVTV_ENC_STREAM_TYPE_MPG:
 135                         offset = data[1];
 136                         size = data[2];
 137                         s->pending_pts = 0;
 138                         break;
 139 
 140                 case IVTV_ENC_STREAM_TYPE_YUV:
 141                         offset = data[1];
 142                         size = data[2];
 143                         UVoffset = data[3];
 144                         UVsize = data[4];
 145                         s->pending_pts = ((u64) data[5] << 32) | data[6];
 146                         break;
 147 
 148                 case IVTV_ENC_STREAM_TYPE_PCM:
 149                         offset = data[1] + 12;
 150                         size = data[2] - 12;
 151                         s->pending_pts = read_dec(offset - 8) |
 152                                 ((u64)(read_dec(offset - 12)) << 32);
 153                         if (itv->has_cx23415)
 154                                 offset += IVTV_DECODER_OFFSET;
 155                         break;
 156 
 157                 case IVTV_ENC_STREAM_TYPE_VBI:
 158                         size = itv->vbi.enc_size * itv->vbi.fpi;
 159                         offset = read_enc(itv->vbi.enc_start - 4) + 12;
 160                         if (offset == 12) {
 161                                 IVTV_DEBUG_INFO("VBI offset == 0\n");
 162                                 return -1;
 163                         }
 164                         s->pending_pts = read_enc(offset - 4) | ((u64)read_enc(offset - 8) << 32);
 165                         break;
 166 
 167                 case IVTV_DEC_STREAM_TYPE_VBI:
 168                         size = read_dec(itv->vbi.dec_start + 4) + 8;
 169                         offset = read_dec(itv->vbi.dec_start) + itv->vbi.dec_start;
 170                         s->pending_pts = 0;
 171                         offset += IVTV_DECODER_OFFSET;
 172                         break;
 173                 default:
 174                         /* shouldn't happen */
 175                         return -1;
 176         }
 177 
 178         /* if this is the start of the DMA then fill in the magic cookie */
 179         if (s->sg_pending_size == 0 && ivtv_use_dma(s)) {
 180                 if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
 181                     s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
 182                         s->pending_backup = read_dec(offset - IVTV_DECODER_OFFSET);
 183                         write_dec_sync(DMA_MAGIC_COOKIE, offset - IVTV_DECODER_OFFSET);
 184                 }
 185                 else {
 186                         s->pending_backup = read_enc(offset);
 187                         write_enc_sync(DMA_MAGIC_COOKIE, offset);
 188                 }
 189                 s->pending_offset = offset;
 190         }
 191 
 192         bytes_needed = size;
 193         if (s->type == IVTV_ENC_STREAM_TYPE_YUV) {
 194                 /* The size for the Y samples needs to be rounded upwards to a
 195                    multiple of the buf_size. The UV samples then start in the
 196                    next buffer. */
 197                 bytes_needed = s->buf_size * ((bytes_needed + s->buf_size - 1) / s->buf_size);
 198                 bytes_needed += UVsize;
 199         }
 200 
 201         IVTV_DEBUG_HI_DMA("%s %s: 0x%08x bytes at 0x%08x\n",
 202                 ivtv_use_pio(s) ? "PIO" : "DMA", s->name, bytes_needed, offset);
 203 
 204         rc = ivtv_queue_move(s, &s->q_free, &s->q_full, &s->q_predma, bytes_needed);
 205         if (rc < 0) { /* Insufficient buffers */
 206                 IVTV_DEBUG_WARN("Cannot obtain %d bytes for %s data transfer\n",
 207                                 bytes_needed, s->name);
 208                 return -1;
 209         }
 210         if (rc && !s->buffers_stolen && test_bit(IVTV_F_S_APPL_IO, &s->s_flags)) {
 211                 IVTV_WARN("All %s stream buffers are full. Dropping data.\n", s->name);
 212                 IVTV_WARN("Cause: the application is not reading fast enough.\n");
 213         }
 214         s->buffers_stolen = rc;
 215 
 216         /* got the buffers, now fill in sg_pending */
 217         buf = list_entry(s->q_predma.list.next, struct ivtv_buffer, list);
 218         memset(buf->buf, 0, 128);
 219         list_for_each_entry(buf, &s->q_predma.list, list) {
 220                 if (skip_bufs-- > 0)
 221                         continue;
 222                 s->sg_pending[idx].dst = buf->dma_handle;
 223                 s->sg_pending[idx].src = offset;
 224                 s->sg_pending[idx].size = s->buf_size;
 225                 buf->bytesused = min(size, s->buf_size);
 226                 buf->dma_xfer_cnt = s->dma_xfer_cnt;
 227 
 228                 s->q_predma.bytesused += buf->bytesused;
 229                 size -= buf->bytesused;
 230                 offset += s->buf_size;
 231 
 232                 /* Sync SG buffers */
 233                 ivtv_buf_sync_for_device(s, buf);
 234 
 235                 if (size == 0) {        /* YUV */
 236                         /* process the UV section */
 237                         offset = UVoffset;
 238                         size = UVsize;
 239                 }
 240                 idx++;
 241         }
 242         s->sg_pending_size = idx;
 243         return 0;
 244 }
 245 
 246 static void dma_post(struct ivtv_stream *s)
 247 {
 248         struct ivtv *itv = s->itv;
 249         struct ivtv_buffer *buf = NULL;
 250         struct list_head *p;
 251         u32 offset;
 252         __le32 *u32buf;
 253         int x = 0;
 254 
 255         IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s) ? "PIO" : "DMA",
 256                         s->name, s->dma_offset);
 257         list_for_each(p, &s->q_dma.list) {
 258                 buf = list_entry(p, struct ivtv_buffer, list);
 259                 u32buf = (__le32 *)buf->buf;
 260 
 261                 /* Sync Buffer */
 262                 ivtv_buf_sync_for_cpu(s, buf);
 263 
 264                 if (x == 0 && ivtv_use_dma(s)) {
 265                         offset = s->dma_last_offset;
 266                         if (le32_to_cpu(u32buf[offset / 4]) != DMA_MAGIC_COOKIE)
 267                         {
 268                                 for (offset = 0; offset < 64; offset++)
 269                                         if (le32_to_cpu(u32buf[offset]) == DMA_MAGIC_COOKIE)
 270                                                 break;
 271                                 offset *= 4;
 272                                 if (offset == 256) {
 273                                         IVTV_DEBUG_WARN("%s: Couldn't find start of buffer within the first 256 bytes\n", s->name);
 274                                         offset = s->dma_last_offset;
 275                                 }
 276                                 if (s->dma_last_offset != offset)
 277                                         IVTV_DEBUG_WARN("%s: offset %d -> %d\n", s->name, s->dma_last_offset, offset);
 278                                 s->dma_last_offset = offset;
 279                         }
 280                         if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
 281                                                 s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
 282                                 write_dec_sync(0, s->dma_offset - IVTV_DECODER_OFFSET);
 283                         }
 284                         else {
 285                                 write_enc_sync(0, s->dma_offset);
 286                         }
 287                         if (offset) {
 288                                 buf->bytesused -= offset;
 289                                 memcpy(buf->buf, buf->buf + offset, buf->bytesused + offset);
 290                         }
 291                         *u32buf = cpu_to_le32(s->dma_backup);
 292                 }
 293                 x++;
 294                 /* flag byteswap ABCD -> DCBA for MPG & VBI data outside irq */
 295                 if (s->type == IVTV_ENC_STREAM_TYPE_MPG ||
 296                     s->type == IVTV_ENC_STREAM_TYPE_VBI)
 297                         buf->b_flags |= IVTV_F_B_NEED_BUF_SWAP;
 298         }
 299         if (buf)
 300                 buf->bytesused += s->dma_last_offset;
 301         if (buf && s->type == IVTV_DEC_STREAM_TYPE_VBI) {
 302                 list_for_each_entry(buf, &s->q_dma.list, list) {
 303                         /* Parse and Groom VBI Data */
 304                         s->q_dma.bytesused -= buf->bytesused;
 305                         ivtv_process_vbi_data(itv, buf, 0, s->type);
 306                         s->q_dma.bytesused += buf->bytesused;
 307                 }
 308                 if (s->fh == NULL) {
 309                         ivtv_queue_move(s, &s->q_dma, NULL, &s->q_free, 0);
 310                         return;
 311                 }
 312         }
 313 
 314         ivtv_queue_move(s, &s->q_dma, NULL, &s->q_full, s->q_dma.bytesused);
 315 
 316         if (s->type == IVTV_ENC_STREAM_TYPE_PCM &&
 317             itv->pcm_announce_callback != NULL) {
 318                 /*
 319                  * Set up the work handler to pass the data to ivtv-alsa.
 320                  *
 321                  * We just use q_full and let the work handler race with users
 322                  * making ivtv-fileops.c calls on the PCM device node.
 323                  *
 324                  * Users should not be using both the ALSA and V4L2 PCM audio
 325                  * capture interfaces at the same time.  If the user does this,
 326                  * fragments of data will just go out each interface as they
 327                  * race for PCM data.
 328                  */
 329                 set_bit(IVTV_F_I_WORK_HANDLER_PCM, &itv->i_flags);
 330                 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
 331         }
 332 
 333         if (s->fh)
 334                 wake_up(&s->waitq);
 335 }
 336 
 337 void ivtv_dma_stream_dec_prepare(struct ivtv_stream *s, u32 offset, int lock)
 338 {
 339         struct ivtv *itv = s->itv;
 340         struct yuv_playback_info *yi = &itv->yuv_info;
 341         u8 frame = yi->draw_frame;
 342         struct yuv_frame_info *f = &yi->new_frame_info[frame];
 343         struct ivtv_buffer *buf;
 344         u32 y_size = 720 * ((f->src_h + 31) & ~31);
 345         u32 uv_offset = offset + IVTV_YUV_BUFFER_UV_OFFSET;
 346         int y_done = 0;
 347         int bytes_written = 0;
 348         int idx = 0;
 349 
 350         IVTV_DEBUG_HI_DMA("DEC PREPARE DMA %s: %08x %08x\n", s->name, s->q_predma.bytesused, offset);
 351 
 352         /* Insert buffer block for YUV if needed */
 353         if (s->type == IVTV_DEC_STREAM_TYPE_YUV && f->offset_y) {
 354                 if (yi->blanking_dmaptr) {
 355                         s->sg_pending[idx].src = yi->blanking_dmaptr;
 356                         s->sg_pending[idx].dst = offset;
 357                         s->sg_pending[idx].size = 720 * 16;
 358                 }
 359                 offset += 720 * 16;
 360                 idx++;
 361         }
 362 
 363         list_for_each_entry(buf, &s->q_predma.list, list) {
 364                 /* YUV UV Offset from Y Buffer */
 365                 if (s->type == IVTV_DEC_STREAM_TYPE_YUV && !y_done &&
 366                                 (bytes_written + buf->bytesused) >= y_size) {
 367                         s->sg_pending[idx].src = buf->dma_handle;
 368                         s->sg_pending[idx].dst = offset;
 369                         s->sg_pending[idx].size = y_size - bytes_written;
 370                         offset = uv_offset;
 371                         if (s->sg_pending[idx].size != buf->bytesused) {
 372                                 idx++;
 373                                 s->sg_pending[idx].src =
 374                                   buf->dma_handle + s->sg_pending[idx - 1].size;
 375                                 s->sg_pending[idx].dst = offset;
 376                                 s->sg_pending[idx].size =
 377                                    buf->bytesused - s->sg_pending[idx - 1].size;
 378                                 offset += s->sg_pending[idx].size;
 379                         }
 380                         y_done = 1;
 381                 } else {
 382                         s->sg_pending[idx].src = buf->dma_handle;
 383                         s->sg_pending[idx].dst = offset;
 384                         s->sg_pending[idx].size = buf->bytesused;
 385                         offset += buf->bytesused;
 386                 }
 387                 bytes_written += buf->bytesused;
 388 
 389                 /* Sync SG buffers */
 390                 ivtv_buf_sync_for_device(s, buf);
 391                 idx++;
 392         }
 393         s->sg_pending_size = idx;
 394 
 395         /* Sync Hardware SG List of buffers */
 396         ivtv_stream_sync_for_device(s);
 397         if (lock) {
 398                 unsigned long flags = 0;
 399 
 400                 spin_lock_irqsave(&itv->dma_reg_lock, flags);
 401                 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
 402                         ivtv_dma_dec_start(s);
 403                 else
 404                         set_bit(IVTV_F_S_DMA_PENDING, &s->s_flags);
 405                 spin_unlock_irqrestore(&itv->dma_reg_lock, flags);
 406         } else {
 407                 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
 408                         ivtv_dma_dec_start(s);
 409                 else
 410                         set_bit(IVTV_F_S_DMA_PENDING, &s->s_flags);
 411         }
 412 }
 413 
 414 static void ivtv_dma_enc_start_xfer(struct ivtv_stream *s)
 415 {
 416         struct ivtv *itv = s->itv;
 417 
 418         s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
 419         s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
 420         s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
 421         s->sg_processed++;
 422         /* Sync Hardware SG List of buffers */
 423         ivtv_stream_sync_for_device(s);
 424         write_reg(s->sg_handle, IVTV_REG_ENCDMAADDR);
 425         write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x02, IVTV_REG_DMAXFER);
 426         itv->dma_timer.expires = jiffies + msecs_to_jiffies(300);
 427         add_timer(&itv->dma_timer);
 428 }
 429 
 430 static void ivtv_dma_dec_start_xfer(struct ivtv_stream *s)
 431 {
 432         struct ivtv *itv = s->itv;
 433 
 434         s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
 435         s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
 436         s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
 437         s->sg_processed++;
 438         /* Sync Hardware SG List of buffers */
 439         ivtv_stream_sync_for_device(s);
 440         write_reg(s->sg_handle, IVTV_REG_DECDMAADDR);
 441         write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x01, IVTV_REG_DMAXFER);
 442         itv->dma_timer.expires = jiffies + msecs_to_jiffies(300);
 443         add_timer(&itv->dma_timer);
 444 }
 445 
 446 /* start the encoder DMA */
 447 static void ivtv_dma_enc_start(struct ivtv_stream *s)
 448 {
 449         struct ivtv *itv = s->itv;
 450         struct ivtv_stream *s_vbi = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
 451         int i;
 452 
 453         IVTV_DEBUG_HI_DMA("start %s for %s\n", ivtv_use_dma(s) ? "DMA" : "PIO", s->name);
 454 
 455         if (s->q_predma.bytesused)
 456                 ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
 457 
 458         if (ivtv_use_dma(s))
 459                 s->sg_pending[s->sg_pending_size - 1].size += 256;
 460 
 461         /* If this is an MPEG stream, and VBI data is also pending, then append the
 462            VBI DMA to the MPEG DMA and transfer both sets of data at once.
 463 
 464            VBI DMA is a second class citizen compared to MPEG and mixing them together
 465            will confuse the firmware (the end of a VBI DMA is seen as the end of a
 466            MPEG DMA, thus effectively dropping an MPEG frame). So instead we make
 467            sure we only use the MPEG DMA to transfer the VBI DMA if both are in
 468            use. This way no conflicts occur. */
 469         clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
 470         if (s->type == IVTV_ENC_STREAM_TYPE_MPG && s_vbi->sg_pending_size &&
 471                         s->sg_pending_size + s_vbi->sg_pending_size <= s->buffers) {
 472                 ivtv_queue_move(s_vbi, &s_vbi->q_predma, NULL, &s_vbi->q_dma, s_vbi->q_predma.bytesused);
 473                 if (ivtv_use_dma(s_vbi))
 474                         s_vbi->sg_pending[s_vbi->sg_pending_size - 1].size += 256;
 475                 for (i = 0; i < s_vbi->sg_pending_size; i++) {
 476                         s->sg_pending[s->sg_pending_size++] = s_vbi->sg_pending[i];
 477                 }
 478                 s_vbi->dma_offset = s_vbi->pending_offset;
 479                 s_vbi->sg_pending_size = 0;
 480                 s_vbi->dma_xfer_cnt++;
 481                 set_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
 482                 IVTV_DEBUG_HI_DMA("include DMA for %s\n", s_vbi->name);
 483         }
 484 
 485         s->dma_xfer_cnt++;
 486         memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
 487         s->sg_processing_size = s->sg_pending_size;
 488         s->sg_pending_size = 0;
 489         s->sg_processed = 0;
 490         s->dma_offset = s->pending_offset;
 491         s->dma_backup = s->pending_backup;
 492         s->dma_pts = s->pending_pts;
 493 
 494         if (ivtv_use_pio(s)) {
 495                 set_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags);
 496                 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
 497                 set_bit(IVTV_F_I_PIO, &itv->i_flags);
 498                 itv->cur_pio_stream = s->type;
 499         }
 500         else {
 501                 itv->dma_retries = 0;
 502                 ivtv_dma_enc_start_xfer(s);
 503                 set_bit(IVTV_F_I_DMA, &itv->i_flags);
 504                 itv->cur_dma_stream = s->type;
 505         }
 506 }
 507 
 508 static void ivtv_dma_dec_start(struct ivtv_stream *s)
 509 {
 510         struct ivtv *itv = s->itv;
 511 
 512         if (s->q_predma.bytesused)
 513                 ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
 514         s->dma_xfer_cnt++;
 515         memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_host_element) * s->sg_pending_size);
 516         s->sg_processing_size = s->sg_pending_size;
 517         s->sg_pending_size = 0;
 518         s->sg_processed = 0;
 519 
 520         IVTV_DEBUG_HI_DMA("start DMA for %s\n", s->name);
 521         itv->dma_retries = 0;
 522         ivtv_dma_dec_start_xfer(s);
 523         set_bit(IVTV_F_I_DMA, &itv->i_flags);
 524         itv->cur_dma_stream = s->type;
 525 }
 526 
 527 static void ivtv_irq_dma_read(struct ivtv *itv)
 528 {
 529         struct ivtv_stream *s = NULL;
 530         struct ivtv_buffer *buf;
 531         int hw_stream_type = 0;
 532 
 533         IVTV_DEBUG_HI_IRQ("DEC DMA READ\n");
 534 
 535         del_timer(&itv->dma_timer);
 536 
 537         if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && itv->cur_dma_stream < 0)
 538                 return;
 539 
 540         if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
 541                 s = &itv->streams[itv->cur_dma_stream];
 542                 ivtv_stream_sync_for_cpu(s);
 543 
 544                 if (read_reg(IVTV_REG_DMASTATUS) & 0x14) {
 545                         IVTV_DEBUG_WARN("DEC DMA ERROR %x (xfer %d of %d, retry %d)\n",
 546                                         read_reg(IVTV_REG_DMASTATUS),
 547                                         s->sg_processed, s->sg_processing_size, itv->dma_retries);
 548                         write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
 549                         if (itv->dma_retries == 3) {
 550                                 /* Too many retries, give up on this frame */
 551                                 itv->dma_retries = 0;
 552                                 s->sg_processed = s->sg_processing_size;
 553                         }
 554                         else {
 555                                 /* Retry, starting with the first xfer segment.
 556                                    Just retrying the current segment is not sufficient. */
 557                                 s->sg_processed = 0;
 558                                 itv->dma_retries++;
 559                         }
 560                 }
 561                 if (s->sg_processed < s->sg_processing_size) {
 562                         /* DMA next buffer */
 563                         ivtv_dma_dec_start_xfer(s);
 564                         return;
 565                 }
 566                 if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
 567                         hw_stream_type = 2;
 568                 IVTV_DEBUG_HI_DMA("DEC DATA READ %s: %d\n", s->name, s->q_dma.bytesused);
 569 
 570                 /* For some reason must kick the firmware, like PIO mode,
 571                    I think this tells the firmware we are done and the size
 572                    of the xfer so it can calculate what we need next.
 573                    I think we can do this part ourselves but would have to
 574                    fully calculate xfer info ourselves and not use interrupts
 575                  */
 576                 ivtv_vapi(itv, CX2341X_DEC_SCHED_DMA_FROM_HOST, 3, 0, s->q_dma.bytesused,
 577                                 hw_stream_type);
 578 
 579                 /* Free last DMA call */
 580                 while ((buf = ivtv_dequeue(s, &s->q_dma)) != NULL) {
 581                         ivtv_buf_sync_for_cpu(s, buf);
 582                         ivtv_enqueue(s, buf, &s->q_free);
 583                 }
 584                 wake_up(&s->waitq);
 585         }
 586         clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
 587         clear_bit(IVTV_F_I_DMA, &itv->i_flags);
 588         itv->cur_dma_stream = -1;
 589         wake_up(&itv->dma_waitq);
 590 }
 591 
 592 static void ivtv_irq_enc_dma_complete(struct ivtv *itv)
 593 {
 594         u32 data[CX2341X_MBOX_MAX_DATA];
 595         struct ivtv_stream *s;
 596 
 597         ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data);
 598         IVTV_DEBUG_HI_IRQ("ENC DMA COMPLETE %x %d (%d)\n", data[0], data[1], itv->cur_dma_stream);
 599 
 600         del_timer(&itv->dma_timer);
 601 
 602         if (itv->cur_dma_stream < 0)
 603                 return;
 604 
 605         s = &itv->streams[itv->cur_dma_stream];
 606         ivtv_stream_sync_for_cpu(s);
 607 
 608         if (data[0] & 0x18) {
 609                 IVTV_DEBUG_WARN("ENC DMA ERROR %x (offset %08x, xfer %d of %d, retry %d)\n", data[0],
 610                         s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries);
 611                 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
 612                 if (itv->dma_retries == 3) {
 613                         /* Too many retries, give up on this frame */
 614                         itv->dma_retries = 0;
 615                         s->sg_processed = s->sg_processing_size;
 616                 }
 617                 else {
 618                         /* Retry, starting with the first xfer segment.
 619                            Just retrying the current segment is not sufficient. */
 620                         s->sg_processed = 0;
 621                         itv->dma_retries++;
 622                 }
 623         }
 624         if (s->sg_processed < s->sg_processing_size) {
 625                 /* DMA next buffer */
 626                 ivtv_dma_enc_start_xfer(s);
 627                 return;
 628         }
 629         clear_bit(IVTV_F_I_DMA, &itv->i_flags);
 630         itv->cur_dma_stream = -1;
 631         dma_post(s);
 632         if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
 633                 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
 634                 dma_post(s);
 635         }
 636         s->sg_processing_size = 0;
 637         s->sg_processed = 0;
 638         wake_up(&itv->dma_waitq);
 639 }
 640 
 641 static void ivtv_irq_enc_pio_complete(struct ivtv *itv)
 642 {
 643         struct ivtv_stream *s;
 644 
 645         if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS) {
 646                 itv->cur_pio_stream = -1;
 647                 return;
 648         }
 649         s = &itv->streams[itv->cur_pio_stream];
 650         IVTV_DEBUG_HI_IRQ("ENC PIO COMPLETE %s\n", s->name);
 651         clear_bit(IVTV_F_I_PIO, &itv->i_flags);
 652         itv->cur_pio_stream = -1;
 653         dma_post(s);
 654         if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
 655                 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 0);
 656         else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
 657                 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 1);
 658         else if (s->type == IVTV_ENC_STREAM_TYPE_PCM)
 659                 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 2);
 660         clear_bit(IVTV_F_I_PIO, &itv->i_flags);
 661         if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
 662                 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
 663                 dma_post(s);
 664         }
 665         wake_up(&itv->dma_waitq);
 666 }
 667 
 668 static void ivtv_irq_dma_err(struct ivtv *itv)
 669 {
 670         u32 data[CX2341X_MBOX_MAX_DATA];
 671         u32 status;
 672 
 673         del_timer(&itv->dma_timer);
 674 
 675         ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, 2, data);
 676         status = read_reg(IVTV_REG_DMASTATUS);
 677         IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1],
 678                                 status, itv->cur_dma_stream);
 679         /*
 680          * We do *not* write back to the IVTV_REG_DMASTATUS register to
 681          * clear the error status, if either the encoder write (0x02) or
 682          * decoder read (0x01) bus master DMA operation do not indicate
 683          * completed.  We can race with the DMA engine, which may have
 684          * transitioned to completed status *after* we read the register.
 685          * Setting a IVTV_REG_DMASTATUS flag back to "busy" status, after the
 686          * DMA engine has completed, will cause the DMA engine to stop working.
 687          */
 688         status &= 0x3;
 689         if (status == 0x3)
 690                 write_reg(status, IVTV_REG_DMASTATUS);
 691 
 692         if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) &&
 693             itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) {
 694                 struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream];
 695 
 696                 if (s->type >= IVTV_DEC_STREAM_TYPE_MPG) {
 697                         /* retry */
 698                         /*
 699                          * FIXME - handle cases of DMA error similar to
 700                          * encoder below, except conditioned on status & 0x1
 701                          */
 702                         ivtv_dma_dec_start(s);
 703                         return;
 704                 } else {
 705                         if ((status & 0x2) == 0) {
 706                                 /*
 707                                  * CX2341x Bus Master DMA write is ongoing.
 708                                  * Reset the timer and let it complete.
 709                                  */
 710                                 itv->dma_timer.expires =
 711                                                 jiffies + msecs_to_jiffies(600);
 712                                 add_timer(&itv->dma_timer);
 713                                 return;
 714                         }
 715 
 716                         if (itv->dma_retries < 3) {
 717                                 /*
 718                                  * CX2341x Bus Master DMA write has ended.
 719                                  * Retry the write, starting with the first
 720                                  * xfer segment. Just retrying the current
 721                                  * segment is not sufficient.
 722                                  */
 723                                 s->sg_processed = 0;
 724                                 itv->dma_retries++;
 725                                 ivtv_dma_enc_start_xfer(s);
 726                                 return;
 727                         }
 728                         /* Too many retries, give up on this one */
 729                 }
 730 
 731         }
 732         if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
 733                 ivtv_udma_start(itv);
 734                 return;
 735         }
 736         clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
 737         clear_bit(IVTV_F_I_DMA, &itv->i_flags);
 738         itv->cur_dma_stream = -1;
 739         wake_up(&itv->dma_waitq);
 740 }
 741 
 742 static void ivtv_irq_enc_start_cap(struct ivtv *itv)
 743 {
 744         u32 data[CX2341X_MBOX_MAX_DATA];
 745         struct ivtv_stream *s;
 746 
 747         /* Get DMA destination and size arguments from card */
 748         ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA, 7, data);
 749         IVTV_DEBUG_HI_IRQ("ENC START CAP %d: %08x %08x\n", data[0], data[1], data[2]);
 750 
 751         if (data[0] > 2 || data[1] == 0 || data[2] == 0) {
 752                 IVTV_DEBUG_WARN("Unknown input: %08x %08x %08x\n",
 753                                 data[0], data[1], data[2]);
 754                 return;
 755         }
 756         s = &itv->streams[ivtv_stream_map[data[0]]];
 757         if (!stream_enc_dma_append(s, data)) {
 758                 set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
 759         }
 760 }
 761 
 762 static void ivtv_irq_enc_vbi_cap(struct ivtv *itv)
 763 {
 764         u32 data[CX2341X_MBOX_MAX_DATA];
 765         struct ivtv_stream *s;
 766 
 767         IVTV_DEBUG_HI_IRQ("ENC START VBI CAP\n");
 768         s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
 769 
 770         if (!stream_enc_dma_append(s, data))
 771                 set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
 772 }
 773 
 774 static void ivtv_irq_dec_vbi_reinsert(struct ivtv *itv)
 775 {
 776         u32 data[CX2341X_MBOX_MAX_DATA];
 777         struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_VBI];
 778 
 779         IVTV_DEBUG_HI_IRQ("DEC VBI REINSERT\n");
 780         if (test_bit(IVTV_F_S_CLAIMED, &s->s_flags) &&
 781                         !stream_enc_dma_append(s, data)) {
 782                 set_bit(IVTV_F_S_PIO_PENDING, &s->s_flags);
 783         }
 784 }
 785 
 786 static void ivtv_irq_dec_data_req(struct ivtv *itv)
 787 {
 788         u32 data[CX2341X_MBOX_MAX_DATA];
 789         struct ivtv_stream *s;
 790 
 791         /* YUV or MPG */
 792 
 793         if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags)) {
 794                 ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 2, data);
 795                 itv->dma_data_req_size =
 796                                  1080 * ((itv->yuv_info.v4l2_src_h + 31) & ~31);
 797                 itv->dma_data_req_offset = data[1];
 798                 if (atomic_read(&itv->yuv_info.next_dma_frame) >= 0)
 799                         ivtv_yuv_frame_complete(itv);
 800                 s = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
 801         }
 802         else {
 803                 ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, 3, data);
 804                 itv->dma_data_req_size = min_t(u32, data[2], 0x10000);
 805                 itv->dma_data_req_offset = data[1];
 806                 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
 807         }
 808         IVTV_DEBUG_HI_IRQ("DEC DATA REQ %s: %d %08x %u\n", s->name, s->q_full.bytesused,
 809                        itv->dma_data_req_offset, itv->dma_data_req_size);
 810         if (itv->dma_data_req_size == 0 || s->q_full.bytesused < itv->dma_data_req_size) {
 811                 set_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
 812         }
 813         else {
 814                 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags))
 815                         ivtv_yuv_setup_stream_frame(itv);
 816                 clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
 817                 ivtv_queue_move(s, &s->q_full, NULL, &s->q_predma, itv->dma_data_req_size);
 818                 ivtv_dma_stream_dec_prepare(s, itv->dma_data_req_offset + IVTV_DECODER_OFFSET, 0);
 819         }
 820 }
 821 
 822 static void ivtv_irq_vsync(struct ivtv *itv)
 823 {
 824         /* The vsync interrupt is unusual in that it won't clear until
 825          * the end of the first line for the current field, at which
 826          * point it clears itself. This can result in repeated vsync
 827          * interrupts, or a missed vsync. Read some of the registers
 828          * to determine the line being displayed and ensure we handle
 829          * one vsync per frame.
 830          */
 831         unsigned int frame = read_reg(IVTV_REG_DEC_LINE_FIELD) & 1;
 832         struct yuv_playback_info *yi = &itv->yuv_info;
 833         int last_dma_frame = atomic_read(&yi->next_dma_frame);
 834         struct yuv_frame_info *f = &yi->new_frame_info[last_dma_frame];
 835 
 836         if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
 837 
 838         if (((frame ^ f->sync_field) == 0 &&
 839                 ((itv->last_vsync_field & 1) ^ f->sync_field)) ||
 840                         (frame != (itv->last_vsync_field & 1) && !f->interlaced)) {
 841                 int next_dma_frame = last_dma_frame;
 842 
 843                 if (!(f->interlaced && f->delay && yi->fields_lapsed < 1)) {
 844                         if (next_dma_frame >= 0 && next_dma_frame != atomic_read(&yi->next_fill_frame)) {
 845                                 write_reg(yuv_offset[next_dma_frame] >> 4, 0x82c);
 846                                 write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x830);
 847                                 write_reg(yuv_offset[next_dma_frame] >> 4, 0x834);
 848                                 write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x838);
 849                                 next_dma_frame = (next_dma_frame + 1) % IVTV_YUV_BUFFERS;
 850                                 atomic_set(&yi->next_dma_frame, next_dma_frame);
 851                                 yi->fields_lapsed = -1;
 852                                 yi->running = 1;
 853                         }
 854                 }
 855         }
 856         if (frame != (itv->last_vsync_field & 1)) {
 857                 static const struct v4l2_event evtop = {
 858                         .type = V4L2_EVENT_VSYNC,
 859                         .u.vsync.field = V4L2_FIELD_TOP,
 860                 };
 861                 static const struct v4l2_event evbottom = {
 862                         .type = V4L2_EVENT_VSYNC,
 863                         .u.vsync.field = V4L2_FIELD_BOTTOM,
 864                 };
 865                 struct ivtv_stream *s = ivtv_get_output_stream(itv);
 866 
 867                 itv->last_vsync_field += 1;
 868                 if (frame == 0) {
 869                         clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
 870                         clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
 871                 }
 872                 else {
 873                         set_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
 874                 }
 875                 if (test_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags)) {
 876                         set_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags);
 877                         wake_up(&itv->event_waitq);
 878                         if (s)
 879                                 wake_up(&s->waitq);
 880                 }
 881                 if (s && s->vdev.v4l2_dev)
 882                         v4l2_event_queue(&s->vdev, frame ? &evtop : &evbottom);
 883                 wake_up(&itv->vsync_waitq);
 884 
 885                 /* Send VBI to saa7127 */
 886                 if (frame && (itv->output_mode == OUT_PASSTHROUGH ||
 887                         test_bit(IVTV_F_I_UPDATE_WSS, &itv->i_flags) ||
 888                         test_bit(IVTV_F_I_UPDATE_VPS, &itv->i_flags) ||
 889                         test_bit(IVTV_F_I_UPDATE_CC, &itv->i_flags))) {
 890                         set_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags);
 891                         set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
 892                 }
 893 
 894                 /* Check if we need to update the yuv registers */
 895                 if (yi->running && (yi->yuv_forced_update || f->update)) {
 896                         if (!f->update) {
 897                                 last_dma_frame =
 898                                         (u8)(atomic_read(&yi->next_dma_frame) -
 899                                                  1) % IVTV_YUV_BUFFERS;
 900                                 f = &yi->new_frame_info[last_dma_frame];
 901                         }
 902 
 903                         if (f->src_w) {
 904                                 yi->update_frame = last_dma_frame;
 905                                 f->update = 0;
 906                                 yi->yuv_forced_update = 0;
 907                                 set_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags);
 908                                 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
 909                         }
 910                 }
 911 
 912                 yi->fields_lapsed++;
 913         }
 914 }
 915 
 916 #define IVTV_IRQ_DMA (IVTV_IRQ_DMA_READ | IVTV_IRQ_ENC_DMA_COMPLETE | IVTV_IRQ_DMA_ERR | IVTV_IRQ_ENC_START_CAP | IVTV_IRQ_ENC_VBI_CAP | IVTV_IRQ_DEC_DATA_REQ | IVTV_IRQ_DEC_VBI_RE_INSERT)
 917 
 918 irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
 919 {
 920         struct ivtv *itv = (struct ivtv *)dev_id;
 921         u32 combo;
 922         u32 stat;
 923         int i;
 924         u8 vsync_force = 0;
 925 
 926         spin_lock(&itv->dma_reg_lock);
 927         /* get contents of irq status register */
 928         stat = read_reg(IVTV_REG_IRQSTATUS);
 929 
 930         combo = ~itv->irqmask & stat;
 931 
 932         /* Clear out IRQ */
 933         if (combo) write_reg(combo, IVTV_REG_IRQSTATUS);
 934 
 935         if (0 == combo) {
 936                 /* The vsync interrupt is unusual and clears itself. If we
 937                  * took too long, we may have missed it. Do some checks
 938                  */
 939                 if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
 940                         /* vsync is enabled, see if we're in a new field */
 941                         if ((itv->last_vsync_field & 1) !=
 942                             (read_reg(IVTV_REG_DEC_LINE_FIELD) & 1)) {
 943                                 /* New field, looks like we missed it */
 944                                 IVTV_DEBUG_YUV("VSync interrupt missed %d\n",
 945                                        read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16);
 946                                 vsync_force = 1;
 947                         }
 948                 }
 949 
 950                 if (!vsync_force) {
 951                         /* No Vsync expected, wasn't for us */
 952                         spin_unlock(&itv->dma_reg_lock);
 953                         return IRQ_NONE;
 954                 }
 955         }
 956 
 957         /* Exclude interrupts noted below from the output, otherwise the log is flooded with
 958            these messages */
 959         if (combo & ~0xff6d0400)
 960                 IVTV_DEBUG_HI_IRQ("======= valid IRQ bits: 0x%08x ======\n", combo);
 961 
 962         if (combo & IVTV_IRQ_DEC_DMA_COMPLETE) {
 963                 IVTV_DEBUG_HI_IRQ("DEC DMA COMPLETE\n");
 964         }
 965 
 966         if (combo & IVTV_IRQ_DMA_READ) {
 967                 ivtv_irq_dma_read(itv);
 968         }
 969 
 970         if (combo & IVTV_IRQ_ENC_DMA_COMPLETE) {
 971                 ivtv_irq_enc_dma_complete(itv);
 972         }
 973 
 974         if (combo & IVTV_IRQ_ENC_PIO_COMPLETE) {
 975                 ivtv_irq_enc_pio_complete(itv);
 976         }
 977 
 978         if (combo & IVTV_IRQ_DMA_ERR) {
 979                 ivtv_irq_dma_err(itv);
 980         }
 981 
 982         if (combo & IVTV_IRQ_ENC_START_CAP) {
 983                 ivtv_irq_enc_start_cap(itv);
 984         }
 985 
 986         if (combo & IVTV_IRQ_ENC_VBI_CAP) {
 987                 ivtv_irq_enc_vbi_cap(itv);
 988         }
 989 
 990         if (combo & IVTV_IRQ_DEC_VBI_RE_INSERT) {
 991                 ivtv_irq_dec_vbi_reinsert(itv);
 992         }
 993 
 994         if (combo & IVTV_IRQ_ENC_EOS) {
 995                 IVTV_DEBUG_IRQ("ENC EOS\n");
 996                 set_bit(IVTV_F_I_EOS, &itv->i_flags);
 997                 wake_up(&itv->eos_waitq);
 998         }
 999 
1000         if (combo & IVTV_IRQ_DEC_DATA_REQ) {
1001                 ivtv_irq_dec_data_req(itv);
1002         }
1003 
1004         /* Decoder Vertical Sync - We can't rely on 'combo', so check if vsync enabled */
1005         if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
1006                 ivtv_irq_vsync(itv);
1007         }
1008 
1009         if (combo & IVTV_IRQ_ENC_VIM_RST) {
1010                 IVTV_DEBUG_IRQ("VIM RST\n");
1011                 /*ivtv_vapi(itv, CX2341X_ENC_REFRESH_INPUT, 0); */
1012         }
1013 
1014         if (combo & IVTV_IRQ_DEC_AUD_MODE_CHG) {
1015                 IVTV_DEBUG_INFO("Stereo mode changed\n");
1016         }
1017 
1018         if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
1019                 itv->irq_rr_idx++;
1020                 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1021                         int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
1022                         struct ivtv_stream *s = &itv->streams[idx];
1023 
1024                         if (!test_and_clear_bit(IVTV_F_S_DMA_PENDING, &s->s_flags))
1025                                 continue;
1026                         if (s->type >= IVTV_DEC_STREAM_TYPE_MPG)
1027                                 ivtv_dma_dec_start(s);
1028                         else
1029                                 ivtv_dma_enc_start(s);
1030                         break;
1031                 }
1032 
1033                 if (i == IVTV_MAX_STREAMS &&
1034                     test_bit(IVTV_F_I_UDMA_PENDING, &itv->i_flags))
1035                         ivtv_udma_start(itv);
1036         }
1037 
1038         if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_PIO, &itv->i_flags)) {
1039                 itv->irq_rr_idx++;
1040                 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
1041                         int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
1042                         struct ivtv_stream *s = &itv->streams[idx];
1043 
1044                         if (!test_and_clear_bit(IVTV_F_S_PIO_PENDING, &s->s_flags))
1045                                 continue;
1046                         if (s->type == IVTV_DEC_STREAM_TYPE_VBI || s->type < IVTV_DEC_STREAM_TYPE_MPG)
1047                                 ivtv_dma_enc_start(s);
1048                         break;
1049                 }
1050         }
1051 
1052         if (test_and_clear_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags)) {
1053                 kthread_queue_work(&itv->irq_worker, &itv->irq_work);
1054         }
1055 
1056         spin_unlock(&itv->dma_reg_lock);
1057 
1058         /* If we've just handled a 'forced' vsync, it's safest to say it
1059          * wasn't ours. Another device may have triggered it at just
1060          * the right time.
1061          */
1062         return vsync_force ? IRQ_NONE : IRQ_HANDLED;
1063 }
1064 
1065 void ivtv_unfinished_dma(struct timer_list *t)
1066 {
1067         struct ivtv *itv = from_timer(itv, t, dma_timer);
1068 
1069         if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
1070                 return;
1071         IVTV_ERR("DMA TIMEOUT %08x %d\n", read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream);
1072 
1073         write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
1074         clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
1075         clear_bit(IVTV_F_I_DMA, &itv->i_flags);
1076         itv->cur_dma_stream = -1;
1077         wake_up(&itv->dma_waitq);
1078 }

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