]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/media/tuners/tda18271-fe.c
Merge remote-tracking branch 'slave-dma/next'
[karo-tx-linux.git] / drivers / media / tuners / tda18271-fe.c
1 /*
2     tda18271-fe.c - driver for the Philips / NXP TDA18271 silicon tuner
3
4     Copyright (C) 2007, 2008 Michael Krufky <mkrufky@linuxtv.org>
5
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include <linux/delay.h>
22 #include <linux/videodev2.h>
23 #include "tda18271-priv.h"
24 #include "tda8290.h"
25
26 int tda18271_debug;
27 module_param_named(debug, tda18271_debug, int, 0644);
28 MODULE_PARM_DESC(debug, "set debug level "
29                  "(info=1, map=2, reg=4, adv=8, cal=16 (or-able))");
30
31 static int tda18271_cal_on_startup = -1;
32 module_param_named(cal, tda18271_cal_on_startup, int, 0644);
33 MODULE_PARM_DESC(cal, "perform RF tracking filter calibration on startup");
34
35 static DEFINE_MUTEX(tda18271_list_mutex);
36 static LIST_HEAD(hybrid_tuner_instance_list);
37
38 /*---------------------------------------------------------------------*/
39
40 static int tda18271_toggle_output(struct dvb_frontend *fe, int standby)
41 {
42         struct tda18271_priv *priv = fe->tuner_priv;
43
44         int ret = tda18271_set_standby_mode(fe, standby ? 1 : 0,
45                         priv->output_opt & TDA18271_OUTPUT_LT_OFF ? 1 : 0,
46                         priv->output_opt & TDA18271_OUTPUT_XT_OFF ? 1 : 0);
47
48         if (tda_fail(ret))
49                 goto fail;
50
51         tda_dbg("%s mode: xtal oscillator %s, slave tuner loop thru %s\n",
52                 standby ? "standby" : "active",
53                 priv->output_opt & TDA18271_OUTPUT_XT_OFF ? "off" : "on",
54                 priv->output_opt & TDA18271_OUTPUT_LT_OFF ? "off" : "on");
55 fail:
56         return ret;
57 }
58
59 /*---------------------------------------------------------------------*/
60
61 static inline int charge_pump_source(struct dvb_frontend *fe, int force)
62 {
63         struct tda18271_priv *priv = fe->tuner_priv;
64         return tda18271_charge_pump_source(fe,
65                                            (priv->role == TDA18271_SLAVE) ?
66                                            TDA18271_CAL_PLL :
67                                            TDA18271_MAIN_PLL, force);
68 }
69
70 static inline void tda18271_set_if_notch(struct dvb_frontend *fe)
71 {
72         struct tda18271_priv *priv = fe->tuner_priv;
73         unsigned char *regs = priv->tda18271_regs;
74
75         switch (priv->mode) {
76         case TDA18271_ANALOG:
77                 regs[R_MPD]  &= ~0x80; /* IF notch = 0 */
78                 break;
79         case TDA18271_DIGITAL:
80                 regs[R_MPD]  |= 0x80; /* IF notch = 1 */
81                 break;
82         }
83 }
84
85 static int tda18271_channel_configuration(struct dvb_frontend *fe,
86                                           struct tda18271_std_map_item *map,
87                                           u32 freq, u32 bw)
88 {
89         struct tda18271_priv *priv = fe->tuner_priv;
90         unsigned char *regs = priv->tda18271_regs;
91         int ret;
92         u32 N;
93
94         /* update TV broadcast parameters */
95
96         /* set standard */
97         regs[R_EP3]  &= ~0x1f; /* clear std bits */
98         regs[R_EP3]  |= (map->agc_mode << 3) | map->std;
99
100         if (priv->id == TDA18271HDC2) {
101                 /* set rfagc to high speed mode */
102                 regs[R_EP3] &= ~0x04;
103         }
104
105         /* set cal mode to normal */
106         regs[R_EP4]  &= ~0x03;
107
108         /* update IF output level */
109         regs[R_EP4]  &= ~0x1c; /* clear if level bits */
110         regs[R_EP4]  |= (map->if_lvl << 2);
111
112         /* update FM_RFn */
113         regs[R_EP4]  &= ~0x80;
114         regs[R_EP4]  |= map->fm_rfn << 7;
115
116         /* update rf top / if top */
117         regs[R_EB22]  = 0x00;
118         regs[R_EB22] |= map->rfagc_top;
119         ret = tda18271_write_regs(fe, R_EB22, 1);
120         if (tda_fail(ret))
121                 goto fail;
122
123         /* --------------------------------------------------------------- */
124
125         /* disable Power Level Indicator */
126         regs[R_EP1]  |= 0x40;
127
128         /* make sure thermometer is off */
129         regs[R_TM]   &= ~0x10;
130
131         /* frequency dependent parameters */
132
133         tda18271_calc_ir_measure(fe, &freq);
134
135         tda18271_calc_bp_filter(fe, &freq);
136
137         tda18271_calc_rf_band(fe, &freq);
138
139         tda18271_calc_gain_taper(fe, &freq);
140
141         /* --------------------------------------------------------------- */
142
143         /* dual tuner and agc1 extra configuration */
144
145         switch (priv->role) {
146         case TDA18271_MASTER:
147                 regs[R_EB1]  |= 0x04; /* main vco */
148                 break;
149         case TDA18271_SLAVE:
150                 regs[R_EB1]  &= ~0x04; /* cal vco */
151                 break;
152         }
153
154         /* agc1 always active */
155         regs[R_EB1]  &= ~0x02;
156
157         /* agc1 has priority on agc2 */
158         regs[R_EB1]  &= ~0x01;
159
160         ret = tda18271_write_regs(fe, R_EB1, 1);
161         if (tda_fail(ret))
162                 goto fail;
163
164         /* --------------------------------------------------------------- */
165
166         N = map->if_freq * 1000 + freq;
167
168         switch (priv->role) {
169         case TDA18271_MASTER:
170                 tda18271_calc_main_pll(fe, N);
171                 tda18271_set_if_notch(fe);
172                 tda18271_write_regs(fe, R_MPD, 4);
173                 break;
174         case TDA18271_SLAVE:
175                 tda18271_calc_cal_pll(fe, N);
176                 tda18271_write_regs(fe, R_CPD, 4);
177
178                 regs[R_MPD] = regs[R_CPD] & 0x7f;
179                 tda18271_set_if_notch(fe);
180                 tda18271_write_regs(fe, R_MPD, 1);
181                 break;
182         }
183
184         ret = tda18271_write_regs(fe, R_TM, 7);
185         if (tda_fail(ret))
186                 goto fail;
187
188         /* force charge pump source */
189         charge_pump_source(fe, 1);
190
191         msleep(1);
192
193         /* return pll to normal operation */
194         charge_pump_source(fe, 0);
195
196         msleep(20);
197
198         if (priv->id == TDA18271HDC2) {
199                 /* set rfagc to normal speed mode */
200                 if (map->fm_rfn)
201                         regs[R_EP3] &= ~0x04;
202                 else
203                         regs[R_EP3] |= 0x04;
204                 ret = tda18271_write_regs(fe, R_EP3, 1);
205         }
206 fail:
207         return ret;
208 }
209
210 static int tda18271_read_thermometer(struct dvb_frontend *fe)
211 {
212         struct tda18271_priv *priv = fe->tuner_priv;
213         unsigned char *regs = priv->tda18271_regs;
214         int tm;
215
216         /* switch thermometer on */
217         regs[R_TM]   |= 0x10;
218         tda18271_write_regs(fe, R_TM, 1);
219
220         /* read thermometer info */
221         tda18271_read_regs(fe);
222
223         if ((((regs[R_TM] & 0x0f) == 0x00) && ((regs[R_TM] & 0x20) == 0x20)) ||
224             (((regs[R_TM] & 0x0f) == 0x08) && ((regs[R_TM] & 0x20) == 0x00))) {
225
226                 if ((regs[R_TM] & 0x20) == 0x20)
227                         regs[R_TM] &= ~0x20;
228                 else
229                         regs[R_TM] |= 0x20;
230
231                 tda18271_write_regs(fe, R_TM, 1);
232
233                 msleep(10); /* temperature sensing */
234
235                 /* read thermometer info */
236                 tda18271_read_regs(fe);
237         }
238
239         tm = tda18271_lookup_thermometer(fe);
240
241         /* switch thermometer off */
242         regs[R_TM]   &= ~0x10;
243         tda18271_write_regs(fe, R_TM, 1);
244
245         /* set CAL mode to normal */
246         regs[R_EP4]  &= ~0x03;
247         tda18271_write_regs(fe, R_EP4, 1);
248
249         return tm;
250 }
251
252 /* ------------------------------------------------------------------ */
253
254 static int tda18271c2_rf_tracking_filters_correction(struct dvb_frontend *fe,
255                                                      u32 freq)
256 {
257         struct tda18271_priv *priv = fe->tuner_priv;
258         struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state;
259         unsigned char *regs = priv->tda18271_regs;
260         int i, ret;
261         u8 tm_current, dc_over_dt, rf_tab;
262         s32 rfcal_comp, approx;
263
264         /* power up */
265         ret = tda18271_set_standby_mode(fe, 0, 0, 0);
266         if (tda_fail(ret))
267                 goto fail;
268
269         /* read die current temperature */
270         tm_current = tda18271_read_thermometer(fe);
271
272         /* frequency dependent parameters */
273
274         tda18271_calc_rf_cal(fe, &freq);
275         rf_tab = regs[R_EB14];
276
277         i = tda18271_lookup_rf_band(fe, &freq, NULL);
278         if (tda_fail(i))
279                 return i;
280
281         if ((0 == map[i].rf3) || (freq / 1000 < map[i].rf2)) {
282                 approx = map[i].rf_a1 * (s32)(freq / 1000 - map[i].rf1) +
283                         map[i].rf_b1 + rf_tab;
284         } else {
285                 approx = map[i].rf_a2 * (s32)(freq / 1000 - map[i].rf2) +
286                         map[i].rf_b2 + rf_tab;
287         }
288
289         if (approx < 0)
290                 approx = 0;
291         if (approx > 255)
292                 approx = 255;
293
294         tda18271_lookup_map(fe, RF_CAL_DC_OVER_DT, &freq, &dc_over_dt);
295
296         /* calculate temperature compensation */
297         rfcal_comp = dc_over_dt * (s32)(tm_current - priv->tm_rfcal) / 1000;
298
299         regs[R_EB14] = (unsigned char)(approx + rfcal_comp);
300         ret = tda18271_write_regs(fe, R_EB14, 1);
301 fail:
302         return ret;
303 }
304
305 static int tda18271_por(struct dvb_frontend *fe)
306 {
307         struct tda18271_priv *priv = fe->tuner_priv;
308         unsigned char *regs = priv->tda18271_regs;
309         int ret;
310
311         /* power up detector 1 */
312         regs[R_EB12] &= ~0x20;
313         ret = tda18271_write_regs(fe, R_EB12, 1);
314         if (tda_fail(ret))
315                 goto fail;
316
317         regs[R_EB18] &= ~0x80; /* turn agc1 loop on */
318         regs[R_EB18] &= ~0x03; /* set agc1_gain to  6 dB */
319         ret = tda18271_write_regs(fe, R_EB18, 1);
320         if (tda_fail(ret))
321                 goto fail;
322
323         regs[R_EB21] |= 0x03; /* set agc2_gain to -6 dB */
324
325         /* POR mode */
326         ret = tda18271_set_standby_mode(fe, 1, 0, 0);
327         if (tda_fail(ret))
328                 goto fail;
329
330         /* disable 1.5 MHz low pass filter */
331         regs[R_EB23] &= ~0x04; /* forcelp_fc2_en = 0 */
332         regs[R_EB23] &= ~0x02; /* XXX: lp_fc[2] = 0 */
333         ret = tda18271_write_regs(fe, R_EB21, 3);
334 fail:
335         return ret;
336 }
337
338 static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq)
339 {
340         struct tda18271_priv *priv = fe->tuner_priv;
341         unsigned char *regs = priv->tda18271_regs;
342         u32 N;
343
344         /* set CAL mode to normal */
345         regs[R_EP4]  &= ~0x03;
346         tda18271_write_regs(fe, R_EP4, 1);
347
348         /* switch off agc1 */
349         regs[R_EP3]  |= 0x40; /* sm_lt = 1 */
350
351         regs[R_EB18] |= 0x03; /* set agc1_gain to 15 dB */
352         tda18271_write_regs(fe, R_EB18, 1);
353
354         /* frequency dependent parameters */
355
356         tda18271_calc_bp_filter(fe, &freq);
357         tda18271_calc_gain_taper(fe, &freq);
358         tda18271_calc_rf_band(fe, &freq);
359         tda18271_calc_km(fe, &freq);
360
361         tda18271_write_regs(fe, R_EP1, 3);
362         tda18271_write_regs(fe, R_EB13, 1);
363
364         /* main pll charge pump source */
365         tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 1);
366
367         /* cal pll charge pump source */
368         tda18271_charge_pump_source(fe, TDA18271_CAL_PLL, 1);
369
370         /* force dcdc converter to 0 V */
371         regs[R_EB14] = 0x00;
372         tda18271_write_regs(fe, R_EB14, 1);
373
374         /* disable plls lock */
375         regs[R_EB20] &= ~0x20;
376         tda18271_write_regs(fe, R_EB20, 1);
377
378         /* set CAL mode to RF tracking filter calibration */
379         regs[R_EP4]  |= 0x03;
380         tda18271_write_regs(fe, R_EP4, 2);
381
382         /* --------------------------------------------------------------- */
383
384         /* set the internal calibration signal */
385         N = freq;
386
387         tda18271_calc_cal_pll(fe, N);
388         tda18271_write_regs(fe, R_CPD, 4);
389
390         /* downconvert internal calibration */
391         N += 1000000;
392
393         tda18271_calc_main_pll(fe, N);
394         tda18271_write_regs(fe, R_MPD, 4);
395
396         msleep(5);
397
398         tda18271_write_regs(fe, R_EP2, 1);
399         tda18271_write_regs(fe, R_EP1, 1);
400         tda18271_write_regs(fe, R_EP2, 1);
401         tda18271_write_regs(fe, R_EP1, 1);
402
403         /* --------------------------------------------------------------- */
404
405         /* normal operation for the main pll */
406         tda18271_charge_pump_source(fe, TDA18271_MAIN_PLL, 0);
407
408         /* normal operation for the cal pll  */
409         tda18271_charge_pump_source(fe, TDA18271_CAL_PLL, 0);
410
411         msleep(10); /* plls locking */
412
413         /* launch the rf tracking filters calibration */
414         regs[R_EB20]  |= 0x20;
415         tda18271_write_regs(fe, R_EB20, 1);
416
417         msleep(60); /* calibration */
418
419         /* --------------------------------------------------------------- */
420
421         /* set CAL mode to normal */
422         regs[R_EP4]  &= ~0x03;
423
424         /* switch on agc1 */
425         regs[R_EP3]  &= ~0x40; /* sm_lt = 0 */
426
427         regs[R_EB18] &= ~0x03; /* set agc1_gain to  6 dB */
428         tda18271_write_regs(fe, R_EB18, 1);
429
430         tda18271_write_regs(fe, R_EP3, 2);
431
432         /* synchronization */
433         tda18271_write_regs(fe, R_EP1, 1);
434
435         /* get calibration result */
436         tda18271_read_extended(fe);
437
438         return regs[R_EB14];
439 }
440
441 static int tda18271_powerscan(struct dvb_frontend *fe,
442                               u32 *freq_in, u32 *freq_out)
443 {
444         struct tda18271_priv *priv = fe->tuner_priv;
445         unsigned char *regs = priv->tda18271_regs;
446         int sgn, bcal, count, wait, ret;
447         u8 cid_target;
448         u16 count_limit;
449         u32 freq;
450
451         freq = *freq_in;
452
453         tda18271_calc_rf_band(fe, &freq);
454         tda18271_calc_rf_cal(fe, &freq);
455         tda18271_calc_gain_taper(fe, &freq);
456         tda18271_lookup_cid_target(fe, &freq, &cid_target, &count_limit);
457
458         tda18271_write_regs(fe, R_EP2, 1);
459         tda18271_write_regs(fe, R_EB14, 1);
460
461         /* downconvert frequency */
462         freq += 1000000;
463
464         tda18271_calc_main_pll(fe, freq);
465         tda18271_write_regs(fe, R_MPD, 4);
466
467         msleep(5); /* pll locking */
468
469         /* detection mode */
470         regs[R_EP4]  &= ~0x03;
471         regs[R_EP4]  |= 0x01;
472         tda18271_write_regs(fe, R_EP4, 1);
473
474         /* launch power detection measurement */
475         tda18271_write_regs(fe, R_EP2, 1);
476
477         /* read power detection info, stored in EB10 */
478         ret = tda18271_read_extended(fe);
479         if (tda_fail(ret))
480                 return ret;
481
482         /* algorithm initialization */
483         sgn = 1;
484         *freq_out = *freq_in;
485         bcal = 0;
486         count = 0;
487         wait = false;
488
489         while ((regs[R_EB10] & 0x3f) < cid_target) {
490                 /* downconvert updated freq to 1 MHz */
491                 freq = *freq_in + (sgn * count) + 1000000;
492
493                 tda18271_calc_main_pll(fe, freq);
494                 tda18271_write_regs(fe, R_MPD, 4);
495
496                 if (wait) {
497                         msleep(5); /* pll locking */
498                         wait = false;
499                 } else
500                         udelay(100); /* pll locking */
501
502                 /* launch power detection measurement */
503                 tda18271_write_regs(fe, R_EP2, 1);
504
505                 /* read power detection info, stored in EB10 */
506                 ret = tda18271_read_extended(fe);
507                 if (tda_fail(ret))
508                         return ret;
509
510                 count += 200;
511
512                 if (count <= count_limit)
513                         continue;
514
515                 if (sgn <= 0)
516                         break;
517
518                 sgn = -1 * sgn;
519                 count = 200;
520                 wait = true;
521         }
522
523         if ((regs[R_EB10] & 0x3f) >= cid_target) {
524                 bcal = 1;
525                 *freq_out = freq - 1000000;
526         } else
527                 bcal = 0;
528
529         tda_cal("bcal = %d, freq_in = %d, freq_out = %d (freq = %d)\n",
530                 bcal, *freq_in, *freq_out, freq);
531
532         return bcal;
533 }
534
535 static int tda18271_powerscan_init(struct dvb_frontend *fe)
536 {
537         struct tda18271_priv *priv = fe->tuner_priv;
538         unsigned char *regs = priv->tda18271_regs;
539         int ret;
540
541         /* set standard to digital */
542         regs[R_EP3]  &= ~0x1f; /* clear std bits */
543         regs[R_EP3]  |= 0x12;
544
545         /* set cal mode to normal */
546         regs[R_EP4]  &= ~0x03;
547
548         /* update IF output level */
549         regs[R_EP4]  &= ~0x1c; /* clear if level bits */
550
551         ret = tda18271_write_regs(fe, R_EP3, 2);
552         if (tda_fail(ret))
553                 goto fail;
554
555         regs[R_EB18] &= ~0x03; /* set agc1_gain to   6 dB */
556         ret = tda18271_write_regs(fe, R_EB18, 1);
557         if (tda_fail(ret))
558                 goto fail;
559
560         regs[R_EB21] &= ~0x03; /* set agc2_gain to -15 dB */
561
562         /* 1.5 MHz low pass filter */
563         regs[R_EB23] |= 0x04; /* forcelp_fc2_en = 1 */
564         regs[R_EB23] |= 0x02; /* lp_fc[2] = 1 */
565
566         ret = tda18271_write_regs(fe, R_EB21, 3);
567 fail:
568         return ret;
569 }
570
571 static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
572 {
573         struct tda18271_priv *priv = fe->tuner_priv;
574         struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state;
575         unsigned char *regs = priv->tda18271_regs;
576         int bcal, rf, i;
577         s32 divisor, dividend;
578 #define RF1 0
579 #define RF2 1
580 #define RF3 2
581         u32 rf_default[3];
582         u32 rf_freq[3];
583         s32 prog_cal[3];
584         s32 prog_tab[3];
585
586         i = tda18271_lookup_rf_band(fe, &freq, NULL);
587
588         if (tda_fail(i))
589                 return i;
590
591         rf_default[RF1] = 1000 * map[i].rf1_def;
592         rf_default[RF2] = 1000 * map[i].rf2_def;
593         rf_default[RF3] = 1000 * map[i].rf3_def;
594
595         for (rf = RF1; rf <= RF3; rf++) {
596                 if (0 == rf_default[rf])
597                         return 0;
598                 tda_cal("freq = %d, rf = %d\n", freq, rf);
599
600                 /* look for optimized calibration frequency */
601                 bcal = tda18271_powerscan(fe, &rf_default[rf], &rf_freq[rf]);
602                 if (tda_fail(bcal))
603                         return bcal;
604
605                 tda18271_calc_rf_cal(fe, &rf_freq[rf]);
606                 prog_tab[rf] = (s32)regs[R_EB14];
607
608                 if (1 == bcal)
609                         prog_cal[rf] =
610                                 (s32)tda18271_calibrate_rf(fe, rf_freq[rf]);
611                 else
612                         prog_cal[rf] = prog_tab[rf];
613
614                 switch (rf) {
615                 case RF1:
616                         map[i].rf_a1 = 0;
617                         map[i].rf_b1 = (prog_cal[RF1] - prog_tab[RF1]);
618                         map[i].rf1   = rf_freq[RF1] / 1000;
619                         break;
620                 case RF2:
621                         dividend = (prog_cal[RF2] - prog_tab[RF2] -
622                                     prog_cal[RF1] + prog_tab[RF1]);
623                         divisor = (s32)(rf_freq[RF2] - rf_freq[RF1]) / 1000;
624                         map[i].rf_a1 = (dividend / divisor);
625                         map[i].rf2   = rf_freq[RF2] / 1000;
626                         break;
627                 case RF3:
628                         dividend = (prog_cal[RF3] - prog_tab[RF3] -
629                                     prog_cal[RF2] + prog_tab[RF2]);
630                         divisor = (s32)(rf_freq[RF3] - rf_freq[RF2]) / 1000;
631                         map[i].rf_a2 = (dividend / divisor);
632                         map[i].rf_b2 = (prog_cal[RF2] - prog_tab[RF2]);
633                         map[i].rf3   = rf_freq[RF3] / 1000;
634                         break;
635                 default:
636                         BUG();
637                 }
638         }
639
640         return 0;
641 }
642
643 static int tda18271_calc_rf_filter_curve(struct dvb_frontend *fe)
644 {
645         struct tda18271_priv *priv = fe->tuner_priv;
646         unsigned int i;
647         int ret;
648
649         tda_info("tda18271: performing RF tracking filter calibration\n");
650
651         /* wait for die temperature stabilization */
652         msleep(200);
653
654         ret = tda18271_powerscan_init(fe);
655         if (tda_fail(ret))
656                 goto fail;
657
658         /* rf band calibration */
659         for (i = 0; priv->rf_cal_state[i].rfmax != 0; i++) {
660                 ret =
661                 tda18271_rf_tracking_filters_init(fe, 1000 *
662                                                   priv->rf_cal_state[i].rfmax);
663                 if (tda_fail(ret))
664                         goto fail;
665         }
666
667         priv->tm_rfcal = tda18271_read_thermometer(fe);
668 fail:
669         return ret;
670 }
671
672 /* ------------------------------------------------------------------ */
673
674 static int tda18271c2_rf_cal_init(struct dvb_frontend *fe)
675 {
676         struct tda18271_priv *priv = fe->tuner_priv;
677         unsigned char *regs = priv->tda18271_regs;
678         int ret;
679
680         /* test RF_CAL_OK to see if we need init */
681         if ((regs[R_EP1] & 0x10) == 0)
682                 priv->cal_initialized = false;
683
684         if (priv->cal_initialized)
685                 return 0;
686
687         ret = tda18271_calc_rf_filter_curve(fe);
688         if (tda_fail(ret))
689                 goto fail;
690
691         ret = tda18271_por(fe);
692         if (tda_fail(ret))
693                 goto fail;
694
695         tda_info("tda18271: RF tracking filter calibration complete\n");
696
697         priv->cal_initialized = true;
698         goto end;
699 fail:
700         tda_info("tda18271: RF tracking filter calibration failed!\n");
701 end:
702         return ret;
703 }
704
705 static int tda18271c1_rf_tracking_filter_calibration(struct dvb_frontend *fe,
706                                                      u32 freq, u32 bw)
707 {
708         struct tda18271_priv *priv = fe->tuner_priv;
709         unsigned char *regs = priv->tda18271_regs;
710         int ret;
711         u32 N = 0;
712
713         /* calculate bp filter */
714         tda18271_calc_bp_filter(fe, &freq);
715         tda18271_write_regs(fe, R_EP1, 1);
716
717         regs[R_EB4]  &= 0x07;
718         regs[R_EB4]  |= 0x60;
719         tda18271_write_regs(fe, R_EB4, 1);
720
721         regs[R_EB7]   = 0x60;
722         tda18271_write_regs(fe, R_EB7, 1);
723
724         regs[R_EB14]  = 0x00;
725         tda18271_write_regs(fe, R_EB14, 1);
726
727         regs[R_EB20]  = 0xcc;
728         tda18271_write_regs(fe, R_EB20, 1);
729
730         /* set cal mode to RF tracking filter calibration */
731         regs[R_EP4]  |= 0x03;
732
733         /* calculate cal pll */
734
735         switch (priv->mode) {
736         case TDA18271_ANALOG:
737                 N = freq - 1250000;
738                 break;
739         case TDA18271_DIGITAL:
740                 N = freq + bw / 2;
741                 break;
742         }
743
744         tda18271_calc_cal_pll(fe, N);
745
746         /* calculate main pll */
747
748         switch (priv->mode) {
749         case TDA18271_ANALOG:
750                 N = freq - 250000;
751                 break;
752         case TDA18271_DIGITAL:
753                 N = freq + bw / 2 + 1000000;
754                 break;
755         }
756
757         tda18271_calc_main_pll(fe, N);
758
759         ret = tda18271_write_regs(fe, R_EP3, 11);
760         if (tda_fail(ret))
761                 return ret;
762
763         msleep(5); /* RF tracking filter calibration initialization */
764
765         /* search for K,M,CO for RF calibration */
766         tda18271_calc_km(fe, &freq);
767         tda18271_write_regs(fe, R_EB13, 1);
768
769         /* search for rf band */
770         tda18271_calc_rf_band(fe, &freq);
771
772         /* search for gain taper */
773         tda18271_calc_gain_taper(fe, &freq);
774
775         tda18271_write_regs(fe, R_EP2, 1);
776         tda18271_write_regs(fe, R_EP1, 1);
777         tda18271_write_regs(fe, R_EP2, 1);
778         tda18271_write_regs(fe, R_EP1, 1);
779
780         regs[R_EB4]  &= 0x07;
781         regs[R_EB4]  |= 0x40;
782         tda18271_write_regs(fe, R_EB4, 1);
783
784         regs[R_EB7]   = 0x40;
785         tda18271_write_regs(fe, R_EB7, 1);
786         msleep(10); /* pll locking */
787
788         regs[R_EB20]  = 0xec;
789         tda18271_write_regs(fe, R_EB20, 1);
790         msleep(60); /* RF tracking filter calibration completion */
791
792         regs[R_EP4]  &= ~0x03; /* set cal mode to normal */
793         tda18271_write_regs(fe, R_EP4, 1);
794
795         tda18271_write_regs(fe, R_EP1, 1);
796
797         /* RF tracking filter correction for VHF_Low band */
798         if (0 == tda18271_calc_rf_cal(fe, &freq))
799                 tda18271_write_regs(fe, R_EB14, 1);
800
801         return 0;
802 }
803
804 /* ------------------------------------------------------------------ */
805
806 static int tda18271_ir_cal_init(struct dvb_frontend *fe)
807 {
808         struct tda18271_priv *priv = fe->tuner_priv;
809         unsigned char *regs = priv->tda18271_regs;
810         int ret;
811
812         ret = tda18271_read_regs(fe);
813         if (tda_fail(ret))
814                 goto fail;
815
816         /* test IR_CAL_OK to see if we need init */
817         if ((regs[R_EP1] & 0x08) == 0)
818                 ret = tda18271_init_regs(fe);
819 fail:
820         return ret;
821 }
822
823 static int tda18271_init(struct dvb_frontend *fe)
824 {
825         struct tda18271_priv *priv = fe->tuner_priv;
826         int ret;
827
828         mutex_lock(&priv->lock);
829
830         /* full power up */
831         ret = tda18271_set_standby_mode(fe, 0, 0, 0);
832         if (tda_fail(ret))
833                 goto fail;
834
835         /* initialization */
836         ret = tda18271_ir_cal_init(fe);
837         if (tda_fail(ret))
838                 goto fail;
839
840         if (priv->id == TDA18271HDC2)
841                 tda18271c2_rf_cal_init(fe);
842 fail:
843         mutex_unlock(&priv->lock);
844
845         return ret;
846 }
847
848 static int tda18271_sleep(struct dvb_frontend *fe)
849 {
850         struct tda18271_priv *priv = fe->tuner_priv;
851         int ret;
852
853         mutex_lock(&priv->lock);
854
855         /* enter standby mode, with required output features enabled */
856         ret = tda18271_toggle_output(fe, 1);
857
858         mutex_unlock(&priv->lock);
859
860         return ret;
861 }
862
863 /* ------------------------------------------------------------------ */
864
865 static int tda18271_agc(struct dvb_frontend *fe)
866 {
867         struct tda18271_priv *priv = fe->tuner_priv;
868         int ret = 0;
869
870         switch (priv->config) {
871         case TDA8290_LNA_OFF:
872                 /* no external agc configuration required */
873                 if (tda18271_debug & DBG_ADV)
874                         tda_dbg("no agc configuration provided\n");
875                 break;
876         case TDA8290_LNA_ON_BRIDGE:
877                 /* switch with GPIO of saa713x */
878                 tda_dbg("invoking callback\n");
879                 if (fe->callback)
880                         ret = fe->callback(priv->i2c_props.adap->algo_data,
881                                            DVB_FRONTEND_COMPONENT_TUNER,
882                                            TDA18271_CALLBACK_CMD_AGC_ENABLE,
883                                            priv->mode);
884                 break;
885         case TDA8290_LNA_GP0_HIGH_ON:
886         case TDA8290_LNA_GP0_HIGH_OFF:
887         default:
888                 /* n/a - currently not supported */
889                 tda_err("unsupported configuration: %d\n", priv->config);
890                 ret = -EINVAL;
891                 break;
892         }
893         return ret;
894 }
895
896 static int tda18271_tune(struct dvb_frontend *fe,
897                          struct tda18271_std_map_item *map, u32 freq, u32 bw)
898 {
899         struct tda18271_priv *priv = fe->tuner_priv;
900         int ret;
901
902         tda_dbg("freq = %d, ifc = %d, bw = %d, agc_mode = %d, std = %d\n",
903                 freq, map->if_freq, bw, map->agc_mode, map->std);
904
905         ret = tda18271_agc(fe);
906         if (tda_fail(ret))
907                 tda_warn("failed to configure agc\n");
908
909         ret = tda18271_init(fe);
910         if (tda_fail(ret))
911                 goto fail;
912
913         mutex_lock(&priv->lock);
914
915         switch (priv->id) {
916         case TDA18271HDC1:
917                 tda18271c1_rf_tracking_filter_calibration(fe, freq, bw);
918                 break;
919         case TDA18271HDC2:
920                 tda18271c2_rf_tracking_filters_correction(fe, freq);
921                 break;
922         }
923         ret = tda18271_channel_configuration(fe, map, freq, bw);
924
925         mutex_unlock(&priv->lock);
926 fail:
927         return ret;
928 }
929
930 /* ------------------------------------------------------------------ */
931
932 static int tda18271_set_params(struct dvb_frontend *fe)
933 {
934         struct dtv_frontend_properties *c = &fe->dtv_property_cache;
935         u32 delsys = c->delivery_system;
936         u32 bw = c->bandwidth_hz;
937         u32 freq = c->frequency;
938         struct tda18271_priv *priv = fe->tuner_priv;
939         struct tda18271_std_map *std_map = &priv->std;
940         struct tda18271_std_map_item *map;
941         int ret;
942
943         priv->mode = TDA18271_DIGITAL;
944
945         switch (delsys) {
946         case SYS_ATSC:
947                 map = &std_map->atsc_6;
948                 bw = 6000000;
949                 break;
950         case SYS_ISDBT:
951         case SYS_DVBT:
952         case SYS_DVBT2:
953                 if (bw <= 6000000) {
954                         map = &std_map->dvbt_6;
955                 } else if (bw <= 7000000) {
956                         map = &std_map->dvbt_7;
957                 } else {
958                         map = &std_map->dvbt_8;
959                 }
960                 break;
961         case SYS_DVBC_ANNEX_B:
962                 bw = 6000000;
963                 /* falltrough */
964         case SYS_DVBC_ANNEX_A:
965         case SYS_DVBC_ANNEX_C:
966                 if (bw <= 6000000) {
967                         map = &std_map->qam_6;
968                 } else if (bw <= 7000000) {
969                         map = &std_map->qam_7;
970                 } else {
971                         map = &std_map->qam_8;
972                 }
973                 break;
974         default:
975                 tda_warn("modulation type not supported!\n");
976                 return -EINVAL;
977         }
978
979         /* When tuning digital, the analog demod must be tri-stated */
980         if (fe->ops.analog_ops.standby)
981                 fe->ops.analog_ops.standby(fe);
982
983         ret = tda18271_tune(fe, map, freq, bw);
984
985         if (tda_fail(ret))
986                 goto fail;
987
988         priv->if_freq   = map->if_freq;
989         priv->frequency = freq;
990         priv->bandwidth = bw;
991 fail:
992         return ret;
993 }
994
995 static int tda18271_set_analog_params(struct dvb_frontend *fe,
996                                       struct analog_parameters *params)
997 {
998         struct tda18271_priv *priv = fe->tuner_priv;
999         struct tda18271_std_map *std_map = &priv->std;
1000         struct tda18271_std_map_item *map;
1001         char *mode;
1002         int ret;
1003         u32 freq = params->frequency * 125 *
1004                 ((params->mode == V4L2_TUNER_RADIO) ? 1 : 1000) / 2;
1005
1006         priv->mode = TDA18271_ANALOG;
1007
1008         if (params->mode == V4L2_TUNER_RADIO) {
1009                 map = &std_map->fm_radio;
1010                 mode = "fm";
1011         } else if (params->std & V4L2_STD_MN) {
1012                 map = &std_map->atv_mn;
1013                 mode = "MN";
1014         } else if (params->std & V4L2_STD_B) {
1015                 map = &std_map->atv_b;
1016                 mode = "B";
1017         } else if (params->std & V4L2_STD_GH) {
1018                 map = &std_map->atv_gh;
1019                 mode = "GH";
1020         } else if (params->std & V4L2_STD_PAL_I) {
1021                 map = &std_map->atv_i;
1022                 mode = "I";
1023         } else if (params->std & V4L2_STD_DK) {
1024                 map = &std_map->atv_dk;
1025                 mode = "DK";
1026         } else if (params->std & V4L2_STD_SECAM_L) {
1027                 map = &std_map->atv_l;
1028                 mode = "L";
1029         } else if (params->std & V4L2_STD_SECAM_LC) {
1030                 map = &std_map->atv_lc;
1031                 mode = "L'";
1032         } else {
1033                 map = &std_map->atv_i;
1034                 mode = "xx";
1035         }
1036
1037         tda_dbg("setting tda18271 to system %s\n", mode);
1038
1039         ret = tda18271_tune(fe, map, freq, 0);
1040
1041         if (tda_fail(ret))
1042                 goto fail;
1043
1044         priv->if_freq   = map->if_freq;
1045         priv->frequency = freq;
1046         priv->bandwidth = 0;
1047 fail:
1048         return ret;
1049 }
1050
1051 static int tda18271_release(struct dvb_frontend *fe)
1052 {
1053         struct tda18271_priv *priv = fe->tuner_priv;
1054
1055         mutex_lock(&tda18271_list_mutex);
1056
1057         if (priv)
1058                 hybrid_tuner_release_state(priv);
1059
1060         mutex_unlock(&tda18271_list_mutex);
1061
1062         fe->tuner_priv = NULL;
1063
1064         return 0;
1065 }
1066
1067 static int tda18271_get_frequency(struct dvb_frontend *fe, u32 *frequency)
1068 {
1069         struct tda18271_priv *priv = fe->tuner_priv;
1070         *frequency = priv->frequency;
1071         return 0;
1072 }
1073
1074 static int tda18271_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
1075 {
1076         struct tda18271_priv *priv = fe->tuner_priv;
1077         *bandwidth = priv->bandwidth;
1078         return 0;
1079 }
1080
1081 static int tda18271_get_if_frequency(struct dvb_frontend *fe, u32 *frequency)
1082 {
1083         struct tda18271_priv *priv = fe->tuner_priv;
1084         *frequency = (u32)priv->if_freq * 1000;
1085         return 0;
1086 }
1087
1088 /* ------------------------------------------------------------------ */
1089
1090 #define tda18271_update_std(std_cfg, name) do {                         \
1091         if (map->std_cfg.if_freq +                                      \
1092                 map->std_cfg.agc_mode + map->std_cfg.std +              \
1093                 map->std_cfg.if_lvl + map->std_cfg.rfagc_top > 0) {     \
1094                 tda_dbg("Using custom std config for %s\n", name);      \
1095                 memcpy(&std->std_cfg, &map->std_cfg,                    \
1096                         sizeof(struct tda18271_std_map_item));          \
1097         } } while (0)
1098
1099 #define tda18271_dump_std_item(std_cfg, name) do {                      \
1100         tda_dbg("(%s) if_freq = %d, agc_mode = %d, std = %d, "          \
1101                 "if_lvl = %d, rfagc_top = 0x%02x\n",                    \
1102                 name, std->std_cfg.if_freq,                             \
1103                 std->std_cfg.agc_mode, std->std_cfg.std,                \
1104                 std->std_cfg.if_lvl, std->std_cfg.rfagc_top);           \
1105         } while (0)
1106
1107 static int tda18271_dump_std_map(struct dvb_frontend *fe)
1108 {
1109         struct tda18271_priv *priv = fe->tuner_priv;
1110         struct tda18271_std_map *std = &priv->std;
1111
1112         tda_dbg("========== STANDARD MAP SETTINGS ==========\n");
1113         tda18271_dump_std_item(fm_radio, "  fm  ");
1114         tda18271_dump_std_item(atv_b,  "atv b ");
1115         tda18271_dump_std_item(atv_dk, "atv dk");
1116         tda18271_dump_std_item(atv_gh, "atv gh");
1117         tda18271_dump_std_item(atv_i,  "atv i ");
1118         tda18271_dump_std_item(atv_l,  "atv l ");
1119         tda18271_dump_std_item(atv_lc, "atv l'");
1120         tda18271_dump_std_item(atv_mn, "atv mn");
1121         tda18271_dump_std_item(atsc_6, "atsc 6");
1122         tda18271_dump_std_item(dvbt_6, "dvbt 6");
1123         tda18271_dump_std_item(dvbt_7, "dvbt 7");
1124         tda18271_dump_std_item(dvbt_8, "dvbt 8");
1125         tda18271_dump_std_item(qam_6,  "qam 6 ");
1126         tda18271_dump_std_item(qam_7,  "qam 7 ");
1127         tda18271_dump_std_item(qam_8,  "qam 8 ");
1128
1129         return 0;
1130 }
1131
1132 static int tda18271_update_std_map(struct dvb_frontend *fe,
1133                                    struct tda18271_std_map *map)
1134 {
1135         struct tda18271_priv *priv = fe->tuner_priv;
1136         struct tda18271_std_map *std = &priv->std;
1137
1138         if (!map)
1139                 return -EINVAL;
1140
1141         tda18271_update_std(fm_radio, "fm");
1142         tda18271_update_std(atv_b,  "atv b");
1143         tda18271_update_std(atv_dk, "atv dk");
1144         tda18271_update_std(atv_gh, "atv gh");
1145         tda18271_update_std(atv_i,  "atv i");
1146         tda18271_update_std(atv_l,  "atv l");
1147         tda18271_update_std(atv_lc, "atv l'");
1148         tda18271_update_std(atv_mn, "atv mn");
1149         tda18271_update_std(atsc_6, "atsc 6");
1150         tda18271_update_std(dvbt_6, "dvbt 6");
1151         tda18271_update_std(dvbt_7, "dvbt 7");
1152         tda18271_update_std(dvbt_8, "dvbt 8");
1153         tda18271_update_std(qam_6,  "qam 6");
1154         tda18271_update_std(qam_7,  "qam 7");
1155         tda18271_update_std(qam_8,  "qam 8");
1156
1157         return 0;
1158 }
1159
1160 static int tda18271_get_id(struct dvb_frontend *fe)
1161 {
1162         struct tda18271_priv *priv = fe->tuner_priv;
1163         unsigned char *regs = priv->tda18271_regs;
1164         char *name;
1165         int ret;
1166
1167         mutex_lock(&priv->lock);
1168         ret = tda18271_read_regs(fe);
1169         mutex_unlock(&priv->lock);
1170
1171         if (ret) {
1172                 tda_info("Error reading device ID @ %d-%04x, bailing out.\n",
1173                          i2c_adapter_id(priv->i2c_props.adap),
1174                          priv->i2c_props.addr);
1175                 return -EIO;
1176         }
1177
1178         switch (regs[R_ID] & 0x7f) {
1179         case 3:
1180                 name = "TDA18271HD/C1";
1181                 priv->id = TDA18271HDC1;
1182                 break;
1183         case 4:
1184                 name = "TDA18271HD/C2";
1185                 priv->id = TDA18271HDC2;
1186                 break;
1187         default:
1188                 tda_info("Unknown device (%i) detected @ %d-%04x, device not supported.\n",
1189                          regs[R_ID], i2c_adapter_id(priv->i2c_props.adap),
1190                          priv->i2c_props.addr);
1191                 return -EINVAL;
1192         }
1193
1194         tda_info("%s detected @ %d-%04x\n", name,
1195                  i2c_adapter_id(priv->i2c_props.adap), priv->i2c_props.addr);
1196
1197         return 0;
1198 }
1199
1200 static int tda18271_setup_configuration(struct dvb_frontend *fe,
1201                                         struct tda18271_config *cfg)
1202 {
1203         struct tda18271_priv *priv = fe->tuner_priv;
1204
1205         priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
1206         priv->role = (cfg) ? cfg->role : TDA18271_MASTER;
1207         priv->config = (cfg) ? cfg->config : 0;
1208         priv->small_i2c = (cfg) ?
1209                 cfg->small_i2c : TDA18271_39_BYTE_CHUNK_INIT;
1210         priv->output_opt = (cfg) ?
1211                 cfg->output_opt : TDA18271_OUTPUT_LT_XT_ON;
1212
1213         return 0;
1214 }
1215
1216 static inline int tda18271_need_cal_on_startup(struct tda18271_config *cfg)
1217 {
1218         /* tda18271_cal_on_startup == -1 when cal module option is unset */
1219         return ((tda18271_cal_on_startup == -1) ?
1220                 /* honor configuration setting */
1221                 ((cfg) && (cfg->rf_cal_on_startup)) :
1222                 /* module option overrides configuration setting */
1223                 (tda18271_cal_on_startup)) ? 1 : 0;
1224 }
1225
1226 static int tda18271_set_config(struct dvb_frontend *fe, void *priv_cfg)
1227 {
1228         struct tda18271_config *cfg = (struct tda18271_config *) priv_cfg;
1229
1230         tda18271_setup_configuration(fe, cfg);
1231
1232         if (tda18271_need_cal_on_startup(cfg))
1233                 tda18271_init(fe);
1234
1235         /* override default std map with values in config struct */
1236         if ((cfg) && (cfg->std_map))
1237                 tda18271_update_std_map(fe, cfg->std_map);
1238
1239         return 0;
1240 }
1241
1242 static const struct dvb_tuner_ops tda18271_tuner_ops = {
1243         .info = {
1244                 .name = "NXP TDA18271HD",
1245                 .frequency_min  =  45000000,
1246                 .frequency_max  = 864000000,
1247                 .frequency_step =     62500
1248         },
1249         .init              = tda18271_init,
1250         .sleep             = tda18271_sleep,
1251         .set_params        = tda18271_set_params,
1252         .set_analog_params = tda18271_set_analog_params,
1253         .release           = tda18271_release,
1254         .set_config        = tda18271_set_config,
1255         .get_frequency     = tda18271_get_frequency,
1256         .get_bandwidth     = tda18271_get_bandwidth,
1257         .get_if_frequency  = tda18271_get_if_frequency,
1258 };
1259
1260 struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
1261                                      struct i2c_adapter *i2c,
1262                                      struct tda18271_config *cfg)
1263 {
1264         struct tda18271_priv *priv = NULL;
1265         int instance, ret;
1266
1267         mutex_lock(&tda18271_list_mutex);
1268
1269         instance = hybrid_tuner_request_state(struct tda18271_priv, priv,
1270                                               hybrid_tuner_instance_list,
1271                                               i2c, addr, "tda18271");
1272         switch (instance) {
1273         case 0:
1274                 goto fail;
1275         case 1:
1276                 /* new tuner instance */
1277                 fe->tuner_priv = priv;
1278
1279                 tda18271_setup_configuration(fe, cfg);
1280
1281                 priv->cal_initialized = false;
1282                 mutex_init(&priv->lock);
1283
1284                 ret = tda18271_get_id(fe);
1285                 if (tda_fail(ret))
1286                         goto fail;
1287
1288                 ret = tda18271_assign_map_layout(fe);
1289                 if (tda_fail(ret))
1290                         goto fail;
1291
1292                 /* if delay_cal is set, delay IR & RF calibration until init()
1293                  * module option 'cal' overrides this delay */
1294                 if ((cfg->delay_cal) && (!tda18271_need_cal_on_startup(cfg)))
1295                         break;
1296
1297                 mutex_lock(&priv->lock);
1298                 tda18271_init_regs(fe);
1299
1300                 if ((tda18271_need_cal_on_startup(cfg)) &&
1301                     (priv->id == TDA18271HDC2))
1302                         tda18271c2_rf_cal_init(fe);
1303
1304                 /* enter standby mode, with required output features enabled */
1305                 ret = tda18271_toggle_output(fe, 1);
1306                 tda_fail(ret);
1307
1308                 mutex_unlock(&priv->lock);
1309                 break;
1310         default:
1311                 /* existing tuner instance */
1312                 fe->tuner_priv = priv;
1313
1314                 /* allow dvb driver to override configuration settings */
1315                 if (cfg) {
1316                         if (cfg->gate != TDA18271_GATE_ANALOG)
1317                                 priv->gate = cfg->gate;
1318                         if (cfg->role)
1319                                 priv->role = cfg->role;
1320                         if (cfg->config)
1321                                 priv->config = cfg->config;
1322                         if (cfg->small_i2c)
1323                                 priv->small_i2c = cfg->small_i2c;
1324                         if (cfg->output_opt)
1325                                 priv->output_opt = cfg->output_opt;
1326                         if (cfg->std_map)
1327                                 tda18271_update_std_map(fe, cfg->std_map);
1328                 }
1329                 if (tda18271_need_cal_on_startup(cfg))
1330                         tda18271_init(fe);
1331                 break;
1332         }
1333
1334         /* override default std map with values in config struct */
1335         if ((cfg) && (cfg->std_map))
1336                 tda18271_update_std_map(fe, cfg->std_map);
1337
1338         mutex_unlock(&tda18271_list_mutex);
1339
1340         memcpy(&fe->ops.tuner_ops, &tda18271_tuner_ops,
1341                sizeof(struct dvb_tuner_ops));
1342
1343         if (tda18271_debug & (DBG_MAP | DBG_ADV))
1344                 tda18271_dump_std_map(fe);
1345
1346         return fe;
1347 fail:
1348         mutex_unlock(&tda18271_list_mutex);
1349
1350         tda18271_release(fe);
1351         return NULL;
1352 }
1353 EXPORT_SYMBOL_GPL(tda18271_attach);
1354 MODULE_DESCRIPTION("NXP TDA18271HD analog / digital tuner driver");
1355 MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
1356 MODULE_LICENSE("GPL");
1357 MODULE_VERSION("0.4");