V4L/DVB (7027): tda18271: put the device in standby mode during sleep()
[powerpc.git] / 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         tda18271_set_standby_mode(fe, 0, 0, 0);
205
206         /* read die current temperature */
207         tm_current = tda18271_read_thermometer(fe);
208
209         /* frequency dependent parameters */
210
211         tda18271_calc_rf_cal(fe, &freq);
212         rf_tab = regs[R_EB14];
213
214         i = tda18271_lookup_rf_band(fe, &freq, NULL);
215         if (i < 0)
216                 return -EINVAL;
217
218         if ((0 == map[i].rf3) || (freq / 1000 < map[i].rf2)) {
219                 approx = map[i].rf_a1 *
220                         (freq / 1000 - map[i].rf1) + map[i].rf_b1 + rf_tab;
221         } else {
222                 approx = map[i].rf_a2 *
223                         (freq / 1000 - map[i].rf2) + map[i].rf_b2 + rf_tab;
224         }
225
226         if (approx < 0)
227                 approx = 0;
228         if (approx > 255)
229                 approx = 255;
230
231         tda18271_lookup_map(fe, RF_CAL_DC_OVER_DT, &freq, &dc_over_dt);
232
233         /* calculate temperature compensation */
234         rfcal_comp = dc_over_dt * (tm_current - priv->tm_rfcal);
235
236         regs[R_EB14] = approx + rfcal_comp;
237         tda18271_write_regs(fe, R_EB14, 1);
238
239         return 0;
240 }
241
242 static int tda18271_por(struct dvb_frontend *fe)
243 {
244         struct tda18271_priv *priv = fe->tuner_priv;
245         unsigned char *regs = priv->tda18271_regs;
246
247         /* power up detector 1 */
248         regs[R_EB12] &= ~0x20;
249         tda18271_write_regs(fe, R_EB12, 1);
250
251         regs[R_EB18] &= ~0x80; /* turn agc1 loop on */
252         regs[R_EB18] &= ~0x03; /* set agc1_gain to  6 dB */
253         tda18271_write_regs(fe, R_EB18, 1);
254
255         regs[R_EB21] |= 0x03; /* set agc2_gain to -6 dB */
256
257         /* POR mode */
258         tda18271_set_standby_mode(fe, 1, 0, 0);
259
260         /* disable 1.5 MHz low pass filter */
261         regs[R_EB23] &= ~0x04; /* forcelp_fc2_en = 0 */
262         regs[R_EB23] &= ~0x02; /* XXX: lp_fc[2] = 0 */
263         tda18271_write_regs(fe, R_EB21, 3);
264
265         return 0;
266 }
267
268 static int tda18271_calibrate_rf(struct dvb_frontend *fe, u32 freq)
269 {
270         struct tda18271_priv *priv = fe->tuner_priv;
271         unsigned char *regs = priv->tda18271_regs;
272         u32 N;
273
274         /* set CAL mode to normal */
275         regs[R_EP4]  &= ~0x03;
276         tda18271_write_regs(fe, R_EP4, 1);
277
278         /* switch off agc1 */
279         regs[R_EP3]  |= 0x40; /* sm_lt = 1 */
280
281         regs[R_EB18] |= 0x03; /* set agc1_gain to 15 dB */
282         tda18271_write_regs(fe, R_EB18, 1);
283
284         /* frequency dependent parameters */
285
286         tda18271_calc_bp_filter(fe, &freq);
287         tda18271_calc_gain_taper(fe, &freq);
288         tda18271_calc_rf_band(fe, &freq);
289         tda18271_calc_km(fe, &freq);
290
291         tda18271_write_regs(fe, R_EP1, 3);
292         tda18271_write_regs(fe, R_EB13, 1);
293
294         /* main pll charge pump source */
295         regs[R_EB4]  |= 0x20;
296         tda18271_write_regs(fe, R_EB4, 1);
297
298         /* cal pll charge pump source */
299         regs[R_EB7]  |= 0x20;
300         tda18271_write_regs(fe, R_EB7, 1);
301
302         /* force dcdc converter to 0 V */
303         regs[R_EB14] = 0x00;
304         tda18271_write_regs(fe, R_EB14, 1);
305
306         /* disable plls lock */
307         regs[R_EB20] &= ~0x20;
308         tda18271_write_regs(fe, R_EB20, 1);
309
310         /* set CAL mode to RF tracking filter calibration */
311         regs[R_EP4]  |= 0x03;
312         tda18271_write_regs(fe, R_EP4, 2);
313
314         /* --------------------------------------------------------------- */
315
316         /* set the internal calibration signal */
317         N = freq;
318
319         tda18271_calc_main_pll(fe, N);
320         tda18271_write_regs(fe, R_MPD, 4);
321
322         /* downconvert internal calibration */
323         N += 1000000;
324
325         tda18271_calc_main_pll(fe, N);
326         tda18271_write_regs(fe, R_MPD, 4);
327
328         msleep(5);
329
330         tda18271_write_regs(fe, R_EP2, 1);
331         tda18271_write_regs(fe, R_EP1, 1);
332         tda18271_write_regs(fe, R_EP2, 1);
333         tda18271_write_regs(fe, R_EP1, 1);
334
335         /* --------------------------------------------------------------- */
336
337         /* normal operation for the main pll */
338         regs[R_EB4] &= ~0x20;
339         tda18271_write_regs(fe, R_EB4, 1);
340
341         /* normal operation for the cal pll  */
342         regs[R_EB7] &= ~0x20;
343         tda18271_write_regs(fe, R_EB7, 1);
344
345         msleep(5); /* plls locking */
346
347         /* launch the rf tracking filters calibration */
348         regs[R_EB20]  |= 0x20;
349         tda18271_write_regs(fe, R_EB20, 1);
350
351         msleep(60); /* calibration */
352
353         /* --------------------------------------------------------------- */
354
355         /* set CAL mode to normal */
356         regs[R_EP4]  &= ~0x03;
357
358         /* switch on agc1 */
359         regs[R_EP3]  &= ~0x40; /* sm_lt = 0 */
360
361         regs[R_EB18] &= ~0x03; /* set agc1_gain to  6 dB */
362         tda18271_write_regs(fe, R_EB18, 1);
363
364         tda18271_write_regs(fe, R_EP3, 2);
365
366         /* synchronization */
367         tda18271_write_regs(fe, R_EP1, 1);
368
369         /* get calibration result */
370         tda18271_read_extended(fe);
371
372         return regs[R_EB14];
373 }
374
375 static int tda18271_powerscan(struct dvb_frontend *fe,
376                               u32 *freq_in, u32 *freq_out)
377 {
378         struct tda18271_priv *priv = fe->tuner_priv;
379         unsigned char *regs = priv->tda18271_regs;
380         int sgn, bcal, count, wait;
381         u8 cid_target;
382         u16 count_limit;
383         u32 freq;
384
385         freq = *freq_in;
386
387         tda18271_calc_rf_band(fe, &freq);
388         tda18271_calc_rf_cal(fe, &freq);
389         tda18271_calc_gain_taper(fe, &freq);
390         tda18271_lookup_cid_target(fe, &freq, &cid_target, &count_limit);
391
392         tda18271_write_regs(fe, R_EP2, 1);
393         tda18271_write_regs(fe, R_EB14, 1);
394
395         /* downconvert frequency */
396         freq += 1000000;
397
398         tda18271_calc_main_pll(fe, freq);
399         tda18271_write_regs(fe, R_MPD, 4);
400
401         msleep(5); /* pll locking */
402
403         /* detection mode */
404         regs[R_EP4]  &= ~0x03;
405         regs[R_EP4]  |= 0x01;
406         tda18271_write_regs(fe, R_EP4, 1);
407
408         /* launch power detection measurement */
409         tda18271_write_regs(fe, R_EP2, 1);
410
411         /* read power detection info, stored in EB10 */
412         tda18271_read_extended(fe);
413
414         /* algorithm initialization */
415         sgn = 1;
416         *freq_out = *freq_in;
417         bcal = 0;
418         count = 0;
419         wait = false;
420
421         while ((regs[R_EB10] & 0x3f) < cid_target) {
422                 /* downconvert updated freq to 1 MHz */
423                 freq = *freq_in + (sgn * count) + 1000000;
424
425                 tda18271_calc_main_pll(fe, freq);
426                 tda18271_write_regs(fe, R_MPD, 4);
427
428                 if (wait) {
429                         msleep(5); /* pll locking */
430                         wait = false;
431                 } else
432                         udelay(100); /* pll locking */
433
434                 /* launch power detection measurement */
435                 tda18271_write_regs(fe, R_EP2, 1);
436
437                 /* read power detection info, stored in EB10 */
438                 tda18271_read_extended(fe);
439
440                 count += 200;
441
442                 if (count < count_limit)
443                         continue;
444
445                 if (sgn <= 0)
446                         break;
447
448                 sgn = -1 * sgn;
449                 count = 200;
450                 wait = true;
451         }
452
453         if ((regs[R_EB10] & 0x3f) >= cid_target) {
454                 bcal = 1;
455                 *freq_out = freq - 1000000;
456         } else
457                 bcal = 0;
458
459         tda_cal("bcal = %d, freq_in = %d, freq_out = %d (freq = %d)\n",
460                 bcal, *freq_in, *freq_out, freq);
461
462         return bcal;
463 }
464
465 static int tda18271_powerscan_init(struct dvb_frontend *fe)
466 {
467         struct tda18271_priv *priv = fe->tuner_priv;
468         unsigned char *regs = priv->tda18271_regs;
469
470         /* set standard to digital */
471         regs[R_EP3]  &= ~0x1f; /* clear std bits */
472         regs[R_EP3]  |= 0x12;
473
474         /* set cal mode to normal */
475         regs[R_EP4]  &= ~0x03;
476
477         /* update IF output level & IF notch frequency */
478         regs[R_EP4]  &= ~0x1c; /* clear if level bits */
479
480         tda18271_write_regs(fe, R_EP3, 2);
481
482         regs[R_EB18] &= ~0x03; /* set agc1_gain to   6 dB */
483         tda18271_write_regs(fe, R_EB18, 1);
484
485         regs[R_EB21] &= ~0x03; /* set agc2_gain to -15 dB */
486
487         /* 1.5 MHz low pass filter */
488         regs[R_EB23] |= 0x04; /* forcelp_fc2_en = 1 */
489         regs[R_EB23] |= 0x02; /* lp_fc[2] = 1 */
490
491         tda18271_write_regs(fe, R_EB21, 3);
492
493         return 0;
494 }
495
496 static int tda18271_rf_tracking_filters_init(struct dvb_frontend *fe, u32 freq)
497 {
498         struct tda18271_priv *priv = fe->tuner_priv;
499         struct tda18271_rf_tracking_filter_cal *map = priv->rf_cal_state;
500         unsigned char *regs = priv->tda18271_regs;
501         int bcal, rf, i;
502 #define RF1 0
503 #define RF2 1
504 #define RF3 2
505         u32 rf_default[3];
506         u32 rf_freq[3];
507         u8 prog_cal[3];
508         u8 prog_tab[3];
509
510         i = tda18271_lookup_rf_band(fe, &freq, NULL);
511
512         if (i < 0)
513                 return i;
514
515         rf_default[RF1] = 1000 * map[i].rf1_def;
516         rf_default[RF2] = 1000 * map[i].rf2_def;
517         rf_default[RF3] = 1000 * map[i].rf3_def;
518
519         for (rf = RF1; rf <= RF3; rf++) {
520                 if (0 == rf_default[rf])
521                         return 0;
522                 tda_cal("freq = %d, rf = %d\n", freq, rf);
523
524                 /* look for optimized calibration frequency */
525                 bcal = tda18271_powerscan(fe, &rf_default[rf], &rf_freq[rf]);
526
527                 tda18271_calc_rf_cal(fe, &rf_freq[rf]);
528                 prog_tab[rf] = regs[R_EB14];
529
530                 if (1 == bcal)
531                         prog_cal[rf] = tda18271_calibrate_rf(fe, rf_freq[rf]);
532                 else
533                         prog_cal[rf] = prog_tab[rf];
534
535                 switch (rf) {
536                 case RF1:
537                         map[i].rf_a1 = 0;
538                         map[i].rf_b1 = prog_cal[RF1] - prog_tab[RF1];
539                         map[i].rf1   = rf_freq[RF1] / 1000;
540                         break;
541                 case RF2:
542                         map[i].rf_a1 = (prog_cal[RF2] - prog_tab[RF2] -
543                                         prog_cal[RF1] + prog_tab[RF1]) /
544                                 ((rf_freq[RF2] - rf_freq[RF1]) / 1000);
545                         map[i].rf2   = rf_freq[RF2] / 1000;
546                         break;
547                 case RF3:
548                         map[i].rf_a2 = (prog_cal[RF3] - prog_tab[RF3] -
549                                         prog_cal[RF2] + prog_tab[RF2]) /
550                                 ((rf_freq[RF3] - rf_freq[RF2]) / 1000);
551                         map[i].rf_b2 = prog_cal[RF2] - prog_tab[RF2];
552                         map[i].rf3   = rf_freq[RF3] / 1000;
553                         break;
554                 default:
555                         BUG();
556                 }
557         }
558
559         return 0;
560 }
561
562 static int tda18271_calc_rf_filter_curve(struct dvb_frontend *fe)
563 {
564         struct tda18271_priv *priv = fe->tuner_priv;
565         unsigned int i;
566
567         tda_info("tda18271: performing RF tracking filter calibration\n");
568
569         /* wait for die temperature stabilization */
570         msleep(200);
571
572         tda18271_powerscan_init(fe);
573
574         /* rf band calibration */
575         for (i = 0; priv->rf_cal_state[i].rfmax != 0; i++)
576                 tda18271_rf_tracking_filters_init(fe, 1000 *
577                                                   priv->rf_cal_state[i].rfmax);
578
579         priv->tm_rfcal = tda18271_read_thermometer(fe);
580
581         return 0;
582 }
583
584 /* ------------------------------------------------------------------ */
585
586 static int tda18271_rf_cal_init(struct dvb_frontend *fe)
587 {
588         struct tda18271_priv *priv = fe->tuner_priv;
589
590         if (priv->cal_initialized)
591                 return 0;
592
593         tda18271_calc_rf_filter_curve(fe);
594
595         tda18271_por(fe);
596
597         tda_info("tda18271: RF tracking filter calibration complete\n");
598
599         priv->cal_initialized = true;
600
601         return 0;
602 }
603
604 static int tda18271_init(struct dvb_frontend *fe)
605 {
606         struct tda18271_priv *priv = fe->tuner_priv;
607
608         mutex_lock(&priv->lock);
609
610         /* power up */
611         tda18271_set_standby_mode(fe, 0, 0, 0);
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_sleep(struct dvb_frontend *fe)
957 {
958         struct tda18271_priv *priv = fe->tuner_priv;
959
960         mutex_lock(&priv->lock);
961
962         /* standby mode w/ slave tuner output
963          * & loop thru & xtal oscillator on */
964         tda18271_set_standby_mode(fe, 1, 0, 0);
965
966         mutex_unlock(&priv->lock);
967
968         return 0;
969 }
970
971 static int tda18271_release(struct dvb_frontend *fe)
972 {
973         struct tda18271_priv *priv = fe->tuner_priv;
974
975         mutex_lock(&tda18271_list_mutex);
976
977         priv->count--;
978
979         if (!priv->count) {
980                 tda_dbg("destroying instance @ %d-%04x\n",
981                         i2c_adapter_id(priv->i2c_adap),
982                         priv->i2c_addr);
983                 list_del(&priv->tda18271_list);
984
985                 kfree(priv);
986         }
987         mutex_unlock(&tda18271_list_mutex);
988
989         fe->tuner_priv = NULL;
990
991         return 0;
992 }
993
994 static int tda18271_get_frequency(struct dvb_frontend *fe, u32 *frequency)
995 {
996         struct tda18271_priv *priv = fe->tuner_priv;
997         *frequency = priv->frequency;
998         return 0;
999 }
1000
1001 static int tda18271_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
1002 {
1003         struct tda18271_priv *priv = fe->tuner_priv;
1004         *bandwidth = priv->bandwidth;
1005         return 0;
1006 }
1007
1008 /* ------------------------------------------------------------------ */
1009
1010 #define tda18271_update_std(std_cfg, name) do {                         \
1011         if (map->std_cfg.if_freq + map->std_cfg.std_bits > 0) {         \
1012                 tda_dbg("Using custom std config for %s\n", name);      \
1013                 memcpy(&std->std_cfg, &map->std_cfg,                    \
1014                         sizeof(struct tda18271_std_map_item));          \
1015         } } while (0)
1016
1017 #define tda18271_dump_std_item(std_cfg, name) do {                      \
1018         tda_dbg("(%s) if freq = %d, std bits = 0x%02x\n",               \
1019                 name, std->std_cfg.if_freq, std->std_cfg.std_bits);     \
1020         } while (0)
1021
1022 static int tda18271_dump_std_map(struct dvb_frontend *fe)
1023 {
1024         struct tda18271_priv *priv = fe->tuner_priv;
1025         struct tda18271_std_map *std = &priv->std;
1026
1027         tda_dbg("========== STANDARD MAP SETTINGS ==========\n");
1028         tda18271_dump_std_item(fm_radio, "fm");
1029         tda18271_dump_std_item(atv_b,  "pal b");
1030         tda18271_dump_std_item(atv_dk, "pal dk");
1031         tda18271_dump_std_item(atv_gh, "pal gh");
1032         tda18271_dump_std_item(atv_i,  "pal i");
1033         tda18271_dump_std_item(atv_l,  "pal l");
1034         tda18271_dump_std_item(atv_lc, "pal l'");
1035         tda18271_dump_std_item(atv_mn, "atv mn");
1036         tda18271_dump_std_item(atsc_6, "atsc 6");
1037         tda18271_dump_std_item(dvbt_6, "dvbt 6");
1038         tda18271_dump_std_item(dvbt_7, "dvbt 7");
1039         tda18271_dump_std_item(dvbt_8, "dvbt 8");
1040         tda18271_dump_std_item(qam_6,  "qam 6");
1041         tda18271_dump_std_item(qam_8,  "qam 8");
1042
1043         return 0;
1044 }
1045
1046 static int tda18271_update_std_map(struct dvb_frontend *fe,
1047                                    struct tda18271_std_map *map)
1048 {
1049         struct tda18271_priv *priv = fe->tuner_priv;
1050         struct tda18271_std_map *std = &priv->std;
1051
1052         if (!map)
1053                 return -EINVAL;
1054
1055         tda18271_update_std(fm_radio, "fm");
1056         tda18271_update_std(atv_b,  "atv b");
1057         tda18271_update_std(atv_dk, "atv dk");
1058         tda18271_update_std(atv_gh, "atv gh");
1059         tda18271_update_std(atv_i,  "atv i");
1060         tda18271_update_std(atv_l,  "atv l");
1061         tda18271_update_std(atv_lc, "atv l'");
1062         tda18271_update_std(atv_mn, "atv mn");
1063         tda18271_update_std(atsc_6, "atsc 6");
1064         tda18271_update_std(dvbt_6, "dvbt 6");
1065         tda18271_update_std(dvbt_7, "dvbt 7");
1066         tda18271_update_std(dvbt_8, "dvbt 8");
1067         tda18271_update_std(qam_6,  "qam 6");
1068         tda18271_update_std(qam_8,  "qam 8");
1069
1070         return 0;
1071 }
1072
1073 static int tda18271_get_id(struct dvb_frontend *fe)
1074 {
1075         struct tda18271_priv *priv = fe->tuner_priv;
1076         unsigned char *regs = priv->tda18271_regs;
1077         char *name;
1078         int ret = 0;
1079
1080         mutex_lock(&priv->lock);
1081         tda18271_read_regs(fe);
1082         mutex_unlock(&priv->lock);
1083
1084         switch (regs[R_ID] & 0x7f) {
1085         case 3:
1086                 name = "TDA18271HD/C1";
1087                 priv->id = TDA18271HDC1;
1088                 break;
1089         case 4:
1090                 name = "TDA18271HD/C2";
1091                 priv->id = TDA18271HDC2;
1092                 break;
1093         default:
1094                 name = "Unknown device";
1095                 ret = -EINVAL;
1096                 break;
1097         }
1098
1099         tda_info("%s detected @ %d-%04x%s\n", name,
1100                  i2c_adapter_id(priv->i2c_adap), priv->i2c_addr,
1101                  (0 == ret) ? "" : ", device not supported.");
1102
1103         return ret;
1104 }
1105
1106 static struct dvb_tuner_ops tda18271_tuner_ops = {
1107         .info = {
1108                 .name = "NXP TDA18271HD",
1109                 .frequency_min  =  45000000,
1110                 .frequency_max  = 864000000,
1111                 .frequency_step =     62500
1112         },
1113         .init              = tda18271_init,
1114         .sleep             = tda18271_sleep,
1115         .set_params        = tda18271_set_params,
1116         .set_analog_params = tda18271_set_analog_params,
1117         .release           = tda18271_release,
1118         .get_frequency     = tda18271_get_frequency,
1119         .get_bandwidth     = tda18271_get_bandwidth,
1120 };
1121
1122 struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
1123                                      struct i2c_adapter *i2c,
1124                                      struct tda18271_config *cfg)
1125 {
1126         struct tda18271_priv *priv = NULL;
1127         int state_found = 0;
1128
1129         mutex_lock(&tda18271_list_mutex);
1130
1131         list_for_each_entry(priv, &tda18271_list, tda18271_list) {
1132                 if ((i2c_adapter_id(priv->i2c_adap) == i2c_adapter_id(i2c)) &&
1133                     (priv->i2c_addr == addr)) {
1134                         tda_dbg("attaching existing tuner @ %d-%04x\n",
1135                                 i2c_adapter_id(priv->i2c_adap),
1136                                 priv->i2c_addr);
1137                         priv->count++;
1138                         fe->tuner_priv = priv;
1139                         state_found = 1;
1140                         /* allow dvb driver to override i2c gate setting */
1141                         if ((cfg) && (cfg->gate != TDA18271_GATE_ANALOG))
1142                                 priv->gate = cfg->gate;
1143                         break;
1144                 }
1145         }
1146         if (state_found == 0) {
1147                 tda_dbg("creating new tuner instance @ %d-%04x\n",
1148                         i2c_adapter_id(i2c), addr);
1149
1150                 priv = kzalloc(sizeof(struct tda18271_priv), GFP_KERNEL);
1151                 if (priv == NULL) {
1152                         mutex_unlock(&tda18271_list_mutex);
1153                         return NULL;
1154                 }
1155
1156                 priv->i2c_addr = addr;
1157                 priv->i2c_adap = i2c;
1158                 priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
1159                 priv->cal_initialized = false;
1160                 mutex_init(&priv->lock);
1161                 priv->count++;
1162
1163                 fe->tuner_priv = priv;
1164
1165                 list_add_tail(&priv->tda18271_list, &tda18271_list);
1166
1167                 if (tda18271_get_id(fe) < 0)
1168                         goto fail;
1169
1170                 if (tda18271_assign_map_layout(fe) < 0)
1171                         goto fail;
1172
1173                 mutex_lock(&priv->lock);
1174                 tda18271_init_regs(fe);
1175                 mutex_unlock(&priv->lock);
1176         }
1177
1178         /* override default std map with values in config struct */
1179         if ((cfg) && (cfg->std_map))
1180                 tda18271_update_std_map(fe, cfg->std_map);
1181
1182         mutex_unlock(&tda18271_list_mutex);
1183
1184         memcpy(&fe->ops.tuner_ops, &tda18271_tuner_ops,
1185                sizeof(struct dvb_tuner_ops));
1186
1187         if (tda18271_debug & DBG_MAP)
1188                 tda18271_dump_std_map(fe);
1189
1190         return fe;
1191 fail:
1192         mutex_unlock(&tda18271_list_mutex);
1193
1194         tda18271_release(fe);
1195         return NULL;
1196 }
1197 EXPORT_SYMBOL_GPL(tda18271_attach);
1198 MODULE_DESCRIPTION("NXP TDA18271HD analog / digital tuner driver");
1199 MODULE_AUTHOR("Michael Krufky <mkrufky@linuxtv.org>");
1200 MODULE_LICENSE("GPL");
1201 MODULE_VERSION("0.2");
1202
1203 /*
1204  * Overrides for Emacs so that we follow Linus's tabbing style.
1205  * ---------------------------------------------------------------------------
1206  * Local variables:
1207  * c-basic-offset: 8
1208  * End:
1209  */