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