Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
budget-ci.c
Go to the documentation of this file.
1 /*
2  * budget-ci.c: driver for the SAA7146 based Budget DVB cards
3  *
4  * Compiled from various sources by Michael Hunold <[email protected]>
5  *
6  * msp430 IR support contributed by Jack Thomasson <[email protected]>
7  * partially based on the Siemens DVB driver by Ralph+Marcus Metzler
8  *
9  * CI interface support (c) 2004 Andrew de Quincey <[email protected]>
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 
97 
98 struct budget_ci_ir {
99  struct rc_dev *dev;
101  char name[72]; /* 40 + 32 for (struct saa7146_dev).name */
102  char phys[32];
106  bool full_rc5; /* Outputs a full RC5 code */
107 };
108 
109 struct budget_ci {
110  struct budget budget;
113  int ci_irq;
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,
165  budget_ci->ir.rc5_device <<8 | budget_ci->ir.ir_key,
166  (command & 0x20) ? 1 : 0);
167  return;
168  }
169 
170  /* FIXME: We should generate complete scancodes for all devices */
171  rc_keydown(dev, budget_ci->ir.ir_key, (command & 0x20) ? 1 : 0);
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 */
234  break;
235  }
236  if (!budget_ci->ir.full_rc5)
237  dev->scanmask = 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);
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);
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
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);
328  CICONTROL_RESET, 1, 0);
329 
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 
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 
358 
359  tmp = ttpci_budget_debiread(&budget_ci->budget, DEBICICTL, DEBIADDR_CICONTROL, 1, 1, 0);
361  tmp | CICONTROL_ENABLETS, 1, 0);
362 
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
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,
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.
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,
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) {
446  }
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 {
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) {
513  } else {
515  }
516  SAA7146_IER_ENABLE(saa, MASK_03);
517  }
518 
519  // enable interface
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) {
530  if (budget_ci->slot_status != SLOTSTATUS_NONE)
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);
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);
557  CICONTROL_RESET, 1, 0);
558 
559  // disable TS data stream to CI interface
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 {
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 {
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 {
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, /* 1 */
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 {
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
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");