ide: fix OOPS during ide-cd error recovery
[linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git] / drivers / media / video / stradis.c
blob0eb313082c973e78fcfe6e2e935ec1c5751ce5c6
1 /*
2 * stradis.c - stradis 4:2:2 mpeg decoder driver
4 * Stradis 4:2:2 MPEG-2 Decoder Driver
5 * Copyright (C) 1999 Nathan Laredo <laredo@gnu.org>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #include <linux/module.h>
23 #include <linux/delay.h>
24 #include <linux/errno.h>
25 #include <linux/fs.h>
26 #include <linux/kernel.h>
27 #include <linux/major.h>
28 #include <linux/slab.h>
29 #include <linux/mm.h>
30 #include <linux/init.h>
31 #include <linux/poll.h>
32 #include <linux/pci.h>
33 #include <linux/signal.h>
34 #include <asm/io.h>
35 #include <linux/ioport.h>
36 #include <asm/pgtable.h>
37 #include <asm/page.h>
38 #include <linux/sched.h>
39 #include <asm/types.h>
40 #include <linux/types.h>
41 #include <linux/interrupt.h>
42 #include <asm/uaccess.h>
43 #include <linux/vmalloc.h>
44 #include <linux/videodev.h>
45 #include <media/v4l2-common.h>
46 #include <media/v4l2-ioctl.h>
48 #include "saa7146.h"
49 #include "saa7146reg.h"
50 #include "ibmmpeg2.h"
51 #include "saa7121.h"
52 #include "cs8420.h"
54 #define DEBUG(x) /* debug driver */
55 #undef IDEBUG /* debug irq handler */
56 #undef MDEBUG /* debug memory management */
58 #define SAA7146_MAX 6
60 static struct saa7146 saa7146s[SAA7146_MAX];
62 static int saa_num; /* number of SAA7146s in use */
64 static int video_nr = -1;
65 module_param(video_nr, int, 0);
66 MODULE_LICENSE("GPL");
68 #define nDebNormal 0x00480000
69 #define nDebNoInc 0x00480000
70 #define nDebVideo 0xd0480000
71 #define nDebAudio 0xd0400000
72 #define nDebDMA 0x02c80000
74 #define oDebNormal 0x13c80000
75 #define oDebNoInc 0x13c80000
76 #define oDebVideo 0xd1080000
77 #define oDebAudio 0xd1080000
78 #define oDebDMA 0x03080000
80 #define NewCard (saa->boardcfg[3])
81 #define ChipControl (saa->boardcfg[1])
82 #define NTSCFirstActive (saa->boardcfg[4])
83 #define PALFirstActive (saa->boardcfg[5])
84 #define NTSCLastActive (saa->boardcfg[54])
85 #define PALLastActive (saa->boardcfg[55])
86 #define Have2MB (saa->boardcfg[18] & 0x40)
87 #define HaveCS8420 (saa->boardcfg[18] & 0x04)
88 #define IBMMPEGCD20 (saa->boardcfg[18] & 0x20)
89 #define HaveCS3310 (saa->boardcfg[18] & 0x01)
90 #define CS3310MaxLvl ((saa->boardcfg[30] << 8) | saa->boardcfg[31])
91 #define HaveCS4341 (saa->boardcfg[40] == 2)
92 #define SDIType (saa->boardcfg[27])
93 #define CurrentMode (saa->boardcfg[2])
95 #define debNormal (NewCard ? nDebNormal : oDebNormal)
96 #define debNoInc (NewCard ? nDebNoInc : oDebNoInc)
97 #define debVideo (NewCard ? nDebVideo : oDebVideo)
98 #define debAudio (NewCard ? nDebAudio : oDebAudio)
99 #define debDMA (NewCard ? nDebDMA : oDebDMA)
101 #ifdef USE_RESCUE_EEPROM_SDM275
102 static unsigned char rescue_eeprom[64] = {
103 0x00, 0x01, 0x04, 0x13, 0x26, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x43, 0x63,
104 0x22, 0x01, 0x29, 0x15, 0x73, 0x00, 0x1f, 'd', 'e', 'c', 'x', 'l',
105 'd', 'v', 'a', 0x02, 0x00, 0x01, 0x00, 0xcc, 0xa4, 0x63, 0x09, 0xe2,
106 0x10, 0x00, 0x0a, 0x00, 0x02, 0x02, 'd', 'e', 'c', 'x', 'l', 'a',
107 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00,
110 #endif
112 /* ----------------------------------------------------------------------- */
113 /* Hardware I2C functions */
114 static void I2CWipe(struct saa7146 *saa)
116 int i;
117 /* set i2c to ~=100kHz, abort transfer, clear busy */
118 saawrite(0x600 | SAA7146_I2C_ABORT, SAA7146_I2C_STATUS);
119 saawrite((SAA7146_MC2_UPLD_I2C << 16) |
120 SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
121 /* wait for i2c registers to be programmed */
122 for (i = 0; i < 1000 &&
123 !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
124 schedule();
125 saawrite(0x600, SAA7146_I2C_STATUS);
126 saawrite((SAA7146_MC2_UPLD_I2C << 16) |
127 SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
128 /* wait for i2c registers to be programmed */
129 for (i = 0; i < 1000 &&
130 !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
131 schedule();
132 saawrite(0x600, SAA7146_I2C_STATUS);
133 saawrite((SAA7146_MC2_UPLD_I2C << 16) |
134 SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
135 /* wait for i2c registers to be programmed */
136 for (i = 0; i < 1000 &&
137 !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
138 schedule();
141 /* read I2C */
142 static int I2CRead(struct saa7146 *saa, unsigned char addr,
143 unsigned char subaddr, int dosub)
145 int i;
147 if (saaread(SAA7146_I2C_STATUS) & 0x3c)
148 I2CWipe(saa);
149 for (i = 0;
150 i < 1000 && (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_BUSY);
151 i++)
152 schedule();
153 if (i == 1000)
154 I2CWipe(saa);
155 if (dosub)
156 saawrite(((addr & 0xfe) << 24) | (((addr | 1) & 0xff) << 8) |
157 ((subaddr & 0xff) << 16) | 0xed, SAA7146_I2C_TRANSFER);
158 else
159 saawrite(((addr & 0xfe) << 24) | (((addr | 1) & 0xff) << 16) |
160 0xf1, SAA7146_I2C_TRANSFER);
161 saawrite((SAA7146_MC2_UPLD_I2C << 16) |
162 SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
163 /* wait for i2c registers to be programmed */
164 for (i = 0; i < 1000 &&
165 !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
166 schedule();
167 /* wait for valid data */
168 for (i = 0; i < 1000 &&
169 (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_BUSY); i++)
170 schedule();
171 if (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_ERR)
172 return -1;
173 if (i == 1000)
174 printk("i2c setup read timeout\n");
175 saawrite(0x41, SAA7146_I2C_TRANSFER);
176 saawrite((SAA7146_MC2_UPLD_I2C << 16) |
177 SAA7146_MC2_UPLD_I2C, SAA7146_MC2);
178 /* wait for i2c registers to be programmed */
179 for (i = 0; i < 1000 &&
180 !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_I2C); i++)
181 schedule();
182 /* wait for valid data */
183 for (i = 0; i < 1000 &&
184 (saaread(SAA7146_I2C_TRANSFER) & SAA7146_I2C_BUSY); i++)
185 schedule();
186 if (saaread(SAA7146_I2C_TRANSFER) & SAA7146_I2C_ERR)
187 return -1;
188 if (i == 1000)
189 printk("i2c read timeout\n");
190 return ((saaread(SAA7146_I2C_TRANSFER) >> 24) & 0xff);
193 /* set both to write both bytes, reset it to write only b1 */
195 static int I2CWrite(struct saa7146 *saa, unsigned char addr, unsigned char b1,
196 unsigned char b2, int both)
198 int i;
199 u32 data;
201 if (saaread(SAA7146_I2C_STATUS) & 0x3c)
202 I2CWipe(saa);
203 for (i = 0; i < 1000 &&
204 (saaread(SAA7146_I2C_STATUS) & SAA7146_I2C_BUSY); i++)
205 schedule();
206 if (i == 1000)
207 I2CWipe(saa);
208 data = ((addr & 0xfe) << 24) | ((b1 & 0xff) << 16);
209 if (both)
210 data |= ((b2 & 0xff) << 8) | 0xe5;
211 else
212 data |= 0xd1;
213 saawrite(data, SAA7146_I2C_TRANSFER);
214 saawrite((SAA7146_MC2_UPLD_I2C << 16) | SAA7146_MC2_UPLD_I2C,
215 SAA7146_MC2);
216 return 0;
219 static void attach_inform(struct saa7146 *saa, int id)
221 int i;
223 DEBUG(printk(KERN_DEBUG "stradis%d: i2c: device found=%02x\n", saa->nr,
224 id));
225 if (id == 0xa0) { /* we have rev2 or later board, fill in info */
226 for (i = 0; i < 64; i++)
227 saa->boardcfg[i] = I2CRead(saa, 0xa0, i, 1);
228 #ifdef USE_RESCUE_EEPROM_SDM275
229 if (saa->boardcfg[0] != 0) {
230 printk("stradis%d: WARNING: EEPROM STORED VALUES HAVE "
231 "BEEN IGNORED\n", saa->nr);
232 for (i = 0; i < 64; i++)
233 saa->boardcfg[i] = rescue_eeprom[i];
235 #endif
236 printk("stradis%d: config =", saa->nr);
237 for (i = 0; i < 51; i++) {
238 printk(" %02x", saa->boardcfg[i]);
240 printk("\n");
244 static void I2CBusScan(struct saa7146 *saa)
246 int i;
247 for (i = 0; i < 0xff; i += 2)
248 if ((I2CRead(saa, i, 0, 0)) >= 0)
249 attach_inform(saa, i);
252 static int debiwait_maxwait;
254 static int wait_for_debi_done(struct saa7146 *saa)
256 int i;
258 /* wait for registers to be programmed */
259 for (i = 0; i < 100000 &&
260 !(saaread(SAA7146_MC2) & SAA7146_MC2_UPLD_DEBI); i++)
261 saaread(SAA7146_MC2);
262 /* wait for transfer to complete */
263 for (i = 0; i < 500000 &&
264 (saaread(SAA7146_PSR) & SAA7146_PSR_DEBI_S); i++)
265 saaread(SAA7146_MC2);
267 if (i > debiwait_maxwait)
268 printk("wait-for-debi-done maxwait: %d\n",
269 debiwait_maxwait = i);
271 if (i == 500000)
272 return -1;
274 return 0;
277 static int debiwrite(struct saa7146 *saa, u32 config, int addr,
278 u32 val, int count)
280 u32 cmd;
281 if (count <= 0 || count > 32764)
282 return -1;
283 if (wait_for_debi_done(saa) < 0)
284 return -1;
285 saawrite(config, SAA7146_DEBI_CONFIG);
286 if (count <= 4) /* immediate transfer */
287 saawrite(val, SAA7146_DEBI_AD);
288 else /* block transfer */
289 saawrite(virt_to_bus(saa->dmadebi), SAA7146_DEBI_AD);
290 saawrite((cmd = (count << 17) | (addr & 0xffff)), SAA7146_DEBI_COMMAND);
291 saawrite((SAA7146_MC2_UPLD_DEBI << 16) | SAA7146_MC2_UPLD_DEBI,
292 SAA7146_MC2);
293 return 0;
296 static u32 debiread(struct saa7146 *saa, u32 config, int addr, int count)
298 u32 result = 0;
300 if (count > 32764 || count <= 0)
301 return 0;
302 if (wait_for_debi_done(saa) < 0)
303 return 0;
304 saawrite(virt_to_bus(saa->dmadebi), SAA7146_DEBI_AD);
305 saawrite((count << 17) | 0x10000 | (addr & 0xffff),
306 SAA7146_DEBI_COMMAND);
307 saawrite(config, SAA7146_DEBI_CONFIG);
308 saawrite((SAA7146_MC2_UPLD_DEBI << 16) | SAA7146_MC2_UPLD_DEBI,
309 SAA7146_MC2);
310 if (count > 4) /* not an immediate transfer */
311 return count;
312 wait_for_debi_done(saa);
313 result = saaread(SAA7146_DEBI_AD);
314 if (count == 1)
315 result &= 0xff;
316 if (count == 2)
317 result &= 0xffff;
318 if (count == 3)
319 result &= 0xffffff;
320 return result;
323 static void do_irq_send_data(struct saa7146 *saa)
325 int split, audbytes, vidbytes;
327 saawrite(SAA7146_PSR_PIN1, SAA7146_IER);
328 /* if special feature mode in effect, disable audio sending */
329 if (saa->playmode != VID_PLAY_NORMAL)
330 saa->audtail = saa->audhead = 0;
331 if (saa->audhead <= saa->audtail)
332 audbytes = saa->audtail - saa->audhead;
333 else
334 audbytes = 65536 - (saa->audhead - saa->audtail);
335 if (saa->vidhead <= saa->vidtail)
336 vidbytes = saa->vidtail - saa->vidhead;
337 else
338 vidbytes = 524288 - (saa->vidhead - saa->vidtail);
339 if (audbytes == 0 && vidbytes == 0 && saa->osdtail == saa->osdhead) {
340 saawrite(0, SAA7146_IER);
341 return;
343 /* if at least 1 block audio waiting and audio fifo isn't full */
344 if (audbytes >= 2048 && (debiread(saa, debNormal, IBM_MP2_AUD_FIFO, 2)
345 & 0xff) < 60) {
346 if (saa->audhead > saa->audtail)
347 split = 65536 - saa->audhead;
348 else
349 split = 0;
350 audbytes = 2048;
351 if (split > 0 && split < 2048) {
352 memcpy(saa->dmadebi, saa->audbuf + saa->audhead, split);
353 saa->audhead = 0;
354 audbytes -= split;
355 } else
356 split = 0;
357 memcpy(saa->dmadebi + split, saa->audbuf + saa->audhead,
358 audbytes);
359 saa->audhead += audbytes;
360 saa->audhead &= 0xffff;
361 debiwrite(saa, debAudio, (NewCard ? IBM_MP2_AUD_FIFO :
362 IBM_MP2_AUD_FIFOW), 0, 2048);
363 wake_up_interruptible(&saa->audq);
364 /* if at least 1 block video waiting and video fifo isn't full */
365 } else if (vidbytes >= 30720 && (debiread(saa, debNormal,
366 IBM_MP2_FIFO, 2)) < 16384) {
367 if (saa->vidhead > saa->vidtail)
368 split = 524288 - saa->vidhead;
369 else
370 split = 0;
371 vidbytes = 30720;
372 if (split > 0 && split < 30720) {
373 memcpy(saa->dmadebi, saa->vidbuf + saa->vidhead, split);
374 saa->vidhead = 0;
375 vidbytes -= split;
376 } else
377 split = 0;
378 memcpy(saa->dmadebi + split, saa->vidbuf + saa->vidhead,
379 vidbytes);
380 saa->vidhead += vidbytes;
381 saa->vidhead &= 0x7ffff;
382 debiwrite(saa, debVideo, (NewCard ? IBM_MP2_FIFO :
383 IBM_MP2_FIFOW), 0, 30720);
384 wake_up_interruptible(&saa->vidq);
386 saawrite(SAA7146_PSR_DEBI_S | SAA7146_PSR_PIN1, SAA7146_IER);
389 static void send_osd_data(struct saa7146 *saa)
391 int size = saa->osdtail - saa->osdhead;
392 if (size > 30720)
393 size = 30720;
394 /* ensure some multiple of 8 bytes is transferred */
395 size = 8 * ((size + 8) >> 3);
396 if (size) {
397 debiwrite(saa, debNormal, IBM_MP2_OSD_ADDR,
398 (saa->osdhead >> 3), 2);
399 memcpy(saa->dmadebi, &saa->osdbuf[saa->osdhead], size);
400 saa->osdhead += size;
401 /* block transfer of next 8 bytes to ~32k bytes */
402 debiwrite(saa, debNormal, IBM_MP2_OSD_DATA, 0, size);
404 if (saa->osdhead >= saa->osdtail) {
405 saa->osdhead = saa->osdtail = 0;
406 debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00c, 2);
410 static irqreturn_t saa7146_irq(int irq, void *dev_id)
412 struct saa7146 *saa = dev_id;
413 u32 stat, astat;
414 int count;
415 int handled = 0;
417 count = 0;
418 while (1) {
419 /* get/clear interrupt status bits */
420 stat = saaread(SAA7146_ISR);
421 astat = stat & saaread(SAA7146_IER);
422 if (!astat)
423 break;
424 handled = 1;
425 saawrite(astat, SAA7146_ISR);
426 if (astat & SAA7146_PSR_DEBI_S) {
427 do_irq_send_data(saa);
429 if (astat & SAA7146_PSR_PIN1) {
430 int istat;
431 /* the following read will trigger DEBI_S */
432 istat = debiread(saa, debNormal, IBM_MP2_HOST_INT, 2);
433 if (istat & 1) {
434 saawrite(0, SAA7146_IER);
435 send_osd_data(saa);
436 saawrite(SAA7146_PSR_DEBI_S |
437 SAA7146_PSR_PIN1, SAA7146_IER);
439 if (istat & 0x20) { /* Video Start */
440 saa->vidinfo.frame_count++;
442 if (istat & 0x400) { /* Picture Start */
443 /* update temporal reference */
445 if (istat & 0x200) { /* Picture Resolution Change */
446 /* read new resolution */
448 if (istat & 0x100) { /* New User Data found */
449 /* read new user data */
451 if (istat & 0x1000) { /* new GOP/SMPTE */
452 /* read new SMPTE */
454 if (istat & 0x8000) { /* Sequence Start Code */
455 /* reset frame counter, load sizes */
456 saa->vidinfo.frame_count = 0;
457 saa->vidinfo.h_size = 704;
458 saa->vidinfo.v_size = 480;
459 #if 0
460 if (saa->endmarkhead != saa->endmarktail) {
461 saa->audhead =
462 saa->endmark[saa->endmarkhead];
463 saa->endmarkhead++;
464 if (saa->endmarkhead >= MAX_MARKS)
465 saa->endmarkhead = 0;
467 #endif
469 if (istat & 0x4000) { /* Sequence Error Code */
470 if (saa->endmarkhead != saa->endmarktail) {
471 saa->audhead =
472 saa->endmark[saa->endmarkhead];
473 saa->endmarkhead++;
474 if (saa->endmarkhead >= MAX_MARKS)
475 saa->endmarkhead = 0;
479 #ifdef IDEBUG
480 if (astat & SAA7146_PSR_PPEF) {
481 IDEBUG(printk("stradis%d irq: PPEF\n", saa->nr));
483 if (astat & SAA7146_PSR_PABO) {
484 IDEBUG(printk("stradis%d irq: PABO\n", saa->nr));
486 if (astat & SAA7146_PSR_PPED) {
487 IDEBUG(printk("stradis%d irq: PPED\n", saa->nr));
489 if (astat & SAA7146_PSR_RPS_I1) {
490 IDEBUG(printk("stradis%d irq: RPS_I1\n", saa->nr));
492 if (astat & SAA7146_PSR_RPS_I0) {
493 IDEBUG(printk("stradis%d irq: RPS_I0\n", saa->nr));
495 if (astat & SAA7146_PSR_RPS_LATE1) {
496 IDEBUG(printk("stradis%d irq: RPS_LATE1\n", saa->nr));
498 if (astat & SAA7146_PSR_RPS_LATE0) {
499 IDEBUG(printk("stradis%d irq: RPS_LATE0\n", saa->nr));
501 if (astat & SAA7146_PSR_RPS_E1) {
502 IDEBUG(printk("stradis%d irq: RPS_E1\n", saa->nr));
504 if (astat & SAA7146_PSR_RPS_E0) {
505 IDEBUG(printk("stradis%d irq: RPS_E0\n", saa->nr));
507 if (astat & SAA7146_PSR_RPS_TO1) {
508 IDEBUG(printk("stradis%d irq: RPS_TO1\n", saa->nr));
510 if (astat & SAA7146_PSR_RPS_TO0) {
511 IDEBUG(printk("stradis%d irq: RPS_TO0\n", saa->nr));
513 if (astat & SAA7146_PSR_UPLD) {
514 IDEBUG(printk("stradis%d irq: UPLD\n", saa->nr));
516 if (astat & SAA7146_PSR_DEBI_E) {
517 IDEBUG(printk("stradis%d irq: DEBI_E\n", saa->nr));
519 if (astat & SAA7146_PSR_I2C_S) {
520 IDEBUG(printk("stradis%d irq: I2C_S\n", saa->nr));
522 if (astat & SAA7146_PSR_I2C_E) {
523 IDEBUG(printk("stradis%d irq: I2C_E\n", saa->nr));
525 if (astat & SAA7146_PSR_A2_IN) {
526 IDEBUG(printk("stradis%d irq: A2_IN\n", saa->nr));
528 if (astat & SAA7146_PSR_A2_OUT) {
529 IDEBUG(printk("stradis%d irq: A2_OUT\n", saa->nr));
531 if (astat & SAA7146_PSR_A1_IN) {
532 IDEBUG(printk("stradis%d irq: A1_IN\n", saa->nr));
534 if (astat & SAA7146_PSR_A1_OUT) {
535 IDEBUG(printk("stradis%d irq: A1_OUT\n", saa->nr));
537 if (astat & SAA7146_PSR_AFOU) {
538 IDEBUG(printk("stradis%d irq: AFOU\n", saa->nr));
540 if (astat & SAA7146_PSR_V_PE) {
541 IDEBUG(printk("stradis%d irq: V_PE\n", saa->nr));
543 if (astat & SAA7146_PSR_VFOU) {
544 IDEBUG(printk("stradis%d irq: VFOU\n", saa->nr));
546 if (astat & SAA7146_PSR_FIDA) {
547 IDEBUG(printk("stradis%d irq: FIDA\n", saa->nr));
549 if (astat & SAA7146_PSR_FIDB) {
550 IDEBUG(printk("stradis%d irq: FIDB\n", saa->nr));
552 if (astat & SAA7146_PSR_PIN3) {
553 IDEBUG(printk("stradis%d irq: PIN3\n", saa->nr));
555 if (astat & SAA7146_PSR_PIN2) {
556 IDEBUG(printk("stradis%d irq: PIN2\n", saa->nr));
558 if (astat & SAA7146_PSR_PIN0) {
559 IDEBUG(printk("stradis%d irq: PIN0\n", saa->nr));
561 if (astat & SAA7146_PSR_ECS) {
562 IDEBUG(printk("stradis%d irq: ECS\n", saa->nr));
564 if (astat & SAA7146_PSR_EC3S) {
565 IDEBUG(printk("stradis%d irq: EC3S\n", saa->nr));
567 if (astat & SAA7146_PSR_EC0S) {
568 IDEBUG(printk("stradis%d irq: EC0S\n", saa->nr));
570 #endif
571 count++;
572 if (count > 15)
573 printk(KERN_WARNING "stradis%d: irq loop %d\n",
574 saa->nr, count);
575 if (count > 20) {
576 saawrite(0, SAA7146_IER);
577 printk(KERN_ERR
578 "stradis%d: IRQ loop cleared\n", saa->nr);
581 return IRQ_RETVAL(handled);
584 static int ibm_send_command(struct saa7146 *saa,
585 int command, int data, int chain)
587 int i;
589 if (chain)
590 debiwrite(saa, debNormal, IBM_MP2_COMMAND, (command << 1)| 1,2);
591 else
592 debiwrite(saa, debNormal, IBM_MP2_COMMAND, command << 1, 2);
593 debiwrite(saa, debNormal, IBM_MP2_CMD_DATA, data, 2);
594 debiwrite(saa, debNormal, IBM_MP2_CMD_STAT, 1, 2);
595 for (i = 0; i < 100 &&
596 (debiread(saa, debNormal, IBM_MP2_CMD_STAT, 2) & 1); i++)
597 schedule();
598 if (i == 100)
599 return -1;
600 return 0;
603 static void cs4341_setlevel(struct saa7146 *saa, int left, int right)
605 I2CWrite(saa, 0x22, 0x03, left > 94 ? 94 : left, 2);
606 I2CWrite(saa, 0x22, 0x04, right > 94 ? 94 : right, 2);
609 static void initialize_cs4341(struct saa7146 *saa)
611 int i;
612 for (i = 0; i < 200; i++) {
613 /* auto mute off, power on, no de-emphasis */
614 /* I2S data up to 24-bit 64xFs internal SCLK */
615 I2CWrite(saa, 0x22, 0x01, 0x11, 2);
616 /* ATAPI mixer settings */
617 I2CWrite(saa, 0x22, 0x02, 0x49, 2);
618 /* attenuation left 3db */
619 I2CWrite(saa, 0x22, 0x03, 0x00, 2);
620 /* attenuation right 3db */
621 I2CWrite(saa, 0x22, 0x04, 0x00, 2);
622 I2CWrite(saa, 0x22, 0x01, 0x10, 2);
623 if (I2CRead(saa, 0x22, 0x02, 1) == 0x49)
624 break;
625 schedule();
627 printk("stradis%d: CS4341 initialized (%d)\n", saa->nr, i);
628 return;
631 static void initialize_cs8420(struct saa7146 *saa, int pro)
633 int i;
634 u8 *sequence;
635 if (pro)
636 sequence = mode8420pro;
637 else
638 sequence = mode8420con;
639 for (i = 0; i < INIT8420LEN; i++)
640 I2CWrite(saa, 0x20, init8420[i * 2], init8420[i * 2 + 1], 2);
641 for (i = 0; i < MODE8420LEN; i++)
642 I2CWrite(saa, 0x20, sequence[i * 2], sequence[i * 2 + 1], 2);
643 printk("stradis%d: CS8420 initialized\n", saa->nr);
646 static void initialize_saa7121(struct saa7146 *saa, int dopal)
648 int i, mod;
649 u8 *sequence;
650 if (dopal)
651 sequence = init7121pal;
652 else
653 sequence = init7121ntsc;
654 mod = saaread(SAA7146_PSR) & 0x08;
655 /* initialize PAL/NTSC video encoder */
656 for (i = 0; i < INIT7121LEN; i++) {
657 if (NewCard) { /* handle new card encoder differences */
658 if (sequence[i * 2] == 0x3a)
659 I2CWrite(saa, 0x88, 0x3a, 0x13, 2);
660 else if (sequence[i * 2] == 0x6b)
661 I2CWrite(saa, 0x88, 0x6b, 0x20, 2);
662 else if (sequence[i * 2] == 0x6c)
663 I2CWrite(saa, 0x88, 0x6c,
664 dopal ? 0x09 : 0xf5, 2);
665 else if (sequence[i * 2] == 0x6d)
666 I2CWrite(saa, 0x88, 0x6d,
667 dopal ? 0x20 : 0x00, 2);
668 else if (sequence[i * 2] == 0x7a)
669 I2CWrite(saa, 0x88, 0x7a,
670 dopal ? (PALFirstActive - 1) :
671 (NTSCFirstActive - 4), 2);
672 else if (sequence[i * 2] == 0x7b)
673 I2CWrite(saa, 0x88, 0x7b,
674 dopal ? PALLastActive :
675 NTSCLastActive, 2);
676 else
677 I2CWrite(saa, 0x88, sequence[i * 2],
678 sequence[i * 2 + 1], 2);
679 } else {
680 if (sequence[i * 2] == 0x6b && mod)
681 I2CWrite(saa, 0x88, 0x6b,
682 (sequence[i * 2 + 1] ^ 0x09), 2);
683 else if (sequence[i * 2] == 0x7a)
684 I2CWrite(saa, 0x88, 0x7a,
685 dopal ? (PALFirstActive - 1) :
686 (NTSCFirstActive - 4), 2);
687 else if (sequence[i * 2] == 0x7b)
688 I2CWrite(saa, 0x88, 0x7b,
689 dopal ? PALLastActive :
690 NTSCLastActive, 2);
691 else
692 I2CWrite(saa, 0x88, sequence[i * 2],
693 sequence[i * 2 + 1], 2);
698 static void set_genlock_offset(struct saa7146 *saa, int noffset)
700 int nCode;
701 int PixelsPerLine = 858;
702 if (CurrentMode == VIDEO_MODE_PAL)
703 PixelsPerLine = 864;
704 if (noffset > 500)
705 noffset = 500;
706 else if (noffset < -500)
707 noffset = -500;
708 nCode = noffset + 0x100;
709 if (nCode == 1)
710 nCode = 0x401;
711 else if (nCode < 1)
712 nCode = 0x400 + PixelsPerLine + nCode;
713 debiwrite(saa, debNormal, XILINX_GLDELAY, nCode, 2);
716 static void set_out_format(struct saa7146 *saa, int mode)
718 initialize_saa7121(saa, (mode == VIDEO_MODE_NTSC ? 0 : 1));
719 saa->boardcfg[2] = mode;
720 /* do not adjust analog video parameters here, use saa7121 init */
721 /* you will affect the SDI output on the new card */
722 if (mode == VIDEO_MODE_PAL) { /* PAL */
723 debiwrite(saa, debNormal, XILINX_CTL0, 0x0808, 2);
724 mdelay(50);
725 saawrite(0x012002c0, SAA7146_NUM_LINE_BYTE1);
726 if (NewCard) {
727 debiwrite(saa, debNormal, IBM_MP2_DISP_MODE, 0xe100, 2);
728 mdelay(50);
730 debiwrite(saa, debNormal, IBM_MP2_DISP_MODE,
731 NewCard ? 0xe500 : 0x6500, 2);
732 debiwrite(saa, debNormal, IBM_MP2_DISP_DLY,
733 (1 << 8) |
734 (NewCard ? PALFirstActive : PALFirstActive - 6), 2);
735 } else { /* NTSC */
736 debiwrite(saa, debNormal, XILINX_CTL0, 0x0800, 2);
737 mdelay(50);
738 saawrite(0x00f002c0, SAA7146_NUM_LINE_BYTE1);
739 debiwrite(saa, debNormal, IBM_MP2_DISP_MODE,
740 NewCard ? 0xe100 : 0x6100, 2);
741 debiwrite(saa, debNormal, IBM_MP2_DISP_DLY,
742 (1 << 8) |
743 (NewCard ? NTSCFirstActive : NTSCFirstActive - 6), 2);
747 /* Intialize bitmangler to map from a byte value to the mangled word that
748 * must be output to program the Xilinx part through the DEBI port.
749 * Xilinx Data Bit->DEBI Bit: 0->15 1->7 2->6 3->12 4->11 5->2 6->1 7->0
750 * transfer FPGA code, init IBM chip, transfer IBM microcode
751 * rev2 card mangles: 0->7 1->6 2->5 3->4 4->3 5->2 6->1 7->0
753 static u16 bitmangler[256];
755 static int initialize_fpga(struct video_code *bitdata)
757 int i, num, startindex, failure = 0, loadtwo, loadfile = 0;
758 u16 *dmabuf;
759 u8 *newdma;
760 struct saa7146 *saa;
762 /* verify fpga code */
763 for (startindex = 0; startindex < bitdata->datasize; startindex++)
764 if (bitdata->data[startindex] == 255)
765 break;
766 if (startindex == bitdata->datasize) {
767 printk(KERN_INFO "stradis: bad fpga code\n");
768 return -1;
770 /* initialize all detected cards */
771 for (num = 0; num < saa_num; num++) {
772 saa = &saa7146s[num];
773 if (saa->boardcfg[0] > 20)
774 continue; /* card was programmed */
775 loadtwo = (saa->boardcfg[18] & 0x10);
776 if (!NewCard) /* we have an old board */
777 for (i = 0; i < 256; i++)
778 bitmangler[i] = ((i & 0x01) << 15) |
779 ((i & 0x02) << 6) | ((i & 0x04) << 4) |
780 ((i & 0x08) << 9) | ((i & 0x10) << 7) |
781 ((i & 0x20) >> 3) | ((i & 0x40) >> 5) |
782 ((i & 0x80) >> 7);
783 else /* else we have a new board */
784 for (i = 0; i < 256; i++)
785 bitmangler[i] = ((i & 0x01) << 7) |
786 ((i & 0x02) << 5) | ((i & 0x04) << 3) |
787 ((i & 0x08) << 1) | ((i & 0x10) >> 1) |
788 ((i & 0x20) >> 3) | ((i & 0x40) >> 5) |
789 ((i & 0x80) >> 7);
791 dmabuf = (u16 *) saa->dmadebi;
792 newdma = (u8 *) saa->dmadebi;
793 if (NewCard) { /* SDM2xxx */
794 if (!strncmp(bitdata->loadwhat, "decoder2", 8))
795 continue; /* fpga not for this card */
796 if (!strncmp(&saa->boardcfg[42], bitdata->loadwhat, 8))
797 loadfile = 1;
798 else if (loadtwo && !strncmp(&saa->boardcfg[19],
799 bitdata->loadwhat, 8))
800 loadfile = 2;
801 else if (!saa->boardcfg[42] && !strncmp("decxl",
802 bitdata->loadwhat, 8))
803 loadfile = 1; /* special */
804 else
805 continue; /* fpga not for this card */
806 if (loadfile != 1 && loadfile != 2)
807 continue; /* skip to next card */
808 if (saa->boardcfg[0] && loadfile == 1)
809 continue; /* skip to next card */
810 if (saa->boardcfg[0] != 1 && loadfile == 2)
811 continue; /* skip to next card */
812 saa->boardcfg[0]++; /* mark fpga handled */
813 printk("stradis%d: loading %s\n", saa->nr,
814 bitdata->loadwhat);
815 if (loadtwo && loadfile == 2)
816 goto send_fpga_stuff;
817 /* turn on the Audio interface to set PROG low */
818 saawrite(0x00400040, SAA7146_GPIO_CTRL);
819 saaread(SAA7146_PSR); /* ensure posted write */
820 /* wait for everyone to reset */
821 mdelay(10);
822 saawrite(0x00400000, SAA7146_GPIO_CTRL);
823 } else { /* original card */
824 if (strncmp(bitdata->loadwhat, "decoder2", 8))
825 continue; /* fpga not for this card */
826 /* Pull the Xilinx PROG signal WS3 low */
827 saawrite(0x02000200, SAA7146_MC1);
828 /* Turn on the Audio interface so can set PROG low */
829 saawrite(0x000000c0, SAA7146_ACON1);
830 /* Pull the Xilinx INIT signal (GPIO2) low */
831 saawrite(0x00400000, SAA7146_GPIO_CTRL);
832 /* Make sure everybody resets */
833 saaread(SAA7146_PSR); /* ensure posted write */
834 mdelay(10);
835 /* Release the Xilinx PROG signal */
836 saawrite(0x00000000, SAA7146_ACON1);
837 /* Turn off the Audio interface */
838 saawrite(0x02000000, SAA7146_MC1);
840 /* Release Xilinx INIT signal (WS2) */
841 saawrite(0x00000000, SAA7146_GPIO_CTRL);
842 /* Wait for the INIT to go High */
843 for (i = 0;
844 i < 10000 && !(saaread(SAA7146_PSR) & SAA7146_PSR_PIN2);
845 i++)
846 schedule();
847 if (i == 1000) {
848 printk(KERN_INFO "stradis%d: no fpga INIT\n", saa->nr);
849 return -1;
851 send_fpga_stuff:
852 if (NewCard) {
853 for (i = startindex; i < bitdata->datasize; i++)
854 newdma[i - startindex] =
855 bitmangler[bitdata->data[i]];
856 debiwrite(saa, 0x01420000, 0, 0,
857 ((bitdata->datasize - startindex) + 5));
858 if (loadtwo && loadfile == 1) {
859 printk("stradis%d: awaiting 2nd FPGA bitfile\n",
860 saa->nr);
861 continue; /* skip to next card */
863 } else {
864 for (i = startindex; i < bitdata->datasize; i++)
865 dmabuf[i - startindex] =
866 bitmangler[bitdata->data[i]];
867 debiwrite(saa, 0x014a0000, 0, 0,
868 ((bitdata->datasize - startindex) + 5) * 2);
870 for (i = 0;
871 i < 1000 && !(saaread(SAA7146_PSR) & SAA7146_PSR_PIN2);
872 i++)
873 schedule();
874 if (i == 1000) {
875 printk(KERN_INFO "stradis%d: FPGA load failed\n",
876 saa->nr);
877 failure++;
878 continue;
880 if (!NewCard) {
881 /* Pull the Xilinx INIT signal (GPIO2) low */
882 saawrite(0x00400000, SAA7146_GPIO_CTRL);
883 saaread(SAA7146_PSR); /* ensure posted write */
884 mdelay(2);
885 saawrite(0x00000000, SAA7146_GPIO_CTRL);
886 mdelay(2);
888 printk(KERN_INFO "stradis%d: FPGA Loaded\n", saa->nr);
889 saa->boardcfg[0] = 26; /* mark fpga programmed */
890 /* set VXCO to its lowest frequency */
891 debiwrite(saa, debNormal, XILINX_PWM, 0, 2);
892 if (NewCard) {
893 /* mute CS3310 */
894 if (HaveCS3310)
895 debiwrite(saa, debNormal, XILINX_CS3310_CMPLT,
896 0, 2);
897 /* set VXCO to PWM mode, release reset, blank on */
898 debiwrite(saa, debNormal, XILINX_CTL0, 0xffc4, 2);
899 mdelay(10);
900 /* unmute CS3310 */
901 if (HaveCS3310)
902 debiwrite(saa, debNormal, XILINX_CTL0,
903 0x2020, 2);
905 /* set source Black */
906 debiwrite(saa, debNormal, XILINX_CTL0, 0x1707, 2);
907 saa->boardcfg[4] = 22; /* set NTSC First Active Line */
908 saa->boardcfg[5] = 23; /* set PAL First Active Line */
909 saa->boardcfg[54] = 2; /* set NTSC Last Active Line - 256 */
910 saa->boardcfg[55] = 54; /* set PAL Last Active Line - 256 */
911 set_out_format(saa, VIDEO_MODE_NTSC);
912 mdelay(50);
913 /* begin IBM chip init */
914 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 4, 2);
915 saaread(SAA7146_PSR); /* wait for reset */
916 mdelay(5);
917 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 0, 2);
918 debiread(saa, debNormal, IBM_MP2_CHIP_CONTROL, 2);
919 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 0x10, 2);
920 debiwrite(saa, debNormal, IBM_MP2_CMD_ADDR, 0, 2);
921 debiwrite(saa, debNormal, IBM_MP2_CHIP_MODE, 0x2e, 2);
922 if (NewCard) {
923 mdelay(5);
924 /* set i2s rate converter to 48KHz */
925 debiwrite(saa, debNormal, 0x80c0, 6, 2);
926 /* we must init CS8420 first since rev b pulls i2s */
927 /* master clock low and CS4341 needs i2s master to */
928 /* run the i2c port. */
929 if (HaveCS8420)
930 /* 0=consumer, 1=pro */
931 initialize_cs8420(saa, 0);
933 mdelay(5);
934 if (HaveCS4341)
935 initialize_cs4341(saa);
937 debiwrite(saa, debNormal, IBM_MP2_INFC_CTL, 0x48, 2);
938 debiwrite(saa, debNormal, IBM_MP2_BEEP_CTL, 0xa000, 2);
939 debiwrite(saa, debNormal, IBM_MP2_DISP_LBOR, 0, 2);
940 debiwrite(saa, debNormal, IBM_MP2_DISP_TBOR, 0, 2);
941 if (NewCard)
942 set_genlock_offset(saa, 0);
943 debiwrite(saa, debNormal, IBM_MP2_FRNT_ATTEN, 0, 2);
944 #if 0
945 /* enable genlock */
946 debiwrite(saa, debNormal, XILINX_CTL0, 0x8000, 2);
947 #else
948 /* disable genlock */
949 debiwrite(saa, debNormal, XILINX_CTL0, 0x8080, 2);
950 #endif
953 return failure;
956 static int do_ibm_reset(struct saa7146 *saa)
958 /* failure if decoder not previously programmed */
959 if (saa->boardcfg[0] < 37)
960 return -EIO;
961 /* mute CS3310 */
962 if (HaveCS3310)
963 debiwrite(saa, debNormal, XILINX_CS3310_CMPLT, 0, 2);
964 /* disable interrupts */
965 saawrite(0, SAA7146_IER);
966 saa->audhead = saa->audtail = 0;
967 saa->vidhead = saa->vidtail = 0;
968 /* tristate debi bus, disable debi transfers */
969 saawrite(0x00880000, SAA7146_MC1);
970 /* ensure posted write */
971 saaread(SAA7146_MC1);
972 mdelay(50);
973 /* re-enable debi transfers */
974 saawrite(0x00880088, SAA7146_MC1);
975 /* set source Black */
976 debiwrite(saa, debNormal, XILINX_CTL0, 0x1707, 2);
977 /* begin IBM chip init */
978 set_out_format(saa, CurrentMode);
979 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 4, 2);
980 saaread(SAA7146_PSR); /* wait for reset */
981 mdelay(5);
982 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, 0, 2);
983 debiread(saa, debNormal, IBM_MP2_CHIP_CONTROL, 2);
984 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, ChipControl, 2);
985 debiwrite(saa, debNormal, IBM_MP2_CHIP_MODE, 0x2e, 2);
986 if (NewCard) {
987 mdelay(5);
988 /* set i2s rate converter to 48KHz */
989 debiwrite(saa, debNormal, 0x80c0, 6, 2);
990 /* we must init CS8420 first since rev b pulls i2s */
991 /* master clock low and CS4341 needs i2s master to */
992 /* run the i2c port. */
993 if (HaveCS8420)
994 /* 0=consumer, 1=pro */
995 initialize_cs8420(saa, 1);
997 mdelay(5);
998 if (HaveCS4341)
999 initialize_cs4341(saa);
1001 debiwrite(saa, debNormal, IBM_MP2_INFC_CTL, 0x48, 2);
1002 debiwrite(saa, debNormal, IBM_MP2_BEEP_CTL, 0xa000, 2);
1003 debiwrite(saa, debNormal, IBM_MP2_DISP_LBOR, 0, 2);
1004 debiwrite(saa, debNormal, IBM_MP2_DISP_TBOR, 0, 2);
1005 if (NewCard)
1006 set_genlock_offset(saa, 0);
1007 debiwrite(saa, debNormal, IBM_MP2_FRNT_ATTEN, 0, 2);
1008 debiwrite(saa, debNormal, IBM_MP2_OSD_SIZE, 0x2000, 2);
1009 debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4552, 2);
1010 if (ibm_send_command(saa, IBM_MP2_CONFIG_DECODER,
1011 (ChipControl == 0x43 ? 0xe800 : 0xe000), 1)) {
1012 printk(KERN_ERR "stradis%d: IBM config failed\n", saa->nr);
1014 if (HaveCS3310) {
1015 int i = CS3310MaxLvl;
1016 debiwrite(saa, debNormal, XILINX_CS3310_CMPLT, ((i << 8)| i),2);
1018 /* start video decoder */
1019 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL, ChipControl, 2);
1020 /* 256k vid, 3520 bytes aud */
1021 debiwrite(saa, debNormal, IBM_MP2_RB_THRESHOLD, 0x4037, 2);
1022 debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4573, 2);
1023 ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
1024 /* enable buffer threshold irq */
1025 debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00c, 2);
1026 /* clear pending interrupts */
1027 debiread(saa, debNormal, IBM_MP2_HOST_INT, 2);
1028 debiwrite(saa, debNormal, XILINX_CTL0, 0x1711, 2);
1030 return 0;
1033 /* load the decoder microcode */
1034 static int initialize_ibmmpeg2(struct video_code *microcode)
1036 int i, num;
1037 struct saa7146 *saa;
1039 for (num = 0; num < saa_num; num++) {
1040 saa = &saa7146s[num];
1041 /* check that FPGA is loaded */
1042 debiwrite(saa, debNormal, IBM_MP2_OSD_SIZE, 0xa55a, 2);
1043 i = debiread(saa, debNormal, IBM_MP2_OSD_SIZE, 2);
1044 if (i != 0xa55a) {
1045 printk(KERN_INFO "stradis%d: %04x != 0xa55a\n",
1046 saa->nr, i);
1047 #if 0
1048 return -1;
1049 #endif
1051 if (!strncmp(microcode->loadwhat, "decoder.vid", 11)) {
1052 if (saa->boardcfg[0] > 27)
1053 continue; /* skip to next card */
1054 /* load video control store */
1055 saa->boardcfg[1] = 0x13; /* no-sync default */
1056 debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 1, 2);
1057 debiwrite(saa, debNormal, IBM_MP2_PROC_IADDR, 0, 2);
1058 for (i = 0; i < microcode->datasize / 2; i++)
1059 debiwrite(saa, debNormal, IBM_MP2_PROC_IDATA,
1060 (microcode->data[i * 2] << 8) |
1061 microcode->data[i * 2 + 1], 2);
1062 debiwrite(saa, debNormal, IBM_MP2_PROC_IADDR, 0, 2);
1063 debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 0, 2);
1064 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL,
1065 ChipControl, 2);
1066 saa->boardcfg[0] = 28;
1068 if (!strncmp(microcode->loadwhat, "decoder.aud", 11)) {
1069 if (saa->boardcfg[0] > 35)
1070 continue; /* skip to next card */
1071 /* load audio control store */
1072 debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 1, 2);
1073 debiwrite(saa, debNormal, IBM_MP2_AUD_IADDR, 0, 2);
1074 for (i = 0; i < microcode->datasize; i++)
1075 debiwrite(saa, debNormal, IBM_MP2_AUD_IDATA,
1076 microcode->data[i], 1);
1077 debiwrite(saa, debNormal, IBM_MP2_AUD_IADDR, 0, 2);
1078 debiwrite(saa, debNormal, IBM_MP2_WR_PROT, 0, 2);
1079 debiwrite(saa, debNormal, IBM_MP2_OSD_SIZE, 0x2000, 2);
1080 debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4552, 2);
1081 if (ibm_send_command(saa, IBM_MP2_CONFIG_DECODER,
1082 0xe000, 1)) {
1083 printk(KERN_ERR "stradis%d: IBM config "
1084 "failed\n", saa->nr);
1085 return -1;
1087 /* set PWM to center value */
1088 if (NewCard) {
1089 debiwrite(saa, debNormal, XILINX_PWM,
1090 saa->boardcfg[14] +
1091 (saa->boardcfg[13] << 8), 2);
1092 } else
1093 debiwrite(saa, debNormal, XILINX_PWM, 0x46, 2);
1095 if (HaveCS3310) {
1096 i = CS3310MaxLvl;
1097 debiwrite(saa, debNormal, XILINX_CS3310_CMPLT,
1098 (i << 8) | i, 2);
1100 printk(KERN_INFO "stradis%d: IBM MPEGCD%d Inited\n",
1101 saa->nr, 18 + (debiread(saa, debNormal,
1102 IBM_MP2_CHIP_CONTROL, 2) >> 12));
1103 /* start video decoder */
1104 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL,
1105 ChipControl, 2);
1106 debiwrite(saa, debNormal, IBM_MP2_RB_THRESHOLD, 0x4037,
1107 2); /* 256k vid, 3520 bytes aud */
1108 debiwrite(saa, debNormal, IBM_MP2_AUD_CTL, 0x4573, 2);
1109 ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
1110 /* enable buffer threshold irq */
1111 debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00c, 2);
1112 debiread(saa, debNormal, IBM_MP2_HOST_INT, 2);
1113 /* enable gpio irq */
1114 saawrite(0x00002000, SAA7146_GPIO_CTRL);
1115 /* enable decoder output to HPS */
1116 debiwrite(saa, debNormal, XILINX_CTL0, 0x1711, 2);
1117 saa->boardcfg[0] = 37;
1121 return 0;
1124 static u32 palette2fmt[] = { /* some of these YUV translations are wrong */
1125 0xffffffff, 0x86000000, 0x87000000, 0x80000000, 0x8100000, 0x82000000,
1126 0x83000000, 0x00000000, 0x03000000, 0x03000000, 0x0a00000, 0x03000000,
1127 0x06000000, 0x00000000, 0x03000000, 0x0a000000, 0x0300000
1129 static int bpp2fmt[4] = {
1130 VIDEO_PALETTE_HI240, VIDEO_PALETTE_RGB565, VIDEO_PALETTE_RGB24,
1131 VIDEO_PALETTE_RGB32
1134 /* I wish I could find a formula to calculate these... */
1135 static u32 h_prescale[64] = {
1136 0x10000000, 0x18040202, 0x18080000, 0x380c0606, 0x38100204, 0x38140808,
1137 0x38180000, 0x381c0000, 0x3820161c, 0x38242a3b, 0x38281230, 0x382c4460,
1138 0x38301040, 0x38340080, 0x38380000, 0x383c0000, 0x3840fefe, 0x3844ee9f,
1139 0x3848ee9f, 0x384cee9f, 0x3850ee9f, 0x38542a3b, 0x38581230, 0x385c0000,
1140 0x38600000, 0x38640000, 0x38680000, 0x386c0000, 0x38700000, 0x38740000,
1141 0x38780000, 0x387c0000, 0x30800000, 0x38840000, 0x38880000, 0x388c0000,
1142 0x38900000, 0x38940000, 0x38980000, 0x389c0000, 0x38a00000, 0x38a40000,
1143 0x38a80000, 0x38ac0000, 0x38b00000, 0x38b40000, 0x38b80000, 0x38bc0000,
1144 0x38c00000, 0x38c40000, 0x38c80000, 0x38cc0000, 0x38d00000, 0x38d40000,
1145 0x38d80000, 0x38dc0000, 0x38e00000, 0x38e40000, 0x38e80000, 0x38ec0000,
1146 0x38f00000, 0x38f40000, 0x38f80000, 0x38fc0000,
1148 static u32 v_gain[64] = {
1149 0x016000ff, 0x016100ff, 0x016100ff, 0x016200ff, 0x016200ff, 0x016200ff,
1150 0x016200ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff,
1151 0x016300ff, 0x016300ff, 0x016300ff, 0x016400ff, 0x016400ff, 0x016400ff,
1152 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1153 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1154 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1155 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1156 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1157 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1158 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1159 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1162 static void saa7146_set_winsize(struct saa7146 *saa)
1164 u32 format;
1165 int offset, yacl, ysci;
1166 saa->win.color_fmt = format =
1167 (saa->win.depth == 15) ? palette2fmt[VIDEO_PALETTE_RGB555] :
1168 palette2fmt[bpp2fmt[(saa->win.bpp - 1) & 3]];
1169 offset = saa->win.x * saa->win.bpp + saa->win.y * saa->win.bpl;
1170 saawrite(saa->win.vidadr + offset, SAA7146_BASE_EVEN1);
1171 saawrite(saa->win.vidadr + offset + saa->win.bpl, SAA7146_BASE_ODD1);
1172 saawrite(saa->win.bpl * 2, SAA7146_PITCH1);
1173 saawrite(saa->win.vidadr + saa->win.bpl * saa->win.sheight,
1174 SAA7146_PROT_ADDR1);
1175 saawrite(0, SAA7146_PAGE1);
1176 saawrite(format | 0x60, SAA7146_CLIP_FORMAT_CTRL);
1177 offset = (704 / (saa->win.width - 1)) & 0x3f;
1178 saawrite(h_prescale[offset], SAA7146_HPS_H_PRESCALE);
1179 offset = (720896 / saa->win.width) / (offset + 1);
1180 saawrite((offset << 12) | 0x0c, SAA7146_HPS_H_SCALE);
1181 if (CurrentMode == VIDEO_MODE_NTSC) {
1182 yacl = /*(480 / saa->win.height - 1) & 0x3f */ 0;
1183 ysci = 1024 - (saa->win.height * 1024 / 480);
1184 } else {
1185 yacl = /*(576 / saa->win.height - 1) & 0x3f */ 0;
1186 ysci = 1024 - (saa->win.height * 1024 / 576);
1188 saawrite((1 << 31) | (ysci << 21) | (yacl << 15), SAA7146_HPS_V_SCALE);
1189 saawrite(v_gain[yacl], SAA7146_HPS_V_GAIN);
1190 saawrite(((SAA7146_MC2_UPLD_DMA1 | SAA7146_MC2_UPLD_HPS_V |
1191 SAA7146_MC2_UPLD_HPS_H) << 16) | (SAA7146_MC2_UPLD_DMA1 |
1192 SAA7146_MC2_UPLD_HPS_V | SAA7146_MC2_UPLD_HPS_H), SAA7146_MC2);
1195 /* clip_draw_rectangle(cm,x,y,w,h) -- handle clipping an area
1196 * bitmap is fixed width, 128 bytes (1024 pixels represented)
1197 * arranged most-sigificant-bit-left in 32-bit words
1198 * based on saa7146 clipping hardware, it swaps bytes if LE
1199 * much of this makes up for egcs brain damage -- so if you
1200 * are wondering "why did he do this?" it is because the C
1201 * was adjusted to generate the optimal asm output without
1202 * writing non-portable __asm__ directives.
1205 static void clip_draw_rectangle(u32 *clipmap, int x, int y, int w, int h)
1207 register int startword, endword;
1208 register u32 bitsleft, bitsright;
1209 u32 *temp;
1210 if (x < 0) {
1211 w += x;
1212 x = 0;
1214 if (y < 0) {
1215 h += y;
1216 y = 0;
1218 if (w <= 0 || h <= 0 || x > 1023 || y > 639)
1219 return; /* throw away bad clips */
1220 if (x + w > 1024)
1221 w = 1024 - x;
1222 if (y + h > 640)
1223 h = 640 - y;
1224 startword = (x >> 5);
1225 endword = ((x + w) >> 5);
1226 bitsleft = (0xffffffff >> (x & 31));
1227 bitsright = (0xffffffff << (~((x + w) - (endword << 5))));
1228 temp = &clipmap[(y << 5) + startword];
1229 w = endword - startword;
1230 if (!w) {
1231 bitsleft |= bitsright;
1232 for (y = 0; y < h; y++) {
1233 *temp |= bitsleft;
1234 temp += 32;
1236 } else {
1237 for (y = 0; y < h; y++) {
1238 *temp++ |= bitsleft;
1239 for (x = 1; x < w; x++)
1240 *temp++ = 0xffffffff;
1241 *temp |= bitsright;
1242 temp += (32 - w);
1247 static void make_clip_tab(struct saa7146 *saa, struct video_clip *cr, int ncr)
1249 int i, width, height;
1250 u32 *clipmap;
1252 clipmap = saa->dmavid2;
1253 if ((width = saa->win.width) > 1023)
1254 width = 1023; /* sanity check */
1255 if ((height = saa->win.height) > 640)
1256 height = 639; /* sanity check */
1257 if (ncr > 0) { /* rectangles pased */
1258 /* convert rectangular clips to a bitmap */
1259 memset(clipmap, 0, VIDEO_CLIPMAP_SIZE); /* clear map */
1260 for (i = 0; i < ncr; i++)
1261 clip_draw_rectangle(clipmap, cr[i].x, cr[i].y,
1262 cr[i].width, cr[i].height);
1264 /* clip against viewing window AND screen
1265 so we do not have to rely on the user program
1267 clip_draw_rectangle(clipmap, (saa->win.x + width > saa->win.swidth) ?
1268 (saa->win.swidth - saa->win.x) : width, 0, 1024, 768);
1269 clip_draw_rectangle(clipmap, 0,
1270 (saa->win.y + height > saa->win.sheight) ?
1271 (saa->win.sheight - saa->win.y) : height, 1024, 768);
1272 if (saa->win.x < 0)
1273 clip_draw_rectangle(clipmap, 0, 0, -saa->win.x, 768);
1274 if (saa->win.y < 0)
1275 clip_draw_rectangle(clipmap, 0, 0, 1024, -saa->win.y);
1278 static long saa_ioctl(struct file *file,
1279 unsigned int cmd, unsigned long argl)
1281 struct saa7146 *saa = file->private_data;
1282 void __user *arg = (void __user *)argl;
1284 switch (cmd) {
1285 case VIDIOCGCAP:
1287 struct video_capability b;
1288 strcpy(b.name, saa->video_dev.name);
1289 b.type = VID_TYPE_CAPTURE | VID_TYPE_OVERLAY |
1290 VID_TYPE_CLIPPING | VID_TYPE_FRAMERAM |
1291 VID_TYPE_SCALES;
1292 b.channels = 1;
1293 b.audios = 1;
1294 b.maxwidth = 768;
1295 b.maxheight = 576;
1296 b.minwidth = 32;
1297 b.minheight = 32;
1298 if (copy_to_user(arg, &b, sizeof(b)))
1299 return -EFAULT;
1300 return 0;
1302 case VIDIOCGPICT:
1304 struct video_picture p = saa->picture;
1305 if (saa->win.depth == 8)
1306 p.palette = VIDEO_PALETTE_HI240;
1307 if (saa->win.depth == 15)
1308 p.palette = VIDEO_PALETTE_RGB555;
1309 if (saa->win.depth == 16)
1310 p.palette = VIDEO_PALETTE_RGB565;
1311 if (saa->win.depth == 24)
1312 p.palette = VIDEO_PALETTE_RGB24;
1313 if (saa->win.depth == 32)
1314 p.palette = VIDEO_PALETTE_RGB32;
1315 if (copy_to_user(arg, &p, sizeof(p)))
1316 return -EFAULT;
1317 return 0;
1319 case VIDIOCSPICT:
1321 struct video_picture p;
1322 u32 format;
1323 if (copy_from_user(&p, arg, sizeof(p)))
1324 return -EFAULT;
1325 if (p.palette < ARRAY_SIZE(palette2fmt)) {
1326 format = palette2fmt[p.palette];
1327 saa->win.color_fmt = format;
1328 saawrite(format | 0x60,
1329 SAA7146_CLIP_FORMAT_CTRL);
1331 saawrite(((p.brightness & 0xff00) << 16) |
1332 ((p.contrast & 0xfe00) << 7) |
1333 ((p.colour & 0xfe00) >> 9), SAA7146_BCS_CTRL);
1334 saa->picture = p;
1335 /* upload changed registers */
1336 saawrite(((SAA7146_MC2_UPLD_HPS_H |
1337 SAA7146_MC2_UPLD_HPS_V) << 16) |
1338 SAA7146_MC2_UPLD_HPS_H |
1339 SAA7146_MC2_UPLD_HPS_V, SAA7146_MC2);
1340 return 0;
1342 case VIDIOCSWIN:
1344 struct video_window vw;
1345 struct video_clip *vcp = NULL;
1347 if (copy_from_user(&vw, arg, sizeof(vw)))
1348 return -EFAULT;
1350 /* stop capture */
1351 if (vw.flags || vw.width < 16 || vw.height < 16) {
1352 saawrite((SAA7146_MC1_TR_E_1 << 16),
1353 SAA7146_MC1);
1354 return -EINVAL;
1356 /* 32-bit align start and adjust width */
1357 if (saa->win.bpp < 4) {
1358 int i = vw.x;
1359 vw.x = (vw.x + 3) & ~3;
1360 i = vw.x - i;
1361 vw.width -= i;
1363 saa->win.x = vw.x;
1364 saa->win.y = vw.y;
1365 saa->win.width = vw.width;
1366 if (saa->win.width > 768)
1367 saa->win.width = 768;
1368 saa->win.height = vw.height;
1369 if (CurrentMode == VIDEO_MODE_NTSC) {
1370 if (saa->win.height > 480)
1371 saa->win.height = 480;
1372 } else {
1373 if (saa->win.height > 576)
1374 saa->win.height = 576;
1377 /* stop capture */
1378 saawrite((SAA7146_MC1_TR_E_1 << 16), SAA7146_MC1);
1379 saa7146_set_winsize(saa);
1382 * Do any clips.
1384 if (vw.clipcount < 0) {
1385 if (copy_from_user(saa->dmavid2, vw.clips,
1386 VIDEO_CLIPMAP_SIZE))
1387 return -EFAULT;
1388 } else if (vw.clipcount > 16384) {
1389 return -EINVAL;
1390 } else if (vw.clipcount > 0) {
1391 vcp = vmalloc(sizeof(struct video_clip) *
1392 vw.clipcount);
1393 if (vcp == NULL)
1394 return -ENOMEM;
1395 if (copy_from_user(vcp, vw.clips,
1396 sizeof(struct video_clip) *
1397 vw.clipcount)) {
1398 vfree(vcp);
1399 return -EFAULT;
1401 } else /* nothing clipped */
1402 memset(saa->dmavid2, 0, VIDEO_CLIPMAP_SIZE);
1404 make_clip_tab(saa, vcp, vw.clipcount);
1405 if (vw.clipcount > 0)
1406 vfree(vcp);
1408 /* start capture & clip dma if we have an address */
1409 if ((saa->cap & 3) && saa->win.vidadr != 0)
1410 saawrite(((SAA7146_MC1_TR_E_1 |
1411 SAA7146_MC1_TR_E_2) << 16) | 0xffff,
1412 SAA7146_MC1);
1413 return 0;
1415 case VIDIOCGWIN:
1417 struct video_window vw;
1418 vw.x = saa->win.x;
1419 vw.y = saa->win.y;
1420 vw.width = saa->win.width;
1421 vw.height = saa->win.height;
1422 vw.chromakey = 0;
1423 vw.flags = 0;
1424 if (copy_to_user(arg, &vw, sizeof(vw)))
1425 return -EFAULT;
1426 return 0;
1428 case VIDIOCCAPTURE:
1430 int v;
1431 if (copy_from_user(&v, arg, sizeof(v)))
1432 return -EFAULT;
1433 if (v == 0) {
1434 saa->cap &= ~1;
1435 saawrite((SAA7146_MC1_TR_E_1 << 16),
1436 SAA7146_MC1);
1437 } else {
1438 if (saa->win.vidadr == 0 || saa->win.width == 0
1439 || saa->win.height == 0)
1440 return -EINVAL;
1441 saa->cap |= 1;
1442 saawrite((SAA7146_MC1_TR_E_1 << 16) | 0xffff,
1443 SAA7146_MC1);
1445 return 0;
1447 case VIDIOCGFBUF:
1449 struct video_buffer v;
1450 v.base = (void *)saa->win.vidadr;
1451 v.height = saa->win.sheight;
1452 v.width = saa->win.swidth;
1453 v.depth = saa->win.depth;
1454 v.bytesperline = saa->win.bpl;
1455 if (copy_to_user(arg, &v, sizeof(v)))
1456 return -EFAULT;
1457 return 0;
1460 case VIDIOCSFBUF:
1462 struct video_buffer v;
1463 if (!capable(CAP_SYS_ADMIN))
1464 return -EPERM;
1465 if (copy_from_user(&v, arg, sizeof(v)))
1466 return -EFAULT;
1467 if (v.depth != 8 && v.depth != 15 && v.depth != 16 &&
1468 v.depth != 24 && v.depth != 32 && v.width > 16 &&
1469 v.height > 16 && v.bytesperline > 16)
1470 return -EINVAL;
1471 if (v.base)
1472 saa->win.vidadr = (unsigned long)v.base;
1473 saa->win.sheight = v.height;
1474 saa->win.swidth = v.width;
1475 saa->win.bpp = ((v.depth + 7) & 0x38) / 8;
1476 saa->win.depth = v.depth;
1477 saa->win.bpl = v.bytesperline;
1479 DEBUG(printk("Display at %p is %d by %d, bytedepth %d, "
1480 "bpl %d\n", v.base, v.width, v.height,
1481 saa->win.bpp, saa->win.bpl));
1482 saa7146_set_winsize(saa);
1483 return 0;
1485 case VIDIOCKEY:
1487 /* Will be handled higher up .. */
1488 return 0;
1491 case VIDIOCGAUDIO:
1493 struct video_audio v;
1494 v = saa->audio_dev;
1495 v.flags &= ~(VIDEO_AUDIO_MUTE | VIDEO_AUDIO_MUTABLE);
1496 v.flags |= VIDEO_AUDIO_MUTABLE | VIDEO_AUDIO_VOLUME;
1497 strcpy(v.name, "MPEG");
1498 v.mode = VIDEO_SOUND_STEREO;
1499 if (copy_to_user(arg, &v, sizeof(v)))
1500 return -EFAULT;
1501 return 0;
1503 case VIDIOCSAUDIO:
1505 struct video_audio v;
1506 int i;
1507 if (copy_from_user(&v, arg, sizeof(v)))
1508 return -EFAULT;
1509 i = (~(v.volume >> 8)) & 0xff;
1510 if (!HaveCS4341) {
1511 if (v.flags & VIDEO_AUDIO_MUTE)
1512 debiwrite(saa, debNormal,
1513 IBM_MP2_FRNT_ATTEN, 0xffff, 2);
1514 if (!(v.flags & VIDEO_AUDIO_MUTE))
1515 debiwrite(saa, debNormal,
1516 IBM_MP2_FRNT_ATTEN, 0x0000, 2);
1517 if (v.flags & VIDEO_AUDIO_VOLUME)
1518 debiwrite(saa, debNormal,
1519 IBM_MP2_FRNT_ATTEN,
1520 (i << 8) | i, 2);
1521 } else {
1522 if (v.flags & VIDEO_AUDIO_MUTE)
1523 cs4341_setlevel(saa, 0xff, 0xff);
1524 if (!(v.flags & VIDEO_AUDIO_MUTE))
1525 cs4341_setlevel(saa, 0, 0);
1526 if (v.flags & VIDEO_AUDIO_VOLUME)
1527 cs4341_setlevel(saa, i, i);
1529 saa->audio_dev = v;
1530 return 0;
1533 case VIDIOCGUNIT:
1535 struct video_unit vu;
1536 vu.video = saa->video_dev.minor;
1537 vu.vbi = VIDEO_NO_UNIT;
1538 vu.radio = VIDEO_NO_UNIT;
1539 vu.audio = VIDEO_NO_UNIT;
1540 vu.teletext = VIDEO_NO_UNIT;
1541 if (copy_to_user(arg, &vu, sizeof(vu)))
1542 return -EFAULT;
1543 return 0;
1545 case VIDIOCSPLAYMODE:
1547 struct video_play_mode pmode;
1548 if (copy_from_user((void *)&pmode, arg,
1549 sizeof(struct video_play_mode)))
1550 return -EFAULT;
1551 switch (pmode.mode) {
1552 case VID_PLAY_VID_OUT_MODE:
1553 if (pmode.p1 != VIDEO_MODE_NTSC &&
1554 pmode.p1 != VIDEO_MODE_PAL)
1555 return -EINVAL;
1556 set_out_format(saa, pmode.p1);
1557 return 0;
1558 case VID_PLAY_GENLOCK:
1559 debiwrite(saa, debNormal, XILINX_CTL0,
1560 pmode.p1 ? 0x8000 : 0x8080, 2);
1561 if (NewCard)
1562 set_genlock_offset(saa, pmode.p2);
1563 return 0;
1564 case VID_PLAY_NORMAL:
1565 debiwrite(saa, debNormal,
1566 IBM_MP2_CHIP_CONTROL, ChipControl, 2);
1567 ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
1568 saa->playmode = pmode.mode;
1569 return 0;
1570 case VID_PLAY_PAUSE:
1571 /* IBM removed the PAUSE command */
1572 /* they say use SINGLE_FRAME now */
1573 case VID_PLAY_SINGLE_FRAME:
1574 ibm_send_command(saa, IBM_MP2_SINGLE_FRAME,0,0);
1575 if (saa->playmode == pmode.mode) {
1576 debiwrite(saa, debNormal,
1577 IBM_MP2_CHIP_CONTROL,
1578 ChipControl, 2);
1580 saa->playmode = pmode.mode;
1581 return 0;
1582 case VID_PLAY_FAST_FORWARD:
1583 ibm_send_command(saa, IBM_MP2_FAST_FORWARD,0,0);
1584 saa->playmode = pmode.mode;
1585 return 0;
1586 case VID_PLAY_SLOW_MOTION:
1587 ibm_send_command(saa, IBM_MP2_SLOW_MOTION,
1588 pmode.p1, 0);
1589 saa->playmode = pmode.mode;
1590 return 0;
1591 case VID_PLAY_IMMEDIATE_NORMAL:
1592 /* ensure transfers resume */
1593 debiwrite(saa, debNormal,
1594 IBM_MP2_CHIP_CONTROL, ChipControl, 2);
1595 ibm_send_command(saa, IBM_MP2_IMED_NORM_PLAY,
1596 0, 0);
1597 saa->playmode = VID_PLAY_NORMAL;
1598 return 0;
1599 case VID_PLAY_SWITCH_CHANNELS:
1600 saa->audhead = saa->audtail = 0;
1601 saa->vidhead = saa->vidtail = 0;
1602 ibm_send_command(saa, IBM_MP2_FREEZE_FRAME,0,1);
1603 ibm_send_command(saa, IBM_MP2_RESET_AUD_RATE,
1604 0, 1);
1605 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL,
1606 0, 2);
1607 ibm_send_command(saa, IBM_MP2_CHANNEL_SWITCH,
1608 0, 1);
1609 debiwrite(saa, debNormal, IBM_MP2_CHIP_CONTROL,
1610 ChipControl, 2);
1611 ibm_send_command(saa, IBM_MP2_PLAY, 0, 0);
1612 saa->playmode = VID_PLAY_NORMAL;
1613 return 0;
1614 case VID_PLAY_FREEZE_FRAME:
1615 ibm_send_command(saa, IBM_MP2_FREEZE_FRAME,0,0);
1616 saa->playmode = pmode.mode;
1617 return 0;
1618 case VID_PLAY_STILL_MODE:
1619 ibm_send_command(saa, IBM_MP2_SET_STILL_MODE,
1620 0, 0);
1621 saa->playmode = pmode.mode;
1622 return 0;
1623 case VID_PLAY_MASTER_MODE:
1624 if (pmode.p1 == VID_PLAY_MASTER_NONE)
1625 saa->boardcfg[1] = 0x13;
1626 else if (pmode.p1 == VID_PLAY_MASTER_VIDEO)
1627 saa->boardcfg[1] = 0x23;
1628 else if (pmode.p1 == VID_PLAY_MASTER_AUDIO)
1629 saa->boardcfg[1] = 0x43;
1630 else
1631 return -EINVAL;
1632 debiwrite(saa, debNormal,
1633 IBM_MP2_CHIP_CONTROL, ChipControl, 2);
1634 return 0;
1635 case VID_PLAY_ACTIVE_SCANLINES:
1636 if (CurrentMode == VIDEO_MODE_PAL) {
1637 if (pmode.p1 < 1 || pmode.p2 > 625)
1638 return -EINVAL;
1639 saa->boardcfg[5] = pmode.p1;
1640 saa->boardcfg[55] = (pmode.p1 +
1641 (pmode.p2 / 2) - 1) & 0xff;
1642 } else {
1643 if (pmode.p1 < 4 || pmode.p2 > 525)
1644 return -EINVAL;
1645 saa->boardcfg[4] = pmode.p1;
1646 saa->boardcfg[54] = (pmode.p1 +
1647 (pmode.p2 / 2) - 4) & 0xff;
1649 set_out_format(saa, CurrentMode);
1650 case VID_PLAY_RESET:
1651 return do_ibm_reset(saa);
1652 case VID_PLAY_END_MARK:
1653 if (saa->endmarktail < saa->endmarkhead) {
1654 if (saa->endmarkhead -
1655 saa->endmarktail < 2)
1656 return -ENOSPC;
1657 } else if (saa->endmarkhead <=saa->endmarktail){
1658 if (saa->endmarktail - saa->endmarkhead
1659 > (MAX_MARKS - 2))
1660 return -ENOSPC;
1661 } else
1662 return -ENOSPC;
1663 saa->endmark[saa->endmarktail] = saa->audtail;
1664 saa->endmarktail++;
1665 if (saa->endmarktail >= MAX_MARKS)
1666 saa->endmarktail = 0;
1668 return -EINVAL;
1670 case VIDIOCSWRITEMODE:
1672 int mode;
1673 if (copy_from_user((void *)&mode, arg, sizeof(int)))
1674 return -EFAULT;
1675 if (mode == VID_WRITE_MPEG_AUD ||
1676 mode == VID_WRITE_MPEG_VID ||
1677 mode == VID_WRITE_CC ||
1678 mode == VID_WRITE_TTX ||
1679 mode == VID_WRITE_OSD) {
1680 saa->writemode = mode;
1681 return 0;
1683 return -EINVAL;
1685 case VIDIOCSMICROCODE:
1687 struct video_code ucode;
1688 __u8 *udata;
1689 int i;
1690 if (copy_from_user(&ucode, arg, sizeof(ucode)))
1691 return -EFAULT;
1692 if (ucode.datasize > 65536 || ucode.datasize < 1024 ||
1693 strncmp(ucode.loadwhat, "dec", 3))
1694 return -EINVAL;
1695 if ((udata = vmalloc(ucode.datasize)) == NULL)
1696 return -ENOMEM;
1697 if (copy_from_user(udata, ucode.data, ucode.datasize)) {
1698 vfree(udata);
1699 return -EFAULT;
1701 ucode.data = udata;
1702 if (!strncmp(ucode.loadwhat, "decoder.aud", 11) ||
1703 !strncmp(ucode.loadwhat, "decoder.vid", 11))
1704 i = initialize_ibmmpeg2(&ucode);
1705 else
1706 i = initialize_fpga(&ucode);
1707 vfree(udata);
1708 if (i)
1709 return -EINVAL;
1710 return 0;
1713 case VIDIOCGCHAN: /* this makes xawtv happy */
1715 struct video_channel v;
1716 if (copy_from_user(&v, arg, sizeof(v)))
1717 return -EFAULT;
1718 v.flags = VIDEO_VC_AUDIO;
1719 v.tuners = 0;
1720 v.type = VID_TYPE_MPEG_DECODER;
1721 v.norm = CurrentMode;
1722 strcpy(v.name, "MPEG2");
1723 if (copy_to_user(arg, &v, sizeof(v)))
1724 return -EFAULT;
1725 return 0;
1727 case VIDIOCSCHAN: /* this makes xawtv happy */
1729 struct video_channel v;
1730 if (copy_from_user(&v, arg, sizeof(v)))
1731 return -EFAULT;
1732 /* do nothing */
1733 return 0;
1735 default:
1736 return -ENOIOCTLCMD;
1738 return 0;
1741 static int saa_mmap(struct file *file, struct vm_area_struct *vma)
1743 struct saa7146 *saa = file->private_data;
1744 printk(KERN_DEBUG "stradis%d: saa_mmap called\n", saa->nr);
1745 return -EINVAL;
1748 static ssize_t saa_read(struct file *file, char __user * buf,
1749 size_t count, loff_t * ppos)
1751 return -EINVAL;
1754 static ssize_t saa_write(struct file *file, const char __user * buf,
1755 size_t count, loff_t * ppos)
1757 struct saa7146 *saa = file->private_data;
1758 unsigned long todo = count;
1759 int blocksize, split;
1760 unsigned long flags;
1762 while (todo > 0) {
1763 if (saa->writemode == VID_WRITE_MPEG_AUD) {
1764 spin_lock_irqsave(&saa->lock, flags);
1765 if (saa->audhead <= saa->audtail)
1766 blocksize = 65536 -
1767 (saa->audtail - saa->audhead);
1768 else
1769 blocksize = saa->audhead - saa->audtail;
1770 spin_unlock_irqrestore(&saa->lock, flags);
1771 if (blocksize < 16384) {
1772 saawrite(SAA7146_PSR_DEBI_S |
1773 SAA7146_PSR_PIN1, SAA7146_IER);
1774 saawrite(SAA7146_PSR_PIN1, SAA7146_PSR);
1775 /* wait for buffer space to open */
1776 interruptible_sleep_on(&saa->audq);
1778 spin_lock_irqsave(&saa->lock, flags);
1779 if (saa->audhead <= saa->audtail) {
1780 blocksize = 65536 -
1781 (saa->audtail - saa->audhead);
1782 split = 65536 - saa->audtail;
1783 } else {
1784 blocksize = saa->audhead - saa->audtail;
1785 split = 65536;
1787 spin_unlock_irqrestore(&saa->lock, flags);
1788 blocksize--;
1789 if (blocksize > todo)
1790 blocksize = todo;
1791 /* double check that we really have space */
1792 if (!blocksize)
1793 return -ENOSPC;
1794 if (split < blocksize) {
1795 if (copy_from_user(saa->audbuf +
1796 saa->audtail, buf, split))
1797 return -EFAULT;
1798 buf += split;
1799 todo -= split;
1800 blocksize -= split;
1801 saa->audtail = 0;
1803 if (copy_from_user(saa->audbuf + saa->audtail, buf,
1804 blocksize))
1805 return -EFAULT;
1806 saa->audtail += blocksize;
1807 todo -= blocksize;
1808 buf += blocksize;
1809 saa->audtail &= 0xffff;
1810 } else if (saa->writemode == VID_WRITE_MPEG_VID) {
1811 spin_lock_irqsave(&saa->lock, flags);
1812 if (saa->vidhead <= saa->vidtail)
1813 blocksize = 524288 -
1814 (saa->vidtail - saa->vidhead);
1815 else
1816 blocksize = saa->vidhead - saa->vidtail;
1817 spin_unlock_irqrestore(&saa->lock, flags);
1818 if (blocksize < 65536) {
1819 saawrite(SAA7146_PSR_DEBI_S |
1820 SAA7146_PSR_PIN1, SAA7146_IER);
1821 saawrite(SAA7146_PSR_PIN1, SAA7146_PSR);
1822 /* wait for buffer space to open */
1823 interruptible_sleep_on(&saa->vidq);
1825 spin_lock_irqsave(&saa->lock, flags);
1826 if (saa->vidhead <= saa->vidtail) {
1827 blocksize = 524288 -
1828 (saa->vidtail - saa->vidhead);
1829 split = 524288 - saa->vidtail;
1830 } else {
1831 blocksize = saa->vidhead - saa->vidtail;
1832 split = 524288;
1834 spin_unlock_irqrestore(&saa->lock, flags);
1835 blocksize--;
1836 if (blocksize > todo)
1837 blocksize = todo;
1838 /* double check that we really have space */
1839 if (!blocksize)
1840 return -ENOSPC;
1841 if (split < blocksize) {
1842 if (copy_from_user(saa->vidbuf +
1843 saa->vidtail, buf, split))
1844 return -EFAULT;
1845 buf += split;
1846 todo -= split;
1847 blocksize -= split;
1848 saa->vidtail = 0;
1850 if (copy_from_user(saa->vidbuf + saa->vidtail, buf,
1851 blocksize))
1852 return -EFAULT;
1853 saa->vidtail += blocksize;
1854 todo -= blocksize;
1855 buf += blocksize;
1856 saa->vidtail &= 0x7ffff;
1857 } else if (saa->writemode == VID_WRITE_OSD) {
1858 if (count > 131072)
1859 return -ENOSPC;
1860 if (copy_from_user(saa->osdbuf, buf, count))
1861 return -EFAULT;
1862 buf += count;
1863 saa->osdhead = 0;
1864 saa->osdtail = count;
1865 debiwrite(saa, debNormal, IBM_MP2_OSD_ADDR, 0, 2);
1866 debiwrite(saa, debNormal, IBM_MP2_OSD_LINK_ADDR, 0, 2);
1867 debiwrite(saa, debNormal, IBM_MP2_MASK0, 0xc00d, 2);
1868 debiwrite(saa, debNormal, IBM_MP2_DISP_MODE,
1869 debiread(saa, debNormal,
1870 IBM_MP2_DISP_MODE, 2) | 1, 2);
1871 /* trigger osd data transfer */
1872 saawrite(SAA7146_PSR_DEBI_S |
1873 SAA7146_PSR_PIN1, SAA7146_IER);
1874 saawrite(SAA7146_PSR_PIN1, SAA7146_PSR);
1877 return count;
1880 static int saa_open(struct file *file)
1882 struct video_device *vdev = video_devdata(file);
1883 struct saa7146 *saa = container_of(vdev, struct saa7146, video_dev);
1885 lock_kernel();
1886 file->private_data = saa;
1888 saa->user++;
1889 if (saa->user > 1) {
1890 unlock_kernel();
1891 return 0; /* device open already, don't reset */
1893 saa->writemode = VID_WRITE_MPEG_VID; /* default to video */
1894 unlock_kernel();
1895 return 0;
1898 static int saa_release(struct file *file)
1900 struct saa7146 *saa = file->private_data;
1901 saa->user--;
1903 if (saa->user > 0) /* still someone using device */
1904 return 0;
1905 saawrite(0x007f0000, SAA7146_MC1); /* stop all overlay dma */
1906 return 0;
1909 static const struct v4l2_file_operations saa_fops = {
1910 .owner = THIS_MODULE,
1911 .open = saa_open,
1912 .release = saa_release,
1913 .ioctl = saa_ioctl,
1914 .read = saa_read,
1915 .write = saa_write,
1916 .mmap = saa_mmap,
1919 /* template for video_device-structure */
1920 static struct video_device saa_template = {
1921 .name = "SAA7146A",
1922 .fops = &saa_fops,
1923 .minor = -1,
1924 .release = video_device_release_empty,
1927 static int __devinit configure_saa7146(struct pci_dev *pdev, int num)
1929 int retval;
1930 struct saa7146 *saa = pci_get_drvdata(pdev);
1932 saa->endmarkhead = saa->endmarktail = 0;
1933 saa->win.x = saa->win.y = 0;
1934 saa->win.width = saa->win.cropwidth = 720;
1935 saa->win.height = saa->win.cropheight = 480;
1936 saa->win.cropx = saa->win.cropy = 0;
1937 saa->win.bpp = 2;
1938 saa->win.depth = 16;
1939 saa->win.color_fmt = palette2fmt[VIDEO_PALETTE_RGB565];
1940 saa->win.bpl = 1024 * saa->win.bpp;
1941 saa->win.swidth = 1024;
1942 saa->win.sheight = 768;
1943 saa->picture.brightness = 32768;
1944 saa->picture.contrast = 38768;
1945 saa->picture.colour = 32768;
1946 saa->cap = 0;
1947 saa->nr = num;
1948 saa->playmode = VID_PLAY_NORMAL;
1949 memset(saa->boardcfg, 0, 64); /* clear board config area */
1950 saa->saa7146_mem = NULL;
1951 saa->dmavid1 = saa->dmavid2 = saa->dmavid3 = saa->dmaa1in =
1952 saa->dmaa1out = saa->dmaa2in = saa->dmaa2out =
1953 saa->pagevid1 = saa->pagevid2 = saa->pagevid3 = saa->pagea1in =
1954 saa->pagea1out = saa->pagea2in = saa->pagea2out =
1955 saa->pagedebi = saa->dmaRPS1 = saa->dmaRPS2 = saa->pageRPS1 =
1956 saa->pageRPS2 = NULL;
1957 saa->audbuf = saa->vidbuf = saa->osdbuf = saa->dmadebi = NULL;
1958 saa->audhead = saa->vidtail = 0;
1960 init_waitqueue_head(&saa->i2cq);
1961 init_waitqueue_head(&saa->audq);
1962 init_waitqueue_head(&saa->debiq);
1963 init_waitqueue_head(&saa->vidq);
1964 spin_lock_init(&saa->lock);
1966 retval = pci_enable_device(pdev);
1967 if (retval) {
1968 dev_err(&pdev->dev, "%d: pci_enable_device failed!\n", num);
1969 goto err;
1972 saa->id = pdev->device;
1973 saa->irq = pdev->irq;
1974 saa->video_dev.minor = -1;
1975 saa->saa7146_adr = pci_resource_start(pdev, 0);
1976 pci_read_config_byte(pdev, PCI_CLASS_REVISION, &saa->revision);
1978 saa->saa7146_mem = ioremap(saa->saa7146_adr, 0x200);
1979 if (saa->saa7146_mem == NULL) {
1980 dev_err(&pdev->dev, "%d: ioremap failed!\n", num);
1981 retval = -EIO;
1982 goto err;
1985 memcpy(&saa->video_dev, &saa_template, sizeof(saa_template));
1986 saawrite(0, SAA7146_IER); /* turn off all interrupts */
1988 retval = request_irq(saa->irq, saa7146_irq, IRQF_SHARED | IRQF_DISABLED,
1989 "stradis", saa);
1990 if (retval == -EINVAL)
1991 dev_err(&pdev->dev, "%d: Bad irq number or handler\n", num);
1992 else if (retval == -EBUSY)
1993 dev_err(&pdev->dev, "%d: IRQ %ld busy, change your PnP config "
1994 "in BIOS\n", num, saa->irq);
1995 if (retval < 0)
1996 goto errio;
1998 pci_set_master(pdev);
1999 retval = video_register_device(&saa->video_dev, VFL_TYPE_GRABBER,
2000 video_nr);
2001 if (retval < 0) {
2002 dev_err(&pdev->dev, "%d: error in registering video device!\n",
2003 num);
2004 goto errio;
2007 return 0;
2008 errio:
2009 iounmap(saa->saa7146_mem);
2010 err:
2011 return retval;
2014 static int __devinit init_saa7146(struct pci_dev *pdev)
2016 struct saa7146 *saa = pci_get_drvdata(pdev);
2018 saa->user = 0;
2019 /* reset the saa7146 */
2020 saawrite(0xffff0000, SAA7146_MC1);
2021 mdelay(5);
2022 /* enable debi and i2c transfers and pins */
2023 saawrite(((SAA7146_MC1_EDP | SAA7146_MC1_EI2C |
2024 SAA7146_MC1_TR_E_DEBI) << 16) | 0xffff, SAA7146_MC1);
2025 /* ensure proper state of chip */
2026 saawrite(0x00000000, SAA7146_PAGE1);
2027 saawrite(0x00f302c0, SAA7146_NUM_LINE_BYTE1);
2028 saawrite(0x00000000, SAA7146_PAGE2);
2029 saawrite(0x01400080, SAA7146_NUM_LINE_BYTE2);
2030 saawrite(0x00000000, SAA7146_DD1_INIT);
2031 saawrite(0x00000000, SAA7146_DD1_STREAM_B);
2032 saawrite(0x00000000, SAA7146_DD1_STREAM_A);
2033 saawrite(0x00000000, SAA7146_BRS_CTRL);
2034 saawrite(0x80400040, SAA7146_BCS_CTRL);
2035 saawrite(0x0000e000 /*| (1<<29) */ , SAA7146_HPS_CTRL);
2036 saawrite(0x00000060, SAA7146_CLIP_FORMAT_CTRL);
2037 saawrite(0x00000000, SAA7146_ACON1);
2038 saawrite(0x00000000, SAA7146_ACON2);
2039 saawrite(0x00000600, SAA7146_I2C_STATUS);
2040 saawrite(((SAA7146_MC2_UPLD_D1_B | SAA7146_MC2_UPLD_D1_A |
2041 SAA7146_MC2_UPLD_BRS | SAA7146_MC2_UPLD_HPS_H |
2042 SAA7146_MC2_UPLD_HPS_V | SAA7146_MC2_UPLD_DMA2 |
2043 SAA7146_MC2_UPLD_DMA1 | SAA7146_MC2_UPLD_I2C) << 16) | 0xffff,
2044 SAA7146_MC2);
2045 /* setup arbitration control registers */
2046 saawrite(0x1412121a, SAA7146_PCI_BT_V1);
2048 /* allocate 32k dma buffer + 4k for page table */
2049 if ((saa->dmadebi = kmalloc(32768 + 4096, GFP_KERNEL)) == NULL) {
2050 dev_err(&pdev->dev, "%d: debi kmalloc failed\n", saa->nr);
2051 goto err;
2053 #if 0
2054 saa->pagedebi = saa->dmadebi + 32768; /* top 4k is for mmu */
2055 saawrite(virt_to_bus(saa->pagedebi) /*|0x800 */ , SAA7146_DEBI_PAGE);
2056 for (i = 0; i < 12; i++) /* setup mmu page table */
2057 saa->pagedebi[i] = virt_to_bus((saa->dmadebi + i * 4096));
2058 #endif
2059 saa->audhead = saa->vidhead = saa->osdhead = 0;
2060 saa->audtail = saa->vidtail = saa->osdtail = 0;
2061 if (saa->vidbuf == NULL && (saa->vidbuf = vmalloc(524288)) == NULL) {
2062 dev_err(&pdev->dev, "%d: malloc failed\n", saa->nr);
2063 goto err;
2065 if (saa->audbuf == NULL && (saa->audbuf = vmalloc(65536)) == NULL) {
2066 dev_err(&pdev->dev, "%d: malloc failed\n", saa->nr);
2067 goto errfree;
2069 if (saa->osdbuf == NULL && (saa->osdbuf = vmalloc(131072)) == NULL) {
2070 dev_err(&pdev->dev, "%d: malloc failed\n", saa->nr);
2071 goto errfree;
2073 /* allocate 81920 byte buffer for clipping */
2074 if ((saa->dmavid2 = kzalloc(VIDEO_CLIPMAP_SIZE, GFP_KERNEL)) == NULL) {
2075 dev_err(&pdev->dev, "%d: clip kmalloc failed\n", saa->nr);
2076 goto errfree;
2078 /* setup clipping registers */
2079 saawrite(virt_to_bus(saa->dmavid2), SAA7146_BASE_EVEN2);
2080 saawrite(virt_to_bus(saa->dmavid2) + 128, SAA7146_BASE_ODD2);
2081 saawrite(virt_to_bus(saa->dmavid2) + VIDEO_CLIPMAP_SIZE,
2082 SAA7146_PROT_ADDR2);
2083 saawrite(256, SAA7146_PITCH2);
2084 saawrite(4, SAA7146_PAGE2); /* dma direction: read, no byteswap */
2085 saawrite(((SAA7146_MC2_UPLD_DMA2) << 16) | SAA7146_MC2_UPLD_DMA2,
2086 SAA7146_MC2);
2087 I2CBusScan(saa);
2089 return 0;
2090 errfree:
2091 vfree(saa->osdbuf);
2092 vfree(saa->audbuf);
2093 vfree(saa->vidbuf);
2094 saa->audbuf = saa->osdbuf = saa->vidbuf = NULL;
2095 err:
2096 return -ENOMEM;
2099 static void stradis_release_saa(struct pci_dev *pdev)
2101 u8 command;
2102 struct saa7146 *saa = pci_get_drvdata(pdev);
2104 /* turn off all capturing, DMA and IRQs */
2105 saawrite(0xffff0000, SAA7146_MC1); /* reset chip */
2106 saawrite(0, SAA7146_MC2);
2107 saawrite(0, SAA7146_IER);
2108 saawrite(0xffffffffUL, SAA7146_ISR);
2110 /* disable PCI bus-mastering */
2111 pci_read_config_byte(pdev, PCI_COMMAND, &command);
2112 command &= ~PCI_COMMAND_MASTER;
2113 pci_write_config_byte(pdev, PCI_COMMAND, command);
2115 /* unmap and free memory */
2116 saa->audhead = saa->audtail = saa->osdhead = 0;
2117 saa->vidhead = saa->vidtail = saa->osdtail = 0;
2118 vfree(saa->vidbuf);
2119 vfree(saa->audbuf);
2120 vfree(saa->osdbuf);
2121 kfree(saa->dmavid2);
2122 saa->audbuf = saa->vidbuf = saa->osdbuf = NULL;
2123 saa->dmavid2 = NULL;
2124 kfree(saa->dmadebi);
2125 kfree(saa->dmavid1);
2126 kfree(saa->dmavid3);
2127 kfree(saa->dmaa1in);
2128 kfree(saa->dmaa1out);
2129 kfree(saa->dmaa2in);
2130 kfree(saa->dmaa2out);
2131 kfree(saa->dmaRPS1);
2132 kfree(saa->dmaRPS2);
2133 free_irq(saa->irq, saa);
2134 if (saa->saa7146_mem)
2135 iounmap(saa->saa7146_mem);
2136 if (saa->video_dev.minor != -1)
2137 video_unregister_device(&saa->video_dev);
2140 static int __devinit stradis_probe(struct pci_dev *pdev,
2141 const struct pci_device_id *ent)
2143 int retval = -EINVAL;
2145 if (saa_num >= SAA7146_MAX)
2146 goto err;
2148 if (!pdev->subsystem_vendor)
2149 dev_info(&pdev->dev, "%d: rev1 decoder\n", saa_num);
2150 else
2151 dev_info(&pdev->dev, "%d: SDM2xx found\n", saa_num);
2153 pci_set_drvdata(pdev, &saa7146s[saa_num]);
2155 retval = configure_saa7146(pdev, saa_num);
2156 if (retval) {
2157 dev_err(&pdev->dev, "%d: error in configuring\n", saa_num);
2158 goto err;
2161 if (init_saa7146(pdev) < 0) {
2162 dev_err(&pdev->dev, "%d: error in initialization\n", saa_num);
2163 retval = -EIO;
2164 goto errrel;
2167 saa_num++;
2169 return 0;
2170 errrel:
2171 stradis_release_saa(pdev);
2172 err:
2173 return retval;
2176 static void __devexit stradis_remove(struct pci_dev *pdev)
2178 stradis_release_saa(pdev);
2181 static struct pci_device_id stradis_pci_tbl[] = {
2182 { PCI_DEVICE(PCI_VENDOR_ID_PHILIPS, PCI_DEVICE_ID_PHILIPS_SAA7146) },
2183 { 0 }
2187 static struct pci_driver stradis_driver = {
2188 .name = "stradis",
2189 .id_table = stradis_pci_tbl,
2190 .probe = stradis_probe,
2191 .remove = __devexit_p(stradis_remove)
2194 static int __init stradis_init(void)
2196 int retval;
2198 saa_num = 0;
2200 retval = pci_register_driver(&stradis_driver);
2201 if (retval)
2202 printk(KERN_ERR "stradis: Unable to register pci driver.\n");
2204 return retval;
2207 static void __exit stradis_exit(void)
2209 pci_unregister_driver(&stradis_driver);
2210 printk(KERN_INFO "stradis: module cleanup complete\n");
2213 module_init(stradis_init);
2214 module_exit(stradis_exit);