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 *
23 * You should have received a copy of the GNU General Public License
24 * along with this program; if not, write to the Free Software
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 * Or, point your browser to http://www.gnu.org/copyleft/gpl.html
27 *
28 *
29 * the project's page is at http://www.linuxtv.org/dvb/
30 */
31
32#include <linux/module.h>
33#include <linux/errno.h>
34#include <linux/slab.h>
35#include <linux/interrupt.h>
36#include <linux/input.h>
37#include <linux/spinlock.h>
38#include <media/ir-common.h>
39
40#include "budget.h"
41
42#include "dvb_ca_en50221.h"
43#include "stv0299.h"
44#include "stv0297.h"
45#include "tda1004x.h"
46#include "lnbp21.h"
47#include "bsbe1.h"
48#include "bsru6.h"
49
50/*
51 * Regarding DEBIADDR_IR:
52 * Some CI modules hang if random addresses are read.
53 * Using address 0x4000 for the IR read means that we
54 * use the same address as for CI version, which should
55 * be a safe default.
56 */
57#define DEBIADDR_IR		0x4000
58#define DEBIADDR_CICONTROL	0x0000
59#define DEBIADDR_CIVERSION	0x4000
60#define DEBIADDR_IO		0x1000
61#define DEBIADDR_ATTR		0x3000
62
63#define CICONTROL_RESET		0x01
64#define CICONTROL_ENABLETS	0x02
65#define CICONTROL_CAMDETECT	0x08
66
67#define DEBICICTL		0x00420000
68#define DEBICICAM		0x02420000
69
70#define SLOTSTATUS_NONE		1
71#define SLOTSTATUS_PRESENT	2
72#define SLOTSTATUS_RESET	4
73#define SLOTSTATUS_READY	8
74#define SLOTSTATUS_OCCUPIED	(SLOTSTATUS_PRESENT|SLOTSTATUS_RESET|SLOTSTATUS_READY)
75
76/*
77 * Milliseconds during which a key is regarded as pressed.
78 * If an identical command arrives within this time, the timer will start over.
79 */
80#define IR_KEYPRESS_TIMEOUT	250
81
82/* RC5 device wildcard */
83#define IR_DEVICE_ANY		255
84
85static int rc5_device = -1;
86module_param(rc5_device, int, 0644);
87MODULE_PARM_DESC(rc5_device, "only IR commands to given RC5 device (device = 0 - 31, any device = 255, default: autodetect)");
88
89static int ir_debug = 0;
90module_param(ir_debug, int, 0644);
91MODULE_PARM_DESC(ir_debug, "enable debugging information for IR decoding");
92
93struct budget_ci_ir {
94	struct input_dev *dev;
95	struct tasklet_struct msp430_irq_tasklet;
96	struct timer_list timer_keyup;
97	char name[72]; /* 40 + 32 for (struct saa7146_dev).name */
98	char phys[32];
99	struct ir_input_state state;
100	int rc5_device;
101	u32 last_raw;
102	u32 ir_key;
103	bool have_command;
104};
105
106struct 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
116static void msp430_ir_keyup(unsigned long data)
117{
118	struct budget_ci_ir *ir = (struct budget_ci_ir *) data;
119	ir_input_nokey(ir->dev, &ir->state);
120}
121
122static void msp430_ir_interrupt(unsigned long data)
123{
124	struct budget_ci *budget_ci = (struct budget_ci *) data;
125	struct input_dev *dev = budget_ci->ir.dev;
126	u32 command = ttpci_budget_debiread(&budget_ci->budget, DEBINOSWAP, DEBIADDR_IR, 2, 1, 0) >> 8;
127	u32 raw;
128
129	/*
130	 * The msp430 chip can generate two different bytes, command and device
131	 *
132	 * type1: X1CCCCCC, C = command bits (0 - 63)
133	 * type2: X0TDDDDD, D = device bits (0 - 31), T = RC5 toggle bit
134	 *
135	 * Each signal from the remote control can generate one or more command
136	 * bytes and one or more device bytes. For the repeated bytes, the
137	 * highest bit (X) is set. The first command byte is always generated
138	 * before the first device byte. Other than that, no specific order
139	 * seems to apply. To make life interesting, bytes can also be lost.
140	 *
141	 * Only when we have a command and device byte, a keypress is
142	 * generated.
143	 */
144
145	if (ir_debug)
146		printk("budget_ci: received byte 0x%02x\n", command);
147
148	/* Remove repeat bit, we use every command */
149	command = command & 0x7f;
150
151	/* Is this a RC5 command byte? */
152	if (command & 0x40) {
153		budget_ci->ir.have_command = true;
154		budget_ci->ir.ir_key = command & 0x3f;
155		return;
156	}
157
158	/* It's a RC5 device byte */
159	if (!budget_ci->ir.have_command)
160		return;
161	budget_ci->ir.have_command = false;
162
163	if (budget_ci->ir.rc5_device != IR_DEVICE_ANY &&
164	    budget_ci->ir.rc5_device != (command & 0x1f))
165		return;
166
167	/* Is this a repeated key sequence? (same device, command, toggle) */
168	raw = budget_ci->ir.ir_key | (command << 8);
169	if (budget_ci->ir.last_raw != raw || !timer_pending(&budget_ci->ir.timer_keyup)) {
170		ir_input_nokey(dev, &budget_ci->ir.state);
171		ir_input_keydown(dev, &budget_ci->ir.state,
172				 budget_ci->ir.ir_key, raw);
173		budget_ci->ir.last_raw = raw;
174	}
175
176	mod_timer(&budget_ci->ir.timer_keyup, jiffies + msecs_to_jiffies(IR_KEYPRESS_TIMEOUT));
177}
178
179static int msp430_ir_init(struct budget_ci *budget_ci)
180{
181	struct saa7146_dev *saa = budget_ci->budget.dev;
182	struct input_dev *input_dev = budget_ci->ir.dev;
183	int error;
184
185	budget_ci->ir.dev = input_dev = input_allocate_device();
186	if (!input_dev) {
187		printk(KERN_ERR "budget_ci: IR interface initialisation failed\n");
188		error = -ENOMEM;
189		goto out1;
190	}
191
192	snprintf(budget_ci->ir.name, sizeof(budget_ci->ir.name),
193		 "Budget-CI dvb ir receiver %s", saa->name);
194	snprintf(budget_ci->ir.phys, sizeof(budget_ci->ir.phys),
195		 "pci-%s/ir0", pci_name(saa->pci));
196
197	input_dev->name = budget_ci->ir.name;
198
199	input_dev->phys = budget_ci->ir.phys;
200	input_dev->id.bustype = BUS_PCI;
201	input_dev->id.version = 1;
202	if (saa->pci->subsystem_vendor) {
203		input_dev->id.vendor = saa->pci->subsystem_vendor;
204		input_dev->id.product = saa->pci->subsystem_device;
205	} else {
206		input_dev->id.vendor = saa->pci->vendor;
207		input_dev->id.product = saa->pci->device;
208	}
209	input_dev->cdev.dev = &saa->pci->dev;
210
211	/* Select keymap and address */
212	switch (budget_ci->budget.dev->pci->subsystem_device) {
213	case 0x100c:
214	case 0x100f:
215	case 0x1011:
216	case 0x1012:
217	case 0x1017:
218		/* The hauppauge keymap is a superset of these remotes */
219		ir_input_init(input_dev, &budget_ci->ir.state,
220			      IR_TYPE_RC5, ir_codes_hauppauge_new);
221
222		if (rc5_device < 0)
223			budget_ci->ir.rc5_device = 0x1f;
224		else
225			budget_ci->ir.rc5_device = rc5_device;
226		break;
227	case 0x1010:
228		/* for the Technotrend 1500 bundled remote */
229		ir_input_init(input_dev, &budget_ci->ir.state,
230			      IR_TYPE_RC5, ir_codes_tt_1500);
231
232		if (rc5_device < 0)
233			budget_ci->ir.rc5_device = IR_DEVICE_ANY;
234		else
235			budget_ci->ir.rc5_device = rc5_device;
236		break;
237	default:
238		/* unknown remote */
239		ir_input_init(input_dev, &budget_ci->ir.state,
240			      IR_TYPE_RC5, ir_codes_budget_ci_old);
241
242		if (rc5_device < 0)
243			budget_ci->ir.rc5_device = IR_DEVICE_ANY;
244		else
245			budget_ci->ir.rc5_device = rc5_device;
246		break;
247	}
248
249	/* initialise the key-up timeout handler */
250	init_timer(&budget_ci->ir.timer_keyup);
251	budget_ci->ir.timer_keyup.function = msp430_ir_keyup;
252	budget_ci->ir.timer_keyup.data = (unsigned long) &budget_ci->ir;
253	budget_ci->ir.last_raw = 0xffff; /* An impossible value */
254	error = input_register_device(input_dev);
255	if (error) {
256		printk(KERN_ERR "budget_ci: could not init driver for IR device (code %d)\n", error);
257		goto out2;
258	}
259
260	/* note: these must be after input_register_device */
261	input_dev->rep[REP_DELAY] = 400;
262	input_dev->rep[REP_PERIOD] = 250;
263
264	tasklet_init(&budget_ci->ir.msp430_irq_tasklet, msp430_ir_interrupt,
265		     (unsigned long) budget_ci);
266
267	SAA7146_IER_ENABLE(saa, MASK_06);
268	saa7146_setgpio(saa, 3, SAA7146_GPIO_IRQHI);
269
270	return 0;
271
272out2:
273	input_free_device(input_dev);
274out1:
275	return error;
276}
277
278static void msp430_ir_deinit(struct budget_ci *budget_ci)
279{
280	struct saa7146_dev *saa = budget_ci->budget.dev;
281	struct input_dev *dev = budget_ci->ir.dev;
282
283	SAA7146_IER_DISABLE(saa, MASK_06);
284	saa7146_setgpio(saa, 3, SAA7146_GPIO_INPUT);
285	tasklet_kill(&budget_ci->ir.msp430_irq_tasklet);
286
287	del_timer_sync(&dev->timer);
288	ir_input_nokey(dev, &budget_ci->ir.state);
289
290	input_unregister_device(dev);
291}
292
293static int ciintf_read_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address)
294{
295	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
296
297	if (slot != 0)
298		return -EINVAL;
299
300	return ttpci_budget_debiread(&budget_ci->budget, DEBICICAM,
301				     DEBIADDR_ATTR | (address & 0xfff), 1, 1, 0);
302}
303
304static int ciintf_write_attribute_mem(struct dvb_ca_en50221 *ca, int slot, int address, u8 value)
305{
306	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
307
308	if (slot != 0)
309		return -EINVAL;
310
311	return ttpci_budget_debiwrite(&budget_ci->budget, DEBICICAM,
312				      DEBIADDR_ATTR | (address & 0xfff), 1, value, 1, 0);
313}
314
315static int ciintf_read_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 address)
316{
317	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
318
319	if (slot != 0)
320		return -EINVAL;
321
322	return ttpci_budget_debiread(&budget_ci->budget, DEBICICAM,
323				     DEBIADDR_IO | (address & 3), 1, 1, 0);
324}
325
326static int ciintf_write_cam_control(struct dvb_ca_en50221 *ca, int slot, u8 address, u8 value)
327{
328	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
329
330	if (slot != 0)
331		return -EINVAL;
332
333	return ttpci_budget_debiwrite(&budget_ci->budget, DEBICICAM,
334				      DEBIADDR_IO | (address & 3), 1, value, 1, 0);
335}
336
337static int ciintf_slot_reset(struct dvb_ca_en50221 *ca, int slot)
338{
339	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
340	struct saa7146_dev *saa = budget_ci->budget.dev;
341
342	if (slot != 0)
343		return -EINVAL;
344
345	if (budget_ci->ci_irq) {
346		// trigger on RISING edge during reset so we know when READY is re-asserted
347		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
348	}
349	budget_ci->slot_status = SLOTSTATUS_RESET;
350	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
351	msleep(1);
352	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
353			       CICONTROL_RESET, 1, 0);
354
355	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTHI);
356	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
357	return 0;
358}
359
360static int ciintf_slot_shutdown(struct dvb_ca_en50221 *ca, int slot)
361{
362	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
363	struct saa7146_dev *saa = budget_ci->budget.dev;
364
365	if (slot != 0)
366		return -EINVAL;
367
368	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTHI);
369	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTB);
370	return 0;
371}
372
373static int ciintf_slot_ts_enable(struct dvb_ca_en50221 *ca, int slot)
374{
375	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
376	struct saa7146_dev *saa = budget_ci->budget.dev;
377	int tmp;
378
379	if (slot != 0)
380		return -EINVAL;
381
382	saa7146_setgpio(saa, 1, SAA7146_GPIO_OUTLO);
383
384	tmp = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
385	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
386			       tmp | CICONTROL_ENABLETS, 1, 0);
387
388	ttpci_budget_set_video_port(saa, BUDGET_VIDEO_PORTA);
389	return 0;
390}
391
392static void ciintf_interrupt(unsigned long data)
393{
394	struct budget_ci *budget_ci = (struct budget_ci *) data;
395	struct saa7146_dev *saa = budget_ci->budget.dev;
396	unsigned int flags;
397
398	// ensure we don't get spurious IRQs during initialisation
399	if (!budget_ci->budget.ci_present)
400		return;
401
402	// read the CAM status
403	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
404	if (flags & CICONTROL_CAMDETECT) {
405
406		// GPIO should be set to trigger on falling edge if a CAM is present
407		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
408
409		if (budget_ci->slot_status & SLOTSTATUS_NONE) {
410			// CAM insertion IRQ
411			budget_ci->slot_status = SLOTSTATUS_PRESENT;
412			dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0,
413						     DVB_CA_EN50221_CAMCHANGE_INSERTED);
414
415		} else if (budget_ci->slot_status & SLOTSTATUS_RESET) {
416			// CAM ready (reset completed)
417			budget_ci->slot_status = SLOTSTATUS_READY;
418			dvb_ca_en50221_camready_irq(&budget_ci->ca, 0);
419
420		} else if (budget_ci->slot_status & SLOTSTATUS_READY) {
421			// FR/DA IRQ
422			dvb_ca_en50221_frda_irq(&budget_ci->ca, 0);
423		}
424	} else {
425
426		// trigger on rising edge if a CAM is not present - when a CAM is inserted, we
427		// only want to get the IRQ when it sets READY. If we trigger on the falling edge,
428		// the CAM might not actually be ready yet.
429		saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
430
431		// generate a CAM removal IRQ if we haven't already
432		if (budget_ci->slot_status & SLOTSTATUS_OCCUPIED) {
433			// CAM removal IRQ
434			budget_ci->slot_status = SLOTSTATUS_NONE;
435			dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0,
436						     DVB_CA_EN50221_CAMCHANGE_REMOVED);
437		}
438	}
439}
440
441static int ciintf_poll_slot_status(struct dvb_ca_en50221 *ca, int slot, int open)
442{
443	struct budget_ci *budget_ci = (struct budget_ci *) ca->data;
444	unsigned int flags;
445
446	// ensure we don't get spurious IRQs during initialisation
447	if (!budget_ci->budget.ci_present)
448		return -EINVAL;
449
450	// read the CAM status
451	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
452	if (flags & CICONTROL_CAMDETECT) {
453		// mark it as present if it wasn't before
454		if (budget_ci->slot_status & SLOTSTATUS_NONE) {
455			budget_ci->slot_status = SLOTSTATUS_PRESENT;
456		}
457
458		// during a RESET, we check if we can read from IO memory to see when CAM is ready
459		if (budget_ci->slot_status & SLOTSTATUS_RESET) {
460			if (ciintf_read_attribute_mem(ca, slot, 0) == 0x1d) {
461				budget_ci->slot_status = SLOTSTATUS_READY;
462			}
463		}
464	} else {
465		budget_ci->slot_status = SLOTSTATUS_NONE;
466	}
467
468	if (budget_ci->slot_status != SLOTSTATUS_NONE) {
469		if (budget_ci->slot_status & SLOTSTATUS_READY) {
470			return DVB_CA_EN50221_POLL_CAM_PRESENT | DVB_CA_EN50221_POLL_CAM_READY;
471		}
472		return DVB_CA_EN50221_POLL_CAM_PRESENT;
473	}
474
475	return 0;
476}
477
478static int ciintf_init(struct budget_ci *budget_ci)
479{
480	struct saa7146_dev *saa = budget_ci->budget.dev;
481	int flags;
482	int result;
483	int ci_version;
484	int ca_flags;
485
486	memset(&budget_ci->ca, 0, sizeof(struct dvb_ca_en50221));
487
488	// enable DEBI pins
489	saa7146_write(saa, MC1, MASK_27 | MASK_11);
490
491	// test if it is there
492	ci_version = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CIVERSION, 1, 1, 0);
493	if ((ci_version & 0xa0) != 0xa0) {
494		result = -ENODEV;
495		goto error;
496	}
497
498	// determine whether a CAM is present or not
499	flags = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
500	budget_ci->slot_status = SLOTSTATUS_NONE;
501	if (flags & CICONTROL_CAMDETECT)
502		budget_ci->slot_status = SLOTSTATUS_PRESENT;
503
504	// version 0xa2 of the CI firmware doesn't generate interrupts
505	if (ci_version == 0xa2) {
506		ca_flags = 0;
507		budget_ci->ci_irq = 0;
508	} else {
509		ca_flags = DVB_CA_EN50221_FLAG_IRQ_CAMCHANGE |
510				DVB_CA_EN50221_FLAG_IRQ_FR |
511				DVB_CA_EN50221_FLAG_IRQ_DA;
512		budget_ci->ci_irq = 1;
513	}
514
515	// register CI interface
516	budget_ci->ca.owner = THIS_MODULE;
517	budget_ci->ca.read_attribute_mem = ciintf_read_attribute_mem;
518	budget_ci->ca.write_attribute_mem = ciintf_write_attribute_mem;
519	budget_ci->ca.read_cam_control = ciintf_read_cam_control;
520	budget_ci->ca.write_cam_control = ciintf_write_cam_control;
521	budget_ci->ca.slot_reset = ciintf_slot_reset;
522	budget_ci->ca.slot_shutdown = ciintf_slot_shutdown;
523	budget_ci->ca.slot_ts_enable = ciintf_slot_ts_enable;
524	budget_ci->ca.poll_slot_status = ciintf_poll_slot_status;
525	budget_ci->ca.data = budget_ci;
526	if ((result = dvb_ca_en50221_init(&budget_ci->budget.dvb_adapter,
527					  &budget_ci->ca,
528					  ca_flags, 1)) != 0) {
529		printk("budget_ci: CI interface detected, but initialisation failed.\n");
530		goto error;
531	}
532
533	// Setup CI slot IRQ
534	if (budget_ci->ci_irq) {
535		tasklet_init(&budget_ci->ciintf_irq_tasklet, ciintf_interrupt, (unsigned long) budget_ci);
536		if (budget_ci->slot_status != SLOTSTATUS_NONE) {
537			saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQLO);
538		} else {
539			saa7146_setgpio(saa, 0, SAA7146_GPIO_IRQHI);
540		}
541		SAA7146_IER_ENABLE(saa, MASK_03);
542	}
543
544	// enable interface
545	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
546			       CICONTROL_RESET, 1, 0);
547
548	// success!
549	printk("budget_ci: CI interface initialised\n");
550	budget_ci->budget.ci_present = 1;
551
552	// forge a fake CI IRQ so the CAM state is setup correctly
553	if (budget_ci->ci_irq) {
554		flags = DVB_CA_EN50221_CAMCHANGE_REMOVED;
555		if (budget_ci->slot_status != SLOTSTATUS_NONE)
556			flags = DVB_CA_EN50221_CAMCHANGE_INSERTED;
557		dvb_ca_en50221_camchange_irq(&budget_ci->ca, 0, flags);
558	}
559
560	return 0;
561
562error:
563	saa7146_write(saa, MC1, MASK_27);
564	return result;
565}
566
567static void ciintf_deinit(struct budget_ci *budget_ci)
568{
569	struct saa7146_dev *saa = budget_ci->budget.dev;
570
571	// disable CI interrupts
572	if (budget_ci->ci_irq) {
573		SAA7146_IER_DISABLE(saa, MASK_03);
574		saa7146_setgpio(saa, 0, SAA7146_GPIO_INPUT);
575		tasklet_kill(&budget_ci->ciintf_irq_tasklet);
576	}
577
578	// reset interface
579	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 0, 1, 0);
580	msleep(1);
581	ttpci_budget_debiwrite(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1,
582			       CICONTROL_RESET, 1, 0);
583
584	// disable TS data stream to CI interface
585	saa7146_setgpio(saa, 1, SAA7146_GPIO_INPUT);
586
587	// release the CA device
588	dvb_ca_en50221_release(&budget_ci->ca);
589
590	// disable DEBI pins
591	saa7146_write(saa, MC1, MASK_27);
592}
593
594static void budget_ci_irq(struct saa7146_dev *dev, u32 * isr)
595{
596	struct budget_ci *budget_ci = (struct budget_ci *) dev->ext_priv;
597
598	dprintk(8, "dev: %p, budget_ci: %p\n", dev, budget_ci);
599
600	if (*isr & MASK_06)
601		tasklet_schedule(&budget_ci->ir.msp430_irq_tasklet);
602
603	if (*isr & MASK_10)
604		ttpci_budget_irq10_handler(dev, isr);
605
606	if ((*isr & MASK_03) && (budget_ci->budget.ci_present) && (budget_ci->ci_irq))
607		tasklet_schedule(&budget_ci->ciintf_irq_tasklet);
608}
609
610static u8 philips_su1278_tt_inittab[] = {
611	0x01, 0x0f,
612	0x02, 0x30,
613	0x03, 0x00,
614	0x04, 0x5b,
615	0x05, 0x85,
616	0x06, 0x02,
617	0x07, 0x00,
618	0x08, 0x02,
619	0x09, 0x00,
620	0x0C, 0x01,
621	0x0D, 0x81,
622	0x0E, 0x44,
623	0x0f, 0x14,
624	0x10, 0x3c,
625	0x11, 0x84,
626	0x12, 0xda,
627	0x13, 0x97,
628	0x14, 0x95,
629	0x15, 0xc9,
630	0x16, 0x19,
631	0x17, 0x8c,
632	0x18, 0x59,
633	0x19, 0xf8,
634	0x1a, 0xfe,
635	0x1c, 0x7f,
636	0x1d, 0x00,
637	0x1e, 0x00,
638	0x1f, 0x50,
639	0x20, 0x00,
640	0x21, 0x00,
641	0x22, 0x00,
642	0x23, 0x00,
643	0x28, 0x00,
644	0x29, 0x28,
645	0x2a, 0x14,
646	0x2b, 0x0f,
647	0x2c, 0x09,
648	0x2d, 0x09,
649	0x31, 0x1f,
650	0x32, 0x19,
651	0x33, 0xfc,
652	0x34, 0x93,
653	0xff, 0xff
654};
655
656static int philips_su1278_tt_set_symbol_rate(struct dvb_frontend *fe, u32 srate, u32 ratio)
657{
658	stv0299_writereg(fe, 0x0e, 0x44);
659	if (srate >= 10000000) {
660		stv0299_writereg(fe, 0x13, 0x97);
661		stv0299_writereg(fe, 0x14, 0x95);
662		stv0299_writereg(fe, 0x15, 0xc9);
663		stv0299_writereg(fe, 0x17, 0x8c);
664		stv0299_writereg(fe, 0x1a, 0xfe);
665		stv0299_writereg(fe, 0x1c, 0x7f);
666		stv0299_writereg(fe, 0x2d, 0x09);
667	} else {
668		stv0299_writereg(fe, 0x13, 0x99);
669		stv0299_writereg(fe, 0x14, 0x8d);
670		stv0299_writereg(fe, 0x15, 0xce);
671		stv0299_writereg(fe, 0x17, 0x43);
672		stv0299_writereg(fe, 0x1a, 0x1d);
673		stv0299_writereg(fe, 0x1c, 0x12);
674		stv0299_writereg(fe, 0x2d, 0x05);
675	}
676	stv0299_writereg(fe, 0x0e, 0x23);
677	stv0299_writereg(fe, 0x0f, 0x94);
678	stv0299_writereg(fe, 0x10, 0x39);
679	stv0299_writereg(fe, 0x15, 0xc9);
680
681	stv0299_writereg(fe, 0x1f, (ratio >> 16) & 0xff);
682	stv0299_writereg(fe, 0x20, (ratio >> 8) & 0xff);
683	stv0299_writereg(fe, 0x21, (ratio) & 0xf0);
684
685	return 0;
686}
687
688static int philips_su1278_tt_tuner_set_params(struct dvb_frontend *fe,
689					   struct dvb_frontend_parameters *params)
690{
691	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
692	u32 div;
693	u8 buf[4];
694	struct i2c_msg msg = {.addr = 0x60,.flags = 0,.buf = buf,.len = sizeof(buf) };
695
696	if ((params->frequency < 950000) || (params->frequency > 2150000))
697		return -EINVAL;
698
699	div = (params->frequency + (500 - 1)) / 500;	// round correctly
700	buf[0] = (div >> 8) & 0x7f;
701	buf[1] = div & 0xff;
702	buf[2] = 0x80 | ((div & 0x18000) >> 10) | 2;
703	buf[3] = 0x20;
704
705	if (params->u.qpsk.symbol_rate < 4000000)
706		buf[3] |= 1;
707
708	if (params->frequency < 1250000)
709		buf[3] |= 0;
710	else if (params->frequency < 1550000)
711		buf[3] |= 0x40;
712	else if (params->frequency < 2050000)
713		buf[3] |= 0x80;
714	else if (params->frequency < 2150000)
715		buf[3] |= 0xC0;
716
717	if (fe->ops.i2c_gate_ctrl)
718		fe->ops.i2c_gate_ctrl(fe, 1);
719	if (i2c_transfer(&budget_ci->budget.i2c_adap, &msg, 1) != 1)
720		return -EIO;
721	return 0;
722}
723
724static struct stv0299_config philips_su1278_tt_config = {
725
726	.demod_address = 0x68,
727	.inittab = philips_su1278_tt_inittab,
728	.mclk = 64000000UL,
729	.invert = 0,
730	.skip_reinit = 1,
731	.lock_output = STV0229_LOCKOUTPUT_1,
732	.volt13_op0_op1 = STV0299_VOLT13_OP1,
733	.min_delay_ms = 50,
734	.set_symbol_rate = philips_su1278_tt_set_symbol_rate,
735};
736
737
738
739static int philips_tdm1316l_tuner_init(struct dvb_frontend *fe)
740{
741	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
742	static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab };
743	static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 };
744	struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,.flags = 0,.buf = td1316_init,.len =
745			sizeof(td1316_init) };
746
747	// setup PLL configuration
748	if (fe->ops.i2c_gate_ctrl)
749		fe->ops.i2c_gate_ctrl(fe, 1);
750	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
751		return -EIO;
752	msleep(1);
753
754	// disable the mc44BC374c (do not check for errors)
755	tuner_msg.addr = 0x65;
756	tuner_msg.buf = disable_mc44BC374c;
757	tuner_msg.len = sizeof(disable_mc44BC374c);
758	if (fe->ops.i2c_gate_ctrl)
759		fe->ops.i2c_gate_ctrl(fe, 1);
760	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1) {
761		if (fe->ops.i2c_gate_ctrl)
762			fe->ops.i2c_gate_ctrl(fe, 1);
763		i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1);
764	}
765
766	return 0;
767}
768
769static int philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
770{
771	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
772	u8 tuner_buf[4];
773	struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,.flags = 0,.buf = tuner_buf,.len = sizeof(tuner_buf) };
774	int tuner_frequency = 0;
775	u8 band, cp, filter;
776
777	// determine charge pump
778	tuner_frequency = params->frequency + 36130000;
779	if (tuner_frequency < 87000000)
780		return -EINVAL;
781	else if (tuner_frequency < 130000000)
782		cp = 3;
783	else if (tuner_frequency < 160000000)
784		cp = 5;
785	else if (tuner_frequency < 200000000)
786		cp = 6;
787	else if (tuner_frequency < 290000000)
788		cp = 3;
789	else if (tuner_frequency < 420000000)
790		cp = 5;
791	else if (tuner_frequency < 480000000)
792		cp = 6;
793	else if (tuner_frequency < 620000000)
794		cp = 3;
795	else if (tuner_frequency < 830000000)
796		cp = 5;
797	else if (tuner_frequency < 895000000)
798		cp = 7;
799	else
800		return -EINVAL;
801
802	// determine band
803	if (params->frequency < 49000000)
804		return -EINVAL;
805	else if (params->frequency < 159000000)
806		band = 1;
807	else if (params->frequency < 444000000)
808		band = 2;
809	else if (params->frequency < 861000000)
810		band = 4;
811	else
812		return -EINVAL;
813
814	// setup PLL filter and TDA9889
815	switch (params->u.ofdm.bandwidth) {
816	case BANDWIDTH_6_MHZ:
817		tda1004x_writereg(fe, 0x0C, 0x14);
818		filter = 0;
819		break;
820
821	case BANDWIDTH_7_MHZ:
822		tda1004x_writereg(fe, 0x0C, 0x80);
823		filter = 0;
824		break;
825
826	case BANDWIDTH_8_MHZ:
827		tda1004x_writereg(fe, 0x0C, 0x14);
828		filter = 1;
829		break;
830
831	default:
832		return -EINVAL;
833	}
834
835	// calculate divisor
836	// ((36130000+((1000000/6)/2)) + Finput)/(1000000/6)
837	tuner_frequency = (((params->frequency / 1000) * 6) + 217280) / 1000;
838
839	// setup tuner buffer
840	tuner_buf[0] = tuner_frequency >> 8;
841	tuner_buf[1] = tuner_frequency & 0xff;
842	tuner_buf[2] = 0xca;
843	tuner_buf[3] = (cp << 5) | (filter << 3) | band;
844
845	if (fe->ops.i2c_gate_ctrl)
846		fe->ops.i2c_gate_ctrl(fe, 1);
847	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
848		return -EIO;
849
850	msleep(1);
851	return 0;
852}
853
854static int philips_tdm1316l_request_firmware(struct dvb_frontend *fe,
855					     const struct firmware **fw, char *name)
856{
857	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
858
859	return request_firmware(fw, name, &budget_ci->budget.dev->pci->dev);
860}
861
862static struct tda1004x_config philips_tdm1316l_config = {
863
864	.demod_address = 0x8,
865	.invert = 0,
866	.invert_oclk = 0,
867	.xtal_freq = TDA10046_XTAL_4M,
868	.agc_config = TDA10046_AGC_DEFAULT,
869	.if_freq = TDA10046_FREQ_3617,
870	.request_firmware = philips_tdm1316l_request_firmware,
871};
872
873static struct tda1004x_config philips_tdm1316l_config_invert = {
874
875	.demod_address = 0x8,
876	.invert = 1,
877	.invert_oclk = 0,
878	.xtal_freq = TDA10046_XTAL_4M,
879	.agc_config = TDA10046_AGC_DEFAULT,
880	.if_freq = TDA10046_FREQ_3617,
881	.request_firmware = philips_tdm1316l_request_firmware,
882};
883
884static int dvbc_philips_tdm1316l_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
885{
886	struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv;
887	u8 tuner_buf[5];
888	struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,
889				    .flags = 0,
890				    .buf = tuner_buf,
891				    .len = sizeof(tuner_buf) };
892	int tuner_frequency = 0;
893	u8 band, cp, filter;
894
895	// determine charge pump
896	tuner_frequency = params->frequency + 36125000;
897	if (tuner_frequency < 87000000)
898		return -EINVAL;
899	else if (tuner_frequency < 130000000) {
900		cp = 3;
901		band = 1;
902	} else if (tuner_frequency < 160000000) {
903		cp = 5;
904		band = 1;
905	} else if (tuner_frequency < 200000000) {
906		cp = 6;
907		band = 1;
908	} else if (tuner_frequency < 290000000) {
909		cp = 3;
910		band = 2;
911	} else if (tuner_frequency < 420000000) {
912		cp = 5;
913		band = 2;
914	} else if (tuner_frequency < 480000000) {
915		cp = 6;
916		band = 2;
917	} else if (tuner_frequency < 620000000) {
918		cp = 3;
919		band = 4;
920	} else if (tuner_frequency < 830000000) {
921		cp = 5;
922		band = 4;
923	} else if (tuner_frequency < 895000000) {
924		cp = 7;
925		band = 4;
926	} else
927		return -EINVAL;
928
929	// assume PLL filter should always be 8MHz for the moment.
930	filter = 1;
931
932	// calculate divisor
933	tuner_frequency = (params->frequency + 36125000 + (62500/2)) / 62500;
934
935	// setup tuner buffer
936	tuner_buf[0] = tuner_frequency >> 8;
937	tuner_buf[1] = tuner_frequency & 0xff;
938	tuner_buf[2] = 0xc8;
939	tuner_buf[3] = (cp << 5) | (filter << 3) | band;
940	tuner_buf[4] = 0x80;
941
942	if (fe->ops.i2c_gate_ctrl)
943		fe->ops.i2c_gate_ctrl(fe, 1);
944	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
945		return -EIO;
946
947	msleep(50);
948
949	if (fe->ops.i2c_gate_ctrl)
950		fe->ops.i2c_gate_ctrl(fe, 1);
951	if (i2c_transfer(&budget_ci->budget.i2c_adap, &tuner_msg, 1) != 1)
952		return -EIO;
953
954	msleep(1);
955
956	return 0;
957}
958
959static u8 dvbc_philips_tdm1316l_inittab[] = {
960	0x80, 0x01,
961	0x80, 0x00,
962	0x81, 0x01,
963	0x81, 0x00,
964	0x00, 0x09,
965	0x01, 0x69,
966	0x03, 0x00,
967	0x04, 0x00,
968	0x07, 0x00,
969	0x08, 0x00,
970	0x20, 0x00,
971	0x21, 0x40,
972	0x22, 0x00,
973	0x23, 0x00,
974	0x24, 0x40,
975	0x25, 0x88,
976	0x30, 0xff,
977	0x31, 0x00,
978	0x32, 0xff,
979	0x33, 0x00,
980	0x34, 0x50,
981	0x35, 0x7f,
982	0x36, 0x00,
983	0x37, 0x20,
984	0x38, 0x00,
985	0x40, 0x1c,
986	0x41, 0xff,
987	0x42, 0x29,
988	0x43, 0x20,
989	0x44, 0xff,
990	0x45, 0x00,
991	0x46, 0x00,
992	0x49, 0x04,
993	0x4a, 0x00,
994	0x4b, 0x7b,
995	0x52, 0x30,
996	0x55, 0xae,
997	0x56, 0x47,
998	0x57, 0xe1,
999	0x58, 0x3a,
1000	0x5a, 0x1e,
1001	0x5b, 0x34,
1002	0x60, 0x00,
1003	0x63, 0x00,
1004	0x64, 0x00,
1005	0x65, 0x00,
1006	0x66, 0x00,
1007	0x67, 0x00,
1008	0x68, 0x00,
1009	0x69, 0x00,
1010	0x6a, 0x02,
1011	0x6b, 0x00,
1012	0x70, 0xff,
1013	0x71, 0x00,
1014	0x72, 0x00,
1015	0x73, 0x00,
1016	0x74, 0x0c,
1017	0x80, 0x00,
1018	0x81, 0x00,
1019	0x82, 0x00,
1020	0x83, 0x00,
1021	0x84, 0x04,
1022	0x85, 0x80,
1023	0x86, 0x24,
1024	0x87, 0x78,
1025	0x88, 0x10,
1026	0x89, 0x00,
1027	0x90, 0x01,
1028	0x91, 0x01,
1029	0xa0, 0x04,
1030	0xa1, 0x00,
1031	0xa2, 0x00,
1032	0xb0, 0x91,
1033	0xb1, 0x0b,
1034	0xc0, 0x53,
1035	0xc1, 0x70,
1036	0xc2, 0x12,
1037	0xd0, 0x00,
1038	0xd1, 0x00,
1039	0xd2, 0x00,
1040	0xd3, 0x00,
1041	0xd4, 0x00,
1042	0xd5, 0x00,
1043	0xde, 0x00,
1044	0xdf, 0x00,
1045	0x61, 0x38,
1046	0x62, 0x0a,
1047	0x53, 0x13,
1048	0x59, 0x08,
1049	0xff, 0xff,
1050};
1051
1052static struct stv0297_config dvbc_philips_tdm1316l_config = {
1053	.demod_address = 0x1c,
1054	.inittab = dvbc_philips_tdm1316l_inittab,
1055	.invert = 0,
1056	.stop_during_read = 1,
1057};
1058
1059
1060
1061
1062static void frontend_init(struct budget_ci *budget_ci)
1063{
1064	switch (budget_ci->budget.dev->pci->subsystem_device) {
1065	case 0x100c:		// Hauppauge/TT Nova-CI budget (stv0299/ALPS BSRU6(tsa5059))
1066		budget_ci->budget.dvb_frontend =
1067			dvb_attach(stv0299_attach, &alps_bsru6_config, &budget_ci->budget.i2c_adap);
1068		if (budget_ci->budget.dvb_frontend) {
1069			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = alps_bsru6_tuner_set_params;
1070			budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap;
1071			break;
1072		}
1073		break;
1074
1075	case 0x100f:		// Hauppauge/TT Nova-CI budget (stv0299b/Philips su1278(tsa5059))
1076		budget_ci->budget.dvb_frontend =
1077			dvb_attach(stv0299_attach, &philips_su1278_tt_config, &budget_ci->budget.i2c_adap);
1078		if (budget_ci->budget.dvb_frontend) {
1079			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_su1278_tt_tuner_set_params;
1080			break;
1081		}
1082		break;
1083
1084	case 0x1010:		// TT DVB-C CI budget (stv0297/Philips tdm1316l(tda6651tt))
1085		budget_ci->tuner_pll_address = 0x61;
1086		budget_ci->budget.dvb_frontend =
1087			dvb_attach(stv0297_attach, &dvbc_philips_tdm1316l_config, &budget_ci->budget.i2c_adap);
1088		if (budget_ci->budget.dvb_frontend) {
1089			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = dvbc_philips_tdm1316l_tuner_set_params;
1090			break;
1091		}
1092		break;
1093
1094	case 0x1011:		// Hauppauge/TT Nova-T budget (tda10045/Philips tdm1316l(tda6651tt) + TDA9889)
1095		budget_ci->tuner_pll_address = 0x63;
1096		budget_ci->budget.dvb_frontend =
1097			dvb_attach(tda10045_attach, &philips_tdm1316l_config, &budget_ci->budget.i2c_adap);
1098		if (budget_ci->budget.dvb_frontend) {
1099			budget_ci->budget.dvb_frontend->ops.tuner_ops.init = philips_tdm1316l_tuner_init;
1100			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params;
1101			break;
1102		}
1103		break;
1104
1105	case 0x1012:		// TT DVB-T CI budget (tda10046/Philips tdm1316l(tda6651tt))
1106		budget_ci->tuner_pll_address = 0x60;
1107		budget_ci->budget.dvb_frontend =
1108			dvb_attach(tda10046_attach, &philips_tdm1316l_config_invert, &budget_ci->budget.i2c_adap);
1109		if (budget_ci->budget.dvb_frontend) {
1110			budget_ci->budget.dvb_frontend->ops.tuner_ops.init = philips_tdm1316l_tuner_init;
1111			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = philips_tdm1316l_tuner_set_params;
1112			break;
1113		}
1114		break;
1115
1116	case 0x1017:		// TT S-1500 PCI
1117		budget_ci->budget.dvb_frontend = dvb_attach(stv0299_attach, &alps_bsbe1_config, &budget_ci->budget.i2c_adap);
1118		if (budget_ci->budget.dvb_frontend) {
1119			budget_ci->budget.dvb_frontend->ops.tuner_ops.set_params = alps_bsbe1_tuner_set_params;
1120			budget_ci->budget.dvb_frontend->tuner_priv = &budget_ci->budget.i2c_adap;
1121
1122			budget_ci->budget.dvb_frontend->ops.dishnetwork_send_legacy_command = NULL;
1123			if (dvb_attach(lnbp21_attach, budget_ci->budget.dvb_frontend, &budget_ci->budget.i2c_adap, LNBP21_LLC, 0) == NULL) {
1124				printk("%s: No LNBP21 found!\n", __FUNCTION__);
1125				dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1126				budget_ci->budget.dvb_frontend = NULL;
1127			}
1128		}
1129
1130		break;
1131	}
1132
1133	if (budget_ci->budget.dvb_frontend == NULL) {
1134		printk("budget-ci: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n",
1135		       budget_ci->budget.dev->pci->vendor,
1136		       budget_ci->budget.dev->pci->device,
1137		       budget_ci->budget.dev->pci->subsystem_vendor,
1138		       budget_ci->budget.dev->pci->subsystem_device);
1139	} else {
1140		if (dvb_register_frontend
1141		    (&budget_ci->budget.dvb_adapter, budget_ci->budget.dvb_frontend)) {
1142			printk("budget-ci: Frontend registration failed!\n");
1143			dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1144			budget_ci->budget.dvb_frontend = NULL;
1145		}
1146	}
1147}
1148
1149static int budget_ci_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_data *info)
1150{
1151	struct budget_ci *budget_ci;
1152	int err;
1153
1154	budget_ci = kzalloc(sizeof(struct budget_ci), GFP_KERNEL);
1155	if (!budget_ci) {
1156		err = -ENOMEM;
1157		goto out1;
1158	}
1159
1160	dprintk(2, "budget_ci: %p\n", budget_ci);
1161
1162	dev->ext_priv = budget_ci;
1163
1164	err = ttpci_budget_init(&budget_ci->budget, dev, info, THIS_MODULE);
1165	if (err)
1166		goto out2;
1167
1168	err = msp430_ir_init(budget_ci);
1169	if (err)
1170		goto out3;
1171
1172	ciintf_init(budget_ci);
1173
1174	budget_ci->budget.dvb_adapter.priv = budget_ci;
1175	frontend_init(budget_ci);
1176
1177	ttpci_budget_init_hooks(&budget_ci->budget);
1178
1179	return 0;
1180
1181out3:
1182	ttpci_budget_deinit(&budget_ci->budget);
1183out2:
1184	kfree(budget_ci);
1185out1:
1186	return err;
1187}
1188
1189static int budget_ci_detach(struct saa7146_dev *dev)
1190{
1191	struct budget_ci *budget_ci = (struct budget_ci *) dev->ext_priv;
1192	struct saa7146_dev *saa = budget_ci->budget.dev;
1193	int err;
1194
1195	if (budget_ci->budget.ci_present)
1196		ciintf_deinit(budget_ci);
1197	msp430_ir_deinit(budget_ci);
1198	if (budget_ci->budget.dvb_frontend) {
1199		dvb_unregister_frontend(budget_ci->budget.dvb_frontend);
1200		dvb_frontend_detach(budget_ci->budget.dvb_frontend);
1201	}
1202	err = ttpci_budget_deinit(&budget_ci->budget);
1203
1204	// disable frontend and CI interface
1205	saa7146_setgpio(saa, 2, SAA7146_GPIO_INPUT);
1206
1207	kfree(budget_ci);
1208
1209	return err;
1210}
1211
1212static struct saa7146_extension budget_extension;
1213
1214MAKE_BUDGET_INFO(ttbs2, "TT-Budget/S-1500 PCI", BUDGET_TT);
1215MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC);
1216MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T	 PCI", BUDGET_TT);
1217MAKE_BUDGET_INFO(ttbtci, "TT-Budget-T-CI PCI", BUDGET_TT);
1218MAKE_BUDGET_INFO(ttbcci, "TT-Budget-C-CI PCI", BUDGET_TT);
1219
1220static struct pci_device_id pci_tbl[] = {
1221	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c),
1222	MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f),
1223	MAKE_EXTENSION_PCI(ttbcci, 0x13c2, 0x1010),
1224	MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011),
1225	MAKE_EXTENSION_PCI(ttbtci, 0x13c2, 0x1012),
1226	MAKE_EXTENSION_PCI(ttbs2, 0x13c2, 0x1017),
1227	{
1228	 .vendor = 0,
1229	 }
1230};
1231
1232MODULE_DEVICE_TABLE(pci, pci_tbl);
1233
1234static struct saa7146_extension budget_extension = {
1235	.name = "budget_ci dvb",
1236	.flags = SAA7146_USE_I2C_IRQ,
1237
1238	.module = THIS_MODULE,
1239	.pci_tbl = &pci_tbl[0],
1240	.attach = budget_ci_attach,
1241	.detach = budget_ci_detach,
1242
1243	.irq_mask = MASK_03 | MASK_06 | MASK_10,
1244	.irq_func = budget_ci_irq,
1245};
1246
1247static int __init budget_ci_init(void)
1248{
1249	return saa7146_register_extension(&budget_extension);
1250}
1251
1252static void __exit budget_ci_exit(void)
1253{
1254	saa7146_unregister_extension(&budget_extension);
1255}
1256
1257module_init(budget_ci_init);
1258module_exit(budget_ci_exit);
1259
1260MODULE_LICENSE("GPL");
1261MODULE_AUTHOR("Michael Hunold, Jack Thomasson, Andrew de Quincey, others");
1262MODULE_DESCRIPTION("driver for the SAA7146 based so-called "
1263		   "budget PCI DVB cards w/ CI-module produced by "
1264		   "Siemens, Technotrend, Hauppauge");
1265