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