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