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