aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb/frontends/tda827x.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb/frontends/tda827x.c')
-rw-r--r--drivers/media/dvb/frontends/tda827x.c367
1 files changed, 352 insertions, 15 deletions
diff --git a/drivers/media/dvb/frontends/tda827x.c b/drivers/media/dvb/frontends/tda827x.c
index 256fc4bf500b..229b11987a58 100644
--- a/drivers/media/dvb/frontends/tda827x.c
+++ b/drivers/media/dvb/frontends/tda827x.c
@@ -19,12 +19,16 @@
19 */ 19 */
20 20
21#include <linux/module.h> 21#include <linux/module.h>
22#include <linux/dvb/frontend.h>
23#include <asm/types.h> 22#include <asm/types.h>
23#include <linux/dvb/frontend.h>
24#include <linux/videodev2.h>
24 25
25#include "tda827x.h" 26#include "tda827x.h"
26 27
27static int debug = 0; 28static int debug = 0;
29module_param(debug, int, 0644);
30MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
31
28#define dprintk(args...) \ 32#define dprintk(args...) \
29 do { \ 33 do { \
30 if (debug) printk(KERN_DEBUG "tda827x: " args); \ 34 if (debug) printk(KERN_DEBUG "tda827x: " args); \
@@ -34,10 +38,57 @@ struct tda827x_priv {
34 int i2c_addr; 38 int i2c_addr;
35 struct i2c_adapter *i2c_adap; 39 struct i2c_adapter *i2c_adap;
36 struct tda827x_config *cfg; 40 struct tda827x_config *cfg;
41
42 unsigned int sgIF;
43 unsigned char lpsel;
44
37 u32 frequency; 45 u32 frequency;
38 u32 bandwidth; 46 u32 bandwidth;
39}; 47};
40 48
49static void tda827x_set_std(struct dvb_frontend *fe,
50 struct analog_parameters *params)
51{
52 struct tda827x_priv *priv = fe->tuner_priv;
53 char *mode;
54
55 priv->lpsel = 0;
56 if (params->std & V4L2_STD_MN) {
57 priv->sgIF = 92;
58 priv->lpsel = 1;
59 mode = "MN";
60 } else if (params->std & V4L2_STD_B) {
61 priv->sgIF = 108;
62 mode = "B";
63 } else if (params->std & V4L2_STD_GH) {
64 priv->sgIF = 124;
65 mode = "GH";
66 } else if (params->std & V4L2_STD_PAL_I) {
67 priv->sgIF = 124;
68 mode = "I";
69 } else if (params->std & V4L2_STD_DK) {
70 priv->sgIF = 124;
71 mode = "DK";
72 } else if (params->std & V4L2_STD_SECAM_L) {
73 priv->sgIF = 124;
74 mode = "L";
75 } else if (params->std & V4L2_STD_SECAM_LC) {
76 priv->sgIF = 20;
77 mode = "LC";
78 } else {
79 priv->sgIF = 124;
80 mode = "xx";
81 }
82
83 if (params->mode == V4L2_TUNER_RADIO)
84 priv->sgIF = 88; /* if frequency is 5.5 MHz */
85
86 dprintk("setting tda827x to system %s\n", mode);
87}
88
89
90/* ------------------------------------------------------------------ */
91
41struct tda827x_data { 92struct tda827x_data {
42 u32 lomax; 93 u32 lomax;
43 u8 spd; 94 u8 spd;
@@ -48,7 +99,7 @@ struct tda827x_data {
48 u8 div1p5; 99 u8 div1p5;
49}; 100};
50 101
51static const struct tda827x_data tda827x_dvbt[] = { 102static const struct tda827x_data tda827x_table[] = {
52 { .lomax = 62000000, .spd = 3, .bs = 2, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 1}, 103 { .lomax = 62000000, .spd = 3, .bs = 2, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 1},
53 { .lomax = 66000000, .spd = 3, .bs = 3, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 1}, 104 { .lomax = 66000000, .spd = 3, .bs = 3, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 1},
54 { .lomax = 76000000, .spd = 3, .bs = 1, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 0}, 105 { .lomax = 76000000, .spd = 3, .bs = 1, .bp = 0, .cp = 0, .gc3 = 3, .div1p5 = 0},
@@ -106,21 +157,22 @@ static int tda827xo_set_params(struct dvb_frontend *fe,
106 tuner_freq = params->frequency + if_freq; 157 tuner_freq = params->frequency + if_freq;
107 158
108 i = 0; 159 i = 0;
109 while (tda827x_dvbt[i].lomax < tuner_freq) { 160 while (tda827x_table[i].lomax < tuner_freq) {
110 if(tda827x_dvbt[i + 1].lomax == 0) 161 if (tda827x_table[i + 1].lomax == 0)
111 break; 162 break;
112 i++; 163 i++;
113 } 164 }
114 165
115 N = ((tuner_freq + 125000) / 250000) << (tda827x_dvbt[i].spd + 2); 166 N = ((tuner_freq + 125000) / 250000) << (tda827x_table[i].spd + 2);
116 buf[0] = 0; 167 buf[0] = 0;
117 buf[1] = (N>>8) | 0x40; 168 buf[1] = (N>>8) | 0x40;
118 buf[2] = N & 0xff; 169 buf[2] = N & 0xff;
119 buf[3] = 0; 170 buf[3] = 0;
120 buf[4] = 0x52; 171 buf[4] = 0x52;
121 buf[5] = (tda827x_dvbt[i].spd << 6) + (tda827x_dvbt[i].div1p5 << 5) + 172 buf[5] = (tda827x_table[i].spd << 6) + (tda827x_table[i].div1p5 << 5) +
122 (tda827x_dvbt[i].bs << 3) + tda827x_dvbt[i].bp; 173 (tda827x_table[i].bs << 3) +
123 buf[6] = (tda827x_dvbt[i].gc3 << 4) + 0x8f; 174 tda827x_table[i].bp;
175 buf[6] = (tda827x_table[i].gc3 << 4) + 0x8f;
124 buf[7] = 0xbf; 176 buf[7] = 0xbf;
125 buf[8] = 0x2a; 177 buf[8] = 0x2a;
126 buf[9] = 0x05; 178 buf[9] = 0x05;
@@ -140,7 +192,7 @@ static int tda827xo_set_params(struct dvb_frontend *fe,
140 msleep(500); 192 msleep(500);
141 /* correct CP value */ 193 /* correct CP value */
142 buf[0] = 0x30; 194 buf[0] = 0x30;
143 buf[1] = 0x50 + tda827x_dvbt[i].cp; 195 buf[1] = 0x50 + tda827x_table[i].cp;
144 msg.len = 2; 196 msg.len = 2;
145 197
146 if (fe->ops.i2c_gate_ctrl) 198 if (fe->ops.i2c_gate_ctrl)
@@ -173,6 +225,102 @@ static int tda827xo_sleep(struct dvb_frontend *fe)
173 225
174/* ------------------------------------------------------------------ */ 226/* ------------------------------------------------------------------ */
175 227
228static int tda827xo_set_analog_params(struct dvb_frontend *fe,
229 struct analog_parameters *params)
230{
231 unsigned char tuner_reg[8];
232 unsigned char reg2[2];
233 u32 N;
234 int i;
235 struct tda827x_priv *priv = fe->tuner_priv;
236 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0 };
237 unsigned int freq = params->frequency;
238
239 tda827x_set_std(fe, params);
240
241 if (params->mode == V4L2_TUNER_RADIO)
242 freq = freq / 1000;
243
244 N = freq + priv->sgIF;
245
246 i = 0;
247 while (tda827x_table[i].lomax < N * 62500) {
248 if (tda827x_table[i + 1].lomax == 0)
249 break;
250 i++;
251 }
252
253 N = N << tda827x_table[i].spd;
254
255 tuner_reg[0] = 0;
256 tuner_reg[1] = (unsigned char)(N>>8);
257 tuner_reg[2] = (unsigned char) N;
258 tuner_reg[3] = 0x40;
259 tuner_reg[4] = 0x52 + (priv->lpsel << 5);
260 tuner_reg[5] = (tda827x_table[i].spd << 6) +
261 (tda827x_table[i].div1p5 << 5) +
262 (tda827x_table[i].bs << 3) + tda827x_table[i].bp;
263 tuner_reg[6] = 0x8f + (tda827x_table[i].gc3 << 4);
264 tuner_reg[7] = 0x8f;
265
266 msg.buf = tuner_reg;
267 msg.len = 8;
268 i2c_transfer(priv->i2c_adap, &msg, 1);
269
270 msg.buf = reg2;
271 msg.len = 2;
272 reg2[0] = 0x80;
273 reg2[1] = 0;
274 i2c_transfer(priv->i2c_adap, &msg, 1);
275
276 reg2[0] = 0x60;
277 reg2[1] = 0xbf;
278 i2c_transfer(priv->i2c_adap, &msg, 1);
279
280 reg2[0] = 0x30;
281 reg2[1] = tuner_reg[4] + 0x80;
282 i2c_transfer(priv->i2c_adap, &msg, 1);
283
284 msleep(1);
285 reg2[0] = 0x30;
286 reg2[1] = tuner_reg[4] + 4;
287 i2c_transfer(priv->i2c_adap, &msg, 1);
288
289 msleep(1);
290 reg2[0] = 0x30;
291 reg2[1] = tuner_reg[4];
292 i2c_transfer(priv->i2c_adap, &msg, 1);
293
294 msleep(550);
295 reg2[0] = 0x30;
296 reg2[1] = (tuner_reg[4] & 0xfc) + tda827x_table[i].cp;
297 i2c_transfer(priv->i2c_adap, &msg, 1);
298
299 reg2[0] = 0x60;
300 reg2[1] = 0x3f;
301 i2c_transfer(priv->i2c_adap, &msg, 1);
302
303 reg2[0] = 0x80;
304 reg2[1] = 0x08; /* Vsync en */
305 i2c_transfer(priv->i2c_adap, &msg, 1);
306
307 priv->frequency = freq * 62500;
308
309 return 0;
310}
311
312static void tda827xo_agcf(struct dvb_frontend *fe)
313{
314 struct tda827x_priv *priv = fe->tuner_priv;
315 unsigned char data[] = { 0x80, 0x0c };
316 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
317 .buf = data, .len = 2};
318
319 i2c_transfer(priv->i2c_adap, &msg, 1);
320}
321
322/* ------------------------------------------------------------------ */
323
176struct tda827xa_data { 324struct tda827xa_data {
177 u32 lomax; 325 u32 lomax;
178 u8 svco; 326 u8 svco;
@@ -212,6 +360,35 @@ static const struct tda827xa_data tda827xa_dvbt[] = {
212 { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0} 360 { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}
213}; 361};
214 362
363static struct tda827xa_data tda827xa_analog[] = {
364 { .lomax = 56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 3},
365 { .lomax = 67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 3},
366 { .lomax = 81250000, .svco = 1, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 3},
367 { .lomax = 97500000, .svco = 2, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 3},
368 { .lomax = 113750000, .svco = 3, .spd = 3, .scr = 0, .sbs = 1, .gc3 = 1},
369 { .lomax = 134500000, .svco = 0, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
370 { .lomax = 154000000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
371 { .lomax = 162500000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
372 { .lomax = 183000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
373 { .lomax = 195000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1},
374 { .lomax = 227500000, .svco = 3, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 3},
375 { .lomax = 269000000, .svco = 0, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 3},
376 { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1},
377 { .lomax = 390000000, .svco = 2, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 3},
378 { .lomax = 455000000, .svco = 3, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 3},
379 { .lomax = 520000000, .svco = 0, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
380 { .lomax = 538000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1},
381 { .lomax = 554000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
382 { .lomax = 620000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
383 { .lomax = 650000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
384 { .lomax = 700000000, .svco = 2, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
385 { .lomax = 780000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
386 { .lomax = 820000000, .svco = 3, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
387 { .lomax = 870000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
388 { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 0},
389 { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}
390};
391
215static int tda827xa_set_params(struct dvb_frontend *fe, 392static int tda827xa_set_params(struct dvb_frontend *fe,
216 struct dvb_frontend_parameters *params) 393 struct dvb_frontend_parameters *params)
217{ 394{
@@ -368,6 +545,163 @@ static int tda827xa_sleep(struct dvb_frontend *fe)
368 return 0; 545 return 0;
369} 546}
370 547
548/* ------------------------------------------------------------------ */
549
550static void tda827xa_lna_gain(struct dvb_frontend *fe, int high,
551 struct analog_parameters *params)
552{
553 struct tda827x_priv *priv = fe->tuner_priv;
554 unsigned char buf[] = {0x22, 0x01};
555 int arg;
556 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
557 .buf = buf, .len = sizeof(buf) };
558
559 if (NULL == priv->cfg) {
560 dprintk("tda827x_config not defined, cannot set LNA gain!\n");
561 return;
562 }
563
564 if (priv->cfg->config) {
565 if (high)
566 dprintk("setting LNA to high gain\n");
567 else
568 dprintk("setting LNA to low gain\n");
569 }
570 switch (*priv->cfg->config) {
571 case 0: /* no LNA */
572 break;
573 case 1: /* switch is GPIO 0 of tda8290 */
574 case 2:
575 /* turn Vsync on */
576 if (params->std & V4L2_STD_MN)
577 arg = 1;
578 else
579 arg = 0;
580 if (priv->cfg->tuner_callback)
581 priv->cfg->tuner_callback(priv->i2c_adap->algo_data,
582 1, arg);
583 buf[1] = high ? 0 : 1;
584 if (*priv->cfg->config == 2)
585 buf[1] = high ? 1 : 0;
586 i2c_transfer(priv->i2c_adap, &msg, 1);
587 break;
588 case 3: /* switch with GPIO of saa713x */
589 if (priv->cfg->tuner_callback)
590 priv->cfg->tuner_callback(priv->i2c_adap->algo_data,
591 0, high);
592 break;
593 }
594}
595
596static int tda827xa_set_analog_params(struct dvb_frontend *fe,
597 struct analog_parameters *params)
598{
599 unsigned char tuner_reg[11];
600 u32 N;
601 int i;
602 struct tda827x_priv *priv = fe->tuner_priv;
603 struct i2c_msg msg = { .addr = priv->i2c_addr, .flags = 0,
604 .buf = tuner_reg, .len = sizeof(tuner_reg) };
605 unsigned int freq = params->frequency;
606
607 tda827x_set_std(fe, params);
608
609 tda827xa_lna_gain(fe, 1, params);
610 msleep(10);
611
612 if (params->mode == V4L2_TUNER_RADIO)
613 freq = freq / 1000;
614
615 N = freq + priv->sgIF;
616
617 i = 0;
618 while (tda827xa_analog[i].lomax < N * 62500) {
619 if (tda827xa_analog[i + 1].lomax == 0)
620 break;
621 i++;
622 }
623
624 N = N << tda827xa_analog[i].spd;
625
626 tuner_reg[0] = 0;
627 tuner_reg[1] = (unsigned char)(N>>8);
628 tuner_reg[2] = (unsigned char) N;
629 tuner_reg[3] = 0;
630 tuner_reg[4] = 0x16;
631 tuner_reg[5] = (tda827xa_analog[i].spd << 5) +
632 (tda827xa_analog[i].svco << 3) +
633 tda827xa_analog[i].sbs;
634 tuner_reg[6] = 0x8b + (tda827xa_analog[i].gc3 << 4);
635 tuner_reg[7] = 0x1c;
636 tuner_reg[8] = 4;
637 tuner_reg[9] = 0x20;
638 tuner_reg[10] = 0x00;
639 msg.len = 11;
640 i2c_transfer(priv->i2c_adap, &msg, 1);
641
642 tuner_reg[0] = 0x90;
643 tuner_reg[1] = 0xff;
644 tuner_reg[2] = 0xe0;
645 tuner_reg[3] = 0;
646 tuner_reg[4] = 0x99 + (priv->lpsel << 1);
647 msg.len = 5;
648 i2c_transfer(priv->i2c_adap, &msg, 1);
649
650 tuner_reg[0] = 0xa0;
651 tuner_reg[1] = 0xc0;
652 msg.len = 2;
653 i2c_transfer(priv->i2c_adap, &msg, 1);
654
655 tuner_reg[0] = 0x30;
656 tuner_reg[1] = 0x10 + tda827xa_analog[i].scr;
657 i2c_transfer(priv->i2c_adap, &msg, 1);
658
659 msg.flags = I2C_M_RD;
660 i2c_transfer(priv->i2c_adap, &msg, 1);
661 msg.flags = 0;
662 tuner_reg[1] >>= 4;
663 dprintk("AGC2 gain is: %d\n", tuner_reg[1]);
664 if (tuner_reg[1] < 1)
665 tda827xa_lna_gain(fe, 0, params);
666
667 msleep(100);
668 tuner_reg[0] = 0x60;
669 tuner_reg[1] = 0x3c;
670 i2c_transfer(priv->i2c_adap, &msg, 1);
671
672 msleep(163);
673 tuner_reg[0] = 0x50;
674 tuner_reg[1] = 0x8f + (tda827xa_analog[i].gc3 << 4);
675 i2c_transfer(priv->i2c_adap, &msg, 1);
676
677 tuner_reg[0] = 0x80;
678 tuner_reg[1] = 0x28;
679 i2c_transfer(priv->i2c_adap, &msg, 1);
680
681 tuner_reg[0] = 0xb0;
682 tuner_reg[1] = 0x01;
683 i2c_transfer(priv->i2c_adap, &msg, 1);
684
685 tuner_reg[0] = 0xc0;
686 tuner_reg[1] = 0x19 + (priv->lpsel << 1);
687 i2c_transfer(priv->i2c_adap, &msg, 1);
688
689 priv->frequency = freq * 62500;
690
691 return 0;
692}
693
694static void tda827xa_agcf(struct dvb_frontend *fe)
695{
696 struct tda827x_priv *priv = fe->tuner_priv;
697 unsigned char data[] = {0x80, 0x2c};
698 struct i2c_msg msg = {.addr = priv->i2c_addr, .flags = 0,
699 .buf = data, .len = 2};
700 i2c_transfer(priv->i2c_adap, &msg, 1);
701}
702
703/* ------------------------------------------------------------------ */
704
371static int tda827x_release(struct dvb_frontend *fe) 705static int tda827x_release(struct dvb_frontend *fe)
372{ 706{
373 kfree(fe->tuner_priv); 707 kfree(fe->tuner_priv);
@@ -430,6 +764,7 @@ static struct dvb_tuner_ops tda827xo_tuner_ops = {
430 .init = tda827x_initial_init, 764 .init = tda827x_initial_init,
431 .sleep = tda827x_initial_sleep, 765 .sleep = tda827x_initial_sleep,
432 .set_params = tda827xo_set_params, 766 .set_params = tda827xo_set_params,
767 .set_analog_params = tda827xo_set_analog_params,
433 .get_frequency = tda827x_get_frequency, 768 .get_frequency = tda827x_get_frequency,
434 .get_bandwidth = tda827x_get_bandwidth, 769 .get_bandwidth = tda827x_get_bandwidth,
435}; 770};
@@ -445,6 +780,7 @@ static struct dvb_tuner_ops tda827xa_tuner_ops = {
445 .init = tda827x_init, 780 .init = tda827x_init,
446 .sleep = tda827xa_sleep, 781 .sleep = tda827xa_sleep,
447 .set_params = tda827xa_set_params, 782 .set_params = tda827xa_set_params,
783 .set_analog_params = tda827xa_set_analog_params,
448 .get_frequency = tda827x_get_frequency, 784 .get_frequency = tda827x_get_frequency,
449 .get_bandwidth = tda827x_get_bandwidth, 785 .get_bandwidth = tda827x_get_bandwidth,
450}; 786};
@@ -465,9 +801,13 @@ static int tda827x_probe_version(struct dvb_frontend *fe)
465 dprintk("tda827x tuner found\n"); 801 dprintk("tda827x tuner found\n");
466 fe->ops.tuner_ops.init = tda827x_init; 802 fe->ops.tuner_ops.init = tda827x_init;
467 fe->ops.tuner_ops.sleep = tda827xo_sleep; 803 fe->ops.tuner_ops.sleep = tda827xo_sleep;
804 if (priv->cfg)
805 priv->cfg->agcf = tda827xo_agcf;
468 } else { 806 } else {
469 dprintk("tda827xa tuner found\n"); 807 dprintk("tda827xa tuner found\n");
470 memcpy(&fe->ops.tuner_ops, &tda827xa_tuner_ops, sizeof(struct dvb_tuner_ops)); 808 memcpy(&fe->ops.tuner_ops, &tda827xa_tuner_ops, sizeof(struct dvb_tuner_ops));
809 if (priv->cfg)
810 priv->cfg->agcf = tda827xa_agcf;
471 } 811 }
472 return 0; 812 return 0;
473} 813}
@@ -487,16 +827,13 @@ struct dvb_frontend *tda827x_attach(struct dvb_frontend *fe, int addr,
487 priv->i2c_adap = i2c; 827 priv->i2c_adap = i2c;
488 priv->cfg = cfg; 828 priv->cfg = cfg;
489 memcpy(&fe->ops.tuner_ops, &tda827xo_tuner_ops, sizeof(struct dvb_tuner_ops)); 829 memcpy(&fe->ops.tuner_ops, &tda827xo_tuner_ops, sizeof(struct dvb_tuner_ops));
490
491 fe->tuner_priv = priv; 830 fe->tuner_priv = priv;
492 831
832 dprintk("type set to %s\n", fe->ops.tuner_ops.info.name);
833
493 return fe; 834 return fe;
494} 835}
495 836EXPORT_SYMBOL_GPL(tda827x_attach);
496EXPORT_SYMBOL(tda827x_attach);
497
498module_param(debug, int, 0644);
499MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
500 837
501MODULE_DESCRIPTION("DVB TDA827x driver"); 838MODULE_DESCRIPTION("DVB TDA827x driver");
502MODULE_AUTHOR("Hartmut Hackmann <hartmut.hackmann@t-online.de>"); 839MODULE_AUTHOR("Hartmut Hackmann <hartmut.hackmann@t-online.de>");