1 /*
2  * budget-ci.c: driver for the SAA7146 based Budget DVB cards
3  *
4  * Compiled from various sources by Michael Hunold <michael@mihu.de>
5  *
6  *     msp430 IR support contributed by Jack Thomasson <jkt@Helius.COM>
7  *     partially based on the Siemens DVB driver by Ralph+Marcus Metzler
8  *
9  * CI interface support (c) 2004 Andrew de Quincey <adq_dvb@lidskialf.net>
10  *
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  *
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the
20  * GNU General Public License for more details.
21  *
22  * To obtain the license, point your browser to
23  * http://www.gnu.org/copyleft/gpl.html
24  *
25  *
26  * the project's page is at https://linuxtv.org
27  */
28 
29 #include <linux/module.h>
30 #include <linux/errno.h>
31 #include <linux/slab.h>
32 #include <linux/interrupt.h>
33 #include <linux/spinlock.h>
34 #include <media/rc-core.h>
35 
36 #include "budget.h"
37 
38 #include "dvb_ca_en50221.h"
39 #include "stv0299.h"
40 #include "stv0297.h"
41 #include "tda1004x.h"
42 #include "stb0899_drv.h"
43 #include "stb0899_reg.h"
44 #include "stb0899_cfg.h"
45 #include "stb6100.h"
46 #include "stb6100_cfg.h"
47 #include "lnbp21.h"
48 #include "bsbe1.h"
49 #include "bsru6.h"
50 #include "tda1002x.h"
51 #include "tda827x.h"
52 #include "bsbe1-d01a.h"
53 
54 #define MODULE_NAME "budget_ci"
55 
56 /*
57  * Regarding DEBIADDR_IR:
58  * Some CI modules hang if random addresses are read.
59  * Using address 0x4000 for the IR read means that we
60  * use the same address as for CI version, which should
61  * be a safe default.
62  */
63 #define DEBIADDR_IR		0x4000
64 #define DEBIADDR_CICONTROL	0x0000
65 #define DEBIADDR_CIVERSION	0x4000
66 #define DEBIADDR_IO		0x1000
67 #define DEBIADDR_ATTR		0x3000
68 
69 #define CICONTROL_RESET		0x01
70 #define CICONTROL_ENABLETS	0x02
71 #define CICONTROL_CAMDETECT	0x08
72 
73 #define DEBICICTL		0x00420000
74 #define DEBICICAM		0x02420000
75 
76 #define SLOTSTATUS_NONE		1
77 #define SLOTSTATUS_PRESENT	2
78 #define SLOTSTATUS_RESET	4
79 #define SLOTSTATUS_READY	8
80 #define SLOTSTATUS_OCCUPIED	(SLOTSTATUS_PRESENT|SLOTSTATUS_RESET|SLOTSTATUS_READY)
81 
82 /* RC5 device wildcard */
83 #define IR_DEVICE_ANY		255
84 
85 static int rc5_device = -1;
86 module_param(rc5_device, int, 0644);
87 MODULE_PARM_DESC(rc5_device, "only IR commands to given RC5 device (device = 0 - 31, any device = 255, default: autodetect)");
88 
89 static int ir_debug;
90 module_param(ir_debug, int, 0644);
91 MODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding");
92 
93 DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
94 
95 struct budget_ci_ir {
96 	struct rc_dev *dev;
97 	struct tasklet_struct msp430_irq_tasklet;
98 	char name[72]; /* 40 + 32 for (struct saa7146_dev).name */
99 	char phys[32];
100 	int rc5_device;
101 	u32 ir_key;
102 	bool have_command;
103 	bool full_rc5;		/* Outputs a full RC5 code */
104 };
105 
106 struct budget_ci {
107 	struct budget budget;
108 	struct tasklet_struct ciintf_irq_tasklet;
109 	int slot_status;
110 	int ci_irq;
111 	struct dvb_ca_en50221 ca;
112 	struct budget_ci_ir ir;
113 	u8 tuner_pll_address; /* used for philips_tdm1316l configs */
114 };
115 
116 static void msp430_ir_interrupt(unsigned long data)
117 {
118 	struct budget_ci *budget_ci = (struct budget_ci *) data;
119 	struct rc_dev *dev = budget_ci->ir.dev;
120 	u32 command = ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8;
121 
122 	/*
123 	 * The msp430 chip can generate two different bytes, command and device
124 	 *
125 	 * type1: X1CCCCCC, C = command bits (0 - 63)
126 	 * type2: X0TDDDDD, D = device bits (0 - 31), T = RC5 toggle bit
127 	 *
128 	 * Each signal from the remote control can generate one or more command
129 	 * bytes and one or more device bytes. For the repeated bytes, the
130 	 * highest bit (X) is set. The first command byte is always generated
131 	 * before the first device byte. Other than that, no specific order
132 	 * seems to apply. To make life interesting, bytes can also be lost.
133 	 *
134 	 * Only when we have a command and device byte, a keypress is
135 	 * generated.
136 	 */
137 
138 	if (ir_debug)
139 		printk("budget_ci: received byte 0x%02x\n", command);
140 
141 	/* Remove repeat bit, we use every command */
142 	command = command & 0x7f;
143 
144 	/* Is this a RC5 command byte? */
145 	if (command & 0x40) {
146 		budget_ci->ir.have_command = true;
147 		budget_ci->ir.ir_key = command & 0x3f;
148 		return;
149 	}
150 
151 	/* It's a RC5 device byte */
152 	if (!budget_ci->ir.have_command)
153 		return;
154 	budget_ci->ir.have_command = false;
155 
156 	if (budget_ci->ir.rc5_device != IR_DEVICE_ANY &&
157 	    budget_ci->ir.rc5_device != (command & 0x1f))
158 		return;
159 
160 	if (budget_ci->ir.full_rc5) {
161 		rc_keydown(dev, RC_PROTO_RC5,
162 			   RC_SCANCODE_RC5(budget_ci->ir.rc5_device, budget_ci->ir.ir_key),
163 			   !!(command & 0x20));
164 		return;
165 	}
166 
167 	/* FIXME: We should generate complete scancodes for all devices */
168 	rc_keydown(dev, RC_PROTO_UNKNOWN, budget_ci->ir.ir_key,
169 		   !!(command & 0x20));
170 }
171 
172 static int msp430_ir_init(struct budget_ci *budget_ci)
173 {
174 	struct saa7146_dev *saa = budget_ci->budget.dev;
175 	struct rc_dev *dev;
176 	int error;
177 
178 	dev = rc_allocate_device(RC_DRIVER_SCANCODE);
179 	if (!dev) {
180 		printk(KERN_ERR "budget_ci: IR interface initialisation failed\n");
181 		return -ENOMEM;
182 	}
183 
184 	snprintf(budget_ci->ir.name, sizeof(budget_ci->ir.name),
185 		 "Budget-CI dvb ir receiver %s", saa->name);
186 	snprintf(budget_ci->ir.phys, sizeof(budget_ci->ir.phys),
187 		 "pci-%s/ir0", pci_name(saa->pci));
188 
189 	dev->driver_name = MODULE_NAME;
190 	dev->device_name = budget_ci->ir.name;
191 	dev->input_phys = budget_ci->ir.phys;
192 	dev->input_id.bustype = BUS_PCI;
193 	dev->input_id.version = 1;
194 	if (saa->pci->subsystem_vendor) {
195 		dev->input_id.vendor = saa->pci->subsystem_vendor;
196 		dev->input_id.product = saa->pci->subsystem_device;
197 	} else {
198 		dev->input_id.vendor = saa->pci->vendor;
199 		dev->input_id.product = saa->pci->device;
200 	}
201 	dev->dev.parent = &saa->pci->dev;
202 
203 	if (rc5_device < 0)
204 		budget_ci->ir.rc5_device = IR_DEVICE_ANY;
205 	else
206 		budget_ci->ir.rc5_device = rc5_device;
207 
208 	/* Select keymap and address */
209 	switch (budget_ci->budget.dev->pci->subsystem_device) {
210 	case 0x100c:
211 	case 0x100f:
212 	case 0x1011:
213 	case 0x1012:
214 		/* The hauppauge keymap is a superset of these remotes */
215 		dev->map_name = RC_MAP_HAUPPAUGE;
216 		budget_ci->ir.full_rc5 = true;
217 
218 		if (rc5_device < 0)
219 			budget_ci->ir.rc5_device = 0x1f;
220 		break;
221 	case 0x1010:
222 	case 0x1017:
223 	case 0x1019:
224 	case 0x101a:
225 	case 0x101b:
226 		/* for the Technotrend 1500 bundled remote */
227 		dev->map_name = RC_MAP_TT_1500;
228 		break;
229 	default:
230 		/* unknown remote */
231 		dev->map_name = RC_MAP_BUDGET_CI_OLD;
232 		break;
233 	}
234 	if (!budget_ci->ir.full_rc5)
235 		dev->scancode_mask = 0xff;
236 
237 	error = rc_register_device(dev);
238 	if (error) {
239 		printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error);
240 		rc_free_device(dev);
241 		return error;
242 	}
243 
244 	budget_ci->ir.dev = dev;
245 
246 	tasklet_init(&budget_ci->ir.msp430_irq_tasklet, msp430_ir_interrupt,
247 		     (unsigned long) budget_ci);
248 
249 	SAA7146_IER_ENABLE(saa, MASK_06);
250 	saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI);
251 
252 	return 0;
253 }
254 
255 static void msp430_ir_deinit(struct budget_ci *budget_ci)
256 {
257 	struct saa7146_dev *saa = budget_ci->budget.dev;
258 
259 	SAA7146_IER_DISABLE(saa, MASK_06);
260 	saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
261 	tasklet_kill(&budget_ci->ir.msp430_irq_tasklet);
262 
263 	rc_unregister_device(budget_ci->ir.dev);
264 }
265 
266 static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address)
267 {
268 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
269 
270 	if (slot != 0)
271 		return -EINVAL;
272 
273 	return ttpci_budget_debiread(&budget_ci->budget, DEBICICAM,
274 				     DEBIADDR_ATTR | (address & 0xfff), 1, 1, 0);
275 }
276 
277 static int ciintf_write_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address, u8 value)
278 {
279 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
280 
281 	if (slot != 0)
282 		return -EINVAL;
283 
284 	return ttpci_budget_debiwrite(&budget_ci->budget, DEBICICAM,
285 				      DEBIADDR_ATTR | (address & 0xfff), 1, value, 1, 0);
286 }
287 
288 static int ciintf_read_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 address)
289 {
290 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
291 
292 	if (slot != 0)
293 		return -EINVAL;
294 
295 	return ttpci_budget_debiread(&budget_ci->budget, DEBICICAM,
296 				     DEBIADDR_IO | (address & 3), 1, 1, 0);
297 }
298 
299 static int ciintf_write_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 address, u8 value)
300 {
301 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
302 
303 	if (slot != 0)
304 		return -EINVAL;
305 
306 	return ttpci_budget_debiwrite(&budget_ci->budget, DEBICICAM,
307 				      DEBIADDR_IO | (address & 3), 1, value, 1, 0);
308 }
309 
310 static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
311 {
312 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
313 	struct saa7146_dev *saa = budget_ci->budget.dev;
314 
315 	if (slot != 0)
316 		return -EINVAL;
317 
318 	if (budget_ci->ci_irq) {
319 		// trigger on RISING edge during reset so we know when READY is re-asserted
320 		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
321 	}
322 	budget_ci->slot_status = SLOTSTATUS_RESET;
323 	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
324 	msleep(1);
325 	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
326 			       CICONTROL_RESET, 1, 0);
327 
328 	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTHI);
329 	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
330 	return 0;
331 }
332 
333 static int ciintf_slot_shutdown(struct dvb_ca_en50221 *ca, int slot)
334 {
335 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
336 	struct saa7146_dev *saa = budget_ci->budget.dev;
337 
338 	if (slot != 0)
339 		return -EINVAL;
340 
341 	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTHI);
342 	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
343 	return 0;
344 }
345 
346 static int ciintf_slot_ts_enable(struct dvb_ca_en50221 *ca, int slot)
347 {
348 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
349 	struct saa7146_dev *saa = budget_ci->budget.dev;
350 	int tmp;
351 
352 	if (slot != 0)
353 		return -EINVAL;
354 
355 	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTLO);
356 
357 	tmp = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
358 	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
359 			       tmp | CICONTROL_ENABLETS, 1, 0);
360 
361 	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTA);
362 	return 0;
363 }
364 
365 static void ciintf_interrupt(unsigned long data)
366 {
367 	struct budget_ci *budget_ci = (struct budget_ci *) data;
368 	struct saa7146_dev *saa = budget_ci->budget.dev;
369 	unsigned int flags;
370 
371 	// ensure we don't get spurious IRQs during initialisation
372 	if (!budget_ci->budget.ci_present)
373 		return;
374 
375 	// read the CAM status
376 	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
377 	if (flags & CICONTROL_CAMDETECT) {
378 
379 		// GPIO should be set to trigger on falling edge if a CAM is present
380 		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
381 
382 		if (budget_ci->slot_status & SLOTSTATUS_NONE) {
383 			// CAM insertion IRQ
384 			budget_ci->slot_status = SLOTSTATUS_PRESENT;
385 			dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0,
386 						     DVB_CA_EN50221_CAMCHANGE_INSERTED);
387 
388 		} else if (budget_ci->slot_status & SLOTSTATUS_RESET) {
389 			// CAM ready (reset completed)
390 			budget_ci->slot_status = SLOTSTATUS_READY;
391 			dvb_ca_en50221_camready_irq(&budget_ci->ca, 0);
392 
393 		} else if (budget_ci->slot_status & SLOTSTATUS_READY) {
394 			// FR/DA IRQ
395 			dvb_ca_en50221_frda_irq(&budget_ci->ca, 0);
396 		}
397 	} else {
398 
399 		// trigger on rising edge if a CAM is not present - when a CAM is inserted, we
400 		// only want to get the IRQ when it sets READY. If we trigger on the falling edge,
401 		// the CAM might not actually be ready yet.
402 		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
403 
404 		// generate a CAM removal IRQ if we haven't already
405 		if (budget_ci->slot_status & SLOTSTATUS_OCCUPIED) {
406 			// CAM removal IRQ
407 			budget_ci->slot_status = SLOTSTATUS_NONE;
408 			dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0,
409 						     DVB_CA_EN50221_CAMCHANGE_REMOVED);
410 		}
411 	}
412 }
413 
414 static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open)
415 {
416 	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
417 	unsigned int flags;
418 
419 	// ensure we don't get spurious IRQs during initialisation
420 	if (!budget_ci->budget.ci_present)
421 		return -EINVAL;
422 
423 	// read the CAM status
424 	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
425 	if (flags & CICONTROL_CAMDETECT) {
426 		// mark it as present if it wasn't before
427 		if (budget_ci->slot_status & SLOTSTATUS_NONE) {
428 			budget_ci->slot_status = SLOTSTATUS_PRESENT;
429 		}
430 
431 		// during a RESET, we check if we can read from IO memory to see when CAM is ready
432 		if (budget_ci->slot_status & SLOTSTATUS_RESET) {
433 			if (ciintf_read_attribute_mem(ca, slot, 0) == 0x1d) {
434 				budget_ci->slot_status = SLOTSTATUS_READY;
435 			}
436 		}
437 	} else {
438 		budget_ci->slot_status = SLOTSTATUS_NONE;
439 	}
440 
441 	if (budget_ci->slot_status != SLOTSTATUS_NONE) {
442 		if (budget_ci->slot_status & SLOTSTATUS_READY) {
443 			return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
444 		}
445 		return DVB_CA_EN50221_POLL_CAM_PRESENT;
446 	}
447 
448 	return 0;
449 }
450 
451 static int ciintf_init(struct budget_ci *budget_ci)
452 {
453 	struct saa7146_dev *saa = budget_ci->budget.dev;
454 	int flags;
455 	int result;
456 	int ci_version;
457 	int ca_flags;
458 
459 	memset(&budget_ci->ca, 0, sizeof(struct dvb_ca_en50221));
460 
461 	// enable DEBI pins
462 	saa7146_write(saa, MC1, MASK_27 | MASK_11);
463 
464 	// test if it is there
465 	ci_version = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0);
466 	if ((ci_version & 0xa0) != 0xa0) {
467 		result = -ENODEV;
468 		goto error;
469 	}
470 
471 	// determine whether a CAM is present or not
472 	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
473 	budget_ci->slot_status = SLOTSTATUS_NONE;
474 	if (flags & CICONTROL_CAMDETECT)
475 		budget_ci->slot_status = SLOTSTATUS_PRESENT;
476 
477 	// version 0xa2 of the CI firmware doesn't generate interrupts
478 	if (ci_version == 0xa2) {
479 		ca_flags = 0;
480 		budget_ci->ci_irq = 0;
481 	} else {
482 		ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE |
483 				DVB_CA_EN50221_FLAG_IRQ_FR |
484 				DVB_CA_EN50221_FLAG_IRQ_DA;
485 		budget_ci->ci_irq = 1;
486 	}
487 
488 	// register CI interface
489 	budget_ci->ca.owner = THIS_MODULE;
490 	budget_ci->ca.read_attribute_mem = ciintf_read_attribute_mem;
491 	budget_ci->ca.write_attribute_mem = ciintf_write_attribute_mem;
492 	budget_ci->ca.read_cam_control = ciintf_read_cam_control;
493 	budget_ci->ca.write_cam_control = ciintf_write_cam_control;
494 	budget_ci->ca.slot_reset = ciintf_slot_reset;
495 	budget_ci->ca.slot_shutdown = ciintf_slot_shutdown;
496 	budget_ci->ca.slot_ts_enable = ciintf_slot_ts_enable;
497 	budget_ci->ca.poll_slot_status = ciintf_poll_slot_status;
498 	budget_ci->ca.data = budget_ci;
499 	if ((result = dvb_ca_en50221_init(&budget_ci->budget.dvb_adapter,
500 					  &budget_ci->ca,
501 					  ca_flags, 1)) != 0) {
502 		printk("budget_ci: CI interface detected, but initialisation failed.\n");
503 		goto error;
504 	}
505 
506 	// Setup CI slot IRQ
507 	if (budget_ci->ci_irq) {
508 		tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci);
509 		if (budget_ci->slot_status != SLOTSTATUS_NONE) {
510 			saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
511 		} else {
512 			saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
513 		}
514 		SAA7146_IER_ENABLE(saa, MASK_03);
515 	}
516 
517 	// enable interface
518 	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
519 			       CICONTROL_RESET, 1, 0);
520 
521 	// success!
522 	printk("budget_ci: CI interface initialised\n");
523 	budget_ci->budget.ci_present = 1;
524 
525 	// forge a fake CI IRQ so the CAM state is setup correctly
526 	if (budget_ci->ci_irq) {
527 		flags = DVB_CA_EN50221_CAMCHANGE_REMOVED;
528 		if (budget_ci->slot_status != SLOTSTATUS_NONE)
529 			flags = DVB_CA_EN50221_CAMCHANGE_INSERTED;
530 		dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags);
531 	}
532 
533 	return 0;
534 
535 error:
536 	saa7146_write(saa, MC1, MASK_27);
537 	return result;
538 }
539 
540 static void ciintf_deinit(struct budget_ci *budget_ci)
541 {
542 	struct saa7146_dev *saa = budget_ci->budget.dev;
543 
544 	// disable CI interrupts
545 	if (budget_ci->ci_irq) {
546 		SAA7146_IER_DISABLE(saa, MASK_03);
547 		saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT);
548 		tasklet_kill(&budget_ci->ciintf_irq_tasklet);
549 	}
550 
551 	// reset interface
552 	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
553 	msleep(1);
554 	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
555 			       CICONTROL_RESET, 1, 0);
556 
557 	// disable TS data stream to CI interface
558 	saa7146_setgpio(saa, 1, SAA7146_GPIO_INPUT);
559 
560 	// release the CA device
561 	dvb_ca_en50221_release(&budget_ci->ca);
562 
563 	// disable DEBI pins
564 	saa7146_write(saa, MC1, MASK_27);
565 }
566 
567 static void budget_ci_irq(struct saa7146_dev *dev, u32 * isr)
568 {
569 	struct budget_ci *budget_ci = (struct budget_ci *) dev->ext_priv;
570 
571 	dprintk(8, "dev: %p, budget_ci: %p\n", dev, budget_ci);
572 
573 	if (*isr & MASK_06)
574 		tasklet_schedule(&budget_ci->ir.msp430_irq_tasklet);
575 
576 	if (*isr & MASK_10)
577 		ttpci_budget_irq10_handler(dev, isr);
578 
579 	if ((*isr & MASK_03) && (budget_ci->budget.ci_present) && (budget_ci->ci_irq))
580 		tasklet_schedule(&budget_ci->ciintf_irq_tasklet);
581 }
582 
583 static u8 philips_su1278_tt_inittab[] = {
584 	0x01, 0x0f,
585 	0x02, 0x30,
586 	0x03, 0x00,
587 	0x04, 0x5b,
588 	0x05, 0x85,
589 	0x06, 0x02,
590 	0x07, 0x00,
591 	0x08, 0x02,
592 	0x09, 0x00,
593 	0x0C, 0x01,
594 	0x0D, 0x81,
595 	0x0E, 0x44,
596 	0x0f, 0x14,
597 	0x10, 0x3c,
598 	0x11, 0x84,
599 	0x12, 0xda,
600 	0x13, 0x97,
601 	0x14, 0x95,
602 	0x15, 0xc9,
603 	0x16, 0x19,
604 	0x17, 0x8c,
605 	0x18, 0x59,
606 	0x19, 0xf8,
607 	0x1a, 0xfe,
608 	0x1c, 0x7f,
609 	0x1d, 0x00,
610 	0x1e, 0x00,
611 	0x1f, 0x50,
612 	0x20, 0x00,
613 	0x21, 0x00,
614 	0x22, 0x00,
615 	0x23, 0x00,
616 	0x28, 0x00,
617 	0x29, 0x28,
618 	0x2a, 0x14,
619 	0x2b, 0x0f,
620 	0x2c, 0x09,
621 	0x2d, 0x09,
622 	0x31, 0x1f,
623 	0x32, 0x19,
624 	0x33, 0xfc,
625 	0x34, 0x93,
626 	0xff, 0xff
627 };
628 
629 static int philips_su1278_tt_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio)
630 {
631 	stv0299_writereg(fe, 0x0e, 0x44);
632 	if (srate >= 10000000) {
633 		stv0299_writereg(fe, 0x13, 0x97);
634 		stv0299_writereg(fe, 0x14, 0x95);
635 		stv0299_writereg(fe, 0x15, 0xc9);
636 		stv0299_writereg(fe, 0x17, 0x8c);
637 		stv0299_writereg(fe, 0x1a, 0xfe);
638 		stv0299_writereg(fe, 0x1c, 0x7f);
639 		stv0299_writereg(fe, 0x2d, 0x09);
640 	} else {
641 		stv0299_writereg(fe, 0x13, 0x99);
642 		stv0299_writereg(fe, 0x14, 0x8d);
643 		stv0299_writereg(fe, 0x15, 0xce);
644 		stv0299_writereg(fe, 0x17, 0x43);
645 		stv0299_writereg(fe, 0x1a, 0x1d);
646 		stv0299_writereg(fe, 0x1c, 0x12);
647 		stv0299_writereg(fe, 0x2d, 0x05);
648 	}
649 	stv0299_writereg(fe, 0x0e, 0x23);
650 	stv0299_writereg(fe, 0x0f, 0x94);
651 	stv0299_writereg(fe, 0x10, 0x39);
652 	stv0299_writereg(fe, 0x15, 0xc9);
653 
654 	stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
655 	stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
656 	stv0299_writereg(fe, 0x21, (ratio) & 0xf0);
657 
658 	return 0;
659 }
660 
661 static int philips_su1278_tt_tuner_set_params(struct dvb_frontend *fe)
662 {
663 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
664 	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
665 	u32 div;
666 	u8 buf[4];
667 	struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = buf,.len = sizeof(buf) };
668 
669 	if ((p->frequency < 950000) || (p->frequency > 2150000))
670 		return -EINVAL;
671 
672 	div = (p->frequency + (500 - 1)) / 500;	/* round correctly */
673 	buf[0] = (div >> 8) & 0x7f;
674 	buf[1] = div & 0xff;
675 	buf[2] = 0x80 | ((div & 0x18000) >> 10) | 2;
676 	buf[3] = 0x20;
677 
678 	if (p->symbol_rate < 4000000)
679 		buf[3] |= 1;
680 
681 	if (p->frequency < 1250000)
682 		buf[3] |= 0;
683 	else if (p->frequency < 1550000)
684 		buf[3] |= 0x40;
685 	else if (p->frequency < 2050000)
686 		buf[3] |= 0x80;
687 	else if (p->frequency < 2150000)
688 		buf[3] |= 0xC0;
689 
690 	if (fe->ops.i2c_gate_ctrl)
691 		fe->ops.i2c_gate_ctrl(fe, 1);
692 	if (i2c_transfer(&budget_ci->budget.i2c_adap, &msg, 1) != 1)
693 		return -EIO;
694 	return 0;
695 }
696 
697 static const struct stv0299_config philips_su1278_tt_config = {
698 
699 	.demod_address = 0x68,
700 	.inittab = philips_su1278_tt_inittab,
701 	.mclk = 64000000UL,
702 	.invert = 0,
703 	.skip_reinit = 1,
704 	.lock_output = STV0299_LOCKOUTPUT_1,
705 	.volt13_op0_op1 = STV0299_VOLT13_OP1,
706 	.min_delay_ms = 50,
707 	.set_symbol_rate = philips_su1278_tt_set_symbol_rate,
708 };
709 
710 
711 
712 static int philips_tdm1316l_tuner_init(struct dvb_frontend *fe)
713 {
714 	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
715 	static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab };
716 	static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 };
717 	struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,.flags = 0,.buf = td1316_init,.len =
718 			sizeof(td1316_init) };
719 
720 	// setup PLL configuration
721 	if (fe->ops.i2c_gate_ctrl)
722 		fe->ops.i2c_gate_ctrl(fe, 1);
723 	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
724 		return -EIO;
725 	msleep(1);
726 
727 	// disable the mc44BC374c (do not check for errors)
728 	tuner_msg.addr = 0x65;
729 	tuner_msg.buf = disable_mc44BC374c;
730 	tuner_msg.len = sizeof(disable_mc44BC374c);
731 	if (fe->ops.i2c_gate_ctrl)
732 		fe->ops.i2c_gate_ctrl(fe, 1);
733 	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1) {
734 		if (fe->ops.i2c_gate_ctrl)
735 			fe->ops.i2c_gate_ctrl(fe, 1);
736 		i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1);
737 	}
738 
739 	return 0;
740 }
741 
742 static int philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe)
743 {
744 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
745 	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
746 	u8 tuner_buf[4];
747 	struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,.flags = 0,.buf = tuner_buf,.len = sizeof(tuner_buf) };
748 	int tuner_frequency = 0;
749 	u8 band, cp, filter;
750 
751 	// determine charge pump
752 	tuner_frequency = p->frequency + 36130000;
753 	if (tuner_frequency < 87000000)
754 		return -EINVAL;
755 	else if (tuner_frequency < 130000000)
756 		cp = 3;
757 	else if (tuner_frequency < 160000000)
758 		cp = 5;
759 	else if (tuner_frequency < 200000000)
760 		cp = 6;
761 	else if (tuner_frequency < 290000000)
762 		cp = 3;
763 	else if (tuner_frequency < 420000000)
764 		cp = 5;
765 	else if (tuner_frequency < 480000000)
766 		cp = 6;
767 	else if (tuner_frequency < 620000000)
768 		cp = 3;
769 	else if (tuner_frequency < 830000000)
770 		cp = 5;
771 	else if (tuner_frequency < 895000000)
772 		cp = 7;
773 	else
774 		return -EINVAL;
775 
776 	// determine band
777 	if (p->frequency < 49000000)
778 		return -EINVAL;
779 	else if (p->frequency < 159000000)
780 		band = 1;
781 	else if (p->frequency < 444000000)
782 		band = 2;
783 	else if (p->frequency < 861000000)
784 		band = 4;
785 	else
786 		return -EINVAL;
787 
788 	// setup PLL filter and TDA9889
789 	switch (p->bandwidth_hz) {
790 	case 6000000:
791 		tda1004x_writereg(fe, 0x0C, 0x14);
792 		filter = 0;
793 		break;
794 
795 	case 7000000:
796 		tda1004x_writereg(fe, 0x0C, 0x80);
797 		filter = 0;
798 		break;
799 
800 	case 8000000:
801 		tda1004x_writereg(fe, 0x0C, 0x14);
802 		filter = 1;
803 		break;
804 
805 	default:
806 		return -EINVAL;
807 	}
808 
809 	// calculate divisor
810 	// ((36130000+((1000000/6)/2)) + Finput)/(1000000/6)
811 	tuner_frequency = (((p->frequency / 1000) * 6) + 217280) / 1000;
812 
813 	// setup tuner buffer
814 	tuner_buf[0] = tuner_frequency >> 8;
815 	tuner_buf[1] = tuner_frequency & 0xff;
816 	tuner_buf[2] = 0xca;
817 	tuner_buf[3] = (cp << 5) | (filter << 3) | band;
818 
819 	if (fe->ops.i2c_gate_ctrl)
820 		fe->ops.i2c_gate_ctrl(fe, 1);
821 	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
822 		return -EIO;
823 
824 	msleep(1);
825 	return 0;
826 }
827 
828 static int philips_tdm1316l_request_firmware(struct dvb_frontend *fe,
829 					     const struct firmware **fw, char *name)
830 {
831 	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
832 
833 	return request_firmware(fw, name, &budget_ci->budget.dev->pci->dev);
834 }
835 
836 static struct tda1004x_config philips_tdm1316l_config = {
837 
838 	.demod_address = 0x8,
839 	.invert = 0,
840 	.invert_oclk = 0,
841 	.xtal_freq = TDA10046_XTAL_4M,
842 	.agc_config = TDA10046_AGC_DEFAULT,
843 	.if_freq = TDA10046_FREQ_3617,
844 	.request_firmware = philips_tdm1316l_request_firmware,
845 };
846 
847 static struct tda1004x_config philips_tdm1316l_config_invert = {
848 
849 	.demod_address = 0x8,
850 	.invert = 1,
851 	.invert_oclk = 0,
852 	.xtal_freq = TDA10046_XTAL_4M,
853 	.agc_config = TDA10046_AGC_DEFAULT,
854 	.if_freq = TDA10046_FREQ_3617,
855 	.request_firmware = philips_tdm1316l_request_firmware,
856 };
857 
858 static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe)
859 {
860 	struct dtv_frontend_properties *p = &fe->dtv_property_cache;
861 	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
862 	u8 tuner_buf[5];
863 	struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,
864 				    .flags = 0,
865 				    .buf = tuner_buf,
866 				    .len = sizeof(tuner_buf) };
867 	int tuner_frequency = 0;
868 	u8 band, cp, filter;
869 
870 	// determine charge pump
871 	tuner_frequency = p->frequency + 36125000;
872 	if (tuner_frequency < 87000000)
873 		return -EINVAL;
874 	else if (tuner_frequency < 130000000) {
875 		cp = 3;
876 		band = 1;
877 	} else if (tuner_frequency < 160000000) {
878 		cp = 5;
879 		band = 1;
880 	} else if (tuner_frequency < 200000000) {
881 		cp = 6;
882 		band = 1;
883 	} else if (tuner_frequency < 290000000) {
884 		cp = 3;
885 		band = 2;
886 	} else if (tuner_frequency < 420000000) {
887 		cp = 5;
888 		band = 2;
889 	} else if (tuner_frequency < 480000000) {
890 		cp = 6;
891 		band = 2;
892 	} else if (tuner_frequency < 620000000) {
893 		cp = 3;
894 		band = 4;
895 	} else if (tuner_frequency < 830000000) {
896 		cp = 5;
897 		band = 4;
898 	} else if (tuner_frequency < 895000000) {
899 		cp = 7;
900 		band = 4;
901 	} else
902 		return -EINVAL;
903 
904 	// assume PLL filter should always be 8MHz for the moment.
905 	filter = 1;
906 
907 	// calculate divisor
908 	tuner_frequency = (p->frequency + 36125000 + (62500/2)) / 62500;
909 
910 	// setup tuner buffer
911 	tuner_buf[0] = tuner_frequency >> 8;
912 	tuner_buf[1] = tuner_frequency & 0xff;
913 	tuner_buf[2] = 0xc8;
914 	tuner_buf[3] = (cp << 5) | (filter << 3) | band;
915 	tuner_buf[4] = 0x80;
916 
917 	if (fe->ops.i2c_gate_ctrl)
918 		fe->ops.i2c_gate_ctrl(fe, 1);
919 	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
920 		return -EIO;
921 
922 	msleep(50);
923 
924 	if (fe->ops.i2c_gate_ctrl)
925 		fe->ops.i2c_gate_ctrl(fe, 1);
926 	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
927 		return -EIO;
928 
929 	msleep(1);
930 
931 	return 0;
932 }
933 
934 static u8 dvbc_philips_tdm1316l_inittab[] = {
935 	0x80, 0x01,
936 	0x80, 0x00,
937 	0x81, 0x01,
938 	0x81, 0x00,
939 	0x00, 0x09,
940 	0x01, 0x69,
941 	0x03, 0x00,
942 	0x04, 0x00,
943 	0x07, 0x00,
944 	0x08, 0x00,
945 	0x20, 0x00,
946 	0x21, 0x40,
947 	0x22, 0x00,
948 	0x23, 0x00,
949 	0x24, 0x40,
950 	0x25, 0x88,
951 	0x30, 0xff,
952 	0x31, 0x00,
953 	0x32, 0xff,
954 	0x33, 0x00,
955 	0x34, 0x50,
956 	0x35, 0x7f,
957 	0x36, 0x00,
958 	0x37, 0x20,
959 	0x38, 0x00,
960 	0x40, 0x1c,
961 	0x41, 0xff,
962 	0x42, 0x29,
963 	0x43, 0x20,
964 	0x44, 0xff,
965 	0x45, 0x00,
966 	0x46, 0x00,
967 	0x49, 0x04,
968 	0x4a, 0x00,
969 	0x4b, 0x7b,
970 	0x52, 0x30,
971 	0x55, 0xae,
972 	0x56, 0x47,
973 	0x57, 0xe1,
974 	0x58, 0x3a,
975 	0x5a, 0x1e,
976 	0x5b, 0x34,
977 	0x60, 0x00,
978 	0x63, 0x00,
979 	0x64, 0x00,
980 	0x65, 0x00,
981 	0x66, 0x00,
982 	0x67, 0x00,
983 	0x68, 0x00,
984 	0x69, 0x00,
985 	0x6a, 0x02,
986 	0x6b, 0x00,
987 	0x70, 0xff,
988 	0x71, 0x00,
989 	0x72, 0x00,
990 	0x73, 0x00,
991 	0x74, 0x0c,
992 	0x80, 0x00,
993 	0x81, 0x00,
994 	0x82, 0x00,
995 	0x83, 0x00,
996 	0x84, 0x04,
997 	0x85, 0x80,
998 	0x86, 0x24,
999 	0x87, 0x78,
1000 	0x88, 0x10,
1001 	0x89, 0x00,
1002 	0x90, 0x01,
1003 	0x91, 0x01,
1004 	0xa0, 0x04,
1005 	0xa1, 0x00,
1006 	0xa2, 0x00,
1007 	0xb0, 0x91,
1008 	0xb1, 0x0b,
1009 	0xc0, 0x53,
1010 	0xc1, 0x70,
1011 	0xc2, 0x12,
1012 	0xd0, 0x00,
1013 	0xd1, 0x00,
1014 	0xd2, 0x00,
1015 	0xd3, 0x00,
1016 	0xd4, 0x00,
1017 	0xd5, 0x00,
1018 	0xde, 0x00,
1019 	0xdf, 0x00,
1020 	0x61, 0x38,
1021 	0x62, 0x0a,
1022 	0x53, 0x13,
1023 	0x59, 0x08,
1024 	0xff, 0xff,
1025 };
1026 
1027 static struct stv0297_config dvbc_philips_tdm1316l_config = {
1028 	.demod_address = 0x1c,
1029 	.inittab = dvbc_philips_tdm1316l_inittab,
1030 	.invert = 0,
1031 	.stop_during_read = 1,
1032 };
1033 
1034 static struct tda10023_config tda10023_config = {
1035 	.demod_address = 0xc,
1036 	.invert = 0,
1037 	.xtal = 16000000,
1038 	.pll_m = 11,
1039 	.pll_p = 3,
1040 	.pll_n = 1,
1041 	.deltaf = 0xa511,
1042 };
1043 
1044 static struct tda827x_config tda827x_config = {
1045 	.config = 0,
1046 };
1047 
1048 /* TT S2-3200 DVB-S (STB0899) Inittab */
1049 static const struct stb0899_s1_reg tt3200_stb0899_s1_init_1[] = {
1050 
1051 	{ STB0899_DEV_ID		, 0x81 },
1052 	{ STB0899_DISCNTRL1		, 0x32 },
1053 	{ STB0899_DISCNTRL2     	, 0x80 },
1054 	{ STB0899_DISRX_ST0     	, 0x04 },
1055 	{ STB0899_DISRX_ST1     	, 0x00 },
1056 	{ STB0899_DISPARITY     	, 0x00 },
1057 	{ STB0899_DISSTATUS		, 0x20 },
1058 	{ STB0899_DISF22        	, 0x8c },
1059 	{ STB0899_DISF22RX      	, 0x9a },
1060 	{ STB0899_SYSREG		, 0x0b },
1061 	{ STB0899_ACRPRESC      	, 0x11 },
1062 	{ STB0899_ACRDIV1       	, 0x0a },
1063 	{ STB0899_ACRDIV2       	, 0x05 },
1064 	{ STB0899_DACR1         	, 0x00 },
1065 	{ STB0899_DACR2         	, 0x00 },
1066 	{ STB0899_OUTCFG        	, 0x00 },
1067 	{ STB0899_MODECFG       	, 0x00 },
1068 	{ STB0899_IRQSTATUS_3		, 0x30 },
1069 	{ STB0899_IRQSTATUS_2		, 0x00 },
1070 	{ STB0899_IRQSTATUS_1		, 0x00 },
1071 	{ STB0899_IRQSTATUS_0		, 0x00 },
1072 	{ STB0899_IRQMSK_3      	, 0xf3 },
1073 	{ STB0899_IRQMSK_2      	, 0xfc },
1074 	{ STB0899_IRQMSK_1      	, 0xff },
1075 	{ STB0899_IRQMSK_0		, 0xff },
1076 	{ STB0899_IRQCFG		, 0x00 },
1077 	{ STB0899_I2CCFG        	, 0x88 },
1078 	{ STB0899_I2CRPT        	, 0x48 }, /* 12k Pullup, Repeater=16, Stop=disabled */
1079 	{ STB0899_IOPVALUE5		, 0x00 },
1080 	{ STB0899_IOPVALUE4		, 0x20 },
1081 	{ STB0899_IOPVALUE3		, 0xc9 },
1082 	{ STB0899_IOPVALUE2		, 0x90 },
1083 	{ STB0899_IOPVALUE1		, 0x40 },
1084 	{ STB0899_IOPVALUE0		, 0x00 },
1085 	{ STB0899_GPIO00CFG     	, 0x82 },
1086 	{ STB0899_GPIO01CFG     	, 0x82 },
1087 	{ STB0899_GPIO02CFG     	, 0x82 },
1088 	{ STB0899_GPIO03CFG     	, 0x82 },
1089 	{ STB0899_GPIO04CFG     	, 0x82 },
1090 	{ STB0899_GPIO05CFG     	, 0x82 },
1091 	{ STB0899_GPIO06CFG     	, 0x82 },
1092 	{ STB0899_GPIO07CFG     	, 0x82 },
1093 	{ STB0899_GPIO08CFG     	, 0x82 },
1094 	{ STB0899_GPIO09CFG     	, 0x82 },
1095 	{ STB0899_GPIO10CFG     	, 0x82 },
1096 	{ STB0899_GPIO11CFG     	, 0x82 },
1097 	{ STB0899_GPIO12CFG     	, 0x82 },
1098 	{ STB0899_GPIO13CFG     	, 0x82 },
1099 	{ STB0899_GPIO14CFG     	, 0x82 },
1100 	{ STB0899_GPIO15CFG     	, 0x82 },
1101 	{ STB0899_GPIO16CFG     	, 0x82 },
1102 	{ STB0899_GPIO17CFG     	, 0x82 },
1103 	{ STB0899_GPIO18CFG     	, 0x82 },
1104 	{ STB0899_GPIO19CFG     	, 0x82 },
1105 	{ STB0899_GPIO20CFG     	, 0x82 },
1106 	{ STB0899_SDATCFG       	, 0xb8 },
1107 	{ STB0899_SCLTCFG       	, 0xba },
1108 	{ STB0899_AGCRFCFG      	, 0x1c }, /* 0x11 */
1109 	{ STB0899_GPIO22        	, 0x82 }, /* AGCBB2CFG */
1110 	{ STB0899_GPIO21        	, 0x91 }, /* AGCBB1CFG */
1111 	{ STB0899_DIRCLKCFG     	, 0x82 },
1112 	{ STB0899_CLKOUT27CFG   	, 0x7e },
1113 	{ STB0899_STDBYCFG      	, 0x82 },
1114 	{ STB0899_CS0CFG        	, 0x82 },
1115 	{ STB0899_CS1CFG        	, 0x82 },
1116 	{ STB0899_DISEQCOCFG    	, 0x20 },
1117 	{ STB0899_GPIO32CFG		, 0x82 },
1118 	{ STB0899_GPIO33CFG		, 0x82 },
1119 	{ STB0899_GPIO34CFG		, 0x82 },
1120 	{ STB0899_GPIO35CFG		, 0x82 },
1121 	{ STB0899_GPIO36CFG		, 0x82 },
1122 	{ STB0899_GPIO37CFG		, 0x82 },
1123 	{ STB0899_GPIO38CFG		, 0x82 },
1124 	{ STB0899_GPIO39CFG		, 0x82 },
1125 	{ STB0899_NCOARSE       	, 0x15 }, /* 0x15 = 27 Mhz Clock, F/3 = 198MHz, F/6 = 99MHz */
1126 	{ STB0899_SYNTCTRL      	, 0x02 }, /* 0x00 = CLK from CLKI, 0x02 = CLK from XTALI */
1127 	{ STB0899_FILTCTRL      	, 0x00 },
1128 	{ STB0899_SYSCTRL       	, 0x00 },
1129 	{ STB0899_STOPCLK1      	, 0x20 },
1130 	{ STB0899_STOPCLK2      	, 0x00 },
1131 	{ STB0899_INTBUFSTATUS		, 0x00 },
1132 	{ STB0899_INTBUFCTRL    	, 0x0a },
1133 	{ 0xffff			, 0xff },
1134 };
1135 
1136 static const struct stb0899_s1_reg tt3200_stb0899_s1_init_3[] = {
1137 	{ STB0899_DEMOD         	, 0x00 },
1138 	{ STB0899_RCOMPC        	, 0xc9 },
1139 	{ STB0899_AGC1CN        	, 0x41 },
1140 	{ STB0899_AGC1REF       	, 0x10 },
1141 	{ STB0899_RTC			, 0x7a },
1142 	{ STB0899_TMGCFG        	, 0x4e },
1143 	{ STB0899_AGC2REF       	, 0x34 },
1144 	{ STB0899_TLSR          	, 0x84 },
1145 	{ STB0899_CFD           	, 0xc7 },
1146 	{ STB0899_ACLC			, 0x87 },
1147 	{ STB0899_BCLC          	, 0x94 },
1148 	{ STB0899_EQON          	, 0x41 },
1149 	{ STB0899_LDT           	, 0xdd },
1150 	{ STB0899_LDT2          	, 0xc9 },
1151 	{ STB0899_EQUALREF      	, 0xb4 },
1152 	{ STB0899_TMGRAMP       	, 0x10 },
1153 	{ STB0899_TMGTHD        	, 0x30 },
1154 	{ STB0899_IDCCOMP		, 0xfb },
1155 	{ STB0899_QDCCOMP		, 0x03 },
1156 	{ STB0899_POWERI		, 0x3b },
1157 	{ STB0899_POWERQ		, 0x3d },
1158 	{ STB0899_RCOMP			, 0x81 },
1159 	{ STB0899_AGCIQIN		, 0x80 },
1160 	{ STB0899_AGC2I1		, 0x04 },
1161 	{ STB0899_AGC2I2		, 0xf5 },
1162 	{ STB0899_TLIR			, 0x25 },
1163 	{ STB0899_RTF			, 0x80 },
1164 	{ STB0899_DSTATUS		, 0x00 },
1165 	{ STB0899_LDI			, 0xca },
1166 	{ STB0899_CFRM			, 0xf1 },
1167 	{ STB0899_CFRL			, 0xf3 },
1168 	{ STB0899_NIRM			, 0x2a },
1169 	{ STB0899_NIRL			, 0x05 },
1170 	{ STB0899_ISYMB			, 0x17 },
1171 	{ STB0899_QSYMB			, 0xfa },
1172 	{ STB0899_SFRH          	, 0x2f },
1173 	{ STB0899_SFRM          	, 0x68 },
1174 	{ STB0899_SFRL          	, 0x40 },
1175 	{ STB0899_SFRUPH        	, 0x2f },
1176 	{ STB0899_SFRUPM        	, 0x68 },
1177 	{ STB0899_SFRUPL        	, 0x40 },
1178 	{ STB0899_EQUAI1		, 0xfd },
1179 	{ STB0899_EQUAQ1		, 0x04 },
1180 	{ STB0899_EQUAI2		, 0x0f },
1181 	{ STB0899_EQUAQ2		, 0xff },
1182 	{ STB0899_EQUAI3		, 0xdf },
1183 	{ STB0899_EQUAQ3		, 0xfa },
1184 	{ STB0899_EQUAI4		, 0x37 },
1185 	{ STB0899_EQUAQ4		, 0x0d },
1186 	{ STB0899_EQUAI5		, 0xbd },
1187 	{ STB0899_EQUAQ5		, 0xf7 },
1188 	{ STB0899_DSTATUS2		, 0x00 },
1189 	{ STB0899_VSTATUS       	, 0x00 },
1190 	{ STB0899_VERROR		, 0xff },
1191 	{ STB0899_IQSWAP		, 0x2a },
1192 	{ STB0899_ECNT1M		, 0x00 },
1193 	{ STB0899_ECNT1L		, 0x00 },
1194 	{ STB0899_ECNT2M		, 0x00 },
1195 	{ STB0899_ECNT2L		, 0x00 },
1196 	{ STB0899_ECNT3M		, 0x00 },
1197 	{ STB0899_ECNT3L		, 0x00 },
1198 	{ STB0899_FECAUTO1      	, 0x06 },
1199 	{ STB0899_FECM			, 0x01 },
1200 	{ STB0899_VTH12         	, 0xf0 },
1201 	{ STB0899_VTH23         	, 0xa0 },
1202 	{ STB0899_VTH34			, 0x78 },
1203 	{ STB0899_VTH56         	, 0x4e },
1204 	{ STB0899_VTH67         	, 0x48 },
1205 	{ STB0899_VTH78         	, 0x38 },
1206 	{ STB0899_PRVIT         	, 0xff },
1207 	{ STB0899_VITSYNC       	, 0x19 },
1208 	{ STB0899_RSULC         	, 0xb1 }, /* DVB = 0xb1, DSS = 0xa1 */
1209 	{ STB0899_TSULC         	, 0x42 },
1210 	{ STB0899_RSLLC         	, 0x40 },
1211 	{ STB0899_TSLPL			, 0x12 },
1212 	{ STB0899_TSCFGH        	, 0x0c },
1213 	{ STB0899_TSCFGM        	, 0x00 },
1214 	{ STB0899_TSCFGL        	, 0x0c },
1215 	{ STB0899_TSOUT			, 0x4d }, /* 0x0d for CAM */
1216 	{ STB0899_RSSYNCDEL     	, 0x00 },
1217 	{ STB0899_TSINHDELH     	, 0x02 },
1218 	{ STB0899_TSINHDELM		, 0x00 },
1219 	{ STB0899_TSINHDELL		, 0x00 },
1220 	{ STB0899_TSLLSTKM		, 0x00 },
1221 	{ STB0899_TSLLSTKL		, 0x00 },
1222 	{ STB0899_TSULSTKM		, 0x00 },
1223 	{ STB0899_TSULSTKL		, 0xab },
1224 	{ STB0899_PCKLENUL		, 0x00 },
1225 	{ STB0899_PCKLENLL		, 0xcc },
1226 	{ STB0899_RSPCKLEN		, 0xcc },
1227 	{ STB0899_TSSTATUS		, 0x80 },
1228 	{ STB0899_ERRCTRL1      	, 0xb6 },
1229 	{ STB0899_ERRCTRL2      	, 0x96 },
1230 	{ STB0899_ERRCTRL3      	, 0x89 },
1231 	{ STB0899_DMONMSK1		, 0x27 },
1232 	{ STB0899_DMONMSK0		, 0x03 },
1233 	{ STB0899_DEMAPVIT      	, 0x5c },
1234 	{ STB0899_PLPARM		, 0x1f },
1235 	{ STB0899_PDELCTRL      	, 0x48 },
1236 	{ STB0899_PDELCTRL2     	, 0x00 },
1237 	{ STB0899_BBHCTRL1      	, 0x00 },
1238 	{ STB0899_BBHCTRL2      	, 0x00 },
1239 	{ STB0899_HYSTTHRESH    	, 0x77 },
1240 	{ STB0899_MATCSTM		, 0x00 },
1241 	{ STB0899_MATCSTL		, 0x00 },
1242 	{ STB0899_UPLCSTM		, 0x00 },
1243 	{ STB0899_UPLCSTL		, 0x00 },
1244 	{ STB0899_DFLCSTM		, 0x00 },
1245 	{ STB0899_DFLCSTL		, 0x00 },
1246 	{ STB0899_SYNCCST		, 0x00 },
1247 	{ STB0899_SYNCDCSTM		, 0x00 },
1248 	{ STB0899_SYNCDCSTL		, 0x00 },
1249 	{ STB0899_ISI_ENTRY		, 0x00 },
1250 	{ STB0899_ISI_BIT_EN		, 0x00 },
1251 	{ STB0899_MATSTRM		, 0x00 },
1252 	{ STB0899_MATSTRL		, 0x00 },
1253 	{ STB0899_UPLSTRM		, 0x00 },
1254 	{ STB0899_UPLSTRL		, 0x00 },
1255 	{ STB0899_DFLSTRM		, 0x00 },
1256 	{ STB0899_DFLSTRL		, 0x00 },
1257 	{ STB0899_SYNCSTR		, 0x00 },
1258 	{ STB0899_SYNCDSTRM		, 0x00 },
1259 	{ STB0899_SYNCDSTRL		, 0x00 },
1260 	{ STB0899_CFGPDELSTATUS1	, 0x10 },
1261 	{ STB0899_CFGPDELSTATUS2	, 0x00 },
1262 	{ STB0899_BBFERRORM		, 0x00 },
1263 	{ STB0899_BBFERRORL		, 0x00 },
1264 	{ STB0899_UPKTERRORM		, 0x00 },
1265 	{ STB0899_UPKTERRORL		, 0x00 },
1266 	{ 0xffff			, 0xff },
1267 };
1268 
1269 static struct stb0899_config tt3200_config = {
1270 	.init_dev		= tt3200_stb0899_s1_init_1,
1271 	.init_s2_demod		= stb0899_s2_init_2,
1272 	.init_s1_demod		= tt3200_stb0899_s1_init_3,
1273 	.init_s2_fec		= stb0899_s2_init_4,
1274 	.init_tst		= stb0899_s1_init_5,
1275 
1276 	.postproc		= NULL,
1277 
1278 	.demod_address 		= 0x68,
1279 
1280 	.xtal_freq		= 27000000,
1281 	.inversion		= IQ_SWAP_ON,
1282 
1283 	.lo_clk			= 76500000,
1284 	.hi_clk			= 99000000,
1285 
1286 	.esno_ave		= STB0899_DVBS2_ESNO_AVE,
1287 	.esno_quant		= STB0899_DVBS2_ESNO_QUANT,
1288 	.avframes_coarse	= STB0899_DVBS2_AVFRAMES_COARSE,
1289 	.avframes_fine		= STB0899_DVBS2_AVFRAMES_FINE,
1290 	.miss_threshold		= STB0899_DVBS2_MISS_THRESHOLD,
1291 	.uwp_threshold_acq	= STB0899_DVBS2_UWP_THRESHOLD_ACQ,
1292 	.uwp_threshold_track	= STB0899_DVBS2_UWP_THRESHOLD_TRACK,
1293 	.uwp_threshold_sof	= STB0899_DVBS2_UWP_THRESHOLD_SOF,
1294 	.sof_search_timeout	= STB0899_DVBS2_SOF_SEARCH_TIMEOUT,
1295 
1296 	.btr_nco_bits		= STB0899_DVBS2_BTR_NCO_BITS,
1297 	.btr_gain_shift_offset	= STB0899_DVBS2_BTR_GAIN_SHIFT_OFFSET,
1298 	.crl_nco_bits		= STB0899_DVBS2_CRL_NCO_BITS,
1299 	.ldpc_max_iter		= STB0899_DVBS2_LDPC_MAX_ITER,
1300 
1301 	.tuner_get_frequency	= stb6100_get_frequency,
1302 	.tuner_set_frequency	= stb6100_set_frequency,
1303 	.tuner_set_bandwidth	= stb6100_set_bandwidth,
1304 	.tuner_get_bandwidth	= stb6100_get_bandwidth,
1305 	.tuner_set_rfsiggain	= NULL
1306 };
1307 
1308 static struct stb6100_config tt3200_stb6100_config = {
1309 	.tuner_address	= 0x60,
1310 	.refclock	= 27000000,
1311 };
1312 
1313 static void frontend_init(struct budget_ci *budget_ci)
1314 {
1315 	switch (budget_ci->budget.dev->pci->subsystem_device) {
1316 	case 0x100c:		// Hauppauge/TT Nova-CI budget (stv0299/ALPS BSRU6(tsa5059))
1317 		budget_ci->budget.dvb_frontend =
1318 			dvb_attach(stv0299_attach, &alps_bsru6_config, &budget_ci->budget.i2c_adap);
1319 		if (budget_ci->budget.dvb_frontend) {
1320 			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
1321 			budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap;
1322 			break;
1323 		}
1324 		break;
1325 
1326 	case 0x100f:		// Hauppauge/TT Nova-CI budget (stv0299b/Philips su1278(tsa5059))
1327 		budget_ci->budget.dvb_frontend =
1328 			dvb_attach(stv0299_attach, &philips_su1278_tt_config, &budget_ci->budget.i2c_adap);
1329 		if (budget_ci->budget.dvb_frontend) {
1330 			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_su1278_tt_tuner_set_params;
1331 			break;
1332 		}
1333 		break;
1334 
1335 	case 0x1010:		// TT DVB-C CI budget (stv0297/Philips tdm1316l(tda6651tt))
1336 		budget_ci->tuner_pll_address = 0x61;
1337 		budget_ci->budget.dvb_frontend =
1338 			dvb_attach(stv0297_attach, &dvbc_philips_tdm1316l_config, &budget_ci->budget.i2c_adap);
1339 		if (budget_ci->budget.dvb_frontend) {
1340 			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = dvbc_philips_tdm1316l_tuner_set_params;
1341 			break;
1342 		}
1343 		break;
1344 
1345 	case 0x1011:		// Hauppauge/TT Nova-T budget (tda10045/Philips tdm1316l(tda6651tt) + TDA9889)
1346 		budget_ci->tuner_pll_address = 0x63;
1347 		budget_ci->budget.dvb_frontend =
1348 			dvb_attach(tda10045_attach, &philips_tdm1316l_config, &budget_ci->budget.i2c_adap);
1349 		if (budget_ci->budget.dvb_frontend) {
1350 			budget_ci->budget.dvb_frontend->ops.tuner_ops.init = philips_tdm1316l_tuner_init;
1351 			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params;
1352 			break;
1353 		}
1354 		break;
1355 
1356 	case 0x1012:		// TT DVB-T CI budget (tda10046/Philips tdm1316l(tda6651tt))
1357 		budget_ci->tuner_pll_address = 0x60;
1358 		budget_ci->budget.dvb_frontend =
1359 			dvb_attach(tda10046_attach, &philips_tdm1316l_config_invert, &budget_ci->budget.i2c_adap);
1360 		if (budget_ci->budget.dvb_frontend) {
1361 			budget_ci->budget.dvb_frontend->ops.tuner_ops.init = philips_tdm1316l_tuner_init;
1362 			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params;
1363 			break;
1364 		}
1365 		break;
1366 
1367 	case 0x1017:		// TT S-1500 PCI
1368 		budget_ci->budget.dvb_frontend = dvb_attach(stv0299_attach, &alps_bsbe1_config, &budget_ci->budget.i2c_adap);
1369 		if (budget_ci->budget.dvb_frontend) {
1370 			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params;
1371 			budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap;
1372 
1373 			budget_ci->budget.dvb_frontend->ops.dishnetwork_send_legacy_command = NULL;
1374 			if (dvb_attach(lnbp21_attach, budget_ci->budget.dvb_frontend, &budget_ci->budget.i2c_adap, LNBP21_LLC, 0) == NULL) {
1375 				printk("%s: No LNBP21 found!\n", __func__);
1376 				dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1377 				budget_ci->budget.dvb_frontend = NULL;
1378 			}
1379 		}
1380 		break;
1381 
1382 	case 0x101a: /* TT Budget-C-1501 (philips tda10023/philips tda8274A) */
1383 		budget_ci->budget.dvb_frontend = dvb_attach(tda10023_attach, &tda10023_config, &budget_ci->budget.i2c_adap, 0x48);
1384 		if (budget_ci->budget.dvb_frontend) {
1385 			if (dvb_attach(tda827x_attach, budget_ci->budget.dvb_frontend, 0x61, &budget_ci->budget.i2c_adap, &tda827x_config) == NULL) {
1386 				printk(KERN_ERR "%s: No tda827x found!\n", __func__);
1387 				dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1388 				budget_ci->budget.dvb_frontend = NULL;
1389 			}
1390 		}
1391 		break;
1392 
1393 	case 0x101b: /* TT S-1500B (BSBE1-D01A - STV0288/STB6000/LNBP21) */
1394 		budget_ci->budget.dvb_frontend = dvb_attach(stv0288_attach, &stv0288_bsbe1_d01a_config, &budget_ci->budget.i2c_adap);
1395 		if (budget_ci->budget.dvb_frontend) {
1396 			if (dvb_attach(stb6000_attach, budget_ci->budget.dvb_frontend, 0x63, &budget_ci->budget.i2c_adap)) {
1397 				if (!dvb_attach(lnbp21_attach, budget_ci->budget.dvb_frontend, &budget_ci->budget.i2c_adap, 0, 0)) {
1398 					printk(KERN_ERR "%s: No LNBP21 found!\n", __func__);
1399 					dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1400 					budget_ci->budget.dvb_frontend = NULL;
1401 				}
1402 			} else {
1403 				printk(KERN_ERR "%s: No STB6000 found!\n", __func__);
1404 				dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1405 				budget_ci->budget.dvb_frontend = NULL;
1406 			}
1407 		}
1408 		break;
1409 
1410 	case 0x1019:		// TT S2-3200 PCI
1411 		/*
1412 		 * NOTE! on some STB0899 versions, the internal PLL takes a longer time
1413 		 * to settle, aka LOCK. On the older revisions of the chip, we don't see
1414 		 * this, as a result on the newer chips the entire clock tree, will not
1415 		 * be stable after a freshly POWER 'ed up situation.
1416 		 * In this case, we should RESET the STB0899 (Active LOW) and wait for
1417 		 * PLL stabilization.
1418 		 *
1419 		 * On the TT S2 3200 and clones, the STB0899 demodulator's RESETB is
1420 		 * connected to the SAA7146 GPIO, GPIO2, Pin 142
1421 		 */
1422 		/* Reset Demodulator */
1423 		saa7146_setgpio(budget_ci->budget.dev, 2, SAA7146_GPIO_OUTLO);
1424 		/* Wait for everything to die */
1425 		msleep(50);
1426 		/* Pull it up out of Reset state */
1427 		saa7146_setgpio(budget_ci->budget.dev, 2, SAA7146_GPIO_OUTHI);
1428 		/* Wait for PLL to stabilize */
1429 		msleep(250);
1430 		/*
1431 		 * PLL state should be stable now. Ideally, we should check
1432 		 * for PLL LOCK status. But well, never mind!
1433 		 */
1434 		budget_ci->budget.dvb_frontend = dvb_attach(stb0899_attach, &tt3200_config, &budget_ci->budget.i2c_adap);
1435 		if (budget_ci->budget.dvb_frontend) {
1436 			if (dvb_attach(stb6100_attach, budget_ci->budget.dvb_frontend, &tt3200_stb6100_config, &budget_ci->budget.i2c_adap)) {
1437 				if (!dvb_attach(lnbp21_attach, budget_ci->budget.dvb_frontend, &budget_ci->budget.i2c_adap, 0, 0)) {
1438 					printk("%s: No LNBP21 found!\n", __func__);
1439 					dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1440 					budget_ci->budget.dvb_frontend = NULL;
1441 				}
1442 			} else {
1443 					dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1444 					budget_ci->budget.dvb_frontend = NULL;
1445 			}
1446 		}
1447 		break;
1448 
1449 	}
1450 
1451 	if (budget_ci->budget.dvb_frontend == NULL) {
1452 		printk("budget-ci: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
1453 		       budget_ci->budget.dev->pci->vendor,
1454 		       budget_ci->budget.dev->pci->device,
1455 		       budget_ci->budget.dev->pci->subsystem_vendor,
1456 		       budget_ci->budget.dev->pci->subsystem_device);
1457 	} else {
1458 		if (dvb_register_frontend
1459 		    (&budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) {
1460 			printk("budget-ci: Frontend registration failed!\n");
1461 			dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1462 			budget_ci->budget.dvb_frontend = NULL;
1463 		}
1464 	}
1465 }
1466 
1467 static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
1468 {
1469 	struct budget_ci *budget_ci;
1470 	int err;
1471 
1472 	budget_ci = kzalloc(sizeof(struct budget_ci), GFP_KERNEL);
1473 	if (!budget_ci) {
1474 		err = -ENOMEM;
1475 		goto out1;
1476 	}
1477 
1478 	dprintk(2, "budget_ci: %p\n", budget_ci);
1479 
1480 	dev->ext_priv = budget_ci;
1481 
1482 	err = ttpci_budget_init(&budget_ci->budget, dev, info, THIS_MODULE,
1483 				adapter_nr);
1484 	if (err)
1485 		goto out2;
1486 
1487 	err = msp430_ir_init(budget_ci);
1488 	if (err)
1489 		goto out3;
1490 
1491 	ciintf_init(budget_ci);
1492 
1493 	budget_ci->budget.dvb_adapter.priv = budget_ci;
1494 	frontend_init(budget_ci);
1495 
1496 	ttpci_budget_init_hooks(&budget_ci->budget);
1497 
1498 	return 0;
1499 
1500 out3:
1501 	ttpci_budget_deinit(&budget_ci->budget);
1502 out2:
1503 	kfree(budget_ci);
1504 out1:
1505 	return err;
1506 }
1507 
1508 static int budget_ci_detach(struct saa7146_dev *dev)
1509 {
1510 	struct budget_ci *budget_ci = (struct budget_ci *) dev->ext_priv;
1511 	struct saa7146_dev *saa = budget_ci->budget.dev;
1512 	int err;
1513 
1514 	if (budget_ci->budget.ci_present)
1515 		ciintf_deinit(budget_ci);
1516 	msp430_ir_deinit(budget_ci);
1517 	if (budget_ci->budget.dvb_frontend) {
1518 		dvb_unregister_frontend(budget_ci->budget.dvb_frontend);
1519 		dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1520 	}
1521 	err = ttpci_budget_deinit(&budget_ci->budget);
1522 
1523 	// disable frontend and CI interface
1524 	saa7146_setgpio(saa, 2, SAA7146_GPIO_INPUT);
1525 
1526 	kfree(budget_ci);
1527 
1528 	return err;
1529 }
1530 
1531 static struct saa7146_extension budget_extension;
1532 
1533 MAKE_BUDGET_INFO(ttbs2, "TT-Budget/S-1500 PCI", BUDGET_TT);
1534 MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC);
1535 MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T	 PCI", BUDGET_TT);
1536 MAKE_BUDGET_INFO(ttbtci, "TT-Budget-T-CI PCI", BUDGET_TT);
1537 MAKE_BUDGET_INFO(ttbcci, "TT-Budget-C-CI PCI", BUDGET_TT);
1538 MAKE_BUDGET_INFO(ttc1501, "TT-Budget C-1501 PCI", BUDGET_TT);
1539 MAKE_BUDGET_INFO(tt3200, "TT-Budget S2-3200 PCI", BUDGET_TT);
1540 MAKE_BUDGET_INFO(ttbs1500b, "TT-Budget S-1500B PCI", BUDGET_TT);
1541 
1542 static const struct pci_device_id pci_tbl[] = {
1543 	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c),
1544 	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f),
1545 	MAKE_EXTENSION_PCI(ttbcci, 0x13c2, 0x1010),
1546 	MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011),
1547 	MAKE_EXTENSION_PCI(ttbtci, 0x13c2, 0x1012),
1548 	MAKE_EXTENSION_PCI(ttbs2, 0x13c2, 0x1017),
1549 	MAKE_EXTENSION_PCI(ttc1501, 0x13c2, 0x101a),
1550 	MAKE_EXTENSION_PCI(tt3200, 0x13c2, 0x1019),
1551 	MAKE_EXTENSION_PCI(ttbs1500b, 0x13c2, 0x101b),
1552 	{
1553 	 .vendor = 0,
1554 	 }
1555 };
1556 
1557 MODULE_DEVICE_TABLE(pci, pci_tbl);
1558 
1559 static struct saa7146_extension budget_extension = {
1560 	.name = "budget_ci dvb",
1561 	.flags = SAA7146_USE_I2C_IRQ,
1562 
1563 	.module = THIS_MODULE,
1564 	.pci_tbl = &pci_tbl[0],
1565 	.attach = budget_ci_attach,
1566 	.detach = budget_ci_detach,
1567 
1568 	.irq_mask = MASK_03 | MASK_06 | MASK_10,
1569 	.irq_func = budget_ci_irq,
1570 };
1571 
1572 static int __init budget_ci_init(void)
1573 {
1574 	return saa7146_register_extension(&budget_extension);
1575 }
1576 
1577 static void __exit budget_ci_exit(void)
1578 {
1579 	saa7146_unregister_extension(&budget_extension);
1580 }
1581 
1582 module_init(budget_ci_init);
1583 module_exit(budget_ci_exit);
1584 
1585 MODULE_LICENSE("GPL");
1586 MODULE_AUTHOR("Michael Hunold, Jack Thomasson, Andrew de Quincey, others");
1587 MODULE_DESCRIPTION("driver for the SAA7146 based so-called budget PCI DVB cards w/ CI-module produced by Siemens, Technotrend, Hauppauge");
1588