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>
29 #include <linux/smp_lock.h>
31 #include <linux/init.h>
32 #include <linux/poll.h>
33 #include <linux/pci.h>
34 #include <linux/signal.h>
36 #include <linux/ioport.h>
37 #include <asm/pgtable.h>
39 #include <linux/sched.h>
40 #include <asm/types.h>
41 #include <linux/types.h>
42 #include <linux/interrupt.h>
43 #include <asm/uaccess.h>
44 #include <linux/vmalloc.h>
45 #include <linux/videodev.h>
46 #include <media/v4l2-common.h>
47 #include <media/v4l2-ioctl.h>
50 #include "saa7146reg.h"
55 #define DEBUG(x) /* debug driver */
56 #undef IDEBUG /* debug irq handler */
57 #undef MDEBUG /* debug memory management */
61 static struct saa7146 saa7146s
[SAA7146_MAX
];
63 static int saa_num
; /* number of SAA7146s in use */
65 static int video_nr
= -1;
66 module_param(video_nr
, int, 0);
67 MODULE_LICENSE("GPL");
69 #define nDebNormal 0x00480000
70 #define nDebNoInc 0x00480000
71 #define nDebVideo 0xd0480000
72 #define nDebAudio 0xd0400000
73 #define nDebDMA 0x02c80000
75 #define oDebNormal 0x13c80000
76 #define oDebNoInc 0x13c80000
77 #define oDebVideo 0xd1080000
78 #define oDebAudio 0xd1080000
79 #define oDebDMA 0x03080000
81 #define NewCard (saa->boardcfg[3])
82 #define ChipControl (saa->boardcfg[1])
83 #define NTSCFirstActive (saa->boardcfg[4])
84 #define PALFirstActive (saa->boardcfg[5])
85 #define NTSCLastActive (saa->boardcfg[54])
86 #define PALLastActive (saa->boardcfg[55])
87 #define Have2MB (saa->boardcfg[18] & 0x40)
88 #define HaveCS8420 (saa->boardcfg[18] & 0x04)
89 #define IBMMPEGCD20 (saa->boardcfg[18] & 0x20)
90 #define HaveCS3310 (saa->boardcfg[18] & 0x01)
91 #define CS3310MaxLvl ((saa->boardcfg[30] << 8) | saa->boardcfg[31])
92 #define HaveCS4341 (saa->boardcfg[40] == 2)
93 #define SDIType (saa->boardcfg[27])
94 #define CurrentMode (saa->boardcfg[2])
96 #define debNormal (NewCard ? nDebNormal : oDebNormal)
97 #define debNoInc (NewCard ? nDebNoInc : oDebNoInc)
98 #define debVideo (NewCard ? nDebVideo : oDebVideo)
99 #define debAudio (NewCard ? nDebAudio : oDebAudio)
100 #define debDMA (NewCard ? nDebDMA : oDebDMA)
102 #ifdef USE_RESCUE_EEPROM_SDM275
103 static unsigned char rescue_eeprom
[64] = {
104 0x00, 0x01, 0x04, 0x13, 0x26, 0x0f, 0x10, 0x00, 0x00, 0x00, 0x43, 0x63,
105 0x22, 0x01, 0x29, 0x15, 0x73, 0x00, 0x1f, 'd', 'e', 'c', 'x', 'l',
106 'd', 'v', 'a', 0x02, 0x00, 0x01, 0x00, 0xcc, 0xa4, 0x63, 0x09, 0xe2,
107 0x10, 0x00, 0x0a, 0x00, 0x02, 0x02, 'd', 'e', 'c', 'x', 'l', 'a',
108 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00,
113 /* ----------------------------------------------------------------------- */
114 /* Hardware I2C functions */
115 static void I2CWipe(struct saa7146
*saa
)
118 /* set i2c to ~=100kHz, abort transfer, clear busy */
119 saawrite(0x600 | SAA7146_I2C_ABORT
, 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
++)
133 saawrite(0x600, SAA7146_I2C_STATUS
);
134 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
135 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
136 /* wait for i2c registers to be programmed */
137 for (i
= 0; i
< 1000 &&
138 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
143 static int I2CRead(struct saa7146
*saa
, unsigned char addr
,
144 unsigned char subaddr
, int dosub
)
148 if (saaread(SAA7146_I2C_STATUS
) & 0x3c)
151 i
< 1000 && (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_BUSY
);
157 saawrite(((addr
& 0xfe) << 24) | (((addr
| 1) & 0xff) << 8) |
158 ((subaddr
& 0xff) << 16) | 0xed, SAA7146_I2C_TRANSFER
);
160 saawrite(((addr
& 0xfe) << 24) | (((addr
| 1) & 0xff) << 16) |
161 0xf1, SAA7146_I2C_TRANSFER
);
162 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
163 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
164 /* wait for i2c registers to be programmed */
165 for (i
= 0; i
< 1000 &&
166 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
168 /* wait for valid data */
169 for (i
= 0; i
< 1000 &&
170 (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_BUSY
); i
++)
172 if (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_ERR
)
175 printk("i2c setup read timeout\n");
176 saawrite(0x41, SAA7146_I2C_TRANSFER
);
177 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) |
178 SAA7146_MC2_UPLD_I2C
, SAA7146_MC2
);
179 /* wait for i2c registers to be programmed */
180 for (i
= 0; i
< 1000 &&
181 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_I2C
); i
++)
183 /* wait for valid data */
184 for (i
= 0; i
< 1000 &&
185 (saaread(SAA7146_I2C_TRANSFER
) & SAA7146_I2C_BUSY
); i
++)
187 if (saaread(SAA7146_I2C_TRANSFER
) & SAA7146_I2C_ERR
)
190 printk("i2c read timeout\n");
191 return ((saaread(SAA7146_I2C_TRANSFER
) >> 24) & 0xff);
194 /* set both to write both bytes, reset it to write only b1 */
196 static int I2CWrite(struct saa7146
*saa
, unsigned char addr
, unsigned char b1
,
197 unsigned char b2
, int both
)
202 if (saaread(SAA7146_I2C_STATUS
) & 0x3c)
204 for (i
= 0; i
< 1000 &&
205 (saaread(SAA7146_I2C_STATUS
) & SAA7146_I2C_BUSY
); i
++)
209 data
= ((addr
& 0xfe) << 24) | ((b1
& 0xff) << 16);
211 data
|= ((b2
& 0xff) << 8) | 0xe5;
214 saawrite(data
, SAA7146_I2C_TRANSFER
);
215 saawrite((SAA7146_MC2_UPLD_I2C
<< 16) | SAA7146_MC2_UPLD_I2C
,
220 static void attach_inform(struct saa7146
*saa
, int id
)
224 DEBUG(printk(KERN_DEBUG
"stradis%d: i2c: device found=%02x\n", saa
->nr
,
226 if (id
== 0xa0) { /* we have rev2 or later board, fill in info */
227 for (i
= 0; i
< 64; i
++)
228 saa
->boardcfg
[i
] = I2CRead(saa
, 0xa0, i
, 1);
229 #ifdef USE_RESCUE_EEPROM_SDM275
230 if (saa
->boardcfg
[0] != 0) {
231 printk("stradis%d: WARNING: EEPROM STORED VALUES HAVE "
232 "BEEN IGNORED\n", saa
->nr
);
233 for (i
= 0; i
< 64; i
++)
234 saa
->boardcfg
[i
] = rescue_eeprom
[i
];
237 printk("stradis%d: config =", saa
->nr
);
238 for (i
= 0; i
< 51; i
++) {
239 printk(" %02x", saa
->boardcfg
[i
]);
245 static void I2CBusScan(struct saa7146
*saa
)
248 for (i
= 0; i
< 0xff; i
+= 2)
249 if ((I2CRead(saa
, i
, 0, 0)) >= 0)
250 attach_inform(saa
, i
);
253 static int debiwait_maxwait
;
255 static int wait_for_debi_done(struct saa7146
*saa
)
259 /* wait for registers to be programmed */
260 for (i
= 0; i
< 100000 &&
261 !(saaread(SAA7146_MC2
) & SAA7146_MC2_UPLD_DEBI
); i
++)
262 saaread(SAA7146_MC2
);
263 /* wait for transfer to complete */
264 for (i
= 0; i
< 500000 &&
265 (saaread(SAA7146_PSR
) & SAA7146_PSR_DEBI_S
); i
++)
266 saaread(SAA7146_MC2
);
268 if (i
> debiwait_maxwait
)
269 printk("wait-for-debi-done maxwait: %d\n",
270 debiwait_maxwait
= i
);
278 static int debiwrite(struct saa7146
*saa
, u32 config
, int addr
,
282 if (count
<= 0 || count
> 32764)
284 if (wait_for_debi_done(saa
) < 0)
286 saawrite(config
, SAA7146_DEBI_CONFIG
);
287 if (count
<= 4) /* immediate transfer */
288 saawrite(val
, SAA7146_DEBI_AD
);
289 else /* block transfer */
290 saawrite(virt_to_bus(saa
->dmadebi
), SAA7146_DEBI_AD
);
291 saawrite((cmd
= (count
<< 17) | (addr
& 0xffff)), SAA7146_DEBI_COMMAND
);
292 saawrite((SAA7146_MC2_UPLD_DEBI
<< 16) | SAA7146_MC2_UPLD_DEBI
,
297 static u32
debiread(struct saa7146
*saa
, u32 config
, int addr
, int count
)
301 if (count
> 32764 || count
<= 0)
303 if (wait_for_debi_done(saa
) < 0)
305 saawrite(virt_to_bus(saa
->dmadebi
), SAA7146_DEBI_AD
);
306 saawrite((count
<< 17) | 0x10000 | (addr
& 0xffff),
307 SAA7146_DEBI_COMMAND
);
308 saawrite(config
, SAA7146_DEBI_CONFIG
);
309 saawrite((SAA7146_MC2_UPLD_DEBI
<< 16) | SAA7146_MC2_UPLD_DEBI
,
311 if (count
> 4) /* not an immediate transfer */
313 wait_for_debi_done(saa
);
314 result
= saaread(SAA7146_DEBI_AD
);
324 static void do_irq_send_data(struct saa7146
*saa
)
326 int split
, audbytes
, vidbytes
;
328 saawrite(SAA7146_PSR_PIN1
, SAA7146_IER
);
329 /* if special feature mode in effect, disable audio sending */
330 if (saa
->playmode
!= VID_PLAY_NORMAL
)
331 saa
->audtail
= saa
->audhead
= 0;
332 if (saa
->audhead
<= saa
->audtail
)
333 audbytes
= saa
->audtail
- saa
->audhead
;
335 audbytes
= 65536 - (saa
->audhead
- saa
->audtail
);
336 if (saa
->vidhead
<= saa
->vidtail
)
337 vidbytes
= saa
->vidtail
- saa
->vidhead
;
339 vidbytes
= 524288 - (saa
->vidhead
- saa
->vidtail
);
340 if (audbytes
== 0 && vidbytes
== 0 && saa
->osdtail
== saa
->osdhead
) {
341 saawrite(0, SAA7146_IER
);
344 /* if at least 1 block audio waiting and audio fifo isn't full */
345 if (audbytes
>= 2048 && (debiread(saa
, debNormal
, IBM_MP2_AUD_FIFO
, 2)
347 if (saa
->audhead
> saa
->audtail
)
348 split
= 65536 - saa
->audhead
;
352 if (split
> 0 && split
< 2048) {
353 memcpy(saa
->dmadebi
, saa
->audbuf
+ saa
->audhead
, split
);
358 memcpy(saa
->dmadebi
+ split
, saa
->audbuf
+ saa
->audhead
,
360 saa
->audhead
+= audbytes
;
361 saa
->audhead
&= 0xffff;
362 debiwrite(saa
, debAudio
, (NewCard
? IBM_MP2_AUD_FIFO
:
363 IBM_MP2_AUD_FIFOW
), 0, 2048);
364 wake_up_interruptible(&saa
->audq
);
365 /* if at least 1 block video waiting and video fifo isn't full */
366 } else if (vidbytes
>= 30720 && (debiread(saa
, debNormal
,
367 IBM_MP2_FIFO
, 2)) < 16384) {
368 if (saa
->vidhead
> saa
->vidtail
)
369 split
= 524288 - saa
->vidhead
;
373 if (split
> 0 && split
< 30720) {
374 memcpy(saa
->dmadebi
, saa
->vidbuf
+ saa
->vidhead
, split
);
379 memcpy(saa
->dmadebi
+ split
, saa
->vidbuf
+ saa
->vidhead
,
381 saa
->vidhead
+= vidbytes
;
382 saa
->vidhead
&= 0x7ffff;
383 debiwrite(saa
, debVideo
, (NewCard
? IBM_MP2_FIFO
:
384 IBM_MP2_FIFOW
), 0, 30720);
385 wake_up_interruptible(&saa
->vidq
);
387 saawrite(SAA7146_PSR_DEBI_S
| SAA7146_PSR_PIN1
, SAA7146_IER
);
390 static void send_osd_data(struct saa7146
*saa
)
392 int size
= saa
->osdtail
- saa
->osdhead
;
395 /* ensure some multiple of 8 bytes is transferred */
396 size
= 8 * ((size
+ 8) >> 3);
398 debiwrite(saa
, debNormal
, IBM_MP2_OSD_ADDR
,
399 (saa
->osdhead
>> 3), 2);
400 memcpy(saa
->dmadebi
, &saa
->osdbuf
[saa
->osdhead
], size
);
401 saa
->osdhead
+= size
;
402 /* block transfer of next 8 bytes to ~32k bytes */
403 debiwrite(saa
, debNormal
, IBM_MP2_OSD_DATA
, 0, size
);
405 if (saa
->osdhead
>= saa
->osdtail
) {
406 saa
->osdhead
= saa
->osdtail
= 0;
407 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00c, 2);
411 static irqreturn_t
saa7146_irq(int irq
, void *dev_id
)
413 struct saa7146
*saa
= dev_id
;
420 /* get/clear interrupt status bits */
421 stat
= saaread(SAA7146_ISR
);
422 astat
= stat
& saaread(SAA7146_IER
);
426 saawrite(astat
, SAA7146_ISR
);
427 if (astat
& SAA7146_PSR_DEBI_S
) {
428 do_irq_send_data(saa
);
430 if (astat
& SAA7146_PSR_PIN1
) {
432 /* the following read will trigger DEBI_S */
433 istat
= debiread(saa
, debNormal
, IBM_MP2_HOST_INT
, 2);
435 saawrite(0, SAA7146_IER
);
437 saawrite(SAA7146_PSR_DEBI_S
|
438 SAA7146_PSR_PIN1
, SAA7146_IER
);
440 if (istat
& 0x20) { /* Video Start */
441 saa
->vidinfo
.frame_count
++;
443 if (istat
& 0x400) { /* Picture Start */
444 /* update temporal reference */
446 if (istat
& 0x200) { /* Picture Resolution Change */
447 /* read new resolution */
449 if (istat
& 0x100) { /* New User Data found */
450 /* read new user data */
452 if (istat
& 0x1000) { /* new GOP/SMPTE */
455 if (istat
& 0x8000) { /* Sequence Start Code */
456 /* reset frame counter, load sizes */
457 saa
->vidinfo
.frame_count
= 0;
458 saa
->vidinfo
.h_size
= 704;
459 saa
->vidinfo
.v_size
= 480;
461 if (saa
->endmarkhead
!= saa
->endmarktail
) {
463 saa
->endmark
[saa
->endmarkhead
];
465 if (saa
->endmarkhead
>= MAX_MARKS
)
466 saa
->endmarkhead
= 0;
470 if (istat
& 0x4000) { /* Sequence Error Code */
471 if (saa
->endmarkhead
!= saa
->endmarktail
) {
473 saa
->endmark
[saa
->endmarkhead
];
475 if (saa
->endmarkhead
>= MAX_MARKS
)
476 saa
->endmarkhead
= 0;
481 if (astat
& SAA7146_PSR_PPEF
) {
482 IDEBUG(printk("stradis%d irq: PPEF\n", saa
->nr
));
484 if (astat
& SAA7146_PSR_PABO
) {
485 IDEBUG(printk("stradis%d irq: PABO\n", saa
->nr
));
487 if (astat
& SAA7146_PSR_PPED
) {
488 IDEBUG(printk("stradis%d irq: PPED\n", saa
->nr
));
490 if (astat
& SAA7146_PSR_RPS_I1
) {
491 IDEBUG(printk("stradis%d irq: RPS_I1\n", saa
->nr
));
493 if (astat
& SAA7146_PSR_RPS_I0
) {
494 IDEBUG(printk("stradis%d irq: RPS_I0\n", saa
->nr
));
496 if (astat
& SAA7146_PSR_RPS_LATE1
) {
497 IDEBUG(printk("stradis%d irq: RPS_LATE1\n", saa
->nr
));
499 if (astat
& SAA7146_PSR_RPS_LATE0
) {
500 IDEBUG(printk("stradis%d irq: RPS_LATE0\n", saa
->nr
));
502 if (astat
& SAA7146_PSR_RPS_E1
) {
503 IDEBUG(printk("stradis%d irq: RPS_E1\n", saa
->nr
));
505 if (astat
& SAA7146_PSR_RPS_E0
) {
506 IDEBUG(printk("stradis%d irq: RPS_E0\n", saa
->nr
));
508 if (astat
& SAA7146_PSR_RPS_TO1
) {
509 IDEBUG(printk("stradis%d irq: RPS_TO1\n", saa
->nr
));
511 if (astat
& SAA7146_PSR_RPS_TO0
) {
512 IDEBUG(printk("stradis%d irq: RPS_TO0\n", saa
->nr
));
514 if (astat
& SAA7146_PSR_UPLD
) {
515 IDEBUG(printk("stradis%d irq: UPLD\n", saa
->nr
));
517 if (astat
& SAA7146_PSR_DEBI_E
) {
518 IDEBUG(printk("stradis%d irq: DEBI_E\n", saa
->nr
));
520 if (astat
& SAA7146_PSR_I2C_S
) {
521 IDEBUG(printk("stradis%d irq: I2C_S\n", saa
->nr
));
523 if (astat
& SAA7146_PSR_I2C_E
) {
524 IDEBUG(printk("stradis%d irq: I2C_E\n", saa
->nr
));
526 if (astat
& SAA7146_PSR_A2_IN
) {
527 IDEBUG(printk("stradis%d irq: A2_IN\n", saa
->nr
));
529 if (astat
& SAA7146_PSR_A2_OUT
) {
530 IDEBUG(printk("stradis%d irq: A2_OUT\n", saa
->nr
));
532 if (astat
& SAA7146_PSR_A1_IN
) {
533 IDEBUG(printk("stradis%d irq: A1_IN\n", saa
->nr
));
535 if (astat
& SAA7146_PSR_A1_OUT
) {
536 IDEBUG(printk("stradis%d irq: A1_OUT\n", saa
->nr
));
538 if (astat
& SAA7146_PSR_AFOU
) {
539 IDEBUG(printk("stradis%d irq: AFOU\n", saa
->nr
));
541 if (astat
& SAA7146_PSR_V_PE
) {
542 IDEBUG(printk("stradis%d irq: V_PE\n", saa
->nr
));
544 if (astat
& SAA7146_PSR_VFOU
) {
545 IDEBUG(printk("stradis%d irq: VFOU\n", saa
->nr
));
547 if (astat
& SAA7146_PSR_FIDA
) {
548 IDEBUG(printk("stradis%d irq: FIDA\n", saa
->nr
));
550 if (astat
& SAA7146_PSR_FIDB
) {
551 IDEBUG(printk("stradis%d irq: FIDB\n", saa
->nr
));
553 if (astat
& SAA7146_PSR_PIN3
) {
554 IDEBUG(printk("stradis%d irq: PIN3\n", saa
->nr
));
556 if (astat
& SAA7146_PSR_PIN2
) {
557 IDEBUG(printk("stradis%d irq: PIN2\n", saa
->nr
));
559 if (astat
& SAA7146_PSR_PIN0
) {
560 IDEBUG(printk("stradis%d irq: PIN0\n", saa
->nr
));
562 if (astat
& SAA7146_PSR_ECS
) {
563 IDEBUG(printk("stradis%d irq: ECS\n", saa
->nr
));
565 if (astat
& SAA7146_PSR_EC3S
) {
566 IDEBUG(printk("stradis%d irq: EC3S\n", saa
->nr
));
568 if (astat
& SAA7146_PSR_EC0S
) {
569 IDEBUG(printk("stradis%d irq: EC0S\n", saa
->nr
));
574 printk(KERN_WARNING
"stradis%d: irq loop %d\n",
577 saawrite(0, SAA7146_IER
);
579 "stradis%d: IRQ loop cleared\n", saa
->nr
);
582 return IRQ_RETVAL(handled
);
585 static int ibm_send_command(struct saa7146
*saa
,
586 int command
, int data
, int chain
)
591 debiwrite(saa
, debNormal
, IBM_MP2_COMMAND
, (command
<< 1)| 1,2);
593 debiwrite(saa
, debNormal
, IBM_MP2_COMMAND
, command
<< 1, 2);
594 debiwrite(saa
, debNormal
, IBM_MP2_CMD_DATA
, data
, 2);
595 debiwrite(saa
, debNormal
, IBM_MP2_CMD_STAT
, 1, 2);
596 for (i
= 0; i
< 100 &&
597 (debiread(saa
, debNormal
, IBM_MP2_CMD_STAT
, 2) & 1); i
++)
604 static void cs4341_setlevel(struct saa7146
*saa
, int left
, int right
)
606 I2CWrite(saa
, 0x22, 0x03, left
> 94 ? 94 : left
, 2);
607 I2CWrite(saa
, 0x22, 0x04, right
> 94 ? 94 : right
, 2);
610 static void initialize_cs4341(struct saa7146
*saa
)
613 for (i
= 0; i
< 200; i
++) {
614 /* auto mute off, power on, no de-emphasis */
615 /* I2S data up to 24-bit 64xFs internal SCLK */
616 I2CWrite(saa
, 0x22, 0x01, 0x11, 2);
617 /* ATAPI mixer settings */
618 I2CWrite(saa
, 0x22, 0x02, 0x49, 2);
619 /* attenuation left 3db */
620 I2CWrite(saa
, 0x22, 0x03, 0x00, 2);
621 /* attenuation right 3db */
622 I2CWrite(saa
, 0x22, 0x04, 0x00, 2);
623 I2CWrite(saa
, 0x22, 0x01, 0x10, 2);
624 if (I2CRead(saa
, 0x22, 0x02, 1) == 0x49)
628 printk("stradis%d: CS4341 initialized (%d)\n", saa
->nr
, i
);
632 static void initialize_cs8420(struct saa7146
*saa
, int pro
)
637 sequence
= mode8420pro
;
639 sequence
= mode8420con
;
640 for (i
= 0; i
< INIT8420LEN
; i
++)
641 I2CWrite(saa
, 0x20, init8420
[i
* 2], init8420
[i
* 2 + 1], 2);
642 for (i
= 0; i
< MODE8420LEN
; i
++)
643 I2CWrite(saa
, 0x20, sequence
[i
* 2], sequence
[i
* 2 + 1], 2);
644 printk("stradis%d: CS8420 initialized\n", saa
->nr
);
647 static void initialize_saa7121(struct saa7146
*saa
, int dopal
)
652 sequence
= init7121pal
;
654 sequence
= init7121ntsc
;
655 mod
= saaread(SAA7146_PSR
) & 0x08;
656 /* initialize PAL/NTSC video encoder */
657 for (i
= 0; i
< INIT7121LEN
; i
++) {
658 if (NewCard
) { /* handle new card encoder differences */
659 if (sequence
[i
* 2] == 0x3a)
660 I2CWrite(saa
, 0x88, 0x3a, 0x13, 2);
661 else if (sequence
[i
* 2] == 0x6b)
662 I2CWrite(saa
, 0x88, 0x6b, 0x20, 2);
663 else if (sequence
[i
* 2] == 0x6c)
664 I2CWrite(saa
, 0x88, 0x6c,
665 dopal
? 0x09 : 0xf5, 2);
666 else if (sequence
[i
* 2] == 0x6d)
667 I2CWrite(saa
, 0x88, 0x6d,
668 dopal
? 0x20 : 0x00, 2);
669 else if (sequence
[i
* 2] == 0x7a)
670 I2CWrite(saa
, 0x88, 0x7a,
671 dopal
? (PALFirstActive
- 1) :
672 (NTSCFirstActive
- 4), 2);
673 else if (sequence
[i
* 2] == 0x7b)
674 I2CWrite(saa
, 0x88, 0x7b,
675 dopal
? PALLastActive
:
678 I2CWrite(saa
, 0x88, sequence
[i
* 2],
679 sequence
[i
* 2 + 1], 2);
681 if (sequence
[i
* 2] == 0x6b && mod
)
682 I2CWrite(saa
, 0x88, 0x6b,
683 (sequence
[i
* 2 + 1] ^ 0x09), 2);
684 else if (sequence
[i
* 2] == 0x7a)
685 I2CWrite(saa
, 0x88, 0x7a,
686 dopal
? (PALFirstActive
- 1) :
687 (NTSCFirstActive
- 4), 2);
688 else if (sequence
[i
* 2] == 0x7b)
689 I2CWrite(saa
, 0x88, 0x7b,
690 dopal
? PALLastActive
:
693 I2CWrite(saa
, 0x88, sequence
[i
* 2],
694 sequence
[i
* 2 + 1], 2);
699 static void set_genlock_offset(struct saa7146
*saa
, int noffset
)
702 int PixelsPerLine
= 858;
703 if (CurrentMode
== VIDEO_MODE_PAL
)
707 else if (noffset
< -500)
709 nCode
= noffset
+ 0x100;
713 nCode
= 0x400 + PixelsPerLine
+ nCode
;
714 debiwrite(saa
, debNormal
, XILINX_GLDELAY
, nCode
, 2);
717 static void set_out_format(struct saa7146
*saa
, int mode
)
719 initialize_saa7121(saa
, (mode
== VIDEO_MODE_NTSC
? 0 : 1));
720 saa
->boardcfg
[2] = mode
;
721 /* do not adjust analog video parameters here, use saa7121 init */
722 /* you will affect the SDI output on the new card */
723 if (mode
== VIDEO_MODE_PAL
) { /* PAL */
724 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x0808, 2);
726 saawrite(0x012002c0, SAA7146_NUM_LINE_BYTE1
);
728 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
, 0xe100, 2);
731 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
,
732 NewCard
? 0xe500 : 0x6500, 2);
733 debiwrite(saa
, debNormal
, IBM_MP2_DISP_DLY
,
735 (NewCard
? PALFirstActive
: PALFirstActive
- 6), 2);
737 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x0800, 2);
739 saawrite(0x00f002c0, SAA7146_NUM_LINE_BYTE1
);
740 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
,
741 NewCard
? 0xe100 : 0x6100, 2);
742 debiwrite(saa
, debNormal
, IBM_MP2_DISP_DLY
,
744 (NewCard
? NTSCFirstActive
: NTSCFirstActive
- 6), 2);
748 /* Intialize bitmangler to map from a byte value to the mangled word that
749 * must be output to program the Xilinx part through the DEBI port.
750 * Xilinx Data Bit->DEBI Bit: 0->15 1->7 2->6 3->12 4->11 5->2 6->1 7->0
751 * transfer FPGA code, init IBM chip, transfer IBM microcode
752 * rev2 card mangles: 0->7 1->6 2->5 3->4 4->3 5->2 6->1 7->0
754 static u16 bitmangler
[256];
756 static int initialize_fpga(struct video_code
*bitdata
)
758 int i
, num
, startindex
, failure
= 0, loadtwo
, loadfile
= 0;
763 /* verify fpga code */
764 for (startindex
= 0; startindex
< bitdata
->datasize
; startindex
++)
765 if (bitdata
->data
[startindex
] == 255)
767 if (startindex
== bitdata
->datasize
) {
768 printk(KERN_INFO
"stradis: bad fpga code\n");
771 /* initialize all detected cards */
772 for (num
= 0; num
< saa_num
; num
++) {
773 saa
= &saa7146s
[num
];
774 if (saa
->boardcfg
[0] > 20)
775 continue; /* card was programmed */
776 loadtwo
= (saa
->boardcfg
[18] & 0x10);
777 if (!NewCard
) /* we have an old board */
778 for (i
= 0; i
< 256; i
++)
779 bitmangler
[i
] = ((i
& 0x01) << 15) |
780 ((i
& 0x02) << 6) | ((i
& 0x04) << 4) |
781 ((i
& 0x08) << 9) | ((i
& 0x10) << 7) |
782 ((i
& 0x20) >> 3) | ((i
& 0x40) >> 5) |
784 else /* else we have a new board */
785 for (i
= 0; i
< 256; i
++)
786 bitmangler
[i
] = ((i
& 0x01) << 7) |
787 ((i
& 0x02) << 5) | ((i
& 0x04) << 3) |
788 ((i
& 0x08) << 1) | ((i
& 0x10) >> 1) |
789 ((i
& 0x20) >> 3) | ((i
& 0x40) >> 5) |
792 dmabuf
= (u16
*) saa
->dmadebi
;
793 newdma
= (u8
*) saa
->dmadebi
;
794 if (NewCard
) { /* SDM2xxx */
795 if (!strncmp(bitdata
->loadwhat
, "decoder2", 8))
796 continue; /* fpga not for this card */
797 if (!strncmp(&saa
->boardcfg
[42], bitdata
->loadwhat
, 8))
799 else if (loadtwo
&& !strncmp(&saa
->boardcfg
[19],
800 bitdata
->loadwhat
, 8))
802 else if (!saa
->boardcfg
[42] && !strncmp("decxl",
803 bitdata
->loadwhat
, 8))
804 loadfile
= 1; /* special */
806 continue; /* fpga not for this card */
807 if (loadfile
!= 1 && loadfile
!= 2)
808 continue; /* skip to next card */
809 if (saa
->boardcfg
[0] && loadfile
== 1)
810 continue; /* skip to next card */
811 if (saa
->boardcfg
[0] != 1 && loadfile
== 2)
812 continue; /* skip to next card */
813 saa
->boardcfg
[0]++; /* mark fpga handled */
814 printk("stradis%d: loading %s\n", saa
->nr
,
816 if (loadtwo
&& loadfile
== 2)
817 goto send_fpga_stuff
;
818 /* turn on the Audio interface to set PROG low */
819 saawrite(0x00400040, SAA7146_GPIO_CTRL
);
820 saaread(SAA7146_PSR
); /* ensure posted write */
821 /* wait for everyone to reset */
823 saawrite(0x00400000, SAA7146_GPIO_CTRL
);
824 } else { /* original card */
825 if (strncmp(bitdata
->loadwhat
, "decoder2", 8))
826 continue; /* fpga not for this card */
827 /* Pull the Xilinx PROG signal WS3 low */
828 saawrite(0x02000200, SAA7146_MC1
);
829 /* Turn on the Audio interface so can set PROG low */
830 saawrite(0x000000c0, SAA7146_ACON1
);
831 /* Pull the Xilinx INIT signal (GPIO2) low */
832 saawrite(0x00400000, SAA7146_GPIO_CTRL
);
833 /* Make sure everybody resets */
834 saaread(SAA7146_PSR
); /* ensure posted write */
836 /* Release the Xilinx PROG signal */
837 saawrite(0x00000000, SAA7146_ACON1
);
838 /* Turn off the Audio interface */
839 saawrite(0x02000000, SAA7146_MC1
);
841 /* Release Xilinx INIT signal (WS2) */
842 saawrite(0x00000000, SAA7146_GPIO_CTRL
);
843 /* Wait for the INIT to go High */
845 i
< 10000 && !(saaread(SAA7146_PSR
) & SAA7146_PSR_PIN2
);
849 printk(KERN_INFO
"stradis%d: no fpga INIT\n", saa
->nr
);
854 for (i
= startindex
; i
< bitdata
->datasize
; i
++)
855 newdma
[i
- startindex
] =
856 bitmangler
[bitdata
->data
[i
]];
857 debiwrite(saa
, 0x01420000, 0, 0,
858 ((bitdata
->datasize
- startindex
) + 5));
859 if (loadtwo
&& loadfile
== 1) {
860 printk("stradis%d: awaiting 2nd FPGA bitfile\n",
862 continue; /* skip to next card */
865 for (i
= startindex
; i
< bitdata
->datasize
; i
++)
866 dmabuf
[i
- startindex
] =
867 bitmangler
[bitdata
->data
[i
]];
868 debiwrite(saa
, 0x014a0000, 0, 0,
869 ((bitdata
->datasize
- startindex
) + 5) * 2);
872 i
< 1000 && !(saaread(SAA7146_PSR
) & SAA7146_PSR_PIN2
);
876 printk(KERN_INFO
"stradis%d: FPGA load failed\n",
882 /* Pull the Xilinx INIT signal (GPIO2) low */
883 saawrite(0x00400000, SAA7146_GPIO_CTRL
);
884 saaread(SAA7146_PSR
); /* ensure posted write */
886 saawrite(0x00000000, SAA7146_GPIO_CTRL
);
889 printk(KERN_INFO
"stradis%d: FPGA Loaded\n", saa
->nr
);
890 saa
->boardcfg
[0] = 26; /* mark fpga programmed */
891 /* set VXCO to its lowest frequency */
892 debiwrite(saa
, debNormal
, XILINX_PWM
, 0, 2);
896 debiwrite(saa
, debNormal
, XILINX_CS3310_CMPLT
,
898 /* set VXCO to PWM mode, release reset, blank on */
899 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0xffc4, 2);
903 debiwrite(saa
, debNormal
, XILINX_CTL0
,
906 /* set source Black */
907 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1707, 2);
908 saa
->boardcfg
[4] = 22; /* set NTSC First Active Line */
909 saa
->boardcfg
[5] = 23; /* set PAL First Active Line */
910 saa
->boardcfg
[54] = 2; /* set NTSC Last Active Line - 256 */
911 saa
->boardcfg
[55] = 54; /* set PAL Last Active Line - 256 */
912 set_out_format(saa
, VIDEO_MODE_NTSC
);
914 /* begin IBM chip init */
915 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 4, 2);
916 saaread(SAA7146_PSR
); /* wait for reset */
918 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 0, 2);
919 debiread(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 2);
920 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 0x10, 2);
921 debiwrite(saa
, debNormal
, IBM_MP2_CMD_ADDR
, 0, 2);
922 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_MODE
, 0x2e, 2);
925 /* set i2s rate converter to 48KHz */
926 debiwrite(saa
, debNormal
, 0x80c0, 6, 2);
927 /* we must init CS8420 first since rev b pulls i2s */
928 /* master clock low and CS4341 needs i2s master to */
929 /* run the i2c port. */
931 /* 0=consumer, 1=pro */
932 initialize_cs8420(saa
, 0);
936 initialize_cs4341(saa
);
938 debiwrite(saa
, debNormal
, IBM_MP2_INFC_CTL
, 0x48, 2);
939 debiwrite(saa
, debNormal
, IBM_MP2_BEEP_CTL
, 0xa000, 2);
940 debiwrite(saa
, debNormal
, IBM_MP2_DISP_LBOR
, 0, 2);
941 debiwrite(saa
, debNormal
, IBM_MP2_DISP_TBOR
, 0, 2);
943 set_genlock_offset(saa
, 0);
944 debiwrite(saa
, debNormal
, IBM_MP2_FRNT_ATTEN
, 0, 2);
947 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x8000, 2);
949 /* disable genlock */
950 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x8080, 2);
957 static int do_ibm_reset(struct saa7146
*saa
)
959 /* failure if decoder not previously programmed */
960 if (saa
->boardcfg
[0] < 37)
964 debiwrite(saa
, debNormal
, XILINX_CS3310_CMPLT
, 0, 2);
965 /* disable interrupts */
966 saawrite(0, SAA7146_IER
);
967 saa
->audhead
= saa
->audtail
= 0;
968 saa
->vidhead
= saa
->vidtail
= 0;
969 /* tristate debi bus, disable debi transfers */
970 saawrite(0x00880000, SAA7146_MC1
);
971 /* ensure posted write */
972 saaread(SAA7146_MC1
);
974 /* re-enable debi transfers */
975 saawrite(0x00880088, SAA7146_MC1
);
976 /* set source Black */
977 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1707, 2);
978 /* begin IBM chip init */
979 set_out_format(saa
, CurrentMode
);
980 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 4, 2);
981 saaread(SAA7146_PSR
); /* wait for reset */
983 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 0, 2);
984 debiread(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, 2);
985 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, ChipControl
, 2);
986 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_MODE
, 0x2e, 2);
989 /* set i2s rate converter to 48KHz */
990 debiwrite(saa
, debNormal
, 0x80c0, 6, 2);
991 /* we must init CS8420 first since rev b pulls i2s */
992 /* master clock low and CS4341 needs i2s master to */
993 /* run the i2c port. */
995 /* 0=consumer, 1=pro */
996 initialize_cs8420(saa
, 1);
1000 initialize_cs4341(saa
);
1002 debiwrite(saa
, debNormal
, IBM_MP2_INFC_CTL
, 0x48, 2);
1003 debiwrite(saa
, debNormal
, IBM_MP2_BEEP_CTL
, 0xa000, 2);
1004 debiwrite(saa
, debNormal
, IBM_MP2_DISP_LBOR
, 0, 2);
1005 debiwrite(saa
, debNormal
, IBM_MP2_DISP_TBOR
, 0, 2);
1007 set_genlock_offset(saa
, 0);
1008 debiwrite(saa
, debNormal
, IBM_MP2_FRNT_ATTEN
, 0, 2);
1009 debiwrite(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 0x2000, 2);
1010 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4552, 2);
1011 if (ibm_send_command(saa
, IBM_MP2_CONFIG_DECODER
,
1012 (ChipControl
== 0x43 ? 0xe800 : 0xe000), 1)) {
1013 printk(KERN_ERR
"stradis%d: IBM config failed\n", saa
->nr
);
1016 int i
= CS3310MaxLvl
;
1017 debiwrite(saa
, debNormal
, XILINX_CS3310_CMPLT
, ((i
<< 8)| i
),2);
1019 /* start video decoder */
1020 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
, ChipControl
, 2);
1021 /* 256k vid, 3520 bytes aud */
1022 debiwrite(saa
, debNormal
, IBM_MP2_RB_THRESHOLD
, 0x4037, 2);
1023 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4573, 2);
1024 ibm_send_command(saa
, IBM_MP2_PLAY
, 0, 0);
1025 /* enable buffer threshold irq */
1026 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00c, 2);
1027 /* clear pending interrupts */
1028 debiread(saa
, debNormal
, IBM_MP2_HOST_INT
, 2);
1029 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1711, 2);
1034 /* load the decoder microcode */
1035 static int initialize_ibmmpeg2(struct video_code
*microcode
)
1038 struct saa7146
*saa
;
1040 for (num
= 0; num
< saa_num
; num
++) {
1041 saa
= &saa7146s
[num
];
1042 /* check that FPGA is loaded */
1043 debiwrite(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 0xa55a, 2);
1044 i
= debiread(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 2);
1046 printk(KERN_INFO
"stradis%d: %04x != 0xa55a\n",
1052 if (!strncmp(microcode
->loadwhat
, "decoder.vid", 11)) {
1053 if (saa
->boardcfg
[0] > 27)
1054 continue; /* skip to next card */
1055 /* load video control store */
1056 saa
->boardcfg
[1] = 0x13; /* no-sync default */
1057 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 1, 2);
1058 debiwrite(saa
, debNormal
, IBM_MP2_PROC_IADDR
, 0, 2);
1059 for (i
= 0; i
< microcode
->datasize
/ 2; i
++)
1060 debiwrite(saa
, debNormal
, IBM_MP2_PROC_IDATA
,
1061 (microcode
->data
[i
* 2] << 8) |
1062 microcode
->data
[i
* 2 + 1], 2);
1063 debiwrite(saa
, debNormal
, IBM_MP2_PROC_IADDR
, 0, 2);
1064 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 0, 2);
1065 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
,
1067 saa
->boardcfg
[0] = 28;
1069 if (!strncmp(microcode
->loadwhat
, "decoder.aud", 11)) {
1070 if (saa
->boardcfg
[0] > 35)
1071 continue; /* skip to next card */
1072 /* load audio control store */
1073 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 1, 2);
1074 debiwrite(saa
, debNormal
, IBM_MP2_AUD_IADDR
, 0, 2);
1075 for (i
= 0; i
< microcode
->datasize
; i
++)
1076 debiwrite(saa
, debNormal
, IBM_MP2_AUD_IDATA
,
1077 microcode
->data
[i
], 1);
1078 debiwrite(saa
, debNormal
, IBM_MP2_AUD_IADDR
, 0, 2);
1079 debiwrite(saa
, debNormal
, IBM_MP2_WR_PROT
, 0, 2);
1080 debiwrite(saa
, debNormal
, IBM_MP2_OSD_SIZE
, 0x2000, 2);
1081 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4552, 2);
1082 if (ibm_send_command(saa
, IBM_MP2_CONFIG_DECODER
,
1084 printk(KERN_ERR
"stradis%d: IBM config "
1085 "failed\n", saa
->nr
);
1088 /* set PWM to center value */
1090 debiwrite(saa
, debNormal
, XILINX_PWM
,
1092 (saa
->boardcfg
[13] << 8), 2);
1094 debiwrite(saa
, debNormal
, XILINX_PWM
, 0x46, 2);
1098 debiwrite(saa
, debNormal
, XILINX_CS3310_CMPLT
,
1101 printk(KERN_INFO
"stradis%d: IBM MPEGCD%d Inited\n",
1102 saa
->nr
, 18 + (debiread(saa
, debNormal
,
1103 IBM_MP2_CHIP_CONTROL
, 2) >> 12));
1104 /* start video decoder */
1105 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
,
1107 debiwrite(saa
, debNormal
, IBM_MP2_RB_THRESHOLD
, 0x4037,
1108 2); /* 256k vid, 3520 bytes aud */
1109 debiwrite(saa
, debNormal
, IBM_MP2_AUD_CTL
, 0x4573, 2);
1110 ibm_send_command(saa
, IBM_MP2_PLAY
, 0, 0);
1111 /* enable buffer threshold irq */
1112 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00c, 2);
1113 debiread(saa
, debNormal
, IBM_MP2_HOST_INT
, 2);
1114 /* enable gpio irq */
1115 saawrite(0x00002000, SAA7146_GPIO_CTRL
);
1116 /* enable decoder output to HPS */
1117 debiwrite(saa
, debNormal
, XILINX_CTL0
, 0x1711, 2);
1118 saa
->boardcfg
[0] = 37;
1125 static u32 palette2fmt
[] = { /* some of these YUV translations are wrong */
1126 0xffffffff, 0x86000000, 0x87000000, 0x80000000, 0x8100000, 0x82000000,
1127 0x83000000, 0x00000000, 0x03000000, 0x03000000, 0x0a00000, 0x03000000,
1128 0x06000000, 0x00000000, 0x03000000, 0x0a000000, 0x0300000
1130 static int bpp2fmt
[4] = {
1131 VIDEO_PALETTE_HI240
, VIDEO_PALETTE_RGB565
, VIDEO_PALETTE_RGB24
,
1135 /* I wish I could find a formula to calculate these... */
1136 static u32 h_prescale
[64] = {
1137 0x10000000, 0x18040202, 0x18080000, 0x380c0606, 0x38100204, 0x38140808,
1138 0x38180000, 0x381c0000, 0x3820161c, 0x38242a3b, 0x38281230, 0x382c4460,
1139 0x38301040, 0x38340080, 0x38380000, 0x383c0000, 0x3840fefe, 0x3844ee9f,
1140 0x3848ee9f, 0x384cee9f, 0x3850ee9f, 0x38542a3b, 0x38581230, 0x385c0000,
1141 0x38600000, 0x38640000, 0x38680000, 0x386c0000, 0x38700000, 0x38740000,
1142 0x38780000, 0x387c0000, 0x30800000, 0x38840000, 0x38880000, 0x388c0000,
1143 0x38900000, 0x38940000, 0x38980000, 0x389c0000, 0x38a00000, 0x38a40000,
1144 0x38a80000, 0x38ac0000, 0x38b00000, 0x38b40000, 0x38b80000, 0x38bc0000,
1145 0x38c00000, 0x38c40000, 0x38c80000, 0x38cc0000, 0x38d00000, 0x38d40000,
1146 0x38d80000, 0x38dc0000, 0x38e00000, 0x38e40000, 0x38e80000, 0x38ec0000,
1147 0x38f00000, 0x38f40000, 0x38f80000, 0x38fc0000,
1149 static u32 v_gain
[64] = {
1150 0x016000ff, 0x016100ff, 0x016100ff, 0x016200ff, 0x016200ff, 0x016200ff,
1151 0x016200ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff, 0x016300ff,
1152 0x016300ff, 0x016300ff, 0x016300ff, 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, 0x016400ff, 0x016400ff,
1160 0x016400ff, 0x016400ff, 0x016400ff, 0x016400ff,
1163 static void saa7146_set_winsize(struct saa7146
*saa
)
1166 int offset
, yacl
, ysci
;
1167 saa
->win
.color_fmt
= format
=
1168 (saa
->win
.depth
== 15) ? palette2fmt
[VIDEO_PALETTE_RGB555
] :
1169 palette2fmt
[bpp2fmt
[(saa
->win
.bpp
- 1) & 3]];
1170 offset
= saa
->win
.x
* saa
->win
.bpp
+ saa
->win
.y
* saa
->win
.bpl
;
1171 saawrite(saa
->win
.vidadr
+ offset
, SAA7146_BASE_EVEN1
);
1172 saawrite(saa
->win
.vidadr
+ offset
+ saa
->win
.bpl
, SAA7146_BASE_ODD1
);
1173 saawrite(saa
->win
.bpl
* 2, SAA7146_PITCH1
);
1174 saawrite(saa
->win
.vidadr
+ saa
->win
.bpl
* saa
->win
.sheight
,
1175 SAA7146_PROT_ADDR1
);
1176 saawrite(0, SAA7146_PAGE1
);
1177 saawrite(format
| 0x60, SAA7146_CLIP_FORMAT_CTRL
);
1178 offset
= (704 / (saa
->win
.width
- 1)) & 0x3f;
1179 saawrite(h_prescale
[offset
], SAA7146_HPS_H_PRESCALE
);
1180 offset
= (720896 / saa
->win
.width
) / (offset
+ 1);
1181 saawrite((offset
<< 12) | 0x0c, SAA7146_HPS_H_SCALE
);
1182 if (CurrentMode
== VIDEO_MODE_NTSC
) {
1183 yacl
= /*(480 / saa->win.height - 1) & 0x3f */ 0;
1184 ysci
= 1024 - (saa
->win
.height
* 1024 / 480);
1186 yacl
= /*(576 / saa->win.height - 1) & 0x3f */ 0;
1187 ysci
= 1024 - (saa
->win
.height
* 1024 / 576);
1189 saawrite((1 << 31) | (ysci
<< 21) | (yacl
<< 15), SAA7146_HPS_V_SCALE
);
1190 saawrite(v_gain
[yacl
], SAA7146_HPS_V_GAIN
);
1191 saawrite(((SAA7146_MC2_UPLD_DMA1
| SAA7146_MC2_UPLD_HPS_V
|
1192 SAA7146_MC2_UPLD_HPS_H
) << 16) | (SAA7146_MC2_UPLD_DMA1
|
1193 SAA7146_MC2_UPLD_HPS_V
| SAA7146_MC2_UPLD_HPS_H
), SAA7146_MC2
);
1196 /* clip_draw_rectangle(cm,x,y,w,h) -- handle clipping an area
1197 * bitmap is fixed width, 128 bytes (1024 pixels represented)
1198 * arranged most-sigificant-bit-left in 32-bit words
1199 * based on saa7146 clipping hardware, it swaps bytes if LE
1200 * much of this makes up for egcs brain damage -- so if you
1201 * are wondering "why did he do this?" it is because the C
1202 * was adjusted to generate the optimal asm output without
1203 * writing non-portable __asm__ directives.
1206 static void clip_draw_rectangle(u32
*clipmap
, int x
, int y
, int w
, int h
)
1208 register int startword
, endword
;
1209 register u32 bitsleft
, bitsright
;
1219 if (w
<= 0 || h
<= 0 || x
> 1023 || y
> 639)
1220 return; /* throw away bad clips */
1225 startword
= (x
>> 5);
1226 endword
= ((x
+ w
) >> 5);
1227 bitsleft
= (0xffffffff >> (x
& 31));
1228 bitsright
= (0xffffffff << (~((x
+ w
) - (endword
<< 5))));
1229 temp
= &clipmap
[(y
<< 5) + startword
];
1230 w
= endword
- startword
;
1232 bitsleft
|= bitsright
;
1233 for (y
= 0; y
< h
; y
++) {
1238 for (y
= 0; y
< h
; y
++) {
1239 *temp
++ |= bitsleft
;
1240 for (x
= 1; x
< w
; x
++)
1241 *temp
++ = 0xffffffff;
1248 static void make_clip_tab(struct saa7146
*saa
, struct video_clip
*cr
, int ncr
)
1250 int i
, width
, height
;
1253 clipmap
= saa
->dmavid2
;
1254 if ((width
= saa
->win
.width
) > 1023)
1255 width
= 1023; /* sanity check */
1256 if ((height
= saa
->win
.height
) > 640)
1257 height
= 639; /* sanity check */
1258 if (ncr
> 0) { /* rectangles pased */
1259 /* convert rectangular clips to a bitmap */
1260 memset(clipmap
, 0, VIDEO_CLIPMAP_SIZE
); /* clear map */
1261 for (i
= 0; i
< ncr
; i
++)
1262 clip_draw_rectangle(clipmap
, cr
[i
].x
, cr
[i
].y
,
1263 cr
[i
].width
, cr
[i
].height
);
1265 /* clip against viewing window AND screen
1266 so we do not have to rely on the user program
1268 clip_draw_rectangle(clipmap
, (saa
->win
.x
+ width
> saa
->win
.swidth
) ?
1269 (saa
->win
.swidth
- saa
->win
.x
) : width
, 0, 1024, 768);
1270 clip_draw_rectangle(clipmap
, 0,
1271 (saa
->win
.y
+ height
> saa
->win
.sheight
) ?
1272 (saa
->win
.sheight
- saa
->win
.y
) : height
, 1024, 768);
1274 clip_draw_rectangle(clipmap
, 0, 0, -saa
->win
.x
, 768);
1276 clip_draw_rectangle(clipmap
, 0, 0, 1024, -saa
->win
.y
);
1279 static long saa_ioctl(struct file
*file
,
1280 unsigned int cmd
, unsigned long argl
)
1282 struct saa7146
*saa
= file
->private_data
;
1283 void __user
*arg
= (void __user
*)argl
;
1288 struct video_capability b
;
1289 strcpy(b
.name
, saa
->video_dev
.name
);
1290 b
.type
= VID_TYPE_CAPTURE
| VID_TYPE_OVERLAY
|
1291 VID_TYPE_CLIPPING
| VID_TYPE_FRAMERAM
|
1299 if (copy_to_user(arg
, &b
, sizeof(b
)))
1305 struct video_picture p
= saa
->picture
;
1306 if (saa
->win
.depth
== 8)
1307 p
.palette
= VIDEO_PALETTE_HI240
;
1308 if (saa
->win
.depth
== 15)
1309 p
.palette
= VIDEO_PALETTE_RGB555
;
1310 if (saa
->win
.depth
== 16)
1311 p
.palette
= VIDEO_PALETTE_RGB565
;
1312 if (saa
->win
.depth
== 24)
1313 p
.palette
= VIDEO_PALETTE_RGB24
;
1314 if (saa
->win
.depth
== 32)
1315 p
.palette
= VIDEO_PALETTE_RGB32
;
1316 if (copy_to_user(arg
, &p
, sizeof(p
)))
1322 struct video_picture p
;
1324 if (copy_from_user(&p
, arg
, sizeof(p
)))
1326 if (p
.palette
< ARRAY_SIZE(palette2fmt
)) {
1327 format
= palette2fmt
[p
.palette
];
1328 saa
->win
.color_fmt
= format
;
1329 saawrite(format
| 0x60,
1330 SAA7146_CLIP_FORMAT_CTRL
);
1332 saawrite(((p
.brightness
& 0xff00) << 16) |
1333 ((p
.contrast
& 0xfe00) << 7) |
1334 ((p
.colour
& 0xfe00) >> 9), SAA7146_BCS_CTRL
);
1336 /* upload changed registers */
1337 saawrite(((SAA7146_MC2_UPLD_HPS_H
|
1338 SAA7146_MC2_UPLD_HPS_V
) << 16) |
1339 SAA7146_MC2_UPLD_HPS_H
|
1340 SAA7146_MC2_UPLD_HPS_V
, SAA7146_MC2
);
1345 struct video_window vw
;
1346 struct video_clip
*vcp
= NULL
;
1348 if (copy_from_user(&vw
, arg
, sizeof(vw
)))
1352 if (vw
.flags
|| vw
.width
< 16 || vw
.height
< 16) {
1353 saawrite((SAA7146_MC1_TR_E_1
<< 16),
1357 /* 32-bit align start and adjust width */
1358 if (saa
->win
.bpp
< 4) {
1360 vw
.x
= (vw
.x
+ 3) & ~3;
1366 saa
->win
.width
= vw
.width
;
1367 if (saa
->win
.width
> 768)
1368 saa
->win
.width
= 768;
1369 saa
->win
.height
= vw
.height
;
1370 if (CurrentMode
== VIDEO_MODE_NTSC
) {
1371 if (saa
->win
.height
> 480)
1372 saa
->win
.height
= 480;
1374 if (saa
->win
.height
> 576)
1375 saa
->win
.height
= 576;
1379 saawrite((SAA7146_MC1_TR_E_1
<< 16), SAA7146_MC1
);
1380 saa7146_set_winsize(saa
);
1385 if (vw
.clipcount
< 0) {
1386 if (copy_from_user(saa
->dmavid2
, vw
.clips
,
1387 VIDEO_CLIPMAP_SIZE
))
1389 } else if (vw
.clipcount
> 16384) {
1391 } else if (vw
.clipcount
> 0) {
1392 vcp
= vmalloc(sizeof(struct video_clip
) *
1396 if (copy_from_user(vcp
, vw
.clips
,
1397 sizeof(struct video_clip
) *
1402 } else /* nothing clipped */
1403 memset(saa
->dmavid2
, 0, VIDEO_CLIPMAP_SIZE
);
1405 make_clip_tab(saa
, vcp
, vw
.clipcount
);
1406 if (vw
.clipcount
> 0)
1409 /* start capture & clip dma if we have an address */
1410 if ((saa
->cap
& 3) && saa
->win
.vidadr
!= 0)
1411 saawrite(((SAA7146_MC1_TR_E_1
|
1412 SAA7146_MC1_TR_E_2
) << 16) | 0xffff,
1418 struct video_window vw
;
1421 vw
.width
= saa
->win
.width
;
1422 vw
.height
= saa
->win
.height
;
1425 if (copy_to_user(arg
, &vw
, sizeof(vw
)))
1432 if (copy_from_user(&v
, arg
, sizeof(v
)))
1436 saawrite((SAA7146_MC1_TR_E_1
<< 16),
1439 if (saa
->win
.vidadr
== 0 || saa
->win
.width
== 0
1440 || saa
->win
.height
== 0)
1443 saawrite((SAA7146_MC1_TR_E_1
<< 16) | 0xffff,
1450 struct video_buffer v
;
1451 v
.base
= (void *)saa
->win
.vidadr
;
1452 v
.height
= saa
->win
.sheight
;
1453 v
.width
= saa
->win
.swidth
;
1454 v
.depth
= saa
->win
.depth
;
1455 v
.bytesperline
= saa
->win
.bpl
;
1456 if (copy_to_user(arg
, &v
, sizeof(v
)))
1463 struct video_buffer v
;
1464 if (!capable(CAP_SYS_ADMIN
))
1466 if (copy_from_user(&v
, arg
, sizeof(v
)))
1468 if (v
.depth
!= 8 && v
.depth
!= 15 && v
.depth
!= 16 &&
1469 v
.depth
!= 24 && v
.depth
!= 32 && v
.width
> 16 &&
1470 v
.height
> 16 && v
.bytesperline
> 16)
1473 saa
->win
.vidadr
= (unsigned long)v
.base
;
1474 saa
->win
.sheight
= v
.height
;
1475 saa
->win
.swidth
= v
.width
;
1476 saa
->win
.bpp
= ((v
.depth
+ 7) & 0x38) / 8;
1477 saa
->win
.depth
= v
.depth
;
1478 saa
->win
.bpl
= v
.bytesperline
;
1480 DEBUG(printk("Display at %p is %d by %d, bytedepth %d, "
1481 "bpl %d\n", v
.base
, v
.width
, v
.height
,
1482 saa
->win
.bpp
, saa
->win
.bpl
));
1483 saa7146_set_winsize(saa
);
1488 /* Will be handled higher up .. */
1494 struct video_audio v
;
1496 v
.flags
&= ~(VIDEO_AUDIO_MUTE
| VIDEO_AUDIO_MUTABLE
);
1497 v
.flags
|= VIDEO_AUDIO_MUTABLE
| VIDEO_AUDIO_VOLUME
;
1498 strcpy(v
.name
, "MPEG");
1499 v
.mode
= VIDEO_SOUND_STEREO
;
1500 if (copy_to_user(arg
, &v
, sizeof(v
)))
1506 struct video_audio v
;
1508 if (copy_from_user(&v
, arg
, sizeof(v
)))
1510 i
= (~(v
.volume
>> 8)) & 0xff;
1512 if (v
.flags
& VIDEO_AUDIO_MUTE
)
1513 debiwrite(saa
, debNormal
,
1514 IBM_MP2_FRNT_ATTEN
, 0xffff, 2);
1515 if (!(v
.flags
& VIDEO_AUDIO_MUTE
))
1516 debiwrite(saa
, debNormal
,
1517 IBM_MP2_FRNT_ATTEN
, 0x0000, 2);
1518 if (v
.flags
& VIDEO_AUDIO_VOLUME
)
1519 debiwrite(saa
, debNormal
,
1523 if (v
.flags
& VIDEO_AUDIO_MUTE
)
1524 cs4341_setlevel(saa
, 0xff, 0xff);
1525 if (!(v
.flags
& VIDEO_AUDIO_MUTE
))
1526 cs4341_setlevel(saa
, 0, 0);
1527 if (v
.flags
& VIDEO_AUDIO_VOLUME
)
1528 cs4341_setlevel(saa
, i
, i
);
1536 struct video_unit vu
;
1537 vu
.video
= saa
->video_dev
.minor
;
1538 vu
.vbi
= VIDEO_NO_UNIT
;
1539 vu
.radio
= VIDEO_NO_UNIT
;
1540 vu
.audio
= VIDEO_NO_UNIT
;
1541 vu
.teletext
= VIDEO_NO_UNIT
;
1542 if (copy_to_user(arg
, &vu
, sizeof(vu
)))
1546 case VIDIOCSPLAYMODE
:
1548 struct video_play_mode pmode
;
1549 if (copy_from_user((void *)&pmode
, arg
,
1550 sizeof(struct video_play_mode
)))
1552 switch (pmode
.mode
) {
1553 case VID_PLAY_VID_OUT_MODE
:
1554 if (pmode
.p1
!= VIDEO_MODE_NTSC
&&
1555 pmode
.p1
!= VIDEO_MODE_PAL
)
1557 set_out_format(saa
, pmode
.p1
);
1559 case VID_PLAY_GENLOCK
:
1560 debiwrite(saa
, debNormal
, XILINX_CTL0
,
1561 pmode
.p1
? 0x8000 : 0x8080, 2);
1563 set_genlock_offset(saa
, pmode
.p2
);
1565 case VID_PLAY_NORMAL
:
1566 debiwrite(saa
, debNormal
,
1567 IBM_MP2_CHIP_CONTROL
, ChipControl
, 2);
1568 ibm_send_command(saa
, IBM_MP2_PLAY
, 0, 0);
1569 saa
->playmode
= pmode
.mode
;
1571 case VID_PLAY_PAUSE
:
1572 /* IBM removed the PAUSE command */
1573 /* they say use SINGLE_FRAME now */
1574 case VID_PLAY_SINGLE_FRAME
:
1575 ibm_send_command(saa
, IBM_MP2_SINGLE_FRAME
,0,0);
1576 if (saa
->playmode
== pmode
.mode
) {
1577 debiwrite(saa
, debNormal
,
1578 IBM_MP2_CHIP_CONTROL
,
1581 saa
->playmode
= pmode
.mode
;
1583 case VID_PLAY_FAST_FORWARD
:
1584 ibm_send_command(saa
, IBM_MP2_FAST_FORWARD
,0,0);
1585 saa
->playmode
= pmode
.mode
;
1587 case VID_PLAY_SLOW_MOTION
:
1588 ibm_send_command(saa
, IBM_MP2_SLOW_MOTION
,
1590 saa
->playmode
= pmode
.mode
;
1592 case VID_PLAY_IMMEDIATE_NORMAL
:
1593 /* ensure transfers resume */
1594 debiwrite(saa
, debNormal
,
1595 IBM_MP2_CHIP_CONTROL
, ChipControl
, 2);
1596 ibm_send_command(saa
, IBM_MP2_IMED_NORM_PLAY
,
1598 saa
->playmode
= VID_PLAY_NORMAL
;
1600 case VID_PLAY_SWITCH_CHANNELS
:
1601 saa
->audhead
= saa
->audtail
= 0;
1602 saa
->vidhead
= saa
->vidtail
= 0;
1603 ibm_send_command(saa
, IBM_MP2_FREEZE_FRAME
,0,1);
1604 ibm_send_command(saa
, IBM_MP2_RESET_AUD_RATE
,
1606 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
,
1608 ibm_send_command(saa
, IBM_MP2_CHANNEL_SWITCH
,
1610 debiwrite(saa
, debNormal
, IBM_MP2_CHIP_CONTROL
,
1612 ibm_send_command(saa
, IBM_MP2_PLAY
, 0, 0);
1613 saa
->playmode
= VID_PLAY_NORMAL
;
1615 case VID_PLAY_FREEZE_FRAME
:
1616 ibm_send_command(saa
, IBM_MP2_FREEZE_FRAME
,0,0);
1617 saa
->playmode
= pmode
.mode
;
1619 case VID_PLAY_STILL_MODE
:
1620 ibm_send_command(saa
, IBM_MP2_SET_STILL_MODE
,
1622 saa
->playmode
= pmode
.mode
;
1624 case VID_PLAY_MASTER_MODE
:
1625 if (pmode
.p1
== VID_PLAY_MASTER_NONE
)
1626 saa
->boardcfg
[1] = 0x13;
1627 else if (pmode
.p1
== VID_PLAY_MASTER_VIDEO
)
1628 saa
->boardcfg
[1] = 0x23;
1629 else if (pmode
.p1
== VID_PLAY_MASTER_AUDIO
)
1630 saa
->boardcfg
[1] = 0x43;
1633 debiwrite(saa
, debNormal
,
1634 IBM_MP2_CHIP_CONTROL
, ChipControl
, 2);
1636 case VID_PLAY_ACTIVE_SCANLINES
:
1637 if (CurrentMode
== VIDEO_MODE_PAL
) {
1638 if (pmode
.p1
< 1 || pmode
.p2
> 625)
1640 saa
->boardcfg
[5] = pmode
.p1
;
1641 saa
->boardcfg
[55] = (pmode
.p1
+
1642 (pmode
.p2
/ 2) - 1) & 0xff;
1644 if (pmode
.p1
< 4 || pmode
.p2
> 525)
1646 saa
->boardcfg
[4] = pmode
.p1
;
1647 saa
->boardcfg
[54] = (pmode
.p1
+
1648 (pmode
.p2
/ 2) - 4) & 0xff;
1650 set_out_format(saa
, CurrentMode
);
1651 case VID_PLAY_RESET
:
1652 return do_ibm_reset(saa
);
1653 case VID_PLAY_END_MARK
:
1654 if (saa
->endmarktail
< saa
->endmarkhead
) {
1655 if (saa
->endmarkhead
-
1656 saa
->endmarktail
< 2)
1658 } else if (saa
->endmarkhead
<=saa
->endmarktail
){
1659 if (saa
->endmarktail
- saa
->endmarkhead
1664 saa
->endmark
[saa
->endmarktail
] = saa
->audtail
;
1666 if (saa
->endmarktail
>= MAX_MARKS
)
1667 saa
->endmarktail
= 0;
1671 case VIDIOCSWRITEMODE
:
1674 if (copy_from_user((void *)&mode
, arg
, sizeof(int)))
1676 if (mode
== VID_WRITE_MPEG_AUD
||
1677 mode
== VID_WRITE_MPEG_VID
||
1678 mode
== VID_WRITE_CC
||
1679 mode
== VID_WRITE_TTX
||
1680 mode
== VID_WRITE_OSD
) {
1681 saa
->writemode
= mode
;
1686 case VIDIOCSMICROCODE
:
1688 struct video_code ucode
;
1691 if (copy_from_user(&ucode
, arg
, sizeof(ucode
)))
1693 if (ucode
.datasize
> 65536 || ucode
.datasize
< 1024 ||
1694 strncmp(ucode
.loadwhat
, "dec", 3))
1696 if ((udata
= vmalloc(ucode
.datasize
)) == NULL
)
1698 if (copy_from_user(udata
, ucode
.data
, ucode
.datasize
)) {
1703 if (!strncmp(ucode
.loadwhat
, "decoder.aud", 11) ||
1704 !strncmp(ucode
.loadwhat
, "decoder.vid", 11))
1705 i
= initialize_ibmmpeg2(&ucode
);
1707 i
= initialize_fpga(&ucode
);
1714 case VIDIOCGCHAN
: /* this makes xawtv happy */
1716 struct video_channel v
;
1717 if (copy_from_user(&v
, arg
, sizeof(v
)))
1719 v
.flags
= VIDEO_VC_AUDIO
;
1721 v
.type
= VID_TYPE_MPEG_DECODER
;
1722 v
.norm
= CurrentMode
;
1723 strcpy(v
.name
, "MPEG2");
1724 if (copy_to_user(arg
, &v
, sizeof(v
)))
1728 case VIDIOCSCHAN
: /* this makes xawtv happy */
1730 struct video_channel v
;
1731 if (copy_from_user(&v
, arg
, sizeof(v
)))
1737 return -ENOIOCTLCMD
;
1742 static int saa_mmap(struct file
*file
, struct vm_area_struct
*vma
)
1744 struct saa7146
*saa
= file
->private_data
;
1745 printk(KERN_DEBUG
"stradis%d: saa_mmap called\n", saa
->nr
);
1749 static ssize_t
saa_read(struct file
*file
, char __user
* buf
,
1750 size_t count
, loff_t
* ppos
)
1755 static ssize_t
saa_write(struct file
*file
, const char __user
* buf
,
1756 size_t count
, loff_t
* ppos
)
1758 struct saa7146
*saa
= file
->private_data
;
1759 unsigned long todo
= count
;
1760 int blocksize
, split
;
1761 unsigned long flags
;
1764 if (saa
->writemode
== VID_WRITE_MPEG_AUD
) {
1765 spin_lock_irqsave(&saa
->lock
, flags
);
1766 if (saa
->audhead
<= saa
->audtail
)
1768 (saa
->audtail
- saa
->audhead
);
1770 blocksize
= saa
->audhead
- saa
->audtail
;
1771 spin_unlock_irqrestore(&saa
->lock
, flags
);
1772 if (blocksize
< 16384) {
1773 saawrite(SAA7146_PSR_DEBI_S
|
1774 SAA7146_PSR_PIN1
, SAA7146_IER
);
1775 saawrite(SAA7146_PSR_PIN1
, SAA7146_PSR
);
1776 /* wait for buffer space to open */
1777 interruptible_sleep_on(&saa
->audq
);
1779 spin_lock_irqsave(&saa
->lock
, flags
);
1780 if (saa
->audhead
<= saa
->audtail
) {
1782 (saa
->audtail
- saa
->audhead
);
1783 split
= 65536 - saa
->audtail
;
1785 blocksize
= saa
->audhead
- saa
->audtail
;
1788 spin_unlock_irqrestore(&saa
->lock
, flags
);
1790 if (blocksize
> todo
)
1792 /* double check that we really have space */
1795 if (split
< blocksize
) {
1796 if (copy_from_user(saa
->audbuf
+
1797 saa
->audtail
, buf
, split
))
1804 if (copy_from_user(saa
->audbuf
+ saa
->audtail
, buf
,
1807 saa
->audtail
+= blocksize
;
1810 saa
->audtail
&= 0xffff;
1811 } else if (saa
->writemode
== VID_WRITE_MPEG_VID
) {
1812 spin_lock_irqsave(&saa
->lock
, flags
);
1813 if (saa
->vidhead
<= saa
->vidtail
)
1814 blocksize
= 524288 -
1815 (saa
->vidtail
- saa
->vidhead
);
1817 blocksize
= saa
->vidhead
- saa
->vidtail
;
1818 spin_unlock_irqrestore(&saa
->lock
, flags
);
1819 if (blocksize
< 65536) {
1820 saawrite(SAA7146_PSR_DEBI_S
|
1821 SAA7146_PSR_PIN1
, SAA7146_IER
);
1822 saawrite(SAA7146_PSR_PIN1
, SAA7146_PSR
);
1823 /* wait for buffer space to open */
1824 interruptible_sleep_on(&saa
->vidq
);
1826 spin_lock_irqsave(&saa
->lock
, flags
);
1827 if (saa
->vidhead
<= saa
->vidtail
) {
1828 blocksize
= 524288 -
1829 (saa
->vidtail
- saa
->vidhead
);
1830 split
= 524288 - saa
->vidtail
;
1832 blocksize
= saa
->vidhead
- saa
->vidtail
;
1835 spin_unlock_irqrestore(&saa
->lock
, flags
);
1837 if (blocksize
> todo
)
1839 /* double check that we really have space */
1842 if (split
< blocksize
) {
1843 if (copy_from_user(saa
->vidbuf
+
1844 saa
->vidtail
, buf
, split
))
1851 if (copy_from_user(saa
->vidbuf
+ saa
->vidtail
, buf
,
1854 saa
->vidtail
+= blocksize
;
1857 saa
->vidtail
&= 0x7ffff;
1858 } else if (saa
->writemode
== VID_WRITE_OSD
) {
1861 if (copy_from_user(saa
->osdbuf
, buf
, count
))
1865 saa
->osdtail
= count
;
1866 debiwrite(saa
, debNormal
, IBM_MP2_OSD_ADDR
, 0, 2);
1867 debiwrite(saa
, debNormal
, IBM_MP2_OSD_LINK_ADDR
, 0, 2);
1868 debiwrite(saa
, debNormal
, IBM_MP2_MASK0
, 0xc00d, 2);
1869 debiwrite(saa
, debNormal
, IBM_MP2_DISP_MODE
,
1870 debiread(saa
, debNormal
,
1871 IBM_MP2_DISP_MODE
, 2) | 1, 2);
1872 /* trigger osd data transfer */
1873 saawrite(SAA7146_PSR_DEBI_S
|
1874 SAA7146_PSR_PIN1
, SAA7146_IER
);
1875 saawrite(SAA7146_PSR_PIN1
, SAA7146_PSR
);
1881 static int saa_open(struct file
*file
)
1883 struct video_device
*vdev
= video_devdata(file
);
1884 struct saa7146
*saa
= container_of(vdev
, struct saa7146
, video_dev
);
1887 file
->private_data
= saa
;
1890 if (saa
->user
> 1) {
1892 return 0; /* device open already, don't reset */
1894 saa
->writemode
= VID_WRITE_MPEG_VID
; /* default to video */
1899 static int saa_release(struct file
*file
)
1901 struct saa7146
*saa
= file
->private_data
;
1904 if (saa
->user
> 0) /* still someone using device */
1906 saawrite(0x007f0000, SAA7146_MC1
); /* stop all overlay dma */
1910 static const struct v4l2_file_operations saa_fops
= {
1911 .owner
= THIS_MODULE
,
1913 .release
= saa_release
,
1920 /* template for video_device-structure */
1921 static struct video_device saa_template
= {
1924 .release
= video_device_release_empty
,
1927 static int __devinit
configure_saa7146(struct pci_dev
*pdev
, int num
)
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;
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;
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
);
1968 dev_err(&pdev
->dev
, "%d: pci_enable_device failed!\n", num
);
1972 saa
->id
= pdev
->device
;
1973 saa
->irq
= pdev
->irq
;
1974 saa
->saa7146_adr
= pci_resource_start(pdev
, 0);
1975 pci_read_config_byte(pdev
, PCI_CLASS_REVISION
, &saa
->revision
);
1977 saa
->saa7146_mem
= ioremap(saa
->saa7146_adr
, 0x200);
1978 if (saa
->saa7146_mem
== NULL
) {
1979 dev_err(&pdev
->dev
, "%d: ioremap failed!\n", num
);
1984 memcpy(&saa
->video_dev
, &saa_template
, sizeof(saa_template
));
1985 saawrite(0, SAA7146_IER
); /* turn off all interrupts */
1987 retval
= request_irq(saa
->irq
, saa7146_irq
, IRQF_SHARED
| IRQF_DISABLED
,
1989 if (retval
== -EINVAL
)
1990 dev_err(&pdev
->dev
, "%d: Bad irq number or handler\n", num
);
1991 else if (retval
== -EBUSY
)
1992 dev_err(&pdev
->dev
, "%d: IRQ %ld busy, change your PnP config "
1993 "in BIOS\n", num
, saa
->irq
);
1997 pci_set_master(pdev
);
1998 retval
= video_register_device(&saa
->video_dev
, VFL_TYPE_GRABBER
,
2001 dev_err(&pdev
->dev
, "%d: error in registering video device!\n",
2008 iounmap(saa
->saa7146_mem
);
2013 static int __devinit
init_saa7146(struct pci_dev
*pdev
)
2015 struct saa7146
*saa
= pci_get_drvdata(pdev
);
2018 /* reset the saa7146 */
2019 saawrite(0xffff0000, SAA7146_MC1
);
2021 /* enable debi and i2c transfers and pins */
2022 saawrite(((SAA7146_MC1_EDP
| SAA7146_MC1_EI2C
|
2023 SAA7146_MC1_TR_E_DEBI
) << 16) | 0xffff, SAA7146_MC1
);
2024 /* ensure proper state of chip */
2025 saawrite(0x00000000, SAA7146_PAGE1
);
2026 saawrite(0x00f302c0, SAA7146_NUM_LINE_BYTE1
);
2027 saawrite(0x00000000, SAA7146_PAGE2
);
2028 saawrite(0x01400080, SAA7146_NUM_LINE_BYTE2
);
2029 saawrite(0x00000000, SAA7146_DD1_INIT
);
2030 saawrite(0x00000000, SAA7146_DD1_STREAM_B
);
2031 saawrite(0x00000000, SAA7146_DD1_STREAM_A
);
2032 saawrite(0x00000000, SAA7146_BRS_CTRL
);
2033 saawrite(0x80400040, SAA7146_BCS_CTRL
);
2034 saawrite(0x0000e000 /*| (1<<29) */ , SAA7146_HPS_CTRL
);
2035 saawrite(0x00000060, SAA7146_CLIP_FORMAT_CTRL
);
2036 saawrite(0x00000000, SAA7146_ACON1
);
2037 saawrite(0x00000000, SAA7146_ACON2
);
2038 saawrite(0x00000600, SAA7146_I2C_STATUS
);
2039 saawrite(((SAA7146_MC2_UPLD_D1_B
| SAA7146_MC2_UPLD_D1_A
|
2040 SAA7146_MC2_UPLD_BRS
| SAA7146_MC2_UPLD_HPS_H
|
2041 SAA7146_MC2_UPLD_HPS_V
| SAA7146_MC2_UPLD_DMA2
|
2042 SAA7146_MC2_UPLD_DMA1
| SAA7146_MC2_UPLD_I2C
) << 16) | 0xffff,
2044 /* setup arbitration control registers */
2045 saawrite(0x1412121a, SAA7146_PCI_BT_V1
);
2047 /* allocate 32k dma buffer + 4k for page table */
2048 if ((saa
->dmadebi
= kmalloc(32768 + 4096, GFP_KERNEL
)) == NULL
) {
2049 dev_err(&pdev
->dev
, "%d: debi kmalloc failed\n", saa
->nr
);
2053 saa
->pagedebi
= saa
->dmadebi
+ 32768; /* top 4k is for mmu */
2054 saawrite(virt_to_bus(saa
->pagedebi
) /*|0x800 */ , SAA7146_DEBI_PAGE
);
2055 for (i
= 0; i
< 12; i
++) /* setup mmu page table */
2056 saa
->pagedebi
[i
] = virt_to_bus((saa
->dmadebi
+ i
* 4096));
2058 saa
->audhead
= saa
->vidhead
= saa
->osdhead
= 0;
2059 saa
->audtail
= saa
->vidtail
= saa
->osdtail
= 0;
2060 if (saa
->vidbuf
== NULL
&& (saa
->vidbuf
= vmalloc(524288)) == NULL
) {
2061 dev_err(&pdev
->dev
, "%d: malloc failed\n", saa
->nr
);
2064 if (saa
->audbuf
== NULL
&& (saa
->audbuf
= vmalloc(65536)) == NULL
) {
2065 dev_err(&pdev
->dev
, "%d: malloc failed\n", saa
->nr
);
2068 if (saa
->osdbuf
== NULL
&& (saa
->osdbuf
= vmalloc(131072)) == NULL
) {
2069 dev_err(&pdev
->dev
, "%d: malloc failed\n", saa
->nr
);
2072 /* allocate 81920 byte buffer for clipping */
2073 if ((saa
->dmavid2
= kzalloc(VIDEO_CLIPMAP_SIZE
, GFP_KERNEL
)) == NULL
) {
2074 dev_err(&pdev
->dev
, "%d: clip kmalloc failed\n", saa
->nr
);
2077 /* setup clipping registers */
2078 saawrite(virt_to_bus(saa
->dmavid2
), SAA7146_BASE_EVEN2
);
2079 saawrite(virt_to_bus(saa
->dmavid2
) + 128, SAA7146_BASE_ODD2
);
2080 saawrite(virt_to_bus(saa
->dmavid2
) + VIDEO_CLIPMAP_SIZE
,
2081 SAA7146_PROT_ADDR2
);
2082 saawrite(256, SAA7146_PITCH2
);
2083 saawrite(4, SAA7146_PAGE2
); /* dma direction: read, no byteswap */
2084 saawrite(((SAA7146_MC2_UPLD_DMA2
) << 16) | SAA7146_MC2_UPLD_DMA2
,
2093 saa
->audbuf
= saa
->osdbuf
= saa
->vidbuf
= NULL
;
2098 static void stradis_release_saa(struct pci_dev
*pdev
)
2101 struct saa7146
*saa
= pci_get_drvdata(pdev
);
2103 /* turn off all capturing, DMA and IRQs */
2104 saawrite(0xffff0000, SAA7146_MC1
); /* reset chip */
2105 saawrite(0, SAA7146_MC2
);
2106 saawrite(0, SAA7146_IER
);
2107 saawrite(0xffffffffUL
, SAA7146_ISR
);
2109 /* disable PCI bus-mastering */
2110 pci_read_config_byte(pdev
, PCI_COMMAND
, &command
);
2111 command
&= ~PCI_COMMAND_MASTER
;
2112 pci_write_config_byte(pdev
, PCI_COMMAND
, command
);
2114 /* unmap and free memory */
2115 saa
->audhead
= saa
->audtail
= saa
->osdhead
= 0;
2116 saa
->vidhead
= saa
->vidtail
= saa
->osdtail
= 0;
2120 kfree(saa
->dmavid2
);
2121 saa
->audbuf
= saa
->vidbuf
= saa
->osdbuf
= NULL
;
2122 saa
->dmavid2
= NULL
;
2123 kfree(saa
->dmadebi
);
2124 kfree(saa
->dmavid1
);
2125 kfree(saa
->dmavid3
);
2126 kfree(saa
->dmaa1in
);
2127 kfree(saa
->dmaa1out
);
2128 kfree(saa
->dmaa2in
);
2129 kfree(saa
->dmaa2out
);
2130 kfree(saa
->dmaRPS1
);
2131 kfree(saa
->dmaRPS2
);
2132 free_irq(saa
->irq
, saa
);
2133 if (saa
->saa7146_mem
)
2134 iounmap(saa
->saa7146_mem
);
2135 if (video_is_registered(&saa
->video_dev
))
2136 video_unregister_device(&saa
->video_dev
);
2139 static int __devinit
stradis_probe(struct pci_dev
*pdev
,
2140 const struct pci_device_id
*ent
)
2142 int retval
= -EINVAL
;
2144 if (saa_num
>= SAA7146_MAX
)
2147 if (!pdev
->subsystem_vendor
)
2148 dev_info(&pdev
->dev
, "%d: rev1 decoder\n", saa_num
);
2150 dev_info(&pdev
->dev
, "%d: SDM2xx found\n", saa_num
);
2152 pci_set_drvdata(pdev
, &saa7146s
[saa_num
]);
2154 retval
= configure_saa7146(pdev
, saa_num
);
2156 dev_err(&pdev
->dev
, "%d: error in configuring\n", saa_num
);
2160 if (init_saa7146(pdev
) < 0) {
2161 dev_err(&pdev
->dev
, "%d: error in initialization\n", saa_num
);
2170 stradis_release_saa(pdev
);
2175 static void __devexit
stradis_remove(struct pci_dev
*pdev
)
2177 stradis_release_saa(pdev
);
2180 static struct pci_device_id stradis_pci_tbl
[] = {
2181 { PCI_DEVICE(PCI_VENDOR_ID_PHILIPS
, PCI_DEVICE_ID_PHILIPS_SAA7146
) },
2186 static struct pci_driver stradis_driver
= {
2188 .id_table
= stradis_pci_tbl
,
2189 .probe
= stradis_probe
,
2190 .remove
= __devexit_p(stradis_remove
)
2193 static int __init
stradis_init(void)
2199 retval
= pci_register_driver(&stradis_driver
);
2201 printk(KERN_ERR
"stradis: Unable to register pci driver.\n");
2206 static void __exit
stradis_exit(void)
2208 pci_unregister_driver(&stradis_driver
);
2209 printk(KERN_INFO
"stradis: module cleanup complete\n");
2212 module_init(stradis_init
);
2213 module_exit(stradis_exit
);