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>
26 #include <linux/kernel.h>
27 #include <linux/major.h>
28 #include <linux/slab.h>
30 #include <linux/init.h>
31 #include <linux/poll.h>
32 #include <linux/pci.h>
33 #include <linux/signal.h>
35 #include <linux/ioport.h>
36 #include <asm/pgtable.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>
47 #include "saa7146reg.h"
52 #define DEBUG(x) /* debug driver */
53 #undef IDEBUG /* debug irq handler */
54 #undef MDEBUG /* debug memory management */
58 static struct saa7146 saa7146s
[SAA7146_MAX
];
60 static int saa_num
= 0; /* number of SAA7146s in use */
62 static int video_nr
= -1;
63 module_param(video_nr
, int, 0);
64 MODULE_LICENSE("GPL");
67 #define nDebNormal 0x00480000
68 #define nDebNoInc 0x00480000
69 #define nDebVideo 0xd0480000
70 #define nDebAudio 0xd0400000
71 #define nDebDMA 0x02c80000
73 #define oDebNormal 0x13c80000
74 #define oDebNoInc 0x13c80000
75 #define oDebVideo 0xd1080000
76 #define oDebAudio 0xd1080000
77 #define oDebDMA 0x03080000
79 #define NewCard (saa->boardcfg[3])
80 #define ChipControl (saa->boardcfg[1])
81 #define NTSCFirstActive (saa->boardcfg[4])
82 #define PALFirstActive (saa->boardcfg[5])
83 #define NTSCLastActive (saa->boardcfg[54])
84 #define PALLastActive (saa->boardcfg[55])
85 #define Have2MB (saa->boardcfg[18] & 0x40)
86 #define HaveCS8420 (saa->boardcfg[18] & 0x04)
87 #define IBMMPEGCD20 (saa->boardcfg[18] & 0x20)
88 #define HaveCS3310 (saa->boardcfg[18] & 0x01)
89 #define CS3310MaxLvl ((saa->boardcfg[30] << 8) | saa->boardcfg[31])
90 #define HaveCS4341 (saa->boardcfg[40] == 2)
91 #define SDIType (saa->boardcfg[27])
92 #define CurrentMode (saa->boardcfg[2])
94 #define debNormal (NewCard ? nDebNormal : oDebNormal)
95 #define debNoInc (NewCard ? nDebNoInc : oDebNoInc)
96 #define debVideo (NewCard ? nDebVideo : oDebVideo)
97 #define debAudio (NewCard ? nDebAudio : oDebAudio)
98 #define debDMA (NewCard ? nDebDMA : oDebDMA)
100 #ifdef USE_RESCUE_EEPROM_SDM275
101 static unsigned char rescue_eeprom
[64] = {
102 0x00,0x01,0x04,0x13,0x26,0x0f,0x10,0x00,0x00,0x00,0x43,0x63,0x22,0x01,0x29,0x15,0x73,0x00,0x1f, 'd', 'e', 'c', 'x', 'l', 'd', 'v', 'a',0x02,0x00,0x01,0x00,0xcc,0xa4,0x63,0x09,0xe2,0x10,0x00,0x0a,0x00,0x02,0x02, 'd', 'e', 'c', 'x', 'l', 'a',0x00,0x00,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
106 /* ----------------------------------------------------------------------- */
107 /* Hardware I2C functions */
108 static void I2CWipe(struct saa7146
*saa
)
111 /* set i2c to ~=100kHz, abort transfer, clear busy */
112 saawrite(0x600 | SAA7146_I2C_ABORT
, SAA7146_I2C_STATUS
);
113 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
114 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
115 /* wait for i2c registers to be programmed */
116 for (i
= 0; i
< 1000 &&
117 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
119 saawrite(0x600, SAA7146_I2C_STATUS
);
120 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
121 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
122 /* wait for i2c registers to be programmed */
123 for (i
= 0; i
< 1000 &&
124 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
126 saawrite(0x600, SAA7146_I2C_STATUS
);
127 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
128 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
129 /* wait for i2c registers to be programmed */
130 for (i
= 0; i
< 1000 &&
131 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
136 static int I2CRead(struct saa7146
*saa
, unsigned char addr
,
137 unsigned char subaddr
, int dosub
)
141 if (saaread(SAA7146_I2C_STATUS
) & 0x3c)
143 for (i
= 0; i
< 1000 &&
144 (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_BUSY
); i
++)
149 saawrite(((addr
& 0xfe) << 24) | (((addr
| 1) & 0xff) << 8) |
150 ((subaddr
& 0xff) << 16) | 0xed, SAA7146_I2C_TRANSFER
);
152 saawrite(((addr
& 0xfe) << 24) | (((addr
| 1) & 0xff) << 16) |
153 0xf1, SAA7146_I2C_TRANSFER
);
154 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
155 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
156 /* wait for i2c registers to be programmed */
157 for (i
= 0; i
< 1000 &&
158 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
160 /* wait for valid data */
161 for (i
= 0; i
< 1000 &&
162 (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_BUSY
); i
++)
164 if (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_ERR
)
167 printk("i2c setup read timeout\n");
168 saawrite(0x41, SAA7146_I2C_TRANSFER
);
169 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
170 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
171 /* wait for i2c registers to be programmed */
172 for (i
= 0; i
< 1000 &&
173 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
175 /* wait for valid data */
176 for (i
= 0; i
< 1000 &&
177 (saaread(SAA7146_I2C_TRANSFER
) & SAA7146_I2C_BUSY
); i
++)
179 if (saaread(SAA7146_I2C_TRANSFER
) & SAA7146_I2C_ERR
)
182 printk("i2c read timeout\n");
183 return ((saaread(SAA7146_I2C_TRANSFER
) >> 24) & 0xff);
186 /* set both to write both bytes, reset it to write only b1 */
188 static int I2CWrite(struct saa7146
*saa
, unsigned char addr
, unsigned char b1
,
189 unsigned char b2
, int both
)
194 if (saaread(SAA7146_I2C_STATUS
) & 0x3c)
196 for (i
= 0; i
< 1000 &&
197 (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_BUSY
); i
++)
201 data
= ((addr
& 0xfe) << 24) | ((b1
& 0xff) << 16);
203 data
|= ((b2
& 0xff) << 8) | 0xe5;
206 saawrite(data
, SAA7146_I2C_TRANSFER
);
207 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) | SAA7146_MC2_UPLD_I2C
,
212 static void attach_inform(struct saa7146
*saa
, int id
)
216 DEBUG(printk(KERN_DEBUG
"stradis%d: i2c: device found=%02x\n", saa
->nr
, id
));
217 if (id
== 0xa0) { /* we have rev2 or later board, fill in info */
218 for (i
= 0; i
< 64; i
++)
219 saa
->boardcfg
[i
] = I2CRead(saa
, 0xa0, i
, 1);
220 #ifdef USE_RESCUE_EEPROM_SDM275
221 if (saa
->boardcfg
[0] != 0) {
222 printk("stradis%d: WARNING: EEPROM STORED VALUES HAVE BEEN IGNORED\n", saa
->nr
);
223 for (i
= 0; i
< 64; i
++)
224 saa
->boardcfg
[i
] = rescue_eeprom
[i
];
227 printk("stradis%d: config =", saa
->nr
);
228 for (i
= 0; i
< 51; i
++) {
229 printk(" %02x",saa
->boardcfg
[i
]);
235 static void I2CBusScan(struct saa7146
*saa
)
238 for (i
= 0; i
< 0xff; i
+= 2)
239 if ((I2CRead(saa
, i
, 0, 0)) >= 0)
240 attach_inform(saa
, i
);
243 static int debiwait_maxwait
= 0;
245 static int wait_for_debi_done(struct saa7146
*saa
)
249 /* wait for registers to be programmed */
250 for (i
= 0; i
< 100000 &&
251 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_DEBI
); i
++)
252 saaread(SAA7146_MC2
);
253 /* wait for transfer to complete */
254 for (i
= 0; i
< 500000 &&
255 (saaread(SAA7146_PSR
) & SAA7146_PSR_DEBI_S
); i
++)
256 saaread(SAA7146_MC2
);
257 if (i
> debiwait_maxwait
)
258 printk("wait-for-debi-done maxwait: %d\n",
259 debiwait_maxwait
= i
);
266 static int debiwrite(struct saa7146
*saa
, u32 config
, int addr
,
270 if (count
<= 0 || count
> 32764)
272 if (wait_for_debi_done(saa
) < 0)
274 saawrite(config
, SAA7146_DEBI_CONFIG
);
275 if (count
<= 4) /* immediate transfer */
276 saawrite(val
, SAA7146_DEBI_AD
);
277 else /* block transfer */
278 saawrite(virt_to_bus(saa
->dmadebi
), SAA7146_DEBI_AD
);
279 saawrite((cmd
= (count
<< 17) | (addr
& 0xffff)), SAA7146_DEBI_COMMAND
);
280 saawrite((SAA7146_MC2_UPLD_DEBI
<< 16) | SAA7146_MC2_UPLD_DEBI
,
285 static u32
debiread(struct saa7146
*saa
, u32 config
, int addr
, int count
)
289 if (count
> 32764 || count
<= 0)
291 if (wait_for_debi_done(saa
) < 0)
293 saawrite(virt_to_bus(saa
->dmadebi
), SAA7146_DEBI_AD
);
294 saawrite((count
<< 17) | 0x10000 | (addr
& 0xffff),
295 SAA7146_DEBI_COMMAND
);
296 saawrite(config
, SAA7146_DEBI_CONFIG
);
297 saawrite((SAA7146_MC2_UPLD_DEBI
<< 16) | SAA7146_MC2_UPLD_DEBI
,
299 if (count
> 4) /* not an immediate transfer */
301 wait_for_debi_done(saa
);
302 result
= saaread(SAA7146_DEBI_AD
);
313 /* MUST be a multiple of 8 bytes and 8-byte aligned and < 32768 bytes */
314 /* data copied into saa->dmadebi buffer, caller must re-enable interrupts */
315 static void ibm_block_dram_read(struct saa7146
*saa
, int address
, int bytes
)
319 buf
= (u32
*) saa
->dmadebi
;
322 saawrite(0, SAA7146_IER
); /* disable interrupts */
323 for (i
=0; i
< 10000 &&
324 (debiread(saa
, debNormal
, IBM_MP2_DRAM_CMD_STAT
, 2)
326 saaread(SAA7146_MC2
);
328 printk(KERN_ERR
"stradis%d: dram_busy never cleared\n",
330 debiwrite(saa
, debNormal
, IBM_MP2_SRC_ADDR
, (address
<<16) |
332 debiwrite(saa
, debNormal
, IBM_MP2_BLOCK_SIZE
, bytes
, 2);
333 debiwrite(saa
, debNormal
, IBM_MP2_CMD_STAT
, 0x8a10, 2);
334 for (j
= 0; j
< bytes
/4; j
++) {
335 for (i
= 0; i
< 10000 &&
336 (!(debiread(saa
, debNormal
, IBM_MP2_DRAM_CMD_STAT
, 2)
338 saaread(SAA7146_MC2
);
340 printk(KERN_ERR
"stradis%d: dram_ready never set\n",
342 buf
[j
] = debiread(saa
, debNormal
, IBM_MP2_DRAM_DATA
, 4);
347 static void do_irq_send_data(struct saa7146
*saa
)
349 int split
, audbytes
, vidbytes
;
351 saawrite(SAA7146_PSR_PIN1
, SAA7146_IER
);
352 /* if special feature mode in effect, disable audio sending */
353 if (saa
->playmode
!= VID_PLAY_NORMAL
)
354 saa
->audtail
= saa
->audhead
= 0;
355 if (saa
->audhead
<= saa
->audtail
)
356 audbytes
= saa
->audtail
- saa
->audhead
;
358 audbytes
= 65536 - (saa
->audhead
- saa
->audtail
);
359 if (saa
->vidhead
<= saa
->vidtail
)
360 vidbytes
= saa
->vidtail
- saa
->vidhead
;
362 vidbytes
= 524288 - (saa
->vidhead
- saa
->vidtail
);
363 if (audbytes
== 0 && vidbytes
== 0 && saa
->osdtail
== saa
->osdhead
) {
364 saawrite(0, SAA7146_IER
);
367 /* if at least 1 block audio waiting and audio fifo isn't full */
368 if (audbytes
>= 2048 && (debiread(saa
, debNormal
,
369 IBM_MP2_AUD_FIFO
, 2) & 0xff) < 60) {
370 if (saa
->audhead
> saa
->audtail
)
371 split
= 65536 - saa
->audhead
;
375 if (split
> 0 && split
< 2048) {
376 memcpy(saa
->dmadebi
, saa
->audbuf
+ saa
->audhead
,
382 memcpy(saa
->dmadebi
+ split
, saa
->audbuf
+ saa
->audhead
,
384 saa
->audhead
+= audbytes
;
385 saa
->audhead
&= 0xffff;
386 debiwrite(saa
, debAudio
, (NewCard
? IBM_MP2_AUD_FIFO
:
387 IBM_MP2_AUD_FIFOW
), 0, 2048);
388 wake_up_interruptible(&saa
->audq
);
389 /* if at least 1 block video waiting and video fifo isn't full */
390 } else if (vidbytes
>= 30720 && (debiread(saa
, debNormal
,
391 IBM_MP2_FIFO
, 2)) < 16384) {
392 if (saa
->vidhead
> saa
->vidtail
)
393 split
= 524288 - saa
->vidhead
;
397 if (split
> 0 && split
< 30720) {
398 memcpy(saa
->dmadebi
, saa
->vidbuf
+ saa
->vidhead
,
404 memcpy(saa
->dmadebi
+ split
, saa
->vidbuf
+ saa
->vidhead
,
406 saa
->vidhead
+= vidbytes
;
407 saa
->vidhead
&= 0x7ffff;
408 debiwrite(saa
, debVideo
, (NewCard
? IBM_MP2_FIFO
:
409 IBM_MP2_FIFOW
), 0, 30720);
410 wake_up_interruptible(&saa
->vidq
);
412 saawrite(SAA7146_PSR_DEBI_S
| SAA7146_PSR_PIN1
, SAA7146_IER
);
415 static void send_osd_data(struct saa7146
*saa
)
417 int size
= saa
->osdtail
- saa
->osdhead
;
420 /* ensure some multiple of 8 bytes is transferred */
421 size
= 8 * ((size
+ 8)>>3);
423 debiwrite(saa
, debNormal
, IBM_MP2_OSD_ADDR
,
424 (saa
->osdhead
>>3), 2);
425 memcpy(saa
->dmadebi
, &saa
->osdbuf
[saa
->osdhead
], size
);
426 saa
->osdhead
+= size
;
427 /* block transfer of next 8 bytes to ~32k bytes */
428 debiwrite(saa
, debNormal
, IBM_MP2_OSD_DATA
, 0, size
);
430 if (saa
->osdhead
>= saa
->osdtail
) {
431 saa
->osdhead
= saa
->osdtail
= 0;
432 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00c, 2);
436 static irqreturn_t
saa7146_irq(int irq
, void *dev_id
, struct pt_regs
*regs
)
438 struct saa7146
*saa
= (struct saa7146
*) dev_id
;
445 /* get/clear interrupt status bits */
446 stat
= saaread(SAA7146_ISR
);
447 astat
= stat
& saaread(SAA7146_IER
);
451 saawrite(astat
, SAA7146_ISR
);
452 if (astat
& SAA7146_PSR_DEBI_S
) {
453 do_irq_send_data(saa
);
455 if (astat
& SAA7146_PSR_PIN1
) {
457 /* the following read will trigger DEBI_S */
458 istat
= debiread(saa
, debNormal
, IBM_MP2_HOST_INT
, 2);
460 saawrite(0, SAA7146_IER
);
462 saawrite(SAA7146_PSR_DEBI_S
|
463 SAA7146_PSR_PIN1
, SAA7146_IER
);
465 if (istat
& 0x20) { /* Video Start */
466 saa
->vidinfo
.frame_count
++;
468 if (istat
& 0x400) { /* Picture Start */
469 /* update temporal reference */
471 if (istat
& 0x200) { /* Picture Resolution Change */
472 /* read new resolution */
474 if (istat
& 0x100) { /* New User Data found */
475 /* read new user data */
477 if (istat
& 0x1000) { /* new GOP/SMPTE */
480 if (istat
& 0x8000) { /* Sequence Start Code */
481 /* reset frame counter, load sizes */
482 saa
->vidinfo
.frame_count
= 0;
483 saa
->vidinfo
.h_size
= 704;
484 saa
->vidinfo
.v_size
= 480;
486 if (saa
->endmarkhead
!= saa
->endmarktail
) {
488 saa
->endmark
[saa
->endmarkhead
];
490 if (saa
->endmarkhead
>= MAX_MARKS
)
491 saa
->endmarkhead
= 0;
495 if (istat
& 0x4000) { /* Sequence Error Code */
496 if (saa
->endmarkhead
!= saa
->endmarktail
) {
498 saa
->endmark
[saa
->endmarkhead
];
500 if (saa
->endmarkhead
>= MAX_MARKS
)
501 saa
->endmarkhead
= 0;
506 if (astat
& SAA7146_PSR_PPEF
) {
507 IDEBUG(printk("stradis%d irq: PPEF\n", saa
->nr
));
509 if (astat
& SAA7146_PSR_PABO
) {
510 IDEBUG(printk("stradis%d irq: PABO\n", saa
->nr
));
512 if (astat
& SAA7146_PSR_PPED
) {
513 IDEBUG(printk("stradis%d irq: PPED\n", saa
->nr
));
515 if (astat
& SAA7146_PSR_RPS_I1
) {
516 IDEBUG(printk("stradis%d irq: RPS_I1\n", saa
->nr
));
518 if (astat
& SAA7146_PSR_RPS_I0
) {
519 IDEBUG(printk("stradis%d irq: RPS_I0\n", saa
->nr
));
521 if (astat
& SAA7146_PSR_RPS_LATE1
) {
522 IDEBUG(printk("stradis%d irq: RPS_LATE1\n", saa
->nr
));
524 if (astat
& SAA7146_PSR_RPS_LATE0
) {
525 IDEBUG(printk("stradis%d irq: RPS_LATE0\n", saa
->nr
));
527 if (astat
& SAA7146_PSR_RPS_E1
) {
528 IDEBUG(printk("stradis%d irq: RPS_E1\n", saa
->nr
));
530 if (astat
& SAA7146_PSR_RPS_E0
) {
531 IDEBUG(printk("stradis%d irq: RPS_E0\n", saa
->nr
));
533 if (astat
& SAA7146_PSR_RPS_TO1
) {
534 IDEBUG(printk("stradis%d irq: RPS_TO1\n", saa
->nr
));
536 if (astat
& SAA7146_PSR_RPS_TO0
) {
537 IDEBUG(printk("stradis%d irq: RPS_TO0\n", saa
->nr
));
539 if (astat
& SAA7146_PSR_UPLD
) {
540 IDEBUG(printk("stradis%d irq: UPLD\n", saa
->nr
));
542 if (astat
& SAA7146_PSR_DEBI_E
) {
543 IDEBUG(printk("stradis%d irq: DEBI_E\n", saa
->nr
));
545 if (astat
& SAA7146_PSR_I2C_S
) {
546 IDEBUG(printk("stradis%d irq: I2C_S\n", saa
->nr
));
548 if (astat
& SAA7146_PSR_I2C_E
) {
549 IDEBUG(printk("stradis%d irq: I2C_E\n", saa
->nr
));
551 if (astat
& SAA7146_PSR_A2_IN
) {
552 IDEBUG(printk("stradis%d irq: A2_IN\n", saa
->nr
));
554 if (astat
& SAA7146_PSR_A2_OUT
) {
555 IDEBUG(printk("stradis%d irq: A2_OUT\n", saa
->nr
));
557 if (astat
& SAA7146_PSR_A1_IN
) {
558 IDEBUG(printk("stradis%d irq: A1_IN\n", saa
->nr
));
560 if (astat
& SAA7146_PSR_A1_OUT
) {
561 IDEBUG(printk("stradis%d irq: A1_OUT\n", saa
->nr
));
563 if (astat
& SAA7146_PSR_AFOU
) {
564 IDEBUG(printk("stradis%d irq: AFOU\n", saa
->nr
));
566 if (astat
& SAA7146_PSR_V_PE
) {
567 IDEBUG(printk("stradis%d irq: V_PE\n", saa
->nr
));
569 if (astat
& SAA7146_PSR_VFOU
) {
570 IDEBUG(printk("stradis%d irq: VFOU\n", saa
->nr
));
572 if (astat
& SAA7146_PSR_FIDA
) {
573 IDEBUG(printk("stradis%d irq: FIDA\n", saa
->nr
));
575 if (astat
& SAA7146_PSR_FIDB
) {
576 IDEBUG(printk("stradis%d irq: FIDB\n", saa
->nr
));
578 if (astat
& SAA7146_PSR_PIN3
) {
579 IDEBUG(printk("stradis%d irq: PIN3\n", saa
->nr
));
581 if (astat
& SAA7146_PSR_PIN2
) {
582 IDEBUG(printk("stradis%d irq: PIN2\n", saa
->nr
));
584 if (astat
& SAA7146_PSR_PIN0
) {
585 IDEBUG(printk("stradis%d irq: PIN0\n", saa
->nr
));
587 if (astat
& SAA7146_PSR_ECS
) {
588 IDEBUG(printk("stradis%d irq: ECS\n", saa
->nr
));
590 if (astat
& SAA7146_PSR_EC3S
) {
591 IDEBUG(printk("stradis%d irq: EC3S\n", saa
->nr
));
593 if (astat
& SAA7146_PSR_EC0S
) {
594 IDEBUG(printk("stradis%d irq: EC0S\n", saa
->nr
));
599 printk(KERN_WARNING
"stradis%d: irq loop %d\n",
602 saawrite(0, SAA7146_IER
);
604 "stradis%d: IRQ loop cleared\n", saa
->nr
);
607 return IRQ_RETVAL(handled
);
610 static int ibm_send_command(struct saa7146
*saa
,
611 int command
, int data
, int chain
)
616 debiwrite(saa
, debNormal
, IBM_MP2_COMMAND
, (command
<< 1) | 1, 2);
618 debiwrite(saa
, debNormal
, IBM_MP2_COMMAND
, command
<< 1, 2);
619 debiwrite(saa
, debNormal
, IBM_MP2_CMD_DATA
, data
, 2);
620 debiwrite(saa
, debNormal
, IBM_MP2_CMD_STAT
, 1, 2);
621 for (i
= 0; i
< 100 &&
622 (debiread(saa
, debNormal
, IBM_MP2_CMD_STAT
, 2) & 1); i
++)
629 static void cs4341_setlevel(struct saa7146
*saa
, int left
, int right
)
631 I2CWrite(saa
, 0x22, 0x03, left
> 94 ? 94 : left
, 2);
632 I2CWrite(saa
, 0x22, 0x04, right
> 94 ? 94 : right
, 2);
635 static void initialize_cs4341(struct saa7146
*saa
)
638 for (i
= 0; i
< 200; i
++) {
639 /* auto mute off, power on, no de-emphasis */
640 /* I2S data up to 24-bit 64xFs internal SCLK */
641 I2CWrite(saa
, 0x22, 0x01, 0x11, 2);
642 /* ATAPI mixer settings */
643 I2CWrite(saa
, 0x22, 0x02, 0x49, 2);
644 /* attenuation left 3db */
645 I2CWrite(saa
, 0x22, 0x03, 0x00, 2);
646 /* attenuation right 3db */
647 I2CWrite(saa
, 0x22, 0x04, 0x00, 2);
648 I2CWrite(saa
, 0x22, 0x01, 0x10, 2);
649 if (I2CRead(saa
, 0x22, 0x02, 1) == 0x49)
653 printk("stradis%d: CS4341 initialized (%d)\n", saa
->nr
, i
);
657 static void initialize_cs8420(struct saa7146
*saa
, int pro
)
662 sequence
= mode8420pro
;
664 sequence
= mode8420con
;
665 for (i
= 0; i
< INIT8420LEN
; i
++)
666 I2CWrite(saa
, 0x20, init8420
[i
* 2],
667 init8420
[i
* 2 + 1], 2);
668 for (i
= 0; i
< MODE8420LEN
; i
++)
669 I2CWrite(saa
, 0x20, sequence
[i
* 2],
670 sequence
[i
* 2 + 1], 2);
671 printk("stradis%d: CS8420 initialized\n", saa
->nr
);
674 static void initialize_saa7121(struct saa7146
*saa
, int dopal
)
679 sequence
= init7121pal
;
681 sequence
= init7121ntsc
;
682 mod
= saaread(SAA7146_PSR
) & 0x08;
683 /* initialize PAL/NTSC video encoder */
684 for (i
= 0; i
< INIT7121LEN
; i
++) {
685 if (NewCard
) { /* handle new card encoder differences */
686 if (sequence
[i
*2] == 0x3a)
687 I2CWrite(saa
, 0x88, 0x3a, 0x13, 2);
688 else if (sequence
[i
*2] == 0x6b)
689 I2CWrite(saa
, 0x88, 0x6b, 0x20, 2);
690 else if (sequence
[i
*2] == 0x6c)
691 I2CWrite(saa
, 0x88, 0x6c,
692 dopal
? 0x09 : 0xf5, 2);
693 else if (sequence
[i
*2] == 0x6d)
694 I2CWrite(saa
, 0x88, 0x6d,
695 dopal
? 0x20 : 0x00, 2);
696 else if (sequence
[i
*2] == 0x7a)
697 I2CWrite(saa
, 0x88, 0x7a,
698 dopal
? (PALFirstActive
- 1) :
699 (NTSCFirstActive
- 4), 2);
700 else if (sequence
[i
*2] == 0x7b)
701 I2CWrite(saa
, 0x88, 0x7b,
702 dopal
? PALLastActive
:
704 else I2CWrite(saa
, 0x88, sequence
[i
* 2],
705 sequence
[i
* 2 + 1], 2);
707 if (sequence
[i
*2] == 0x6b && mod
)
708 I2CWrite(saa
, 0x88, 0x6b,
709 (sequence
[i
* 2 + 1] ^ 0x09), 2);
710 else if (sequence
[i
*2] == 0x7a)
711 I2CWrite(saa
, 0x88, 0x7a,
712 dopal
? (PALFirstActive
- 1) :
713 (NTSCFirstActive
- 4), 2);
714 else if (sequence
[i
*2] == 0x7b)
715 I2CWrite(saa
, 0x88, 0x7b,
716 dopal
? PALLastActive
:
719 I2CWrite(saa
, 0x88, sequence
[i
* 2],
720 sequence
[i
* 2 + 1], 2);
725 static void set_genlock_offset(struct saa7146
*saa
, int noffset
)
728 int PixelsPerLine
= 858;
729 if (CurrentMode
== VIDEO_MODE_PAL
)
733 else if (noffset
< -500)
735 nCode
= noffset
+ 0x100;
738 else if (nCode
< 1) nCode
= 0x400 + PixelsPerLine
+ nCode
;
739 debiwrite(saa
, debNormal
, XILINX_GLDELAY
, nCode
, 2);
742 static void set_out_format(struct saa7146
*saa
, int mode
)
744 initialize_saa7121(saa
, (mode
== VIDEO_MODE_NTSC
? 0 : 1));
745 saa
->boardcfg
[2] = mode
;
746 /* do not adjust analog video parameters here, use saa7121 init */
747 /* you will affect the SDI output on the new card */
748 if (mode
== VIDEO_MODE_PAL
) { /* PAL */
749 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x0808, 2);
751 saawrite(0x012002c0, SAA7146_NUM_LINE_BYTE1
);
753 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
,
757 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
,
758 NewCard
? 0xe500: 0x6500, 2);
759 debiwrite(saa
, debNormal
, IBM_MP2_DISP_DLY
,
761 (NewCard
? PALFirstActive
: PALFirstActive
-6), 2);
763 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x0800, 2);
765 saawrite(0x00f002c0, SAA7146_NUM_LINE_BYTE1
);
766 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
,
767 NewCard
? 0xe100: 0x6100, 2);
768 debiwrite(saa
, debNormal
, IBM_MP2_DISP_DLY
,
770 (NewCard
? NTSCFirstActive
: NTSCFirstActive
-6), 2);
775 /* Intialize bitmangler to map from a byte value to the mangled word that
776 * must be output to program the Xilinx part through the DEBI port.
777 * Xilinx Data Bit->DEBI Bit: 0->15 1->7 2->6 3->12 4->11 5->2 6->1 7->0
778 * transfer FPGA code, init IBM chip, transfer IBM microcode
779 * rev2 card mangles: 0->7 1->6 2->5 3->4 4->3 5->2 6->1 7->0
781 static u16 bitmangler
[256];
783 static int initialize_fpga(struct video_code
*bitdata
)
785 int i
, num
, startindex
, failure
= 0, loadtwo
, loadfile
= 0;
790 /* verify fpga code */
791 for (startindex
= 0; startindex
< bitdata
->datasize
; startindex
++)
792 if (bitdata
->data
[startindex
] == 255)
794 if (startindex
== bitdata
->datasize
) {
795 printk(KERN_INFO
"stradis: bad fpga code\n");
798 /* initialize all detected cards */
799 for (num
= 0; num
< saa_num
; num
++) {
800 saa
= &saa7146s
[num
];
801 if (saa
->boardcfg
[0] > 20)
802 continue; /* card was programmed */
803 loadtwo
= (saa
->boardcfg
[18] & 0x10);
804 if (!NewCard
) /* we have an old board */
805 for (i
= 0; i
< 256; i
++)
806 bitmangler
[i
] = ((i
& 0x01) << 15) |
807 ((i
& 0x02) << 6) | ((i
& 0x04) << 4) |
808 ((i
& 0x08) << 9) | ((i
& 0x10) << 7) |
809 ((i
& 0x20) >> 3) | ((i
& 0x40) >> 5) |
811 else /* else we have a new board */
812 for (i
= 0; i
< 256; i
++)
813 bitmangler
[i
] = ((i
& 0x01) << 7) |
814 ((i
& 0x02) << 5) | ((i
& 0x04) << 3) |
815 ((i
& 0x08) << 1) | ((i
& 0x10) >> 1) |
816 ((i
& 0x20) >> 3) | ((i
& 0x40) >> 5) |
819 dmabuf
= (u16
*) saa
->dmadebi
;
820 newdma
= (u8
*) saa
->dmadebi
;
821 if (NewCard
) { /* SDM2xxx */
822 if (!strncmp(bitdata
->loadwhat
, "decoder2", 8))
823 continue; /* fpga not for this card */
824 if (!strncmp(&saa
->boardcfg
[42],
825 bitdata
->loadwhat
, 8)) {
827 } else if (loadtwo
&& !strncmp(&saa
->boardcfg
[19],
828 bitdata
->loadwhat
, 8)) {
830 } else if (!saa
->boardcfg
[42] && /* special */
831 !strncmp("decxl", bitdata
->loadwhat
, 8)) {
834 continue; /* fpga not for this card */
835 if (loadfile
!= 1 && loadfile
!= 2) {
836 continue; /* skip to next card */
838 if (saa
->boardcfg
[0] && loadfile
== 1 )
839 continue; /* skip to next card */
840 if (saa
->boardcfg
[0] != 1 && loadfile
== 2)
841 continue; /* skip to next card */
842 saa
->boardcfg
[0]++; /* mark fpga handled */
843 printk("stradis%d: loading %s\n", saa
->nr
,
845 if (loadtwo
&& loadfile
== 2)
846 goto send_fpga_stuff
;
847 /* turn on the Audio interface to set PROG low */
848 saawrite(0x00400040, SAA7146_GPIO_CTRL
);
849 saaread(SAA7146_PSR
); /* ensure posted write */
850 /* wait for everyone to reset */
852 saawrite(0x00400000, SAA7146_GPIO_CTRL
);
853 } else { /* original card */
854 if (strncmp(bitdata
->loadwhat
, "decoder2", 8))
855 continue; /* fpga not for this card */
856 /* Pull the Xilinx PROG signal WS3 low */
857 saawrite(0x02000200, SAA7146_MC1
);
858 /* Turn on the Audio interface so can set PROG low */
859 saawrite(0x000000c0, SAA7146_ACON1
);
860 /* Pull the Xilinx INIT signal (GPIO2) low */
861 saawrite(0x00400000, SAA7146_GPIO_CTRL
);
862 /* Make sure everybody resets */
863 saaread(SAA7146_PSR
); /* ensure posted write */
865 /* Release the Xilinx PROG signal */
866 saawrite(0x00000000, SAA7146_ACON1
);
867 /* Turn off the Audio interface */
868 saawrite(0x02000000, SAA7146_MC1
);
870 /* Release Xilinx INIT signal (WS2) */
871 saawrite(0x00000000, SAA7146_GPIO_CTRL
);
872 /* Wait for the INIT to go High */
873 for (i
= 0; i
< 10000 &&
874 !(saaread(SAA7146_PSR
) & SAA7146_PSR_PIN2
); i
++)
877 printk(KERN_INFO
"stradis%d: no fpga INIT\n", saa
->nr
);
882 for (i
= startindex
; i
< bitdata
->datasize
; i
++)
883 newdma
[i
- startindex
] =
884 bitmangler
[bitdata
->data
[i
]];
885 debiwrite(saa
, 0x01420000, 0, 0,
886 ((bitdata
->datasize
- startindex
) + 5));
890 "awaiting 2nd FPGA bitfile\n",
892 continue; /* skip to next card */
897 for (i
= startindex
; i
< bitdata
->datasize
; i
++)
898 dmabuf
[i
- startindex
] =
899 bitmangler
[bitdata
->data
[i
]];
900 debiwrite(saa
, 0x014a0000, 0, 0,
901 ((bitdata
->datasize
- startindex
) + 5) * 2);
903 for (i
= 0; i
< 1000 &&
904 !(saaread(SAA7146_PSR
) & SAA7146_PSR_PIN2
); i
++)
907 printk(KERN_INFO
"stradis%d: FPGA load failed\n",
913 /* Pull the Xilinx INIT signal (GPIO2) low */
914 saawrite(0x00400000, SAA7146_GPIO_CTRL
);
915 saaread(SAA7146_PSR
); /* ensure posted write */
917 saawrite(0x00000000, SAA7146_GPIO_CTRL
);
920 printk(KERN_INFO
"stradis%d: FPGA Loaded\n", saa
->nr
);
921 saa
->boardcfg
[0] = 26; /* mark fpga programmed */
922 /* set VXCO to its lowest frequency */
923 debiwrite(saa
, debNormal
, XILINX_PWM
, 0, 2);
927 debiwrite(saa
, debNormal
, XILINX_CS3310_CMPLT
,
929 /* set VXCO to PWM mode, release reset, blank on */
930 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0xffc4, 2);
934 debiwrite(saa
, debNormal
, XILINX_CTL0
,
937 /* set source Black */
938 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1707, 2);
939 saa
->boardcfg
[4] = 22; /* set NTSC First Active Line */
940 saa
->boardcfg
[5] = 23; /* set PAL First Active Line */
941 saa
->boardcfg
[54] = 2; /* set NTSC Last Active Line - 256 */
942 saa
->boardcfg
[55] = 54; /* set PAL Last Active Line - 256 */
943 set_out_format(saa
, VIDEO_MODE_NTSC
);
945 /* begin IBM chip init */
946 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 4, 2);
947 saaread(SAA7146_PSR
); /* wait for reset */
949 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 0, 2);
950 debiread(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 2);
951 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 0x10, 2);
952 debiwrite(saa
, debNormal
, IBM_MP2_CMD_ADDR
, 0, 2);
953 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_MODE
, 0x2e, 2);
956 /* set i2s rate converter to 48KHz */
957 debiwrite(saa
, debNormal
, 0x80c0, 6, 2);
958 /* we must init CS8420 first since rev b pulls i2s */
959 /* master clock low and CS4341 needs i2s master to */
960 /* run the i2c port. */
962 /* 0=consumer, 1=pro */
963 initialize_cs8420(saa
, 0);
967 initialize_cs4341(saa
);
969 debiwrite(saa
, debNormal
, IBM_MP2_INFC_CTL
, 0x48, 2);
970 debiwrite(saa
, debNormal
, IBM_MP2_BEEP_CTL
, 0xa000, 2);
971 debiwrite(saa
, debNormal
, IBM_MP2_DISP_LBOR
, 0, 2);
972 debiwrite(saa
, debNormal
, IBM_MP2_DISP_TBOR
, 0, 2);
974 set_genlock_offset(saa
, 0);
975 debiwrite(saa
, debNormal
, IBM_MP2_FRNT_ATTEN
, 0, 2);
978 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x8000, 2);
980 /* disable genlock */
981 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x8080, 2);
987 static int do_ibm_reset(struct saa7146
*saa
)
989 /* failure if decoder not previously programmed */
990 if (saa
->boardcfg
[0] < 37)
994 debiwrite(saa
, debNormal
, XILINX_CS3310_CMPLT
, 0, 2);
995 /* disable interrupts */
996 saawrite(0, SAA7146_IER
);
997 saa
->audhead
= saa
->audtail
= 0;
998 saa
->vidhead
= saa
->vidtail
= 0;
999 /* tristate debi bus, disable debi transfers */
1000 saawrite(0x00880000, SAA7146_MC1
);
1001 /* ensure posted write */
1002 saaread(SAA7146_MC1
);
1004 /* re-enable debi transfers */
1005 saawrite(0x00880088, SAA7146_MC1
);
1006 /* set source Black */
1007 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1707, 2);
1008 /* begin IBM chip init */
1009 set_out_format(saa
, CurrentMode
);
1010 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 4, 2);
1011 saaread(SAA7146_PSR
); /* wait for reset */
1013 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 0, 2);
1014 debiread(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 2);
1015 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, ChipControl
, 2);
1016 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_MODE
, 0x2e, 2);
1019 /* set i2s rate converter to 48KHz */
1020 debiwrite(saa
, debNormal
, 0x80c0, 6, 2);
1021 /* we must init CS8420 first since rev b pulls i2s */
1022 /* master clock low and CS4341 needs i2s master to */
1023 /* run the i2c port. */
1025 /* 0=consumer, 1=pro */
1026 initialize_cs8420(saa
, 1);
1030 initialize_cs4341(saa
);
1032 debiwrite(saa
, debNormal
, IBM_MP2_INFC_CTL
, 0x48, 2);
1033 debiwrite(saa
, debNormal
, IBM_MP2_BEEP_CTL
, 0xa000, 2);
1034 debiwrite(saa
, debNormal
, IBM_MP2_DISP_LBOR
, 0, 2);
1035 debiwrite(saa
, debNormal
, IBM_MP2_DISP_TBOR
, 0, 2);
1037 set_genlock_offset(saa
, 0);
1038 debiwrite(saa
, debNormal
, IBM_MP2_FRNT_ATTEN
, 0, 2);
1039 debiwrite(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 0x2000, 2);
1040 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4552, 2);
1041 if (ibm_send_command(saa
, IBM_MP2_CONFIG_DECODER
,
1042 (ChipControl
== 0x43 ? 0xe800 : 0xe000), 1)) {
1043 printk(KERN_ERR
"stradis%d: IBM config failed\n", saa
->nr
);
1046 int i
= CS3310MaxLvl
;
1047 debiwrite(saa
, debNormal
, XILINX_CS3310_CMPLT
, ((i
<<8)|i
), 2);
1049 /* start video decoder */
1050 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, ChipControl
, 2);
1051 /* 256k vid, 3520 bytes aud */
1052 debiwrite(saa
, debNormal
, IBM_MP2_RB_THRESHOLD
, 0x4037, 2);
1053 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4573, 2);
1054 ibm_send_command(saa
, IBM_MP2_PLAY
, 0, 0);
1055 /* enable buffer threshold irq */
1056 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00c, 2);
1057 /* clear pending interrupts */
1058 debiread(saa
, debNormal
, IBM_MP2_HOST_INT
, 2);
1059 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1711, 2);
1063 /* load the decoder microcode */
1064 static int initialize_ibmmpeg2(struct video_code
*microcode
)
1067 struct saa7146
*saa
;
1069 for (num
= 0; num
< saa_num
; num
++) {
1070 saa
= &saa7146s
[num
];
1071 /* check that FPGA is loaded */
1072 debiwrite(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 0xa55a, 2);
1073 if ((i
= debiread(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 2)) !=
1075 printk(KERN_INFO
"stradis%d: %04x != 0xa55a\n",
1081 if (!strncmp(microcode
->loadwhat
, "decoder.vid", 11)) {
1082 if (saa
->boardcfg
[0] > 27)
1083 continue; /* skip to next card */
1084 /* load video control store */
1085 saa
->boardcfg
[1] = 0x13; /* no-sync default */
1086 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 1, 2);
1087 debiwrite(saa
, debNormal
, IBM_MP2_PROC_IADDR
, 0, 2);
1088 for (i
= 0; i
< microcode
->datasize
/ 2; i
++)
1089 debiwrite(saa
, debNormal
, IBM_MP2_PROC_IDATA
,
1090 (microcode
->data
[i
* 2] << 8) |
1091 microcode
->data
[i
* 2 + 1], 2);
1092 debiwrite(saa
, debNormal
, IBM_MP2_PROC_IADDR
, 0, 2);
1093 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 0, 2);
1094 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
,
1096 saa
->boardcfg
[0] = 28;
1098 if (!strncmp(microcode
->loadwhat
, "decoder.aud", 11)) {
1099 if (saa
->boardcfg
[0] > 35)
1100 continue; /* skip to next card */
1101 /* load audio control store */
1102 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 1, 2);
1103 debiwrite(saa
, debNormal
, IBM_MP2_AUD_IADDR
, 0, 2);
1104 for (i
= 0; i
< microcode
->datasize
; i
++)
1105 debiwrite(saa
, debNormal
, IBM_MP2_AUD_IDATA
,
1106 microcode
->data
[i
], 1);
1107 debiwrite(saa
, debNormal
, IBM_MP2_AUD_IADDR
, 0, 2);
1108 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 0, 2);
1109 debiwrite(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 0x2000, 2);
1110 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4552, 2);
1111 if (ibm_send_command(saa
, IBM_MP2_CONFIG_DECODER
,
1114 "stradis%d: IBM config failed\n",
1118 /* set PWM to center value */
1120 debiwrite(saa
, debNormal
, XILINX_PWM
,
1122 (saa
->boardcfg
[13]<<8), 2);
1124 debiwrite(saa
, debNormal
, XILINX_PWM
,
1128 debiwrite(saa
, debNormal
,
1129 XILINX_CS3310_CMPLT
, ((i
<<8)|i
), 2);
1132 "stradis%d: IBM MPEGCD%d Initialized\n",
1133 saa
->nr
, 18 + (debiread(saa
, debNormal
,
1134 IBM_MP2_CHIP_CONTROL
, 2) >> 12));
1135 /* start video decoder */
1136 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
,
1138 debiwrite(saa
, debNormal
, IBM_MP2_RB_THRESHOLD
,
1139 0x4037, 2); /* 256k vid, 3520 bytes aud */
1140 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4573, 2);
1141 ibm_send_command(saa
, IBM_MP2_PLAY
, 0, 0);
1142 /* enable buffer threshold irq */
1143 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00c, 2);
1144 debiread(saa
, debNormal
, IBM_MP2_HOST_INT
, 2);
1145 /* enable gpio irq */
1146 saawrite(0x00002000, SAA7146_GPIO_CTRL
);
1147 /* enable decoder output to HPS */
1148 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1711, 2);
1149 saa
->boardcfg
[0] = 37;
1155 static u32 palette2fmt
[] =
1156 { /* some of these YUV translations are wrong */
1157 0xffffffff, 0x86000000, 0x87000000, 0x80000000, 0x8100000, 0x82000000,
1158 0x83000000, 0x00000000, 0x03000000, 0x03000000, 0x0a00000, 0x03000000,
1159 0x06000000, 0x00000000, 0x03000000, 0x0a000000, 0x0300000
1161 static int bpp2fmt
[4] =
1163 VIDEO_PALETTE_HI240
, VIDEO_PALETTE_RGB565
, VIDEO_PALETTE_RGB24
,
1167 /* I wish I could find a formula to calculate these... */
1168 static u32 h_prescale
[64] =
1170 0x10000000, 0x18040202, 0x18080000, 0x380c0606, 0x38100204, 0x38140808,
1171 0x38180000, 0x381c0000, 0x3820161c, 0x38242a3b, 0x38281230, 0x382c4460,
1172 0x38301040, 0x38340080, 0x38380000, 0x383c0000, 0x3840fefe, 0x3844ee9f,
1173 0x3848ee9f, 0x384cee9f, 0x3850ee9f, 0x38542a3b, 0x38581230, 0x385c0000,
1174 0x38600000, 0x38640000, 0x38680000, 0x386c0000, 0x38700000, 0x38740000,
1175 0x38780000, 0x387c0000, 0x30800000, 0x38840000, 0x38880000, 0x388c0000,
1176 0x38900000, 0x38940000, 0x38980000, 0x389c0000, 0x38a00000, 0x38a40000,
1177 0x38a80000, 0x38ac0000, 0x38b00000, 0x38b40000, 0x38b80000, 0x38bc0000,
1178 0x38c00000, 0x38c40000, 0x38c80000, 0x38cc0000, 0x38d00000, 0x38d40000,
1179 0x38d80000, 0x38dc0000, 0x38e00000, 0x38e40000, 0x38e80000, 0x38ec0000,
1180 0x38f00000, 0x38f40000, 0x38f80000, 0x38fc0000,
1182 static u32 v_gain
[64] =
1184 0x016000ff, 0x016100ff, 0x016100ff, 0x016200ff, 0x016200ff, 0x016200ff,
1185 0x016200ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff,
1186 0x016300ff, 0x016300ff, 0x016300ff, 0x016400ff, 0x016400ff, 0x016400ff,
1187 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1188 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1189 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1190 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1191 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1192 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1193 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1194 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1198 static void saa7146_set_winsize(struct saa7146
*saa
)
1201 int offset
, yacl
, ysci
;
1202 saa
->win
.color_fmt
= format
=
1203 (saa
->win
.depth
== 15) ? palette2fmt
[VIDEO_PALETTE_RGB555
] :
1204 palette2fmt
[bpp2fmt
[(saa
->win
.bpp
- 1) & 3]];
1205 offset
= saa
->win
.x
* saa
->win
.bpp
+ saa
->win
.y
* saa
->win
.bpl
;
1206 saawrite(saa
->win
.vidadr
+ offset
, SAA7146_BASE_EVEN1
);
1207 saawrite(saa
->win
.vidadr
+ offset
+ saa
->win
.bpl
, SAA7146_BASE_ODD1
);
1208 saawrite(saa
->win
.bpl
* 2, SAA7146_PITCH1
);
1209 saawrite(saa
->win
.vidadr
+ saa
->win
.bpl
* saa
->win
.sheight
,
1210 SAA7146_PROT_ADDR1
);
1211 saawrite(0, SAA7146_PAGE1
);
1212 saawrite(format
|0x60, SAA7146_CLIP_FORMAT_CTRL
);
1213 offset
= (704 / (saa
->win
.width
- 1)) & 0x3f;
1214 saawrite(h_prescale
[offset
], SAA7146_HPS_H_PRESCALE
);
1215 offset
= (720896 / saa
->win
.width
) / (offset
+ 1);
1216 saawrite((offset
<<12)|0x0c, SAA7146_HPS_H_SCALE
);
1217 if (CurrentMode
== VIDEO_MODE_NTSC
) {
1218 yacl
= /*(480 / saa->win.height - 1) & 0x3f*/ 0;
1219 ysci
= 1024 - (saa
->win
.height
* 1024 / 480);
1221 yacl
= /*(576 / saa->win.height - 1) & 0x3f*/ 0;
1222 ysci
= 1024 - (saa
->win
.height
* 1024 / 576);
1224 saawrite((1<<31)|(ysci
<<21)|(yacl
<<15), SAA7146_HPS_V_SCALE
);
1225 saawrite(v_gain
[yacl
], SAA7146_HPS_V_GAIN
);
1226 saawrite(((SAA7146_MC2_UPLD_DMA1
| SAA7146_MC2_UPLD_HPS_V
|
1227 SAA7146_MC2_UPLD_HPS_H
) << 16) | (SAA7146_MC2_UPLD_DMA1
|
1228 SAA7146_MC2_UPLD_HPS_V
| SAA7146_MC2_UPLD_HPS_H
),
1232 /* clip_draw_rectangle(cm,x,y,w,h) -- handle clipping an area
1233 * bitmap is fixed width, 128 bytes (1024 pixels represented)
1234 * arranged most-sigificant-bit-left in 32-bit words
1235 * based on saa7146 clipping hardware, it swaps bytes if LE
1236 * much of this makes up for egcs brain damage -- so if you
1237 * are wondering "why did he do this?" it is because the C
1238 * was adjusted to generate the optimal asm output without
1239 * writing non-portable __asm__ directives.
1242 static void clip_draw_rectangle(u32
*clipmap
, int x
, int y
, int w
, int h
)
1244 register int startword
, endword
;
1245 register u32 bitsleft
, bitsright
;
1255 if (w
<= 0 || h
<= 0 || x
> 1023 || y
> 639)
1256 return; /* throw away bad clips */
1261 startword
= (x
>> 5);
1262 endword
= ((x
+ w
) >> 5);
1263 bitsleft
= (0xffffffff >> (x
& 31));
1264 bitsright
= (0xffffffff << (~((x
+ w
) - (endword
<<5))));
1265 temp
= &clipmap
[(y
<<5) + startword
];
1266 w
= endword
- startword
;
1268 bitsleft
|= bitsright
;
1269 for (y
= 0; y
< h
; y
++) {
1274 for (y
= 0; y
< h
; y
++) {
1275 *temp
++ |= bitsleft
;
1276 for (x
= 1; x
< w
; x
++)
1277 *temp
++ = 0xffffffff;
1284 static void make_clip_tab(struct saa7146
*saa
, struct video_clip
*cr
, int ncr
)
1286 int i
, width
, height
;
1289 clipmap
= saa
->dmavid2
;
1290 if((width
=saa
->win
.width
)>1023)
1291 width
= 1023; /* sanity check */
1292 if((height
=saa
->win
.height
)>640)
1293 height
= 639; /* sanity check */
1294 if (ncr
> 0) { /* rectangles pased */
1295 /* convert rectangular clips to a bitmap */
1296 memset(clipmap
, 0, VIDEO_CLIPMAP_SIZE
); /* clear map */
1297 for (i
= 0; i
< ncr
; i
++)
1298 clip_draw_rectangle(clipmap
, cr
[i
].x
, cr
[i
].y
,
1299 cr
[i
].width
, cr
[i
].height
);
1301 /* clip against viewing window AND screen
1302 so we do not have to rely on the user program
1304 clip_draw_rectangle(clipmap
,(saa
->win
.x
+width
>saa
->win
.swidth
) ?
1305 (saa
->win
.swidth
-saa
->win
.x
) : width
, 0, 1024, 768);
1306 clip_draw_rectangle(clipmap
,0,(saa
->win
.y
+height
>saa
->win
.sheight
) ?
1307 (saa
->win
.sheight
-saa
->win
.y
) : height
,1024,768);
1309 clip_draw_rectangle(clipmap
, 0, 0, -(saa
->win
.x
), 768);
1311 clip_draw_rectangle(clipmap
, 0, 0, 1024, -(saa
->win
.y
));
1314 static int saa_ioctl(struct inode
*inode
, struct file
*file
,
1315 unsigned int cmd
, unsigned long argl
)
1317 struct saa7146
*saa
= file
->private_data
;
1318 void __user
*arg
= (void __user
*)argl
;
1323 struct video_capability b
;
1324 strcpy(b
.name
, saa
->video_dev
.name
);
1325 b
.type
= VID_TYPE_CAPTURE
|
1336 if (copy_to_user(arg
, &b
, sizeof(b
)))
1342 struct video_picture p
= saa
->picture
;
1343 if (saa
->win
.depth
== 8)
1344 p
.palette
= VIDEO_PALETTE_HI240
;
1345 if (saa
->win
.depth
== 15)
1346 p
.palette
= VIDEO_PALETTE_RGB555
;
1347 if (saa
->win
.depth
== 16)
1348 p
.palette
= VIDEO_PALETTE_RGB565
;
1349 if (saa
->win
.depth
== 24)
1350 p
.palette
= VIDEO_PALETTE_RGB24
;
1351 if (saa
->win
.depth
== 32)
1352 p
.palette
= VIDEO_PALETTE_RGB32
;
1353 if (copy_to_user(arg
, &p
, sizeof(p
)))
1359 struct video_picture p
;
1361 if (copy_from_user(&p
, arg
, sizeof(p
)))
1363 if (p
.palette
< sizeof(palette2fmt
) / sizeof(u32
)) {
1364 format
= palette2fmt
[p
.palette
];
1365 saa
->win
.color_fmt
= format
;
1366 saawrite(format
|0x60, SAA7146_CLIP_FORMAT_CTRL
);
1368 saawrite(((p
.brightness
& 0xff00) << 16) |
1369 ((p
.contrast
& 0xfe00) << 7) |
1370 ((p
.colour
& 0xfe00) >> 9), SAA7146_BCS_CTRL
);
1372 /* upload changed registers */
1373 saawrite(((SAA7146_MC2_UPLD_HPS_H
|
1374 SAA7146_MC2_UPLD_HPS_V
) << 16) |
1375 SAA7146_MC2_UPLD_HPS_H
| SAA7146_MC2_UPLD_HPS_V
,
1381 struct video_window vw
;
1382 struct video_clip
*vcp
= NULL
;
1384 if (copy_from_user(&vw
, arg
, sizeof(vw
)))
1387 if (vw
.flags
|| vw
.width
< 16 || vw
.height
< 16) { /* stop capture */
1388 saawrite((SAA7146_MC1_TR_E_1
<< 16), SAA7146_MC1
);
1391 if (saa
->win
.bpp
< 4) { /* 32-bit align start and adjust width */
1393 vw
.x
= (vw
.x
+ 3) & ~3;
1399 saa
->win
.width
= vw
.width
;
1400 if (saa
->win
.width
> 768)
1401 saa
->win
.width
= 768;
1402 saa
->win
.height
= vw
.height
;
1403 if (CurrentMode
== VIDEO_MODE_NTSC
) {
1404 if (saa
->win
.height
> 480)
1405 saa
->win
.height
= 480;
1407 if (saa
->win
.height
> 576)
1408 saa
->win
.height
= 576;
1412 saawrite((SAA7146_MC1_TR_E_1
<< 16), SAA7146_MC1
);
1413 saa7146_set_winsize(saa
);
1418 if (vw
.clipcount
< 0) {
1419 if (copy_from_user(saa
->dmavid2
, vw
.clips
,
1420 VIDEO_CLIPMAP_SIZE
))
1423 else if (vw
.clipcount
> 16384) {
1425 } else if (vw
.clipcount
> 0) {
1426 if ((vcp
= vmalloc(sizeof(struct video_clip
) *
1427 (vw
.clipcount
))) == NULL
)
1429 if (copy_from_user(vcp
, vw
.clips
,
1430 sizeof(struct video_clip
) *
1435 } else /* nothing clipped */
1436 memset(saa
->dmavid2
, 0, VIDEO_CLIPMAP_SIZE
);
1437 make_clip_tab(saa
, vcp
, vw
.clipcount
);
1438 if (vw
.clipcount
> 0)
1441 /* start capture & clip dma if we have an address */
1442 if ((saa
->cap
& 3) && saa
->win
.vidadr
!= 0)
1443 saawrite(((SAA7146_MC1_TR_E_1
|
1444 SAA7146_MC1_TR_E_2
) << 16) | 0xffff,
1450 struct video_window vw
;
1453 vw
.width
= saa
->win
.width
;
1454 vw
.height
= saa
->win
.height
;
1457 if (copy_to_user(arg
, &vw
, sizeof(vw
)))
1464 if (copy_from_user(&v
, arg
, sizeof(v
)))
1468 saawrite((SAA7146_MC1_TR_E_1
<< 16),
1471 if (saa
->win
.vidadr
== 0 || saa
->win
.width
== 0
1472 || saa
->win
.height
== 0)
1475 saawrite((SAA7146_MC1_TR_E_1
<< 16) | 0xffff,
1482 struct video_buffer v
;
1483 v
.base
= (void *) saa
->win
.vidadr
;
1484 v
.height
= saa
->win
.sheight
;
1485 v
.width
= saa
->win
.swidth
;
1486 v
.depth
= saa
->win
.depth
;
1487 v
.bytesperline
= saa
->win
.bpl
;
1488 if (copy_to_user(arg
, &v
, sizeof(v
)))
1495 struct video_buffer v
;
1496 if (!capable(CAP_SYS_ADMIN
))
1498 if (copy_from_user(&v
, arg
, sizeof(v
)))
1500 if (v
.depth
!= 8 && v
.depth
!= 15 && v
.depth
!= 16 &&
1501 v
.depth
!= 24 && v
.depth
!= 32 && v
.width
> 16 &&
1502 v
.height
> 16 && v
.bytesperline
> 16)
1505 saa
->win
.vidadr
= (unsigned long) v
.base
;
1506 saa
->win
.sheight
= v
.height
;
1507 saa
->win
.swidth
= v
.width
;
1508 saa
->win
.bpp
= ((v
.depth
+ 7) & 0x38) / 8;
1509 saa
->win
.depth
= v
.depth
;
1510 saa
->win
.bpl
= v
.bytesperline
;
1512 DEBUG(printk("Display at %p is %d by %d, bytedepth %d, bpl %d\n",
1513 v
.base
, v
.width
, v
.height
, saa
->win
.bpp
, saa
->win
.bpl
));
1514 saa7146_set_winsize(saa
);
1519 /* Will be handled higher up .. */
1525 struct video_audio v
;
1527 v
.flags
&= ~(VIDEO_AUDIO_MUTE
| VIDEO_AUDIO_MUTABLE
);
1528 v
.flags
|= VIDEO_AUDIO_MUTABLE
| VIDEO_AUDIO_VOLUME
;
1529 strcpy(v
.name
, "MPEG");
1530 v
.mode
= VIDEO_SOUND_STEREO
;
1531 if (copy_to_user(arg
, &v
, sizeof(v
)))
1537 struct video_audio v
;
1539 if (copy_from_user(&v
, arg
, sizeof(v
)))
1541 i
= (~(v
.volume
>>8))&0xff;
1543 if (v
.flags
& VIDEO_AUDIO_MUTE
) {
1544 debiwrite(saa
, debNormal
,
1548 if (!(v
.flags
& VIDEO_AUDIO_MUTE
))
1549 debiwrite(saa
, debNormal
,
1552 if (v
.flags
& VIDEO_AUDIO_VOLUME
)
1553 debiwrite(saa
, debNormal
,
1557 if (v
.flags
& VIDEO_AUDIO_MUTE
)
1558 cs4341_setlevel(saa
, 0xff, 0xff);
1559 if (!(v
.flags
& VIDEO_AUDIO_MUTE
))
1560 cs4341_setlevel(saa
, 0, 0);
1561 if (v
.flags
& VIDEO_AUDIO_VOLUME
)
1562 cs4341_setlevel(saa
, i
, i
);
1570 struct video_unit vu
;
1571 vu
.video
= saa
->video_dev
.minor
;
1572 vu
.vbi
= VIDEO_NO_UNIT
;
1573 vu
.radio
= VIDEO_NO_UNIT
;
1574 vu
.audio
= VIDEO_NO_UNIT
;
1575 vu
.teletext
= VIDEO_NO_UNIT
;
1576 if (copy_to_user(arg
, &vu
, sizeof(vu
)))
1580 case VIDIOCSPLAYMODE
:
1582 struct video_play_mode pmode
;
1583 if (copy_from_user((void *) &pmode
, arg
,
1584 sizeof(struct video_play_mode
)))
1586 switch (pmode
.mode
) {
1587 case VID_PLAY_VID_OUT_MODE
:
1588 if (pmode
.p1
!= VIDEO_MODE_NTSC
&&
1589 pmode
.p1
!= VIDEO_MODE_PAL
)
1591 set_out_format(saa
, pmode
.p1
);
1593 case VID_PLAY_GENLOCK
:
1594 debiwrite(saa
, debNormal
,
1596 (pmode
.p1
? 0x8000 : 0x8080),
1599 set_genlock_offset(saa
,
1602 case VID_PLAY_NORMAL
:
1603 debiwrite(saa
, debNormal
,
1604 IBM_MP2_CHIP_CONTROL
,
1606 ibm_send_command(saa
,
1607 IBM_MP2_PLAY
, 0, 0);
1608 saa
->playmode
= pmode
.mode
;
1610 case VID_PLAY_PAUSE
:
1611 /* IBM removed the PAUSE command */
1612 /* they say use SINGLE_FRAME now */
1613 case VID_PLAY_SINGLE_FRAME
:
1614 ibm_send_command(saa
,
1615 IBM_MP2_SINGLE_FRAME
,
1617 if (saa
->playmode
== pmode
.mode
) {
1618 debiwrite(saa
, debNormal
,
1619 IBM_MP2_CHIP_CONTROL
,
1622 saa
->playmode
= pmode
.mode
;
1624 case VID_PLAY_FAST_FORWARD
:
1625 ibm_send_command(saa
,
1626 IBM_MP2_FAST_FORWARD
, 0, 0);
1627 saa
->playmode
= pmode
.mode
;
1629 case VID_PLAY_SLOW_MOTION
:
1630 ibm_send_command(saa
,
1631 IBM_MP2_SLOW_MOTION
,
1633 saa
->playmode
= pmode
.mode
;
1635 case VID_PLAY_IMMEDIATE_NORMAL
:
1636 /* ensure transfers resume */
1637 debiwrite(saa
, debNormal
,
1638 IBM_MP2_CHIP_CONTROL
,
1640 ibm_send_command(saa
,
1641 IBM_MP2_IMED_NORM_PLAY
, 0, 0);
1642 saa
->playmode
= VID_PLAY_NORMAL
;
1644 case VID_PLAY_SWITCH_CHANNELS
:
1645 saa
->audhead
= saa
->audtail
= 0;
1646 saa
->vidhead
= saa
->vidtail
= 0;
1647 ibm_send_command(saa
,
1648 IBM_MP2_FREEZE_FRAME
, 0, 1);
1649 ibm_send_command(saa
,
1650 IBM_MP2_RESET_AUD_RATE
, 0, 1);
1651 debiwrite(saa
, debNormal
,
1652 IBM_MP2_CHIP_CONTROL
, 0, 2);
1653 ibm_send_command(saa
,
1654 IBM_MP2_CHANNEL_SWITCH
, 0, 1);
1655 debiwrite(saa
, debNormal
,
1656 IBM_MP2_CHIP_CONTROL
,
1658 ibm_send_command(saa
,
1659 IBM_MP2_PLAY
, 0, 0);
1660 saa
->playmode
= VID_PLAY_NORMAL
;
1662 case VID_PLAY_FREEZE_FRAME
:
1663 ibm_send_command(saa
,
1664 IBM_MP2_FREEZE_FRAME
, 0, 0);
1665 saa
->playmode
= pmode
.mode
;
1667 case VID_PLAY_STILL_MODE
:
1668 ibm_send_command(saa
,
1669 IBM_MP2_SET_STILL_MODE
, 0, 0);
1670 saa
->playmode
= pmode
.mode
;
1672 case VID_PLAY_MASTER_MODE
:
1673 if (pmode
.p1
== VID_PLAY_MASTER_NONE
)
1674 saa
->boardcfg
[1] = 0x13;
1675 else if (pmode
.p1
==
1676 VID_PLAY_MASTER_VIDEO
)
1677 saa
->boardcfg
[1] = 0x23;
1678 else if (pmode
.p1
==
1679 VID_PLAY_MASTER_AUDIO
)
1680 saa
->boardcfg
[1] = 0x43;
1683 debiwrite(saa
, debNormal
,
1684 IBM_MP2_CHIP_CONTROL
,
1687 case VID_PLAY_ACTIVE_SCANLINES
:
1688 if (CurrentMode
== VIDEO_MODE_PAL
) {
1692 saa
->boardcfg
[5] = pmode
.p1
;
1693 saa
->boardcfg
[55] = (pmode
.p1
+
1700 saa
->boardcfg
[4] = pmode
.p1
;
1701 saa
->boardcfg
[54] = (pmode
.p1
+
1705 set_out_format(saa
, CurrentMode
);
1706 case VID_PLAY_RESET
:
1707 return do_ibm_reset(saa
);
1708 case VID_PLAY_END_MARK
:
1709 if (saa
->endmarktail
<
1711 if (saa
->endmarkhead
-
1712 saa
->endmarktail
< 2)
1714 } else if (saa
->endmarkhead
<=
1716 if (saa
->endmarktail
-
1722 saa
->endmark
[saa
->endmarktail
] =
1725 if (saa
->endmarktail
>= MAX_MARKS
)
1726 saa
->endmarktail
= 0;
1730 case VIDIOCSWRITEMODE
:
1733 if (copy_from_user((void *) &mode
, arg
, sizeof(int)))
1735 if (mode
== VID_WRITE_MPEG_AUD
||
1736 mode
== VID_WRITE_MPEG_VID
||
1737 mode
== VID_WRITE_CC
||
1738 mode
== VID_WRITE_TTX
||
1739 mode
== VID_WRITE_OSD
) {
1740 saa
->writemode
= mode
;
1745 case VIDIOCSMICROCODE
:
1747 struct video_code ucode
;
1750 if (copy_from_user(&ucode
, arg
, sizeof(ucode
)))
1752 if (ucode
.datasize
> 65536 || ucode
.datasize
< 1024 ||
1753 strncmp(ucode
.loadwhat
, "dec", 3))
1755 if ((udata
= vmalloc(ucode
.datasize
)) == NULL
)
1757 if (copy_from_user(udata
, ucode
.data
, ucode
.datasize
)) {
1762 if (!strncmp(ucode
.loadwhat
, "decoder.aud", 11)
1763 || !strncmp(ucode
.loadwhat
, "decoder.vid", 11))
1764 i
= initialize_ibmmpeg2(&ucode
);
1766 i
= initialize_fpga(&ucode
);
1773 case VIDIOCGCHAN
: /* this makes xawtv happy */
1775 struct video_channel v
;
1776 if (copy_from_user(&v
, arg
, sizeof(v
)))
1778 v
.flags
= VIDEO_VC_AUDIO
;
1780 v
.type
= VID_TYPE_MPEG_DECODER
;
1781 v
.norm
= CurrentMode
;
1782 strcpy(v
.name
, "MPEG2");
1783 if (copy_to_user(arg
, &v
, sizeof(v
)))
1787 case VIDIOCSCHAN
: /* this makes xawtv happy */
1789 struct video_channel v
;
1790 if (copy_from_user(&v
, arg
, sizeof(v
)))
1796 return -ENOIOCTLCMD
;
1801 static int saa_mmap(struct file
*file
, struct vm_area_struct
*vma
)
1803 struct saa7146
*saa
= file
->private_data
;
1804 printk(KERN_DEBUG
"stradis%d: saa_mmap called\n", saa
->nr
);
1808 static ssize_t
saa_read(struct file
*file
, char __user
*buf
,
1809 size_t count
, loff_t
*ppos
)
1814 static ssize_t
saa_write(struct file
*file
, const char __user
*buf
,
1815 size_t count
, loff_t
*ppos
)
1817 struct saa7146
*saa
= file
->private_data
;
1818 unsigned long todo
= count
;
1819 int blocksize
, split
;
1820 unsigned long flags
;
1823 if (saa
->writemode
== VID_WRITE_MPEG_AUD
) {
1824 spin_lock_irqsave(&saa
->lock
, flags
);
1825 if (saa
->audhead
<= saa
->audtail
)
1826 blocksize
= 65536-(saa
->audtail
- saa
->audhead
);
1828 blocksize
= saa
->audhead
- saa
->audtail
;
1829 spin_unlock_irqrestore(&saa
->lock
, flags
);
1830 if (blocksize
< 16384) {
1831 saawrite(SAA7146_PSR_DEBI_S
|
1832 SAA7146_PSR_PIN1
, SAA7146_IER
);
1833 saawrite(SAA7146_PSR_PIN1
, SAA7146_PSR
);
1834 /* wait for buffer space to open */
1835 interruptible_sleep_on(&saa
->audq
);
1837 spin_lock_irqsave(&saa
->lock
, flags
);
1838 if (saa
->audhead
<= saa
->audtail
) {
1839 blocksize
= 65536-(saa
->audtail
- saa
->audhead
);
1840 split
= 65536 - saa
->audtail
;
1842 blocksize
= saa
->audhead
- saa
->audtail
;
1845 spin_unlock_irqrestore(&saa
->lock
, flags
);
1847 if (blocksize
> todo
)
1849 /* double check that we really have space */
1852 if (split
< blocksize
) {
1853 if (copy_from_user(saa
->audbuf
+
1854 saa
->audtail
, buf
, split
))
1861 if (copy_from_user(saa
->audbuf
+ saa
->audtail
, buf
,
1864 saa
->audtail
+= blocksize
;
1867 saa
->audtail
&= 0xffff;
1868 } else if (saa
->writemode
== VID_WRITE_MPEG_VID
) {
1869 spin_lock_irqsave(&saa
->lock
, flags
);
1870 if (saa
->vidhead
<= saa
->vidtail
)
1871 blocksize
=524288-(saa
->vidtail
- saa
->vidhead
);
1873 blocksize
= saa
->vidhead
- saa
->vidtail
;
1874 spin_unlock_irqrestore(&saa
->lock
, flags
);
1875 if (blocksize
< 65536) {
1876 saawrite(SAA7146_PSR_DEBI_S
|
1877 SAA7146_PSR_PIN1
, SAA7146_IER
);
1878 saawrite(SAA7146_PSR_PIN1
, SAA7146_PSR
);
1879 /* wait for buffer space to open */
1880 interruptible_sleep_on(&saa
->vidq
);
1882 spin_lock_irqsave(&saa
->lock
, flags
);
1883 if (saa
->vidhead
<= saa
->vidtail
) {
1884 blocksize
=524288-(saa
->vidtail
- saa
->vidhead
);
1885 split
= 524288 - saa
->vidtail
;
1887 blocksize
= saa
->vidhead
- saa
->vidtail
;
1890 spin_unlock_irqrestore(&saa
->lock
, flags
);
1892 if (blocksize
> todo
)
1894 /* double check that we really have space */
1897 if (split
< blocksize
) {
1898 if (copy_from_user(saa
->vidbuf
+
1899 saa
->vidtail
, buf
, split
))
1906 if (copy_from_user(saa
->vidbuf
+ saa
->vidtail
, buf
,
1909 saa
->vidtail
+= blocksize
;
1912 saa
->vidtail
&= 0x7ffff;
1913 } else if (saa
->writemode
== VID_WRITE_OSD
) {
1916 if (copy_from_user(saa
->osdbuf
, buf
, count
))
1920 saa
->osdtail
= count
;
1921 debiwrite(saa
, debNormal
, IBM_MP2_OSD_ADDR
, 0, 2);
1922 debiwrite(saa
, debNormal
, IBM_MP2_OSD_LINK_ADDR
, 0, 2);
1923 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00d, 2);
1924 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
,
1925 debiread(saa
, debNormal
,
1926 IBM_MP2_DISP_MODE
, 2) | 1, 2);
1927 /* trigger osd data transfer */
1928 saawrite(SAA7146_PSR_DEBI_S
|
1929 SAA7146_PSR_PIN1
, SAA7146_IER
);
1930 saawrite(SAA7146_PSR_PIN1
, SAA7146_PSR
);
1936 static int saa_open(struct inode
*inode
, struct file
*file
)
1938 struct saa7146
*saa
= NULL
;
1939 unsigned int minor
= iminor(inode
);
1942 for (i
= 0; i
< SAA7146_MAX
; i
++) {
1943 if (saa7146s
[i
].video_dev
.minor
== minor
) {
1950 file
->private_data
= saa
;
1952 //saa->video_dev.busy = 0; /* old hack to support multiple open */
1955 return 0; /* device open already, don't reset */
1956 saa
->writemode
= VID_WRITE_MPEG_VID
; /* default to video */
1960 static int saa_release(struct inode
*inode
, struct file
*file
)
1962 struct saa7146
*saa
= file
->private_data
;
1964 //saa->video_dev.busy = 0; /* old hack to support multiple open */
1965 if (saa
->user
> 0) /* still someone using device */
1967 saawrite(0x007f0000, SAA7146_MC1
); /* stop all overlay dma */
1971 static struct file_operations saa_fops
=
1973 .owner
= THIS_MODULE
,
1975 .release
= saa_release
,
1978 .llseek
= no_llseek
,
1983 /* template for video_device-structure */
1984 static struct video_device saa_template
=
1987 .type
= VID_TYPE_CAPTURE
| VID_TYPE_OVERLAY
,
1988 .hardware
= VID_HARDWARE_SAA7146
,
1993 static int configure_saa7146(struct pci_dev
*dev
, int num
)
1996 struct saa7146
*saa
;
1998 saa
= &saa7146s
[num
];
2000 saa
->endmarkhead
= saa
->endmarktail
= 0;
2001 saa
->win
.x
= saa
->win
.y
= 0;
2002 saa
->win
.width
= saa
->win
.cropwidth
= 720;
2003 saa
->win
.height
= saa
->win
.cropheight
= 480;
2004 saa
->win
.cropx
= saa
->win
.cropy
= 0;
2006 saa
->win
.depth
= 16;
2007 saa
->win
.color_fmt
= palette2fmt
[VIDEO_PALETTE_RGB565
];
2008 saa
->win
.bpl
= 1024 * saa
->win
.bpp
;
2009 saa
->win
.swidth
= 1024;
2010 saa
->win
.sheight
= 768;
2011 saa
->picture
.brightness
= 32768;
2012 saa
->picture
.contrast
= 38768;
2013 saa
->picture
.colour
= 32768;
2017 saa
->playmode
= VID_PLAY_NORMAL
;
2018 memset(saa
->boardcfg
, 0, 64); /* clear board config area */
2019 saa
->saa7146_mem
= NULL
;
2020 saa
->dmavid1
= saa
->dmavid2
= saa
->dmavid3
= saa
->dmaa1in
=
2021 saa
->dmaa1out
= saa
->dmaa2in
= saa
->dmaa2out
=
2022 saa
->pagevid1
= saa
->pagevid2
= saa
->pagevid3
= saa
->pagea1in
=
2023 saa
->pagea1out
= saa
->pagea2in
= saa
->pagea2out
=
2024 saa
->pagedebi
= saa
->dmaRPS1
= saa
->dmaRPS2
= saa
->pageRPS1
=
2025 saa
->pageRPS2
= NULL
;
2026 saa
->audbuf
= saa
->vidbuf
= saa
->osdbuf
= saa
->dmadebi
= NULL
;
2027 saa
->audhead
= saa
->vidtail
= 0;
2029 init_waitqueue_head(&saa
->i2cq
);
2030 init_waitqueue_head(&saa
->audq
);
2031 init_waitqueue_head(&saa
->debiq
);
2032 init_waitqueue_head(&saa
->vidq
);
2033 spin_lock_init(&saa
->lock
);
2035 if (pci_enable_device(dev
))
2038 saa
->id
= dev
->device
;
2039 saa
->irq
= dev
->irq
;
2040 saa
->video_dev
.minor
= -1;
2041 saa
->saa7146_adr
= pci_resource_start(dev
, 0);
2042 pci_read_config_byte(dev
, PCI_CLASS_REVISION
, &saa
->revision
);
2044 saa
->saa7146_mem
= ioremap(saa
->saa7146_adr
, 0x200);
2045 if (!saa
->saa7146_mem
)
2048 memcpy(&saa
->video_dev
, &saa_template
, sizeof(saa_template
));
2049 saawrite(0, SAA7146_IER
); /* turn off all interrupts */
2050 result
= request_irq(saa
->irq
, saa7146_irq
,
2051 SA_SHIRQ
| SA_INTERRUPT
, "stradis", (void *) saa
);
2052 if (result
== -EINVAL
)
2053 printk(KERN_ERR
"stradis%d: Bad irq number or handler\n",
2055 if (result
== -EBUSY
)
2056 printk(KERN_ERR
"stradis%d: IRQ %ld busy, change your PnP"
2057 " config in BIOS\n", num
, saa
->irq
);
2059 iounmap(saa
->saa7146_mem
);
2062 pci_set_master(dev
);
2063 if (video_register_device(&saa
->video_dev
, VFL_TYPE_GRABBER
, video_nr
) < 0) {
2064 iounmap(saa
->saa7146_mem
);
2070 static int init_saa7146(int i
)
2072 struct saa7146
*saa
= &saa7146s
[i
];
2075 /* reset the saa7146 */
2076 saawrite(0xffff0000, SAA7146_MC1
);
2078 /* enable debi and i2c transfers and pins */
2079 saawrite(((SAA7146_MC1_EDP
| SAA7146_MC1_EI2C
|
2080 SAA7146_MC1_TR_E_DEBI
) << 16) | 0xffff, SAA7146_MC1
);
2081 /* ensure proper state of chip */
2082 saawrite(0x00000000, SAA7146_PAGE1
);
2083 saawrite(0x00f302c0, SAA7146_NUM_LINE_BYTE1
);
2084 saawrite(0x00000000, SAA7146_PAGE2
);
2085 saawrite(0x01400080, SAA7146_NUM_LINE_BYTE2
);
2086 saawrite(0x00000000, SAA7146_DD1_INIT
);
2087 saawrite(0x00000000, SAA7146_DD1_STREAM_B
);
2088 saawrite(0x00000000, SAA7146_DD1_STREAM_A
);
2089 saawrite(0x00000000, SAA7146_BRS_CTRL
);
2090 saawrite(0x80400040, SAA7146_BCS_CTRL
);
2091 saawrite(0x0000e000 /*| (1<<29)*/, SAA7146_HPS_CTRL
);
2092 saawrite(0x00000060, SAA7146_CLIP_FORMAT_CTRL
);
2093 saawrite(0x00000000, SAA7146_ACON1
);
2094 saawrite(0x00000000, SAA7146_ACON2
);
2095 saawrite(0x00000600, SAA7146_I2C_STATUS
);
2096 saawrite(((SAA7146_MC2_UPLD_D1_B
| SAA7146_MC2_UPLD_D1_A
|
2097 SAA7146_MC2_UPLD_BRS
| SAA7146_MC2_UPLD_HPS_H
|
2098 SAA7146_MC2_UPLD_HPS_V
| SAA7146_MC2_UPLD_DMA2
|
2099 SAA7146_MC2_UPLD_DMA1
| SAA7146_MC2_UPLD_I2C
) << 16) | 0xffff,
2101 /* setup arbitration control registers */
2102 saawrite(0x1412121a, SAA7146_PCI_BT_V1
);
2104 /* allocate 32k dma buffer + 4k for page table */
2105 if ((saa
->dmadebi
= kmalloc(32768 + 4096, GFP_KERNEL
)) == NULL
) {
2106 printk(KERN_ERR
"stradis%d: debi kmalloc failed\n", i
);
2110 saa
->pagedebi
= saa
->dmadebi
+ 32768; /* top 4k is for mmu */
2111 saawrite(virt_to_bus(saa
->pagedebi
) /*|0x800 */ , SAA7146_DEBI_PAGE
);
2112 for (i
= 0; i
< 12; i
++) /* setup mmu page table */
2113 saa
->pagedebi
[i
] = virt_to_bus((saa
->dmadebi
+ i
* 4096));
2115 saa
->audhead
= saa
->vidhead
= saa
->osdhead
= 0;
2116 saa
->audtail
= saa
->vidtail
= saa
->osdtail
= 0;
2117 if (saa
->vidbuf
== NULL
)
2118 if ((saa
->vidbuf
= vmalloc(524288)) == NULL
) {
2119 printk(KERN_ERR
"stradis%d: malloc failed\n", saa
->nr
);
2122 if (saa
->audbuf
== NULL
)
2123 if ((saa
->audbuf
= vmalloc(65536)) == NULL
) {
2124 printk(KERN_ERR
"stradis%d: malloc failed\n", saa
->nr
);
2129 if (saa
->osdbuf
== NULL
)
2130 if ((saa
->osdbuf
= vmalloc(131072)) == NULL
) {
2131 printk(KERN_ERR
"stradis%d: malloc failed\n", saa
->nr
);
2134 saa
->vidbuf
= saa
->audbuf
= NULL
;
2137 /* allocate 81920 byte buffer for clipping */
2138 if ((saa
->dmavid2
= kmalloc(VIDEO_CLIPMAP_SIZE
, GFP_KERNEL
)) == NULL
) {
2139 printk(KERN_ERR
"stradis%d: clip kmalloc failed\n", saa
->nr
);
2143 saa
->vidbuf
= saa
->audbuf
= saa
->osdbuf
= NULL
;
2144 saa
->dmavid2
= NULL
;
2147 memset(saa
->dmavid2
, 0x00, VIDEO_CLIPMAP_SIZE
); /* clip everything */
2148 /* setup clipping registers */
2149 saawrite(virt_to_bus(saa
->dmavid2
), SAA7146_BASE_EVEN2
);
2150 saawrite(virt_to_bus(saa
->dmavid2
) + 128, SAA7146_BASE_ODD2
);
2151 saawrite(virt_to_bus(saa
->dmavid2
) + VIDEO_CLIPMAP_SIZE
,
2152 SAA7146_PROT_ADDR2
);
2153 saawrite(256, SAA7146_PITCH2
);
2154 saawrite(4, SAA7146_PAGE2
); /* dma direction: read, no byteswap */
2155 saawrite(((SAA7146_MC2_UPLD_DMA2
) << 16) | SAA7146_MC2_UPLD_DMA2
,
2161 static void release_saa(void)
2165 struct saa7146
*saa
;
2167 for (i
= 0; i
< saa_num
; i
++) {
2170 /* turn off all capturing, DMA and IRQs */
2171 saawrite(0xffff0000, SAA7146_MC1
); /* reset chip */
2172 saawrite(0, SAA7146_MC2
);
2173 saawrite(0, SAA7146_IER
);
2174 saawrite(0xffffffffUL
, SAA7146_ISR
);
2176 /* disable PCI bus-mastering */
2177 pci_read_config_byte(saa
->dev
, PCI_COMMAND
, &command
);
2178 command
&= ~PCI_COMMAND_MASTER
;
2179 pci_write_config_byte(saa
->dev
, PCI_COMMAND
, command
);
2181 /* unmap and free memory */
2182 saa
->audhead
= saa
->audtail
= saa
->osdhead
= 0;
2183 saa
->vidhead
= saa
->vidtail
= saa
->osdtail
= 0;
2188 kfree((void *) saa
->dmavid2
);
2189 saa
->audbuf
= saa
->vidbuf
= saa
->osdbuf
= NULL
;
2190 saa
->dmavid2
= NULL
;
2192 kfree((void *) saa
->dmadebi
);
2194 kfree((void *) saa
->dmavid1
);
2196 kfree((void *) saa
->dmavid2
);
2198 kfree((void *) saa
->dmavid3
);
2200 kfree((void *) saa
->dmaa1in
);
2202 kfree((void *) saa
->dmaa1out
);
2204 kfree((void *) saa
->dmaa2in
);
2206 kfree((void *) saa
->dmaa2out
);
2208 kfree((void *) saa
->dmaRPS1
);
2210 kfree((void *) saa
->dmaRPS2
);
2211 free_irq(saa
->irq
, saa
);
2212 if (saa
->saa7146_mem
)
2213 iounmap(saa
->saa7146_mem
);
2214 if (saa
->video_dev
.minor
!= -1)
2215 video_unregister_device(&saa
->video_dev
);
2220 static int __init
stradis_init (void)
2222 struct pci_dev
*dev
= NULL
;
2227 while ((dev
= pci_find_device(PCI_VENDOR_ID_PHILIPS
, PCI_DEVICE_ID_PHILIPS_SAA7146
, dev
))) {
2228 if (!dev
->subsystem_vendor
)
2229 printk(KERN_INFO
"stradis%d: rev1 decoder\n", saa_num
);
2231 printk(KERN_INFO
"stradis%d: SDM2xx found\n", saa_num
);
2232 result
= configure_saa7146(dev
, saa_num
++);
2237 printk(KERN_INFO
"stradis: %d card(s) found.\n", saa_num
);
2240 for (i
= 0; i
< saa_num
; i
++)
2241 if (init_saa7146(i
) < 0) {
2249 static void __exit
stradis_exit (void)
2252 printk(KERN_INFO
"stradis: module cleanup complete\n");
2256 module_init(stradis_init
);
2257 module_exit(stradis_exit
);