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