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