V4L/DVB (7026): tda18271: report when the RF tracking filter calibration has completed
[linux-2.6] / drivers / media / dvb / frontends / 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
25 int tda18271_debug;
26 module_param_named(debug, tda18271_debug, int, 0644);
27 MODULE_PARM_DESC(debug, "set debug level "
28                  "(info=1, map=2, reg=4, adv=8, cal=16 (or-able))");
29
30 static LIST_HEAD(tda18271_list);
31 static DEFINE_MUTEX(tda18271_list_mutex);
32
33 /*---------------------------------------------------------------------*/
34
35 static int tda18271_ir_cal_init(struct dvb_frontend *fe)
36 {
37         struct tda18271_priv *priv = fe->tuner_priv;
38         unsigned char *regs = priv->tda18271_regs;
39
40         tda18271_read_regs(fe);
41
42         /* test IR_CAL_OK to see if we need init */
43         if ((regs[R_EP1] & 0x08) == 0)
44                 tda18271_init_regs(fe);
45
46         return 0;
47 }
48
49 /* ------------------------------------------------------------------ */
50
51 static int tda18271_channel_configuration(struct dvb_frontend *fe,
52                                           u32 ifc, u32 freq, u32 bw, u8 std,
53                                           int radio)
54 {
55         struct tda18271_priv *priv = fe->tuner_priv;
56         unsigned char *regs = priv->tda18271_regs;
57         u32 N;
58
59         /* update TV broadcast parameters */
60
61         /* set standard */
62         regs[R_EP3]  &= ~0x1f; /* clear std bits */
63         regs[R_EP3]  |= std;
64
65         /* set cal mode to normal */
66         regs[R_EP4]  &= ~0x03;
67
68         /* update IF output level & IF notch frequency */
69         regs[R_EP4]  &= ~0x1c; /* clear if level bits */
70
71         switch (priv->mode) {
72         case TDA18271_ANALOG:
73                 regs[R_MPD]  &= ~0x80; /* IF notch = 0 */
74                 break;
75         case TDA18271_DIGITAL:
76                 regs[R_EP4]  |= 0x04; /* IF level = 1 */
77                 regs[R_MPD]  |= 0x80; /* IF notch = 1 */
78                 break;
79         }
80
81         if (radio)
82                 regs[R_EP4]  |=  0x80;
83         else
84                 regs[R_EP4]  &= ~0x80;
85
86         /* update RF_TOP / IF_TOP */
87         switch (priv->mode) {
88         case TDA18271_ANALOG:
89                 regs[R_EB22]  = 0x2c;
90                 break;
91         case TDA18271_DIGITAL:
92                 regs[R_EB22]  = 0x37;
93                 break;
94         }
95         tda18271_write_regs(fe, R_EB22, 1);
96
97         /* --------------------------------------------------------------- */
98
99         /* disable Power Level Indicator */
100         regs[R_EP1]  |= 0x40;
101
102         /* frequency dependent parameters */
103
104         tda18271_calc_ir_measure(fe, &freq);
105
106         tda18271_calc_bp_filter(fe, &freq);
107
108         tda18271_calc_rf_band(fe, &freq);
109
110         tda18271_calc_gain_taper(fe, &freq);
111
112         /* --------------------------------------------------------------- */
113
114         /* dual tuner and agc1 extra configuration */
115
116         /* main vco when Master, cal vco when slave */
117         regs[R_EB1]  |= 0x04; /* FIXME: assumes master */
118
119         /* agc1 always active */
120         regs[R_EB1]  &= ~0x02;
121
122         /* agc1 has priority on agc2 */
123         regs[R_EB1]  &= ~0x01;
124
125         tda18271_write_regs(fe, R_EB1, 1);
126
127         /* --------------------------------------------------------------- */
128
129         N = freq + ifc;
130
131         /* FIXME: assumes master */
132         tda18271_calc_main_pll(fe, N);
133         tda18271_write_regs(fe, R_MPD, 4);
134
135         tda18271_write_regs(fe, R_TM, 7);
136
137         /* main pll charge pump source */
138         regs[R_EB4] |= 0x20;
139         tda18271_write_regs(fe, R_EB4, 1);
140
141         msleep(1);
142
143         /* normal operation for the main pll */
144         regs[R_EB4] &= ~0x20;
145         tda18271_write_regs(fe, R_EB4, 1);
146
147         msleep(5);
148
149         return 0;
150 }
151
152 static int tda18271_read_thermometer(struct dvb_frontend *fe)
153 {
154         struct tda18271_priv *priv = fe->tuner_priv;
155         unsigned char *regs = priv->tda18271_regs;
156         int tm;
157
158         /* switch thermometer on */
159         regs[R_TM]   |= 0x10;
160         tda18271_write_regs(fe, R_TM, 1);
161
162         /* read thermometer info */
163         tda18271_read_regs(fe);
164
165         if ((((regs[R_TM] & 0x0f) == 0x00) && ((regs[R_TM] & 0x20) == 0x20)) ||
166             (((regs[R_TM] & 0x0f) == 0x08) && ((regs[R_TM] & 0x20) == 0x00))) {
167
168                 if ((regs[R_TM] & 0x20) == 0x20)
169                         regs[R_TM] &= ~0x20;
170                 else
171                         regs[R_TM] |= 0x20;
172
173                 tda18271_write_regs(fe, R_TM, 1);
174
175                 msleep(10); /* temperature sensing */
176
177                 /* read thermometer info */
178                 tda18271_read_regs(fe);
179         }
180
181         tm = tda18271_lookup_thermometer(fe);
182
183         /* switch thermometer off */
184         regs[R_TM]   &= ~0x10;
185         tda18271_write_regs(fe, R_TM, 1);
186
187         /* set CAL mode to normal */
188         regs[R_EP4]  &= ~0x03;
189         tda18271_write_regs(fe, R_EP4, 1);
190
191         return tm;
192 }
193
194 static int tda18271_rf_tracking_filters_correction(struct dvb_frontend *fe,
195                                                    u32 freq)
196 {
197         struct tda18271_priv *priv = fe->tuner_priv;
198         struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state;
199         unsigned char *regs = priv->tda18271_regs;
200         int tm_current, rfcal_comp, approx, i;
201         u8 dc_over_dt, rf_tab;
202
203         /* power up */
204         regs[R_EP3]  &= ~0xe0; /* sm = 0, sm_lt = 0, sm_xt = 0 */
205         tda18271_write_regs(fe, R_EP3, 1);
206
207         /* read die current temperature */
208         tm_current = tda18271_read_thermometer(fe);
209
210         /* frequency dependent parameters */
211
212         tda18271_calc_rf_cal(fe, &freq);
213         rf_tab = regs[R_EB14];
214
215         i = tda18271_lookup_rf_band(fe, &freq, NULL);
216         if (i < 0)
217                 return -EINVAL;
218
219         if ((0 == map[i].rf3) || (freq / 1000 < map[i].rf2)) {
220                 approx = map[i].rf_a1 *
221                         (freq / 1000 - map[i].rf1) + map[i].rf_b1 + rf_tab;
222         } else {
223                 approx = map[i].rf_a2 *
224                         (freq / 1000 - map[i].rf2) + map[i].rf_b2 + rf_tab;
225         }
226
227         if (approx < 0)
228                 approx = 0;
229         if (approx > 255)
230                 approx = 255;
231
232         tda18271_lookup_map(fe, RF_CAL_DC_OVER_DT, &freq, &dc_over_dt);
233
234         /* calculate temperature compensation */
235         rfcal_comp = dc_over_dt * (tm_current - priv->tm_rfcal);
236
237         regs[R_EB14] = approx + rfcal_comp;
238         tda18271_write_regs(fe, R_EB14, 1);
239
240         return 0;
241 }
242
243 static int tda18271_por(struct dvb_frontend *fe)
244 {
245         struct tda18271_priv *priv = fe->tuner_priv;
246         unsigned char *regs = priv->tda18271_regs;
247
248         /* power up detector 1 */
249         regs[R_EB12] &= ~0x20;
250         tda18271_write_regs(fe, R_EB12, 1);
251
252         regs[R_EB18] &= ~0x80; /* turn agc1 loop on */
253         regs[R_EB18] &= ~0x03; /* set agc1_gain to  6 dB */
254         tda18271_write_regs(fe, R_EB18, 1);
255
256         regs[R_EB21] |= 0x03; /* set agc2_gain to -6 dB */
257
258         /* POR mode */
259         regs[R_EP3]  &= ~0xe0; /* clear sm, sm_lt, sm_xt */
260         regs[R_EP3]  |= 0x80; /* sm = 1, sm_lt = 0, sm_xt = 0 */
261         tda18271_write_regs(fe, R_EP3, 1);
262
263         /* disable 1.5 MHz low pass filter */
264         regs[R_EB23] &= ~0x04; /* forcelp_fc2_en = 0 */
265         regs[R_EB23] &= ~0x02; /* XXX: lp_fc[2] = 0 */
266         tda18271_write_regs(fe, R_EB21, 3);
267
268         return 0;
269 }
270
271 static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq)
272 {
273         struct tda18271_priv *priv = fe->tuner_priv;
274         unsigned char *regs = priv->tda18271_regs;
275         u32 N;
276
277         /* set CAL mode to normal */
278         regs[R_EP4]  &= ~0x03;
279         tda18271_write_regs(fe, R_EP4, 1);
280
281         /* switch off agc1 */
282         regs[R_EP3]  |= 0x40; /* sm_lt = 1 */
283
284         regs[R_EB18] |= 0x03; /* set agc1_gain to 15 dB */
285         tda18271_write_regs(fe, R_EB18, 1);
286
287         /* frequency dependent parameters */
288
289         tda18271_calc_bp_filter(fe, &freq);
290         tda18271_calc_gain_taper(fe, &freq);
291         tda18271_calc_rf_band(fe, &freq);
292         tda18271_calc_km(fe, &freq);
293
294         tda18271_write_regs(fe, R_EP1, 3);
295         tda18271_write_regs(fe, R_EB13, 1);
296
297         /* main pll charge pump source */
298         regs[R_EB4]  |= 0x20;
299         tda18271_write_regs(fe, R_EB4, 1);
300
301         /* cal pll charge pump source */
302         regs[R_EB7]  |= 0x20;
303         tda18271_write_regs(fe, R_EB7, 1);
304
305         /* force dcdc converter to 0 V */
306         regs[R_EB14] = 0x00;
307         tda18271_write_regs(fe, R_EB14, 1);
308
309         /* disable plls lock */
310         regs[R_EB20] &= ~0x20;
311         tda18271_write_regs(fe, R_EB20, 1);
312
313         /* set CAL mode to RF tracking filter calibration */
314         regs[R_EP4]  |= 0x03;
315         tda18271_write_regs(fe, R_EP4, 2);
316
317         /* --------------------------------------------------------------- */
318
319         /* set the internal calibration signal */
320         N = freq;
321
322         tda18271_calc_main_pll(fe, N);
323         tda18271_write_regs(fe, R_MPD, 4);
324
325         /* downconvert internal calibration */
326         N += 1000000;
327
328         tda18271_calc_main_pll(fe, N);
329         tda18271_write_regs(fe, R_MPD, 4);
330
331         msleep(5);
332
333         tda18271_write_regs(fe, R_EP2, 1);
334         tda18271_write_regs(fe, R_EP1, 1);
335         tda18271_write_regs(fe, R_EP2, 1);
336         tda18271_write_regs(fe, R_EP1, 1);
337
338         /* --------------------------------------------------------------- */
339
340         /* normal operation for the main pll */
341         regs[R_EB4] &= ~0x20;
342         tda18271_write_regs(fe, R_EB4, 1);
343
344         /* normal operation for the cal pll  */
345         regs[R_EB7] &= ~0x20;
346         tda18271_write_regs(fe, R_EB7, 1);
347
348         msleep(5); /* plls locking */
349
350         /* launch the rf tracking filters calibration */
351         regs[R_EB20]  |= 0x20;
352         tda18271_write_regs(fe, R_EB20, 1);
353
354         msleep(60); /* calibration */
355
356         /* --------------------------------------------------------------- */
357
358         /* set CAL mode to normal */
359         regs[R_EP4]  &= ~0x03;
360
361         /* switch on agc1 */
362         regs[R_EP3]  &= ~0x40; /* sm_lt = 0 */
363
364         regs[R_EB18] &= ~0x03; /* set agc1_gain to  6 dB */
365         tda18271_write_regs(fe, R_EB18, 1);
366
367         tda18271_write_regs(fe, R_EP3, 2);
368
369         /* synchronization */
370         tda18271_write_regs(fe, R_EP1, 1);
371
372         /* get calibration result */
373         tda18271_read_extended(fe);
374
375         return regs[R_EB14];
376 }
377
378 static int tda18271_powerscan(struct dvb_frontend *fe,
379                               u32 *freq_in, u32 *freq_out)
380 {
381         struct tda18271_priv *priv = fe->tuner_priv;
382         unsigned char *regs = priv->tda18271_regs;
383         int sgn, bcal, count, wait;
384         u8 cid_target;
385         u16 count_limit;
386         u32 freq;
387
388         freq = *freq_in;
389
390         tda18271_calc_rf_band(fe, &freq);
391         tda18271_calc_rf_cal(fe, &freq);
392         tda18271_calc_gain_taper(fe, &freq);
393         tda18271_lookup_cid_target(fe, &freq, &cid_target, &count_limit);
394
395         tda18271_write_regs(fe, R_EP2, 1);
396         tda18271_write_regs(fe, R_EB14, 1);
397
398         /* downconvert frequency */
399         freq += 1000000;
400
401         tda18271_calc_main_pll(fe, freq);
402         tda18271_write_regs(fe, R_MPD, 4);
403
404         msleep(5); /* pll locking */
405
406         /* detection mode */
407         regs[R_EP4]  &= ~0x03;
408         regs[R_EP4]  |= 0x01;
409         tda18271_write_regs(fe, R_EP4, 1);
410
411         /* launch power detection measurement */
412         tda18271_write_regs(fe, R_EP2, 1);
413
414         /* read power detection info, stored in EB10 */
415         tda18271_read_extended(fe);
416
417         /* algorithm initialization */
418         sgn = 1;
419         *freq_out = *freq_in;
420         bcal = 0;
421         count = 0;
422         wait = false;
423
424         while ((regs[R_EB10] & 0x3f) < cid_target) {
425                 /* downconvert updated freq to 1 MHz */
426                 freq = *freq_in + (sgn * count) + 1000000;
427
428                 tda18271_calc_main_pll(fe, freq);
429                 tda18271_write_regs(fe, R_MPD, 4);
430
431                 if (wait) {
432                         msleep(5); /* pll locking */
433                         wait = false;
434                 } else
435                         udelay(100); /* pll locking */
436
437                 /* launch power detection measurement */
438                 tda18271_write_regs(fe, R_EP2, 1);
439
440                 /* read power detection info, stored in EB10 */
441                 tda18271_read_extended(fe);
442
443                 count += 200;
444
445                 if (count < count_limit)
446                         continue;
447
448                 if (sgn <= 0)
449                         break;
450
451                 sgn = -1 * sgn;
452                 count = 200;
453                 wait = true;
454         }
455
456         if ((regs[R_EB10] & 0x3f) >= cid_target) {
457                 bcal = 1;
458                 *freq_out = freq - 1000000;
459         } else
460                 bcal = 0;
461
462         tda_cal("bcal = %d, freq_in = %d, freq_out = %d (freq = %d)\n",
463                 bcal, *freq_in, *freq_out, freq);
464
465         return bcal;
466 }
467
468 static int tda18271_powerscan_init(struct dvb_frontend *fe)
469 {
470         struct tda18271_priv *priv = fe->tuner_priv;
471         unsigned char *regs = priv->tda18271_regs;
472
473         /* set standard to digital */
474         regs[R_EP3]  &= ~0x1f; /* clear std bits */
475         regs[R_EP3]  |= 0x12;
476
477         /* set cal mode to normal */
478         regs[R_EP4]  &= ~0x03;
479
480         /* update IF output level & IF notch frequency */
481         regs[R_EP4]  &= ~0x1c; /* clear if level bits */
482
483         tda18271_write_regs(fe, R_EP3, 2);
484
485         regs[R_EB18] &= ~0x03; /* set agc1_gain to   6 dB */
486         tda18271_write_regs(fe, R_EB18, 1);
487
488         regs[R_EB21] &= ~0x03; /* set agc2_gain to -15 dB */
489
490         /* 1.5 MHz low pass filter */
491         regs[R_EB23] |= 0x04; /* forcelp_fc2_en = 1 */
492         regs[R_EB23] |= 0x02; /* lp_fc[2] = 1 */
493
494         tda18271_write_regs(fe, R_EB21, 3);
495
496         return 0;
497 }
498
499 static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
500 {
501         struct tda18271_priv *priv = fe->tuner_priv;
502         struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state;
503         unsigned char *regs = priv->tda18271_regs;
504         int bcal, rf, i;
505 #define RF1 0
506 #define RF2 1
507 #define RF3 2
508         u32 rf_default[3];
509         u32 rf_freq[3];
510         u8 prog_cal[3];
511         u8 prog_tab[3];
512
513         i = tda18271_lookup_rf_band(fe, &freq, NULL);
514
515         if (i < 0)
516                 return i;
517
518         rf_default[RF1] = 1000 * map[i].rf1_def;
519         rf_default[RF2] = 1000 * map[i].rf2_def;
520         rf_default[RF3] = 1000 * map[i].rf3_def;
521
522         for (rf = RF1; rf <= RF3; rf++) {
523                 if (0 == rf_default[rf])
524                         return 0;
525                 tda_cal("freq = %d, rf = %d\n", freq, rf);
526
527                 /* look for optimized calibration frequency */
528                 bcal = tda18271_powerscan(fe, &rf_default[rf], &rf_freq[rf]);
529
530                 tda18271_calc_rf_cal(fe, &rf_freq[rf]);
531                 prog_tab[rf] = regs[R_EB14];
532
533                 if (1 == bcal)
534                         prog_cal[rf] = tda18271_calibrate_rf(fe, rf_freq[rf]);
535                 else
536                         prog_cal[rf] = prog_tab[rf];
537
538                 switch (rf) {
539                 case RF1:
540                         map[i].rf_a1 = 0;
541                         map[i].rf_b1 = prog_cal[RF1] - prog_tab[RF1];
542                         map[i].rf1   = rf_freq[RF1] / 1000;
543                         break;
544                 case RF2:
545                         map[i].rf_a1 = (prog_cal[RF2] - prog_tab[RF2] -
546                                         prog_cal[RF1] + prog_tab[RF1]) /
547                                 ((rf_freq[RF2] - rf_freq[RF1]) / 1000);
548                         map[i].rf2   = rf_freq[RF2] / 1000;
549                         break;
550                 case RF3:
551                         map[i].rf_a2 = (prog_cal[RF3] - prog_tab[RF3] -
552                                         prog_cal[RF2] + prog_tab[RF2]) /
553                                 ((rf_freq[RF3] - rf_freq[RF2]) / 1000);
554                         map[i].rf_b2 = prog_cal[RF2] - prog_tab[RF2];
555                         map[i].rf3   = rf_freq[RF3] / 1000;
556                         break;
557                 default:
558                         BUG();
559                 }
560         }
561
562         return 0;
563 }
564
565 static int tda18271_calc_rf_filter_curve(struct dvb_frontend *fe)
566 {
567         struct tda18271_priv *priv = fe->tuner_priv;
568         unsigned int i;
569
570         tda_info("tda18271: performing RF tracking filter calibration\n");
571
572         /* wait for die temperature stabilization */
573         msleep(200);
574
575         tda18271_powerscan_init(fe);
576
577         /* rf band calibration */
578         for (i = 0; priv->rf_cal_state[i].rfmax != 0; i++)
579                 tda18271_rf_tracking_filters_init(fe, 1000 *
580                                                   priv->rf_cal_state[i].rfmax);
581
582         priv->tm_rfcal = tda18271_read_thermometer(fe);
583
584         return 0;
585 }
586
587 /* ------------------------------------------------------------------ */
588
589 static int tda18271_rf_cal_init(struct dvb_frontend *fe)
590 {
591         struct tda18271_priv *priv = fe->tuner_priv;
592
593         if (priv->cal_initialized)
594                 return 0;
595
596         tda18271_calc_rf_filter_curve(fe);
597
598         tda18271_por(fe);
599
600         tda_info("tda18271: RF tracking filter calibration complete\n");
601
602         priv->cal_initialized = true;
603
604         return 0;
605 }
606
607 static int tda18271_init(struct dvb_frontend *fe)
608 {
609         struct tda18271_priv *priv = fe->tuner_priv;
610
611         mutex_lock(&priv->lock);
612
613         /* initialization */
614         tda18271_ir_cal_init(fe);
615
616         if (priv->id == TDA18271HDC2)
617                 tda18271_rf_cal_init(fe);
618
619         mutex_unlock(&priv->lock);
620
621         return 0;
622 }
623
624 static int tda18271c2_tune(struct dvb_frontend *fe,
625                            u32 ifc, u32 freq, u32 bw, u8 std, int radio)
626 {
627         struct tda18271_priv *priv = fe->tuner_priv;
628
629         tda_dbg("freq = %d, ifc = %d\n", freq, ifc);
630
631         tda18271_init(fe);
632
633         mutex_lock(&priv->lock);
634
635         tda18271_rf_tracking_filters_correction(fe, freq);
636
637         tda18271_channel_configuration(fe, ifc, freq, bw, std, radio);
638
639         mutex_unlock(&priv->lock);
640
641         return 0;
642 }
643
644 /* ------------------------------------------------------------------ */
645
646 static int tda18271c1_tune(struct dvb_frontend *fe,
647                            u32 ifc, u32 freq, u32 bw, u8 std, int radio)
648 {
649         struct tda18271_priv *priv = fe->tuner_priv;
650         unsigned char *regs = priv->tda18271_regs;
651         u32 N = 0;
652
653         tda18271_init(fe);
654
655         mutex_lock(&priv->lock);
656
657         tda_dbg("freq = %d, ifc = %d\n", freq, ifc);
658
659         /* RF tracking filter calibration */
660
661         /* calculate bp filter */
662         tda18271_calc_bp_filter(fe, &freq);
663         tda18271_write_regs(fe, R_EP1, 1);
664
665         regs[R_EB4]  &= 0x07;
666         regs[R_EB4]  |= 0x60;
667         tda18271_write_regs(fe, R_EB4, 1);
668
669         regs[R_EB7]   = 0x60;
670         tda18271_write_regs(fe, R_EB7, 1);
671
672         regs[R_EB14]  = 0x00;
673         tda18271_write_regs(fe, R_EB14, 1);
674
675         regs[R_EB20]  = 0xcc;
676         tda18271_write_regs(fe, R_EB20, 1);
677
678         /* set cal mode to RF tracking filter calibration */
679         regs[R_EP4]  |= 0x03;
680
681         /* calculate cal pll */
682
683         switch (priv->mode) {
684         case TDA18271_ANALOG:
685                 N = freq - 1250000;
686                 break;
687         case TDA18271_DIGITAL:
688                 N = freq + bw / 2;
689                 break;
690         }
691
692         tda18271_calc_cal_pll(fe, N);
693
694         /* calculate main pll */
695
696         switch (priv->mode) {
697         case TDA18271_ANALOG:
698                 N = freq - 250000;
699                 break;
700         case TDA18271_DIGITAL:
701                 N = freq + bw / 2 + 1000000;
702                 break;
703         }
704
705         tda18271_calc_main_pll(fe, N);
706
707         tda18271_write_regs(fe, R_EP3, 11);
708         msleep(5); /* RF tracking filter calibration initialization */
709
710         /* search for K,M,CO for RF calibration */
711         tda18271_calc_km(fe, &freq);
712         tda18271_write_regs(fe, R_EB13, 1);
713
714         /* search for rf band */
715         tda18271_calc_rf_band(fe, &freq);
716
717         /* search for gain taper */
718         tda18271_calc_gain_taper(fe, &freq);
719
720         tda18271_write_regs(fe, R_EP2, 1);
721         tda18271_write_regs(fe, R_EP1, 1);
722         tda18271_write_regs(fe, R_EP2, 1);
723         tda18271_write_regs(fe, R_EP1, 1);
724
725         regs[R_EB4]  &= 0x07;
726         regs[R_EB4]  |= 0x40;
727         tda18271_write_regs(fe, R_EB4, 1);
728
729         regs[R_EB7]   = 0x40;
730         tda18271_write_regs(fe, R_EB7, 1);
731         msleep(10);
732
733         regs[R_EB20]  = 0xec;
734         tda18271_write_regs(fe, R_EB20, 1);
735         msleep(60); /* RF tracking filter calibration completion */
736
737         regs[R_EP4]  &= ~0x03; /* set cal mode to normal */
738         tda18271_write_regs(fe, R_EP4, 1);
739
740         tda18271_write_regs(fe, R_EP1, 1);
741
742         /* RF tracking filter correction for VHF_Low band */
743         if (0 == tda18271_calc_rf_cal(fe, &freq))
744                 tda18271_write_regs(fe, R_EB14, 1);
745
746         /* Channel Configuration */
747
748         switch (priv->mode) {
749         case TDA18271_ANALOG:
750                 regs[R_EB22]  = 0x2c;
751                 break;
752         case TDA18271_DIGITAL:
753                 regs[R_EB22]  = 0x37;
754                 break;
755         }
756         tda18271_write_regs(fe, R_EB22, 1);
757
758         regs[R_EP1]  |= 0x40; /* set dis power level on */
759
760         /* set standard */
761         regs[R_EP3]  &= ~0x1f; /* clear std bits */
762
763         /* see table 22 */
764         regs[R_EP3]  |= std;
765
766         regs[R_EP4]  &= ~0x03; /* set cal mode to normal */
767
768         regs[R_EP4]  &= ~0x1c; /* clear if level bits */
769         switch (priv->mode) {
770         case TDA18271_ANALOG:
771                 regs[R_MPD]  &= ~0x80; /* IF notch = 0 */
772                 break;
773         case TDA18271_DIGITAL:
774                 regs[R_EP4]  |= 0x04;
775                 regs[R_MPD]  |= 0x80;
776                 break;
777         }
778
779         if (radio)
780                 regs[R_EP4]  |=  0x80;
781         else
782                 regs[R_EP4]  &= ~0x80;
783
784         /* image rejection validity */
785         tda18271_calc_ir_measure(fe, &freq);
786
787         /* calculate MAIN PLL */
788         N = freq + ifc;
789
790         tda18271_calc_main_pll(fe, N);
791
792         tda18271_write_regs(fe, R_TM, 15);
793         msleep(5);
794         mutex_unlock(&priv->lock);
795
796         return 0;
797 }
798
799 static inline int tda18271_tune(struct dvb_frontend *fe,
800                                 u32 ifc, u32 freq, u32 bw, u8 std, int radio)
801 {
802         struct tda18271_priv *priv = fe->tuner_priv;
803         int ret = -EINVAL;
804
805         switch (priv->id) {
806         case TDA18271HDC1:
807                 ret = tda18271c1_tune(fe, ifc, freq, bw, std, radio);
808                 break;
809         case TDA18271HDC2:
810                 ret = tda18271c2_tune(fe, ifc, freq, bw, std, radio);
811                 break;
812         }
813         return ret;
814 }
815
816 /* ------------------------------------------------------------------ */
817
818 static int tda18271_set_params(struct dvb_frontend *fe,
819                                struct dvb_frontend_parameters *params)
820 {
821         struct tda18271_priv *priv = fe->tuner_priv;
822         struct tda18271_std_map *std_map = &priv->std;
823         int ret;
824         u8 std;
825         u16 sgIF;
826         u32 bw, freq = params->frequency;
827
828         priv->mode = TDA18271_DIGITAL;
829
830         /* see table 22 */
831         if (fe->ops.info.type == FE_ATSC) {
832                 switch (params->u.vsb.modulation) {
833                 case VSB_8:
834                 case VSB_16:
835                         std  = std_map->atsc_6.std_bits;
836                         sgIF = std_map->atsc_6.if_freq;
837                         break;
838                 case QAM_64:
839                 case QAM_256:
840                         std  = std_map->qam_6.std_bits;
841                         sgIF = std_map->qam_6.if_freq;
842                         break;
843                 default:
844                         tda_warn("modulation not set!\n");
845                         return -EINVAL;
846                 }
847 #if 0
848                 /* userspace request is already center adjusted */
849                 freq += 1750000; /* Adjust to center (+1.75MHZ) */
850 #endif
851                 bw = 6000000;
852         } else if (fe->ops.info.type == FE_OFDM) {
853                 switch (params->u.ofdm.bandwidth) {
854                 case BANDWIDTH_6_MHZ:
855                         bw = 6000000;
856                         std  = std_map->dvbt_6.std_bits;
857                         sgIF = std_map->dvbt_6.if_freq;
858                         break;
859                 case BANDWIDTH_7_MHZ:
860                         bw = 7000000;
861                         std  = std_map->dvbt_7.std_bits;
862                         sgIF = std_map->dvbt_7.if_freq;
863                         break;
864                 case BANDWIDTH_8_MHZ:
865                         bw = 8000000;
866                         std  = std_map->dvbt_8.std_bits;
867                         sgIF = std_map->dvbt_8.if_freq;
868                         break;
869                 default:
870                         tda_warn("bandwidth not set!\n");
871                         return -EINVAL;
872                 }
873         } else {
874                 tda_warn("modulation type not supported!\n");
875                 return -EINVAL;
876         }
877
878         ret = tda18271_tune(fe, sgIF * 1000, freq, bw, std, 0);
879
880         if (ret < 0)
881                 goto fail;
882
883         priv->frequency = freq;
884         priv->bandwidth = (fe->ops.info.type == FE_OFDM) ?
885                 params->u.ofdm.bandwidth : 0;
886 fail:
887         return ret;
888 }
889
890 static int tda18271_set_analog_params(struct dvb_frontend *fe,
891                                       struct analog_parameters *params)
892 {
893         struct tda18271_priv *priv = fe->tuner_priv;
894         struct tda18271_std_map *std_map = &priv->std;
895         char *mode;
896         int ret, radio = 0;
897         u8 std;
898         u16 sgIF;
899         u32 freq = params->frequency * 62500;
900
901         priv->mode = TDA18271_ANALOG;
902
903         if (params->mode == V4L2_TUNER_RADIO) {
904                 radio = 1;
905                 freq = freq / 1000;
906                 std  = std_map->fm_radio.std_bits;
907                 sgIF = std_map->fm_radio.if_freq;
908                 mode = "fm";
909         } else if (params->std & V4L2_STD_MN) {
910                 std  = std_map->atv_mn.std_bits;
911                 sgIF = std_map->atv_mn.if_freq;
912                 mode = "MN";
913         } else if (params->std & V4L2_STD_B) {
914                 std  = std_map->atv_b.std_bits;
915                 sgIF = std_map->atv_b.if_freq;
916                 mode = "B";
917         } else if (params->std & V4L2_STD_GH) {
918                 std  = std_map->atv_gh.std_bits;
919                 sgIF = std_map->atv_gh.if_freq;
920                 mode = "GH";
921         } else if (params->std & V4L2_STD_PAL_I) {
922                 std  = std_map->atv_i.std_bits;
923                 sgIF = std_map->atv_i.if_freq;
924                 mode = "I";
925         } else if (params->std & V4L2_STD_DK) {
926                 std  = std_map->atv_dk.std_bits;
927                 sgIF = std_map->atv_dk.if_freq;
928                 mode = "DK";
929         } else if (params->std & V4L2_STD_SECAM_L) {
930                 std  = std_map->atv_l.std_bits;
931                 sgIF = std_map->atv_l.if_freq;
932                 mode = "L";
933         } else if (params->std & V4L2_STD_SECAM_LC) {
934                 std  = std_map->atv_lc.std_bits;
935                 sgIF = std_map->atv_lc.if_freq;
936                 mode = "L'";
937         } else {
938                 std  = std_map->atv_i.std_bits;
939                 sgIF = std_map->atv_i.if_freq;
940                 mode = "xx";
941         }
942
943         tda_dbg("setting tda18271 to system %s\n", mode);
944
945         ret = tda18271_tune(fe, sgIF * 1000, freq, 0, std, radio);
946
947         if (ret < 0)
948                 goto fail;
949
950         priv->frequency = freq;
951         priv->bandwidth = 0;
952 fail:
953         return ret;
954 }
955
956 static int tda18271_release(struct dvb_frontend *fe)
957 {
958         struct tda18271_priv *priv = fe->tuner_priv;
959
960         mutex_lock(&tda18271_list_mutex);
961
962         priv->count--;
963
964         if (!priv->count) {
965                 tda_dbg("destroying instance @ %d-%04x\n",
966                         i2c_adapter_id(priv->i2c_adap),
967                         priv->i2c_addr);
968                 list_del(&priv->tda18271_list);
969
970                 kfree(priv);
971         }
972         mutex_unlock(&tda18271_list_mutex);
973
974         fe->tuner_priv = NULL;
975
976         return 0;
977 }
978
979 static int tda18271_get_frequency(struct dvb_frontend *fe, u32 *frequency)
980 {
981         struct tda18271_priv *priv = fe->tuner_priv;
982         *frequency = priv->frequency;
983         return 0;
984 }
985
986 static int tda18271_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
987 {
988         struct tda18271_priv *priv = fe->tuner_priv;
989         *bandwidth = priv->bandwidth;
990         return 0;
991 }
992
993 /* ------------------------------------------------------------------ */
994
995 #define tda18271_update_std(std_cfg, name) do {                         \
996         if (map->std_cfg.if_freq + map->std_cfg.std_bits > 0) {         \
997                 tda_dbg("Using custom std config for %s\n", name);      \
998                 memcpy(&std->std_cfg, &map->std_cfg,                    \
999                         sizeof(struct tda18271_std_map_item));          \
1000         } } while (0)
1001
1002 #define tda18271_dump_std_item(std_cfg, name) do {                      \
1003         tda_dbg("(%s) if freq = %d, std bits = 0x%02x\n",               \
1004                 name, std->std_cfg.if_freq, std->std_cfg.std_bits);     \
1005         } while (0)
1006
1007 static int tda18271_dump_std_map(struct dvb_frontend *fe)
1008 {
1009         struct tda18271_priv *priv = fe->tuner_priv;
1010         struct tda18271_std_map *std = &priv->std;
1011
1012         tda_dbg("========== STANDARD MAP SETTINGS ==========\n");
1013         tda18271_dump_std_item(fm_radio, "fm");
1014         tda18271_dump_std_item(atv_b,  "pal b");
1015         tda18271_dump_std_item(atv_dk, "pal dk");
1016         tda18271_dump_std_item(atv_gh, "pal gh");
1017         tda18271_dump_std_item(atv_i,  "pal i");
1018         tda18271_dump_std_item(atv_l,  "pal l");
1019         tda18271_dump_std_item(atv_lc, "pal l'");
1020         tda18271_dump_std_item(atv_mn, "atv mn");
1021         tda18271_dump_std_item(atsc_6, "atsc 6");
1022         tda18271_dump_std_item(dvbt_6, "dvbt 6");
1023         tda18271_dump_std_item(dvbt_7, "dvbt 7");
1024         tda18271_dump_std_item(dvbt_8, "dvbt 8");
1025         tda18271_dump_std_item(qam_6,  "qam 6");
1026         tda18271_dump_std_item(qam_8,  "qam 8");
1027
1028         return 0;
1029 }
1030
1031 static int tda18271_update_std_map(struct dvb_frontend *fe,
1032                                    struct tda18271_std_map *map)
1033 {
1034         struct tda18271_priv *priv = fe->tuner_priv;
1035         struct tda18271_std_map *std = &priv->std;
1036
1037         if (!map)
1038                 return -EINVAL;
1039
1040         tda18271_update_std(fm_radio, "fm");
1041         tda18271_update_std(atv_b,  "atv b");
1042         tda18271_update_std(atv_dk, "atv dk");
1043         tda18271_update_std(atv_gh, "atv gh");
1044         tda18271_update_std(atv_i,  "atv i");
1045         tda18271_update_std(atv_l,  "atv l");
1046         tda18271_update_std(atv_lc, "atv l'");
1047         tda18271_update_std(atv_mn, "atv mn");
1048         tda18271_update_std(atsc_6, "atsc 6");
1049         tda18271_update_std(dvbt_6, "dvbt 6");
1050         tda18271_update_std(dvbt_7, "dvbt 7");
1051         tda18271_update_std(dvbt_8, "dvbt 8");
1052         tda18271_update_std(qam_6,  "qam 6");
1053         tda18271_update_std(qam_8,  "qam 8");
1054
1055         return 0;
1056 }
1057
1058 static int tda18271_get_id(struct dvb_frontend *fe)
1059 {
1060         struct tda18271_priv *priv = fe->tuner_priv;
1061         unsigned char *regs = priv->tda18271_regs;
1062         char *name;
1063         int ret = 0;
1064
1065         mutex_lock(&priv->lock);
1066         tda18271_read_regs(fe);
1067         mutex_unlock(&priv->lock);
1068
1069         switch (regs[R_ID] & 0x7f) {
1070         case 3:
1071                 name = "TDA18271HD/C1";
1072                 priv->id = TDA18271HDC1;
1073                 break;
1074         case 4:
1075                 name = "TDA18271HD/C2";
1076                 priv->id = TDA18271HDC2;
1077                 break;
1078         default:
1079                 name = "Unknown device";
1080                 ret = -EINVAL;
1081                 break;
1082         }
1083
1084         tda_info("%s detected @ %d-%04x%s\n", name,
1085                  i2c_adapter_id(priv->i2c_adap), priv->i2c_addr,
1086                  (0 == ret) ? "" : ", device not supported.");
1087
1088         return ret;
1089 }
1090
1091 static struct dvb_tuner_ops tda18271_tuner_ops = {
1092         .info = {
1093                 .name = "NXP TDA18271HD",
1094                 .frequency_min  =  45000000,
1095                 .frequency_max  = 864000000,
1096                 .frequency_step =     62500
1097         },
1098         .init              = tda18271_init,
1099         .set_params        = tda18271_set_params,
1100         .set_analog_params = tda18271_set_analog_params,
1101         .release           = tda18271_release,
1102         .get_frequency     = tda18271_get_frequency,
1103         .get_bandwidth     = tda18271_get_bandwidth,
1104 };
1105
1106 struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
1107                                      struct i2c_adapter *i2c,
1108                                      struct tda18271_config *cfg)
1109 {
1110         struct tda18271_priv *priv = NULL;
1111         int state_found = 0;
1112
1113         mutex_lock(&tda18271_list_mutex);
1114
1115         list_for_each_entry(priv, &tda18271_list, tda18271_list) {
1116                 if ((i2c_adapter_id(priv->i2c_adap) == i2c_adapter_id(i2c)) &&
1117                     (priv->i2c_addr == addr)) {
1118                         tda_dbg("attaching existing tuner @ %d-%04x\n",
1119                                 i2c_adapter_id(priv->i2c_adap),
1120                                 priv->i2c_addr);
1121                         priv->count++;
1122                         fe->tuner_priv = priv;
1123                         state_found = 1;
1124                         /* allow dvb driver to override i2c gate setting */
1125                         if ((cfg) && (cfg->gate != TDA18271_GATE_ANALOG))
1126                                 priv->gate = cfg->gate;
1127                         break;
1128                 }
1129         }
1130         if (state_found == 0) {
1131                 tda_dbg("creating new tuner instance @ %d-%04x\n",
1132                         i2c_adapter_id(i2c), addr);
1133
1134                 priv = kzalloc(sizeof(struct tda18271_priv), GFP_KERNEL);
1135                 if (priv == NULL) {
1136                         mutex_unlock(&tda18271_list_mutex);
1137                         return NULL;
1138                 }
1139
1140                 priv->i2c_addr = addr;
1141                 priv->i2c_adap = i2c;
1142                 priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
1143                 priv->cal_initialized = false;
1144                 mutex_init(&priv->lock);
1145                 priv->count++;
1146
1147                 fe->tuner_priv = priv;
1148
1149                 list_add_tail(&priv->tda18271_list, &tda18271_list);
1150
1151                 if (tda18271_get_id(fe) < 0)
1152                         goto fail;
1153
1154                 if (tda18271_assign_map_layout(fe) < 0)
1155                         goto fail;
1156
1157                 mutex_lock(&priv->lock);
1158                 tda18271_init_regs(fe);
1159                 mutex_unlock(&priv->lock);
1160         }
1161
1162         /* override default std map with values in config struct */
1163         if ((cfg) && (cfg->std_map))
1164                 tda18271_update_std_map(fe, cfg->std_map);
1165
1166         mutex_unlock(&tda18271_list_mutex);
1167
1168         memcpy(&fe->ops.tuner_ops, &tda18271_tuner_ops,
1169                sizeof(struct dvb_tuner_ops));
1170
1171         if (tda18271_debug & DBG_MAP)
1172                 tda18271_dump_std_map(fe);
1173
1174         return fe;
1175 fail:
1176         mutex_unlock(&tda18271_list_mutex);
1177
1178         tda18271_release(fe);
1179         return NULL;
1180 }
1181 EXPORT_SYMBOL_GPL(tda18271_attach);
1182 MODULE_DESCRIPTION("NXP TDA18271HD analog / digital tuner driver");
1183 MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
1184 MODULE_LICENSE("GPL");
1185 MODULE_VERSION("0.2");
1186
1187 /*
1188  * Overrides for Emacs so that we follow Linus's tabbing style.
1189  * ---------------------------------------------------------------------------
1190  * Local variables:
1191  * c-basic-offset: 8
1192  * End:
1193  */