blob: dd0dd8d126de34668a399064abbb72346356f692 [file] [log] [blame]
Hans Verkuil1a0adaf2007-04-27 12:31:25 -03001/* 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"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030022#include "ivtv-queue.h"
23#include "ivtv-udma.h"
24#include "ivtv-irq.h"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030025#include "ivtv-mailbox.h"
26#include "ivtv-vbi.h"
Hans Verkuil1e13f9e2007-03-10 06:52:02 -030027#include "ivtv-yuv.h"
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030028
29#define DMA_MAGIC_COOKIE 0x000001fe
30
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030031static void ivtv_dma_dec_start(struct ivtv_stream *s);
32
33static const int ivtv_stream_map[] = {
34 IVTV_ENC_STREAM_TYPE_MPG,
35 IVTV_ENC_STREAM_TYPE_YUV,
36 IVTV_ENC_STREAM_TYPE_PCM,
37 IVTV_ENC_STREAM_TYPE_VBI,
38};
39
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030040
Hans Verkuildc02d502007-05-19 14:07:16 -030041static void ivtv_pio_work_handler(struct ivtv *itv)
42{
43 struct ivtv_stream *s = &itv->streams[itv->cur_pio_stream];
44 struct ivtv_buffer *buf;
Hans Verkuildc02d502007-05-19 14:07:16 -030045 int i = 0;
46
Hans Verkuilbd58df62007-07-10 17:47:07 -030047 IVTV_DEBUG_HI_DMA("ivtv_pio_work_handler\n");
Hans Verkuildc02d502007-05-19 14:07:16 -030048 if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS ||
49 s->v4l2dev == NULL || !ivtv_use_pio(s)) {
50 itv->cur_pio_stream = -1;
51 /* trigger PIO complete user interrupt */
52 write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
53 return;
54 }
Hans Verkuilbd58df62007-07-10 17:47:07 -030055 IVTV_DEBUG_HI_DMA("Process PIO %s\n", s->name);
Trent Piepho805a4392007-10-10 05:37:41 -030056 list_for_each_entry(buf, &s->q_dma.list, list) {
Hans Verkuil37093b12007-07-28 19:45:50 -030057 u32 size = s->sg_processing[i].size & 0x3ffff;
Hans Verkuildc02d502007-05-19 14:07:16 -030058
59 /* Copy the data from the card to the buffer */
60 if (s->type == IVTV_DEC_STREAM_TYPE_VBI) {
Hans Verkuil37093b12007-07-28 19:45:50 -030061 memcpy_fromio(buf->buf, itv->dec_mem + s->sg_processing[i].src - IVTV_DECODER_OFFSET, size);
Hans Verkuildc02d502007-05-19 14:07:16 -030062 }
63 else {
Hans Verkuil37093b12007-07-28 19:45:50 -030064 memcpy_fromio(buf->buf, itv->enc_mem + s->sg_processing[i].src, size);
Hans Verkuildc02d502007-05-19 14:07:16 -030065 }
Hans Verkuildc02d502007-05-19 14:07:16 -030066 i++;
Hans Verkuil37093b12007-07-28 19:45:50 -030067 if (i == s->sg_processing_size)
68 break;
Hans Verkuildc02d502007-05-19 14:07:16 -030069 }
70 write_reg(IVTV_IRQ_ENC_PIO_COMPLETE, 0x44);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030071}
72
Hans Verkuil1e13f9e2007-03-10 06:52:02 -030073void ivtv_irq_work_handler(struct work_struct *work)
74{
75 struct ivtv *itv = container_of(work, struct ivtv, irq_work_queue);
76
77 DEFINE_WAIT(wait);
78
Hans Verkuildc02d502007-05-19 14:07:16 -030079 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags))
80 ivtv_pio_work_handler(itv);
81
Hans Verkuil1e13f9e2007-03-10 06:52:02 -030082 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags))
Hans Verkuildc02d502007-05-19 14:07:16 -030083 ivtv_vbi_work_handler(itv);
Hans Verkuil1e13f9e2007-03-10 06:52:02 -030084
85 if (test_and_clear_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags))
86 ivtv_yuv_work_handler(itv);
87}
88
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030089/* Determine the required DMA size, setup enough buffers in the predma queue and
90 actually copy the data from the card to the buffers in case a PIO transfer is
91 required for this stream.
92 */
93static int stream_enc_dma_append(struct ivtv_stream *s, u32 data[CX2341X_MBOX_MAX_DATA])
94{
95 struct ivtv *itv = s->itv;
96 struct ivtv_buffer *buf;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -030097 u32 bytes_needed = 0;
98 u32 offset, size;
99 u32 UVoffset = 0, UVsize = 0;
100 int skip_bufs = s->q_predma.buffers;
Hans Verkuil37093b12007-07-28 19:45:50 -0300101 int idx = s->sg_pending_size;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300102 int rc;
103
104 /* sanity checks */
105 if (s->v4l2dev == NULL) {
106 IVTV_DEBUG_WARN("Stream %s not started\n", s->name);
107 return -1;
108 }
109 if (!test_bit(IVTV_F_S_CLAIMED, &s->s_flags)) {
110 IVTV_DEBUG_WARN("Stream %s not open\n", s->name);
111 return -1;
112 }
113
114 /* determine offset, size and PTS for the various streams */
115 switch (s->type) {
116 case IVTV_ENC_STREAM_TYPE_MPG:
117 offset = data[1];
118 size = data[2];
Hans Verkuil37093b12007-07-28 19:45:50 -0300119 s->pending_pts = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300120 break;
121
122 case IVTV_ENC_STREAM_TYPE_YUV:
123 offset = data[1];
124 size = data[2];
125 UVoffset = data[3];
126 UVsize = data[4];
Hans Verkuil37093b12007-07-28 19:45:50 -0300127 s->pending_pts = ((u64) data[5] << 32) | data[6];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300128 break;
129
130 case IVTV_ENC_STREAM_TYPE_PCM:
131 offset = data[1] + 12;
132 size = data[2] - 12;
Hans Verkuil37093b12007-07-28 19:45:50 -0300133 s->pending_pts = read_dec(offset - 8) |
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300134 ((u64)(read_dec(offset - 12)) << 32);
135 if (itv->has_cx23415)
136 offset += IVTV_DECODER_OFFSET;
137 break;
138
139 case IVTV_ENC_STREAM_TYPE_VBI:
140 size = itv->vbi.enc_size * itv->vbi.fpi;
141 offset = read_enc(itv->vbi.enc_start - 4) + 12;
142 if (offset == 12) {
143 IVTV_DEBUG_INFO("VBI offset == 0\n");
144 return -1;
145 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300146 s->pending_pts = read_enc(offset - 4) | ((u64)read_enc(offset - 8) << 32);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300147 break;
148
149 case IVTV_DEC_STREAM_TYPE_VBI:
150 size = read_dec(itv->vbi.dec_start + 4) + 8;
151 offset = read_dec(itv->vbi.dec_start) + itv->vbi.dec_start;
Hans Verkuil37093b12007-07-28 19:45:50 -0300152 s->pending_pts = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300153 offset += IVTV_DECODER_OFFSET;
154 break;
155 default:
156 /* shouldn't happen */
157 return -1;
158 }
159
160 /* if this is the start of the DMA then fill in the magic cookie */
Hans Verkuil51a99c02007-08-18 15:16:00 -0300161 if (s->sg_pending_size == 0 && ivtv_use_dma(s)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300162 if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
163 s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
Hans Verkuil37093b12007-07-28 19:45:50 -0300164 s->pending_backup = read_dec(offset - IVTV_DECODER_OFFSET);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300165 write_dec_sync(cpu_to_le32(DMA_MAGIC_COOKIE), offset - IVTV_DECODER_OFFSET);
166 }
167 else {
Hans Verkuil37093b12007-07-28 19:45:50 -0300168 s->pending_backup = read_enc(offset);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300169 write_enc_sync(cpu_to_le32(DMA_MAGIC_COOKIE), offset);
170 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300171 s->pending_offset = offset;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300172 }
173
174 bytes_needed = size;
175 if (s->type == IVTV_ENC_STREAM_TYPE_YUV) {
176 /* The size for the Y samples needs to be rounded upwards to a
177 multiple of the buf_size. The UV samples then start in the
178 next buffer. */
179 bytes_needed = s->buf_size * ((bytes_needed + s->buf_size - 1) / s->buf_size);
180 bytes_needed += UVsize;
181 }
182
Hans Verkuilbd58df62007-07-10 17:47:07 -0300183 IVTV_DEBUG_HI_DMA("%s %s: 0x%08x bytes at 0x%08x\n",
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300184 ivtv_use_pio(s) ? "PIO" : "DMA", s->name, bytes_needed, offset);
185
186 rc = ivtv_queue_move(s, &s->q_free, &s->q_full, &s->q_predma, bytes_needed);
187 if (rc < 0) { /* Insufficient buffers */
188 IVTV_DEBUG_WARN("Cannot obtain %d bytes for %s data transfer\n",
189 bytes_needed, s->name);
190 return -1;
191 }
192 if (rc && !s->buffers_stolen && (s->s_flags & IVTV_F_S_APPL_IO)) {
193 IVTV_WARN("All %s stream buffers are full. Dropping data.\n", s->name);
194 IVTV_WARN("Cause: the application is not reading fast enough.\n");
195 }
196 s->buffers_stolen = rc;
197
Hans Verkuil37093b12007-07-28 19:45:50 -0300198 /* got the buffers, now fill in sg_pending */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300199 buf = list_entry(s->q_predma.list.next, struct ivtv_buffer, list);
200 memset(buf->buf, 0, 128);
Trent Piepho805a4392007-10-10 05:37:41 -0300201 list_for_each_entry(buf, &s->q_predma.list, list) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300202 if (skip_bufs-- > 0)
203 continue;
Hans Verkuil37093b12007-07-28 19:45:50 -0300204 s->sg_pending[idx].dst = buf->dma_handle;
205 s->sg_pending[idx].src = offset;
206 s->sg_pending[idx].size = s->buf_size;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300207 buf->bytesused = (size < s->buf_size) ? size : s->buf_size;
Hans Verkuilf4071b82007-07-28 12:07:12 -0300208 buf->dma_xfer_cnt = s->dma_xfer_cnt;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300209
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300210 s->q_predma.bytesused += buf->bytesused;
211 size -= buf->bytesused;
212 offset += s->buf_size;
213
214 /* Sync SG buffers */
215 ivtv_buf_sync_for_device(s, buf);
216
217 if (size == 0) { /* YUV */
218 /* process the UV section */
219 offset = UVoffset;
220 size = UVsize;
221 }
222 idx++;
223 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300224 s->sg_pending_size = idx;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300225 return 0;
226}
227
228static void dma_post(struct ivtv_stream *s)
229{
230 struct ivtv *itv = s->itv;
231 struct ivtv_buffer *buf = NULL;
232 struct list_head *p;
233 u32 offset;
234 u32 *u32buf;
235 int x = 0;
236
Hans Verkuilbd58df62007-07-10 17:47:07 -0300237 IVTV_DEBUG_HI_DMA("%s %s completed (%x)\n", ivtv_use_pio(s) ? "PIO" : "DMA",
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300238 s->name, s->dma_offset);
239 list_for_each(p, &s->q_dma.list) {
240 buf = list_entry(p, struct ivtv_buffer, list);
241 u32buf = (u32 *)buf->buf;
242
243 /* Sync Buffer */
244 ivtv_buf_sync_for_cpu(s, buf);
245
Hans Verkuil51a99c02007-08-18 15:16:00 -0300246 if (x == 0 && ivtv_use_dma(s)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300247 offset = s->dma_last_offset;
248 if (u32buf[offset / 4] != DMA_MAGIC_COOKIE)
249 {
250 for (offset = 0; offset < 64; offset++) {
251 if (u32buf[offset] == DMA_MAGIC_COOKIE) {
252 break;
253 }
254 }
255 offset *= 4;
256 if (offset == 256) {
257 IVTV_DEBUG_WARN("%s: Couldn't find start of buffer within the first 256 bytes\n", s->name);
258 offset = s->dma_last_offset;
259 }
260 if (s->dma_last_offset != offset)
261 IVTV_DEBUG_WARN("%s: offset %d -> %d\n", s->name, s->dma_last_offset, offset);
262 s->dma_last_offset = offset;
263 }
264 if (itv->has_cx23415 && (s->type == IVTV_ENC_STREAM_TYPE_PCM ||
265 s->type == IVTV_DEC_STREAM_TYPE_VBI)) {
266 write_dec_sync(0, s->dma_offset - IVTV_DECODER_OFFSET);
267 }
268 else {
269 write_enc_sync(0, s->dma_offset);
270 }
271 if (offset) {
272 buf->bytesused -= offset;
273 memcpy(buf->buf, buf->buf + offset, buf->bytesused + offset);
274 }
275 *u32buf = cpu_to_le32(s->dma_backup);
276 }
277 x++;
278 /* flag byteswap ABCD -> DCBA for MPG & VBI data outside irq */
279 if (s->type == IVTV_ENC_STREAM_TYPE_MPG ||
280 s->type == IVTV_ENC_STREAM_TYPE_VBI)
Hans Verkuilf4071b82007-07-28 12:07:12 -0300281 buf->b_flags |= IVTV_F_B_NEED_BUF_SWAP;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300282 }
283 if (buf)
284 buf->bytesused += s->dma_last_offset;
285 if (buf && s->type == IVTV_DEC_STREAM_TYPE_VBI) {
Trent Piepho805a4392007-10-10 05:37:41 -0300286 list_for_each_entry(buf, &s->q_dma.list, list) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300287 /* Parse and Groom VBI Data */
288 s->q_dma.bytesused -= buf->bytesused;
289 ivtv_process_vbi_data(itv, buf, 0, s->type);
290 s->q_dma.bytesused += buf->bytesused;
291 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300292 if (s->id == -1) {
293 ivtv_queue_move(s, &s->q_dma, NULL, &s->q_free, 0);
294 return;
295 }
296 }
297 ivtv_queue_move(s, &s->q_dma, NULL, &s->q_full, s->q_dma.bytesused);
298 if (s->id != -1)
299 wake_up(&s->waitq);
300}
301
302void ivtv_dma_stream_dec_prepare(struct ivtv_stream *s, u32 offset, int lock)
303{
304 struct ivtv *itv = s->itv;
305 struct ivtv_buffer *buf;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300306 u32 y_size = itv->params.height * itv->params.width;
307 u32 uv_offset = offset + IVTV_YUV_BUFFER_UV_OFFSET;
308 int y_done = 0;
309 int bytes_written = 0;
310 unsigned long flags = 0;
311 int idx = 0;
312
Hans Verkuilbd58df62007-07-10 17:47:07 -0300313 IVTV_DEBUG_HI_DMA("DEC PREPARE DMA %s: %08x %08x\n", s->name, s->q_predma.bytesused, offset);
Trent Piepho805a4392007-10-10 05:37:41 -0300314 list_for_each_entry(buf, &s->q_predma.list, list) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300315 /* YUV UV Offset from Y Buffer */
Ian Armstrongc240ad02007-10-16 03:21:46 -0300316 if (s->type == IVTV_DEC_STREAM_TYPE_YUV && !y_done &&
317 (bytes_written + buf->bytesused) >= y_size) {
318 s->sg_pending[idx].src = buf->dma_handle;
319 s->sg_pending[idx].dst = offset;
320 s->sg_pending[idx].size = y_size - bytes_written;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300321 offset = uv_offset;
Ian Armstrongc240ad02007-10-16 03:21:46 -0300322 if (s->sg_pending[idx].size != buf->bytesused) {
323 idx++;
324 s->sg_pending[idx].src =
325 buf->dma_handle + s->sg_pending[idx - 1].size;
326 s->sg_pending[idx].dst = offset;
327 s->sg_pending[idx].size =
328 buf->bytesused - s->sg_pending[idx - 1].size;
329 offset += s->sg_pending[idx].size;
330 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300331 y_done = 1;
Ian Armstrongc240ad02007-10-16 03:21:46 -0300332 } else {
333 s->sg_pending[idx].src = buf->dma_handle;
334 s->sg_pending[idx].dst = offset;
335 s->sg_pending[idx].size = buf->bytesused;
336 offset += buf->bytesused;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300337 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300338 bytes_written += buf->bytesused;
339
340 /* Sync SG buffers */
341 ivtv_buf_sync_for_device(s, buf);
342 idx++;
343 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300344 s->sg_pending_size = idx;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300345
346 /* Sync Hardware SG List of buffers */
347 ivtv_stream_sync_for_device(s);
348 if (lock)
349 spin_lock_irqsave(&itv->dma_reg_lock, flags);
350 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
351 ivtv_dma_dec_start(s);
352 }
353 else {
354 set_bit(IVTV_F_S_DMA_PENDING, &s->s_flags);
355 }
356 if (lock)
357 spin_unlock_irqrestore(&itv->dma_reg_lock, flags);
358}
359
Hans Verkuil37093b12007-07-28 19:45:50 -0300360static void ivtv_dma_enc_start_xfer(struct ivtv_stream *s)
361{
362 struct ivtv *itv = s->itv;
363
364 s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
365 s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
366 s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
367 s->sg_processed++;
368 /* Sync Hardware SG List of buffers */
369 ivtv_stream_sync_for_device(s);
370 write_reg(s->sg_handle, IVTV_REG_ENCDMAADDR);
371 write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x02, IVTV_REG_DMAXFER);
372}
373
374static void ivtv_dma_dec_start_xfer(struct ivtv_stream *s)
375{
376 struct ivtv *itv = s->itv;
377
378 s->sg_dma->src = cpu_to_le32(s->sg_processing[s->sg_processed].src);
379 s->sg_dma->dst = cpu_to_le32(s->sg_processing[s->sg_processed].dst);
380 s->sg_dma->size = cpu_to_le32(s->sg_processing[s->sg_processed].size | 0x80000000);
381 s->sg_processed++;
382 /* Sync Hardware SG List of buffers */
383 ivtv_stream_sync_for_device(s);
384 write_reg(s->sg_handle, IVTV_REG_DECDMAADDR);
385 write_reg_sync(read_reg(IVTV_REG_DMAXFER) | 0x01, IVTV_REG_DMAXFER);
386}
387
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300388/* start the encoder DMA */
389static void ivtv_dma_enc_start(struct ivtv_stream *s)
390{
391 struct ivtv *itv = s->itv;
392 struct ivtv_stream *s_vbi = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
393 int i;
394
Hans Verkuilbd58df62007-07-10 17:47:07 -0300395 IVTV_DEBUG_HI_DMA("start %s for %s\n", ivtv_use_dma(s) ? "DMA" : "PIO", s->name);
Hans Verkuildc02d502007-05-19 14:07:16 -0300396
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300397 if (s->q_predma.bytesused)
398 ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
Hans Verkuildc02d502007-05-19 14:07:16 -0300399
400 if (ivtv_use_dma(s))
Hans Verkuil37093b12007-07-28 19:45:50 -0300401 s->sg_pending[s->sg_pending_size - 1].size += 256;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300402
403 /* If this is an MPEG stream, and VBI data is also pending, then append the
404 VBI DMA to the MPEG DMA and transfer both sets of data at once.
405
406 VBI DMA is a second class citizen compared to MPEG and mixing them together
407 will confuse the firmware (the end of a VBI DMA is seen as the end of a
408 MPEG DMA, thus effectively dropping an MPEG frame). So instead we make
409 sure we only use the MPEG DMA to transfer the VBI DMA if both are in
410 use. This way no conflicts occur. */
411 clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
Hans Verkuil37093b12007-07-28 19:45:50 -0300412 if (s->type == IVTV_ENC_STREAM_TYPE_MPG && s_vbi->sg_pending_size &&
413 s->sg_pending_size + s_vbi->sg_pending_size <= s->buffers) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300414 ivtv_queue_move(s_vbi, &s_vbi->q_predma, NULL, &s_vbi->q_dma, s_vbi->q_predma.bytesused);
Hans Verkuildc02d502007-05-19 14:07:16 -0300415 if (ivtv_use_dma(s_vbi))
Hans Verkuil37093b12007-07-28 19:45:50 -0300416 s_vbi->sg_pending[s_vbi->sg_pending_size - 1].size += 256;
417 for (i = 0; i < s_vbi->sg_pending_size; i++) {
418 s->sg_pending[s->sg_pending_size++] = s_vbi->sg_pending[i];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300419 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300420 s_vbi->dma_offset = s_vbi->pending_offset;
421 s_vbi->sg_pending_size = 0;
Hans Verkuilf4071b82007-07-28 12:07:12 -0300422 s_vbi->dma_xfer_cnt++;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300423 set_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags);
Hans Verkuilbd58df62007-07-10 17:47:07 -0300424 IVTV_DEBUG_HI_DMA("include DMA for %s\n", s->name);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300425 }
426
Hans Verkuilf4071b82007-07-28 12:07:12 -0300427 s->dma_xfer_cnt++;
Hans Verkuil37093b12007-07-28 19:45:50 -0300428 memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_element) * s->sg_pending_size);
429 s->sg_processing_size = s->sg_pending_size;
430 s->sg_pending_size = 0;
431 s->sg_processed = 0;
432 s->dma_offset = s->pending_offset;
433 s->dma_backup = s->pending_backup;
434 s->dma_pts = s->pending_pts;
Hans Verkuildd1e7292007-07-18 13:22:06 -0300435
Hans Verkuildc02d502007-05-19 14:07:16 -0300436 if (ivtv_use_pio(s)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300437 set_bit(IVTV_F_I_WORK_HANDLER_PIO, &itv->i_flags);
438 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
439 set_bit(IVTV_F_I_PIO, &itv->i_flags);
440 itv->cur_pio_stream = s->type;
441 }
442 else {
Hans Verkuil37093b12007-07-28 19:45:50 -0300443 itv->dma_retries = 0;
444 ivtv_dma_enc_start_xfer(s);
Hans Verkuildc02d502007-05-19 14:07:16 -0300445 set_bit(IVTV_F_I_DMA, &itv->i_flags);
446 itv->cur_dma_stream = s->type;
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300447 itv->dma_timer.expires = jiffies + msecs_to_jiffies(100);
Hans Verkuildc02d502007-05-19 14:07:16 -0300448 add_timer(&itv->dma_timer);
449 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300450}
451
452static void ivtv_dma_dec_start(struct ivtv_stream *s)
453{
454 struct ivtv *itv = s->itv;
455
456 if (s->q_predma.bytesused)
457 ivtv_queue_move(s, &s->q_predma, NULL, &s->q_dma, s->q_predma.bytesused);
Hans Verkuil37093b12007-07-28 19:45:50 -0300458 s->dma_xfer_cnt++;
459 memcpy(s->sg_processing, s->sg_pending, sizeof(struct ivtv_sg_element) * s->sg_pending_size);
460 s->sg_processing_size = s->sg_pending_size;
461 s->sg_pending_size = 0;
462 s->sg_processed = 0;
463
Hans Verkuilbd58df62007-07-10 17:47:07 -0300464 IVTV_DEBUG_HI_DMA("start DMA for %s\n", s->name);
Hans Verkuil37093b12007-07-28 19:45:50 -0300465 itv->dma_retries = 0;
466 ivtv_dma_dec_start_xfer(s);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300467 set_bit(IVTV_F_I_DMA, &itv->i_flags);
468 itv->cur_dma_stream = s->type;
Mauro Carvalho Chehab201700d2007-07-19 11:21:04 -0300469 itv->dma_timer.expires = jiffies + msecs_to_jiffies(100);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300470 add_timer(&itv->dma_timer);
471}
472
473static void ivtv_irq_dma_read(struct ivtv *itv)
474{
475 struct ivtv_stream *s = NULL;
476 struct ivtv_buffer *buf;
Hans Verkuil37093b12007-07-28 19:45:50 -0300477 int hw_stream_type = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300478
Hans Verkuilbd58df62007-07-10 17:47:07 -0300479 IVTV_DEBUG_HI_IRQ("DEC DMA READ\n");
Hans Verkuil37093b12007-07-28 19:45:50 -0300480 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) && itv->cur_dma_stream < 0) {
481 del_timer(&itv->dma_timer);
482 return;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300483 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300484
Hans Verkuil37093b12007-07-28 19:45:50 -0300485 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
486 s = &itv->streams[itv->cur_dma_stream];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300487 ivtv_stream_sync_for_cpu(s);
488
Hans Verkuil37093b12007-07-28 19:45:50 -0300489 if (read_reg(IVTV_REG_DMASTATUS) & 0x14) {
490 IVTV_DEBUG_WARN("DEC DMA ERROR %x (xfer %d of %d, retry %d)\n",
491 read_reg(IVTV_REG_DMASTATUS),
492 s->sg_processed, s->sg_processing_size, itv->dma_retries);
493 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
494 if (itv->dma_retries == 3) {
Hans Verkuile17a06b2007-08-18 15:48:42 -0300495 /* Too many retries, give up on this frame */
Hans Verkuil37093b12007-07-28 19:45:50 -0300496 itv->dma_retries = 0;
Hans Verkuile17a06b2007-08-18 15:48:42 -0300497 s->sg_processed = s->sg_processing_size;
Hans Verkuil37093b12007-07-28 19:45:50 -0300498 }
499 else {
500 /* Retry, starting with the first xfer segment.
501 Just retrying the current segment is not sufficient. */
502 s->sg_processed = 0;
503 itv->dma_retries++;
504 }
505 }
506 if (s->sg_processed < s->sg_processing_size) {
507 /* DMA next buffer */
508 ivtv_dma_dec_start_xfer(s);
509 return;
510 }
511 if (s->type == IVTV_DEC_STREAM_TYPE_YUV)
512 hw_stream_type = 2;
513 IVTV_DEBUG_HI_DMA("DEC DATA READ %s: %d\n", s->name, s->q_dma.bytesused);
514
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300515 /* For some reason must kick the firmware, like PIO mode,
516 I think this tells the firmware we are done and the size
517 of the xfer so it can calculate what we need next.
518 I think we can do this part ourselves but would have to
519 fully calculate xfer info ourselves and not use interrupts
520 */
521 ivtv_vapi(itv, CX2341X_DEC_SCHED_DMA_FROM_HOST, 3, 0, s->q_dma.bytesused,
522 hw_stream_type);
523
524 /* Free last DMA call */
525 while ((buf = ivtv_dequeue(s, &s->q_dma)) != NULL) {
526 ivtv_buf_sync_for_cpu(s, buf);
527 ivtv_enqueue(s, buf, &s->q_free);
528 }
529 wake_up(&s->waitq);
530 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300531 del_timer(&itv->dma_timer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300532 clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
533 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
534 itv->cur_dma_stream = -1;
535 wake_up(&itv->dma_waitq);
536}
537
538static void ivtv_irq_enc_dma_complete(struct ivtv *itv)
539{
540 u32 data[CX2341X_MBOX_MAX_DATA];
541 struct ivtv_stream *s;
542
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300543 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, data);
Hans Verkuil37093b12007-07-28 19:45:50 -0300544 IVTV_DEBUG_HI_IRQ("ENC DMA COMPLETE %x %d (%d)\n", data[0], data[1], itv->cur_dma_stream);
545 if (itv->cur_dma_stream < 0) {
546 del_timer(&itv->dma_timer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300547 return;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300548 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300549 s = &itv->streams[itv->cur_dma_stream];
550 ivtv_stream_sync_for_cpu(s);
551
552 if (data[0] & 0x18) {
553 IVTV_DEBUG_WARN("ENC DMA ERROR %x (offset %08x, xfer %d of %d, retry %d)\n", data[0],
554 s->dma_offset, s->sg_processed, s->sg_processing_size, itv->dma_retries);
555 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
556 if (itv->dma_retries == 3) {
Hans Verkuile17a06b2007-08-18 15:48:42 -0300557 /* Too many retries, give up on this frame */
Hans Verkuil37093b12007-07-28 19:45:50 -0300558 itv->dma_retries = 0;
Hans Verkuile17a06b2007-08-18 15:48:42 -0300559 s->sg_processed = s->sg_processing_size;
Hans Verkuil37093b12007-07-28 19:45:50 -0300560 }
561 else {
562 /* Retry, starting with the first xfer segment.
563 Just retrying the current segment is not sufficient. */
564 s->sg_processed = 0;
565 itv->dma_retries++;
566 }
567 }
568 if (s->sg_processed < s->sg_processing_size) {
569 /* DMA next buffer */
570 ivtv_dma_enc_start_xfer(s);
571 return;
572 }
573 del_timer(&itv->dma_timer);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300574 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
575 itv->cur_dma_stream = -1;
576 dma_post(s);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300577 if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300578 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300579 dma_post(s);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300580 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300581 s->sg_processing_size = 0;
582 s->sg_processed = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300583 wake_up(&itv->dma_waitq);
584}
585
Hans Verkuildc02d502007-05-19 14:07:16 -0300586static void ivtv_irq_enc_pio_complete(struct ivtv *itv)
587{
588 struct ivtv_stream *s;
589
590 if (itv->cur_pio_stream < 0 || itv->cur_pio_stream >= IVTV_MAX_STREAMS) {
591 itv->cur_pio_stream = -1;
592 return;
593 }
594 s = &itv->streams[itv->cur_pio_stream];
Hans Verkuilbd58df62007-07-10 17:47:07 -0300595 IVTV_DEBUG_HI_IRQ("ENC PIO COMPLETE %s\n", s->name);
Hans Verkuildc02d502007-05-19 14:07:16 -0300596 clear_bit(IVTV_F_I_PIO, &itv->i_flags);
597 itv->cur_pio_stream = -1;
598 dma_post(s);
599 if (s->type == IVTV_ENC_STREAM_TYPE_MPG)
600 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 0);
601 else if (s->type == IVTV_ENC_STREAM_TYPE_YUV)
602 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 1);
603 else if (s->type == IVTV_ENC_STREAM_TYPE_PCM)
604 ivtv_vapi(itv, CX2341X_ENC_SCHED_DMA_TO_HOST, 3, 0, 0, 2);
605 clear_bit(IVTV_F_I_PIO, &itv->i_flags);
606 if (test_and_clear_bit(IVTV_F_S_DMA_HAS_VBI, &s->s_flags)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300607 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
Hans Verkuildc02d502007-05-19 14:07:16 -0300608 dma_post(s);
Hans Verkuildc02d502007-05-19 14:07:16 -0300609 }
610 wake_up(&itv->dma_waitq);
611}
612
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300613static void ivtv_irq_dma_err(struct ivtv *itv)
614{
615 u32 data[CX2341X_MBOX_MAX_DATA];
616
617 del_timer(&itv->dma_timer);
618 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA_END, data);
619 IVTV_DEBUG_WARN("DMA ERROR %08x %08x %08x %d\n", data[0], data[1],
Hans Verkuil37093b12007-07-28 19:45:50 -0300620 read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream);
621 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300622 if (!test_bit(IVTV_F_I_UDMA, &itv->i_flags) &&
623 itv->cur_dma_stream >= 0 && itv->cur_dma_stream < IVTV_MAX_STREAMS) {
624 struct ivtv_stream *s = &itv->streams[itv->cur_dma_stream];
625
626 /* retry */
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300627 if (s->type >= IVTV_DEC_STREAM_TYPE_MPG)
628 ivtv_dma_dec_start(s);
629 else
630 ivtv_dma_enc_start(s);
631 return;
632 }
Hans Verkuil37093b12007-07-28 19:45:50 -0300633 if (test_bit(IVTV_F_I_UDMA, &itv->i_flags)) {
634 ivtv_udma_start(itv);
635 return;
636 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300637 clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
638 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
639 itv->cur_dma_stream = -1;
640 wake_up(&itv->dma_waitq);
641}
642
643static void ivtv_irq_enc_start_cap(struct ivtv *itv)
644{
645 u32 data[CX2341X_MBOX_MAX_DATA];
646 struct ivtv_stream *s;
647
648 /* Get DMA destination and size arguments from card */
649 ivtv_api_get_data(&itv->enc_mbox, IVTV_MBOX_DMA, data);
Hans Verkuilbd58df62007-07-10 17:47:07 -0300650 IVTV_DEBUG_HI_IRQ("ENC START CAP %d: %08x %08x\n", data[0], data[1], data[2]);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300651
652 if (data[0] > 2 || data[1] == 0 || data[2] == 0) {
653 IVTV_DEBUG_WARN("Unknown input: %08x %08x %08x\n",
654 data[0], data[1], data[2]);
655 return;
656 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300657 s = &itv->streams[ivtv_stream_map[data[0]]];
658 if (!stream_enc_dma_append(s, data)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300659 set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300660 }
661}
662
663static void ivtv_irq_enc_vbi_cap(struct ivtv *itv)
664{
665 struct ivtv_stream *s_mpg = &itv->streams[IVTV_ENC_STREAM_TYPE_MPG];
666 u32 data[CX2341X_MBOX_MAX_DATA];
667 struct ivtv_stream *s;
668
Hans Verkuilbd58df62007-07-10 17:47:07 -0300669 IVTV_DEBUG_HI_IRQ("ENC START VBI CAP\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300670 s = &itv->streams[IVTV_ENC_STREAM_TYPE_VBI];
671
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300672 /* If more than two VBI buffers are pending, then
673 clear the old ones and start with this new one.
674 This can happen during transition stages when MPEG capturing is
675 started, but the first interrupts haven't arrived yet. During
676 that period VBI requests can accumulate without being able to
677 DMA the data. Since at most four VBI DMA buffers are available,
678 we just drop the old requests when there are already three
679 requests queued. */
Hans Verkuil37093b12007-07-28 19:45:50 -0300680 if (s->sg_pending_size > 2) {
Trent Piepho805a4392007-10-10 05:37:41 -0300681 struct ivtv_buffer *buf;
682 list_for_each_entry(buf, &s->q_predma.list, list)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300683 ivtv_buf_sync_for_cpu(s, buf);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300684 ivtv_queue_move(s, &s->q_predma, NULL, &s->q_free, 0);
Hans Verkuil37093b12007-07-28 19:45:50 -0300685 s->sg_pending_size = 0;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300686 }
687 /* if we can append the data, and the MPEG stream isn't capturing,
688 then start a DMA request for just the VBI data. */
689 if (!stream_enc_dma_append(s, data) &&
690 !test_bit(IVTV_F_S_STREAMING, &s_mpg->s_flags)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300691 set_bit(ivtv_use_pio(s) ? IVTV_F_S_PIO_PENDING : IVTV_F_S_DMA_PENDING, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300692 }
693}
694
Hans Verkuildc02d502007-05-19 14:07:16 -0300695static void ivtv_irq_dec_vbi_reinsert(struct ivtv *itv)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300696{
697 u32 data[CX2341X_MBOX_MAX_DATA];
698 struct ivtv_stream *s = &itv->streams[IVTV_DEC_STREAM_TYPE_VBI];
699
Hans Verkuilbd58df62007-07-10 17:47:07 -0300700 IVTV_DEBUG_HI_IRQ("DEC VBI REINSERT\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300701 if (test_bit(IVTV_F_S_CLAIMED, &s->s_flags) &&
702 !stream_enc_dma_append(s, data)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300703 set_bit(IVTV_F_S_PIO_PENDING, &s->s_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300704 }
705}
706
707static void ivtv_irq_dec_data_req(struct ivtv *itv)
708{
709 u32 data[CX2341X_MBOX_MAX_DATA];
710 struct ivtv_stream *s;
711
712 /* YUV or MPG */
713 ivtv_api_get_data(&itv->dec_mbox, IVTV_MBOX_DMA, data);
714
715 if (test_bit(IVTV_F_I_DEC_YUV, &itv->i_flags)) {
716 itv->dma_data_req_size = itv->params.width * itv->params.height * 3 / 2;
717 itv->dma_data_req_offset = data[1] ? data[1] : yuv_offset[0];
718 s = &itv->streams[IVTV_DEC_STREAM_TYPE_YUV];
719 }
720 else {
721 itv->dma_data_req_size = data[2] >= 0x10000 ? 0x10000 : data[2];
722 itv->dma_data_req_offset = data[1];
723 s = &itv->streams[IVTV_DEC_STREAM_TYPE_MPG];
724 }
Hans Verkuilbd58df62007-07-10 17:47:07 -0300725 IVTV_DEBUG_HI_IRQ("DEC DATA REQ %s: %d %08x %u\n", s->name, s->q_full.bytesused,
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300726 itv->dma_data_req_offset, itv->dma_data_req_size);
727 if (itv->dma_data_req_size == 0 || s->q_full.bytesused < itv->dma_data_req_size) {
728 set_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
729 }
730 else {
731 clear_bit(IVTV_F_S_NEEDS_DATA, &s->s_flags);
732 ivtv_queue_move(s, &s->q_full, NULL, &s->q_predma, itv->dma_data_req_size);
733 ivtv_dma_stream_dec_prepare(s, itv->dma_data_req_offset + IVTV_DECODER_OFFSET, 0);
734 }
735}
736
737static void ivtv_irq_vsync(struct ivtv *itv)
738{
739 /* The vsync interrupt is unusual in that it won't clear until
740 * the end of the first line for the current field, at which
741 * point it clears itself. This can result in repeated vsync
742 * interrupts, or a missed vsync. Read some of the registers
743 * to determine the line being displayed and ensure we handle
744 * one vsync per frame.
745 */
746 unsigned int frame = read_reg(0x28c0) & 1;
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300747 struct yuv_playback_info *yi = &itv->yuv_info;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300748 int last_dma_frame = atomic_read(&itv->yuv_info.next_dma_frame);
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300749 struct yuv_frame_info *f = &yi->new_frame_info[last_dma_frame];
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300750
751 if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
752
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300753 if (((frame ^ f->sync_field) == 0 &&
754 ((itv->last_vsync_field & 1) ^ f->sync_field)) ||
755 (frame != (itv->last_vsync_field & 1) && !f->interlaced)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300756 int next_dma_frame = last_dma_frame;
757
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300758 if (!(f->interlaced && f->delay && yi->fields_lapsed < 1)) {
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300759 if (next_dma_frame >= 0 && next_dma_frame != atomic_read(&yi->next_fill_frame)) {
Ian Armstrongbfd7bea2007-08-03 10:01:39 -0300760 write_reg(yuv_offset[next_dma_frame] >> 4, 0x82c);
761 write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x830);
762 write_reg(yuv_offset[next_dma_frame] >> 4, 0x834);
763 write_reg((yuv_offset[next_dma_frame] + IVTV_YUV_BUFFER_UV_OFFSET) >> 4, 0x838);
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300764 next_dma_frame = (next_dma_frame + 1) % IVTV_YUV_BUFFERS;
765 atomic_set(&yi->next_dma_frame, next_dma_frame);
766 yi->fields_lapsed = -1;
Ian Armstrongbfd7bea2007-08-03 10:01:39 -0300767 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300768 }
769 }
Hans Verkuila158f352007-08-23 11:31:57 -0300770 if (frame != (itv->last_vsync_field & 1)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300771 struct ivtv_stream *s = ivtv_get_output_stream(itv);
772
Hans Verkuila158f352007-08-23 11:31:57 -0300773 itv->last_vsync_field += 1;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300774 if (frame == 0) {
775 clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
776 clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
777 }
778 else {
779 set_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
780 }
781 if (test_bit(IVTV_F_I_EV_VSYNC_ENABLED, &itv->i_flags)) {
782 set_bit(IVTV_F_I_EV_VSYNC, &itv->i_flags);
783 wake_up(&itv->event_waitq);
784 }
785 wake_up(&itv->vsync_waitq);
786 if (s)
787 wake_up(&s->waitq);
788
789 /* Send VBI to saa7127 */
Hans Verkuil2f3a9892007-08-25 14:11:23 -0300790 if (frame && (itv->output_mode == OUT_PASSTHROUGH ||
791 test_bit(IVTV_F_I_UPDATE_WSS, &itv->i_flags) ||
792 test_bit(IVTV_F_I_UPDATE_VPS, &itv->i_flags) ||
793 test_bit(IVTV_F_I_UPDATE_CC, &itv->i_flags))) {
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300794 set_bit(IVTV_F_I_WORK_HANDLER_VBI, &itv->i_flags);
Hans Verkuildc02d502007-05-19 14:07:16 -0300795 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300796 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300797
798 /* Check if we need to update the yuv registers */
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300799 if ((yi->yuv_forced_update || f->update) && last_dma_frame != -1) {
800 if (!f->update) {
Ian Armstrong166983c2007-10-21 08:09:10 -0300801 last_dma_frame = (u8)(last_dma_frame - 1) % IVTV_YUV_BUFFERS;
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300802 f = &yi->new_frame_info[last_dma_frame];
803 }
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300804
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300805 if (f->src_w) {
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300806 yi->update_frame = last_dma_frame;
Ian Armstrong3b5c1c82007-10-22 14:24:26 -0300807 f->update = 0;
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300808 yi->yuv_forced_update = 0;
Hans Verkuil1e13f9e2007-03-10 06:52:02 -0300809 set_bit(IVTV_F_I_WORK_HANDLER_YUV, &itv->i_flags);
Hans Verkuildc02d502007-05-19 14:07:16 -0300810 set_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300811 }
812 }
Ian Armstrongbfd7bea2007-08-03 10:01:39 -0300813
Ian Armstronga3e5f5e2007-10-20 14:52:55 -0300814 yi->fields_lapsed++;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300815 }
816}
817
Hans Verkuil2f3a9892007-08-25 14:11:23 -0300818#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)
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300819
820irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
821{
822 struct ivtv *itv = (struct ivtv *)dev_id;
823 u32 combo;
824 u32 stat;
825 int i;
826 u8 vsync_force = 0;
827
828 spin_lock(&itv->dma_reg_lock);
829 /* get contents of irq status register */
830 stat = read_reg(IVTV_REG_IRQSTATUS);
831
832 combo = ~itv->irqmask & stat;
833
834 /* Clear out IRQ */
835 if (combo) write_reg(combo, IVTV_REG_IRQSTATUS);
836
837 if (0 == combo) {
838 /* The vsync interrupt is unusual and clears itself. If we
839 * took too long, we may have missed it. Do some checks
840 */
841 if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
842 /* vsync is enabled, see if we're in a new field */
Hans Verkuila158f352007-08-23 11:31:57 -0300843 if ((itv->last_vsync_field & 1) != (read_reg(0x28c0) & 1)) {
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300844 /* New field, looks like we missed it */
845 IVTV_DEBUG_YUV("VSync interrupt missed %d\n",read_reg(0x28c0)>>16);
846 vsync_force = 1;
847 }
848 }
849
850 if (!vsync_force) {
851 /* No Vsync expected, wasn't for us */
852 spin_unlock(&itv->dma_reg_lock);
853 return IRQ_NONE;
854 }
855 }
856
857 /* Exclude interrupts noted below from the output, otherwise the log is flooded with
858 these messages */
859 if (combo & ~0xff6d0400)
Hans Verkuilbd58df62007-07-10 17:47:07 -0300860 IVTV_DEBUG_HI_IRQ("======= valid IRQ bits: 0x%08x ======\n", combo);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300861
862 if (combo & IVTV_IRQ_DEC_DMA_COMPLETE) {
Hans Verkuilbd58df62007-07-10 17:47:07 -0300863 IVTV_DEBUG_HI_IRQ("DEC DMA COMPLETE\n");
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300864 }
865
866 if (combo & IVTV_IRQ_DMA_READ) {
867 ivtv_irq_dma_read(itv);
868 }
869
870 if (combo & IVTV_IRQ_ENC_DMA_COMPLETE) {
871 ivtv_irq_enc_dma_complete(itv);
872 }
873
Hans Verkuildc02d502007-05-19 14:07:16 -0300874 if (combo & IVTV_IRQ_ENC_PIO_COMPLETE) {
875 ivtv_irq_enc_pio_complete(itv);
876 }
877
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300878 if (combo & IVTV_IRQ_DMA_ERR) {
879 ivtv_irq_dma_err(itv);
880 }
881
882 if (combo & IVTV_IRQ_ENC_START_CAP) {
883 ivtv_irq_enc_start_cap(itv);
884 }
885
886 if (combo & IVTV_IRQ_ENC_VBI_CAP) {
887 ivtv_irq_enc_vbi_cap(itv);
888 }
889
890 if (combo & IVTV_IRQ_DEC_VBI_RE_INSERT) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300891 ivtv_irq_dec_vbi_reinsert(itv);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300892 }
893
894 if (combo & IVTV_IRQ_ENC_EOS) {
895 IVTV_DEBUG_IRQ("ENC EOS\n");
896 set_bit(IVTV_F_I_EOS, &itv->i_flags);
Hans Verkuilfd8b2812007-08-23 10:13:15 -0300897 wake_up(&itv->eos_waitq);
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300898 }
899
900 if (combo & IVTV_IRQ_DEC_DATA_REQ) {
901 ivtv_irq_dec_data_req(itv);
902 }
903
904 /* Decoder Vertical Sync - We can't rely on 'combo', so check if vsync enabled */
905 if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
906 ivtv_irq_vsync(itv);
907 }
908
909 if (combo & IVTV_IRQ_ENC_VIM_RST) {
910 IVTV_DEBUG_IRQ("VIM RST\n");
911 /*ivtv_vapi(itv, CX2341X_ENC_REFRESH_INPUT, 0); */
912 }
913
914 if (combo & IVTV_IRQ_DEC_AUD_MODE_CHG) {
915 IVTV_DEBUG_INFO("Stereo mode changed\n");
916 }
917
918 if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_DMA, &itv->i_flags)) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -0300919 itv->irq_rr_idx++;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300920 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -0300921 int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300922 struct ivtv_stream *s = &itv->streams[idx];
923
924 if (!test_and_clear_bit(IVTV_F_S_DMA_PENDING, &s->s_flags))
925 continue;
926 if (s->type >= IVTV_DEC_STREAM_TYPE_MPG)
927 ivtv_dma_dec_start(s);
928 else
929 ivtv_dma_enc_start(s);
930 break;
931 }
932 if (i == IVTV_MAX_STREAMS && test_and_clear_bit(IVTV_F_I_UDMA_PENDING, &itv->i_flags)) {
933 ivtv_udma_start(itv);
934 }
935 }
936
Hans Verkuildc02d502007-05-19 14:07:16 -0300937 if ((combo & IVTV_IRQ_DMA) && !test_bit(IVTV_F_I_PIO, &itv->i_flags)) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -0300938 itv->irq_rr_idx++;
Hans Verkuildc02d502007-05-19 14:07:16 -0300939 for (i = 0; i < IVTV_MAX_STREAMS; i++) {
Hans Verkuil33bc4de2007-08-18 11:36:09 -0300940 int idx = (i + itv->irq_rr_idx) % IVTV_MAX_STREAMS;
Hans Verkuildc02d502007-05-19 14:07:16 -0300941 struct ivtv_stream *s = &itv->streams[idx];
942
943 if (!test_and_clear_bit(IVTV_F_S_PIO_PENDING, &s->s_flags))
944 continue;
945 if (s->type == IVTV_DEC_STREAM_TYPE_VBI || s->type < IVTV_DEC_STREAM_TYPE_MPG)
946 ivtv_dma_enc_start(s);
947 break;
948 }
949 }
950
Hans Verkuil2f3a9892007-08-25 14:11:23 -0300951 if (test_and_clear_bit(IVTV_F_I_HAVE_WORK, &itv->i_flags)) {
Hans Verkuildc02d502007-05-19 14:07:16 -0300952 queue_work(itv->irq_work_queues, &itv->irq_work_queue);
Hans Verkuil2f3a9892007-08-25 14:11:23 -0300953 }
Hans Verkuildc02d502007-05-19 14:07:16 -0300954
Hans Verkuil1a0adaf2007-04-27 12:31:25 -0300955 spin_unlock(&itv->dma_reg_lock);
956
957 /* If we've just handled a 'forced' vsync, it's safest to say it
958 * wasn't ours. Another device may have triggered it at just
959 * the right time.
960 */
961 return vsync_force ? IRQ_NONE : IRQ_HANDLED;
962}
963
964void ivtv_unfinished_dma(unsigned long arg)
965{
966 struct ivtv *itv = (struct ivtv *)arg;
967
968 if (!test_bit(IVTV_F_I_DMA, &itv->i_flags))
969 return;
970 IVTV_ERR("DMA TIMEOUT %08x %d\n", read_reg(IVTV_REG_DMASTATUS), itv->cur_dma_stream);
971
972 write_reg(read_reg(IVTV_REG_DMASTATUS) & 3, IVTV_REG_DMASTATUS);
973 clear_bit(IVTV_F_I_UDMA, &itv->i_flags);
974 clear_bit(IVTV_F_I_DMA, &itv->i_flags);
975 itv->cur_dma_stream = -1;
976 wake_up(&itv->dma_waitq);
977}