V4L/DVB (6230): dvb-pll: add module option to force dvb-pll desc id (for debug use...
[safe/jmp/linux-2.6] / drivers / media / dvb / frontends / dvb-pll.c
1 /*
2  * descriptions + helper functions for simple dvb plls.
3  *
4  * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
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/module.h>
22 #include <linux/dvb/frontend.h>
23 #include <asm/types.h>
24
25 #include "dvb-pll.h"
26
27 struct dvb_pll_priv {
28         /* pll number */
29         int nr;
30
31         /* i2c details */
32         int pll_i2c_address;
33         struct i2c_adapter *i2c;
34
35         /* the PLL descriptor */
36         struct dvb_pll_desc *pll_desc;
37
38         /* cached frequency/bandwidth */
39         u32 frequency;
40         u32 bandwidth;
41 };
42
43 #define DVB_PLL_MAX 64
44
45 static unsigned int dvb_pll_devcount;
46
47 static int debug = 0;
48 module_param(debug, int, 0644);
49 MODULE_PARM_DESC(debug, "enable verbose debug messages");
50
51 static unsigned int input[DVB_PLL_MAX] = { [ 0 ... (DVB_PLL_MAX-1) ] = 0 };
52 module_param_array(input, int, NULL, 0644);
53 MODULE_PARM_DESC(input,"specify rf input choice, 0 for autoselect (default)");
54
55 static unsigned int id[DVB_PLL_MAX] =
56         { [ 0 ... (DVB_PLL_MAX-1) ] = DVB_PLL_UNDEFINED };
57 module_param_array(id, int, NULL, 0644);
58 MODULE_PARM_DESC(id, "force pll id to use (DEBUG ONLY)");
59
60 /* ----------------------------------------------------------- */
61
62 struct dvb_pll_desc {
63         char *name;
64         u32  min;
65         u32  max;
66         u32  iffreq;
67         void (*set)(struct dvb_frontend *fe, u8 *buf,
68                     const struct dvb_frontend_parameters *params);
69         u8   *initdata;
70         u8   *sleepdata;
71         int  count;
72         struct {
73                 u32 limit;
74                 u32 stepsize;
75                 u8  config;
76                 u8  cb;
77         } entries[12];
78 };
79
80 /* ----------------------------------------------------------- */
81 /* descriptions                                                */
82
83 /* Set AGC TOP value to 103 dBuV:
84         0x80 = Control Byte
85         0x40 = 250 uA charge pump (irrelevant)
86         0x18 = Aux Byte to follow
87         0x06 = 64.5 kHz divider (irrelevant)
88         0x01 = Disable Vt (aka sleep)
89
90         0x00 = AGC Time constant 2s Iagc = 300 nA (vs 0x80 = 9 nA)
91         0x50 = AGC Take over point = 103 dBuV */
92 static u8 tua603x_agc103[] = { 2, 0x80|0x40|0x18|0x06|0x01, 0x00|0x50 };
93
94 /*      0x04 = 166.67 kHz divider
95
96         0x80 = AGC Time constant 50ms Iagc = 9 uA
97         0x20 = AGC Take over point = 112 dBuV */
98 static u8 tua603x_agc112[] = { 2, 0x80|0x40|0x18|0x04|0x01, 0x80|0x20 };
99
100 static struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
101         .name  = "Thomson dtt7579",
102         .min   = 177000000,
103         .max   = 858000000,
104         .iffreq= 36166667,
105         .sleepdata = (u8[]){ 2, 0xb4, 0x03 },
106         .count = 4,
107         .entries = {
108                 {  443250000, 166667, 0xb4, 0x02 },
109                 {  542000000, 166667, 0xb4, 0x08 },
110                 {  771000000, 166667, 0xbc, 0x08 },
111                 {  999999999, 166667, 0xf4, 0x08 },
112         },
113 };
114
115 static struct dvb_pll_desc dvb_pll_thomson_dtt7610 = {
116         .name  = "Thomson dtt7610",
117         .min   =  44000000,
118         .max   = 958000000,
119         .iffreq= 44000000,
120         .count = 3,
121         .entries = {
122                 { 157250000, 62500, 0x8e, 0x39 },
123                 { 454000000, 62500, 0x8e, 0x3a },
124                 { 999999999, 62500, 0x8e, 0x3c },
125         },
126 };
127
128 static void thomson_dtt759x_bw(struct dvb_frontend *fe, u8 *buf,
129                                const struct dvb_frontend_parameters *params)
130 {
131         if (BANDWIDTH_7_MHZ == params->u.ofdm.bandwidth)
132                 buf[3] |= 0x10;
133 }
134
135 static struct dvb_pll_desc dvb_pll_thomson_dtt759x = {
136         .name  = "Thomson dtt759x",
137         .min   = 177000000,
138         .max   = 896000000,
139         .set   = thomson_dtt759x_bw,
140         .iffreq= 36166667,
141         .sleepdata = (u8[]){ 2, 0x84, 0x03 },
142         .count = 5,
143         .entries = {
144                 {  264000000, 166667, 0xb4, 0x02 },
145                 {  470000000, 166667, 0xbc, 0x02 },
146                 {  735000000, 166667, 0xbc, 0x08 },
147                 {  835000000, 166667, 0xf4, 0x08 },
148                 {  999999999, 166667, 0xfc, 0x08 },
149         },
150 };
151
152 static struct dvb_pll_desc dvb_pll_lg_z201 = {
153         .name  = "LG z201",
154         .min   = 174000000,
155         .max   = 862000000,
156         .iffreq= 36166667,
157         .sleepdata = (u8[]){ 2, 0xbc, 0x03 },
158         .count = 5,
159         .entries = {
160                 {  157500000, 166667, 0xbc, 0x01 },
161                 {  443250000, 166667, 0xbc, 0x02 },
162                 {  542000000, 166667, 0xbc, 0x04 },
163                 {  830000000, 166667, 0xf4, 0x04 },
164                 {  999999999, 166667, 0xfc, 0x04 },
165         },
166 };
167
168 static struct dvb_pll_desc dvb_pll_microtune_4042 = {
169         .name  = "Microtune 4042 FI5",
170         .min   =  57000000,
171         .max   = 858000000,
172         .iffreq= 44000000,
173         .count = 3,
174         .entries = {
175                 { 162000000, 62500, 0x8e, 0xa1 },
176                 { 457000000, 62500, 0x8e, 0x91 },
177                 { 999999999, 62500, 0x8e, 0x31 },
178         },
179 };
180
181 static struct dvb_pll_desc dvb_pll_thomson_dtt761x = {
182         /* DTT 7611 7611A 7612 7613 7613A 7614 7615 7615A */
183         .name  = "Thomson dtt761x",
184         .min   =  57000000,
185         .max   = 863000000,
186         .iffreq= 44000000,
187         .count = 3,
188         .initdata = tua603x_agc103,
189         .entries = {
190                 { 147000000, 62500, 0x8e, 0x39 },
191                 { 417000000, 62500, 0x8e, 0x3a },
192                 { 999999999, 62500, 0x8e, 0x3c },
193         },
194 };
195
196 static struct dvb_pll_desc dvb_pll_unknown_1 = {
197         .name  = "unknown 1", /* used by dntv live dvb-t */
198         .min   = 174000000,
199         .max   = 862000000,
200         .iffreq= 36166667,
201         .count = 9,
202         .entries = {
203                 {  150000000, 166667, 0xb4, 0x01 },
204                 {  173000000, 166667, 0xbc, 0x01 },
205                 {  250000000, 166667, 0xb4, 0x02 },
206                 {  400000000, 166667, 0xbc, 0x02 },
207                 {  420000000, 166667, 0xf4, 0x02 },
208                 {  470000000, 166667, 0xfc, 0x02 },
209                 {  600000000, 166667, 0xbc, 0x08 },
210                 {  730000000, 166667, 0xf4, 0x08 },
211                 {  999999999, 166667, 0xfc, 0x08 },
212         },
213 };
214
215 /* Infineon TUA6010XS
216  * used in Thomson Cable Tuner
217  */
218 static struct dvb_pll_desc dvb_pll_tua6010xs = {
219         .name  = "Infineon TUA6010XS",
220         .min   =  44250000,
221         .max   = 858000000,
222         .iffreq= 36125000,
223         .count = 3,
224         .entries = {
225                 {  115750000, 62500, 0x8e, 0x03 },
226                 {  403250000, 62500, 0x8e, 0x06 },
227                 {  999999999, 62500, 0x8e, 0x85 },
228         },
229 };
230
231 /* Panasonic env57h1xd5 (some Philips PLL ?) */
232 static struct dvb_pll_desc dvb_pll_env57h1xd5 = {
233         .name  = "Panasonic ENV57H1XD5",
234         .min   =  44250000,
235         .max   = 858000000,
236         .iffreq= 36125000,
237         .count = 4,
238         .entries = {
239                 {  153000000, 166667, 0xc2, 0x41 },
240                 {  470000000, 166667, 0xc2, 0x42 },
241                 {  526000000, 166667, 0xc2, 0x84 },
242                 {  999999999, 166667, 0xc2, 0xa4 },
243         },
244 };
245
246 /* Philips TDA6650/TDA6651
247  * used in Panasonic ENV77H11D5
248  */
249 static void tda665x_bw(struct dvb_frontend *fe, u8 *buf,
250                        const struct dvb_frontend_parameters *params)
251 {
252         if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
253                 buf[3] |= 0x08;
254 }
255
256 static struct dvb_pll_desc dvb_pll_tda665x = {
257         .name  = "Philips TDA6650/TDA6651",
258         .min   =  44250000,
259         .max   = 858000000,
260         .set   = tda665x_bw,
261         .iffreq= 36166667,
262         .initdata = (u8[]){ 4, 0x0b, 0xf5, 0x85, 0xab },
263         .count = 12,
264         .entries = {
265                 {   93834000, 166667, 0xca, 0x61 /* 011 0 0 0  01 */ },
266                 {  123834000, 166667, 0xca, 0xa1 /* 101 0 0 0  01 */ },
267                 {  161000000, 166667, 0xca, 0xa1 /* 101 0 0 0  01 */ },
268                 {  163834000, 166667, 0xca, 0xc2 /* 110 0 0 0  10 */ },
269                 {  253834000, 166667, 0xca, 0x62 /* 011 0 0 0  10 */ },
270                 {  383834000, 166667, 0xca, 0xa2 /* 101 0 0 0  10 */ },
271                 {  443834000, 166667, 0xca, 0xc2 /* 110 0 0 0  10 */ },
272                 {  444000000, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
273                 {  583834000, 166667, 0xca, 0x64 /* 011 0 0 1  00 */ },
274                 {  793834000, 166667, 0xca, 0xa4 /* 101 0 0 1  00 */ },
275                 {  444834000, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
276                 {  861000000, 166667, 0xca, 0xe4 /* 111 0 0 1  00 */ },
277         }
278 };
279
280 /* Infineon TUA6034
281  * used in LG TDTP E102P
282  */
283 static void tua6034_bw(struct dvb_frontend *fe, u8 *buf,
284                        const struct dvb_frontend_parameters *params)
285 {
286         if (BANDWIDTH_7_MHZ != params->u.ofdm.bandwidth)
287                 buf[3] |= 0x08;
288 }
289
290 static struct dvb_pll_desc dvb_pll_tua6034 = {
291         .name  = "Infineon TUA6034",
292         .min   =  44250000,
293         .max   = 858000000,
294         .iffreq= 36166667,
295         .count = 3,
296         .set   = tua6034_bw,
297         .entries = {
298                 {  174500000, 62500, 0xce, 0x01 },
299                 {  230000000, 62500, 0xce, 0x02 },
300                 {  999999999, 62500, 0xce, 0x04 },
301         },
302 };
303
304 /* Infineon TUA6034
305  * used in LG TDVS-H061F, LG TDVS-H062F and LG TDVS-H064F
306  */
307 static struct dvb_pll_desc dvb_pll_lg_tdvs_h06xf = {
308         .name  = "LG TDVS-H06xF",
309         .min   =  54000000,
310         .max   = 863000000,
311         .iffreq= 44000000,
312         .initdata = tua603x_agc103,
313         .count = 3,
314         .entries = {
315                 {  165000000, 62500, 0xce, 0x01 },
316                 {  450000000, 62500, 0xce, 0x02 },
317                 {  999999999, 62500, 0xce, 0x04 },
318         },
319 };
320
321 /* Philips FMD1216ME
322  * used in Medion Hybrid PCMCIA card and USB Box
323  */
324 static void fmd1216me_bw(struct dvb_frontend *fe, u8 *buf,
325                          const struct dvb_frontend_parameters *params)
326 {
327         if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ &&
328             params->frequency >= 158870000)
329                 buf[3] |= 0x08;
330 }
331
332 static struct dvb_pll_desc dvb_pll_fmd1216me = {
333         .name = "Philips FMD1216ME",
334         .min = 50870000,
335         .max = 858000000,
336         .iffreq= 36125000,
337         .set   = fmd1216me_bw,
338         .initdata = tua603x_agc112,
339         .sleepdata = (u8[]){ 4, 0x9c, 0x60, 0x85, 0x54 },
340         .count = 7,
341         .entries = {
342                 { 143870000, 166667, 0xbc, 0x41 },
343                 { 158870000, 166667, 0xf4, 0x41 },
344                 { 329870000, 166667, 0xbc, 0x42 },
345                 { 441870000, 166667, 0xf4, 0x42 },
346                 { 625870000, 166667, 0xbc, 0x44 },
347                 { 803870000, 166667, 0xf4, 0x44 },
348                 { 999999999, 166667, 0xfc, 0x44 },
349         }
350 };
351
352 /* ALPS TDED4
353  * used in Nebula-Cards and USB boxes
354  */
355 static void tded4_bw(struct dvb_frontend *fe, u8 *buf,
356                      const struct dvb_frontend_parameters *params)
357 {
358         if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
359                 buf[3] |= 0x04;
360 }
361
362 static struct dvb_pll_desc dvb_pll_tded4 = {
363         .name = "ALPS TDED4",
364         .min = 47000000,
365         .max = 863000000,
366         .iffreq= 36166667,
367         .set   = tded4_bw,
368         .count = 4,
369         .entries = {
370                 { 153000000, 166667, 0x85, 0x01 },
371                 { 470000000, 166667, 0x85, 0x02 },
372                 { 823000000, 166667, 0x85, 0x08 },
373                 { 999999999, 166667, 0x85, 0x88 },
374         }
375 };
376
377 /* ALPS TDHU2
378  * used in AverTVHD MCE A180
379  */
380 static struct dvb_pll_desc dvb_pll_tdhu2 = {
381         .name = "ALPS TDHU2",
382         .min = 54000000,
383         .max = 864000000,
384         .iffreq= 44000000,
385         .count = 4,
386         .entries = {
387                 { 162000000, 62500, 0x85, 0x01 },
388                 { 426000000, 62500, 0x85, 0x02 },
389                 { 782000000, 62500, 0x85, 0x08 },
390                 { 999999999, 62500, 0x85, 0x88 },
391         }
392 };
393
394 /* Philips TUV1236D
395  * used in ATI HDTV Wonder
396  */
397 static void tuv1236d_rf(struct dvb_frontend *fe, u8 *buf,
398                         const struct dvb_frontend_parameters *params)
399 {
400         struct dvb_pll_priv *priv = fe->tuner_priv;
401         unsigned int new_rf = input[priv->nr];
402
403         if ((new_rf == 0) || (new_rf > 2)) {
404                 switch (params->u.vsb.modulation) {
405                         case QAM_64:
406                         case QAM_256:
407                                 new_rf = 1;
408                                 break;
409                         case VSB_8:
410                         default:
411                                 new_rf = 2;
412                 }
413         }
414
415         switch (new_rf) {
416                 case 1:
417                         buf[3] |= 0x08;
418                         break;
419                 case 2:
420                         buf[3] &= ~0x08;
421                         break;
422                 default:
423                         printk(KERN_WARNING
424                                "%s: unhandled rf input selection: %d",
425                                __FUNCTION__, new_rf);
426         }
427 }
428
429 static struct dvb_pll_desc dvb_pll_tuv1236d = {
430         .name  = "Philips TUV1236D",
431         .min   =  54000000,
432         .max   = 864000000,
433         .iffreq= 44000000,
434         .set   = tuv1236d_rf,
435         .count = 3,
436         .entries = {
437                 { 157250000, 62500, 0xc6, 0x41 },
438                 { 454000000, 62500, 0xc6, 0x42 },
439                 { 999999999, 62500, 0xc6, 0x44 },
440         },
441 };
442
443 /* Samsung TBMV30111IN / TBMV30712IN1
444  * used in Air2PC ATSC - 2nd generation (nxt2002)
445  */
446 static struct dvb_pll_desc dvb_pll_samsung_tbmv = {
447         .name = "Samsung TBMV30111IN / TBMV30712IN1",
448         .min = 54000000,
449         .max = 860000000,
450         .iffreq= 44000000,
451         .count = 6,
452         .entries = {
453                 { 172000000, 166667, 0xb4, 0x01 },
454                 { 214000000, 166667, 0xb4, 0x02 },
455                 { 467000000, 166667, 0xbc, 0x02 },
456                 { 721000000, 166667, 0xbc, 0x08 },
457                 { 841000000, 166667, 0xf4, 0x08 },
458                 { 999999999, 166667, 0xfc, 0x02 },
459         }
460 };
461
462 /*
463  * Philips SD1878 Tuner.
464  */
465 static struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
466         .name  = "Philips SD1878",
467         .min   =  950000,
468         .max   = 2150000,
469         .iffreq= 249, /* zero-IF, offset 249 is to round up */
470         .count = 4,
471         .entries = {
472                 { 1250000, 500, 0xc4, 0x00},
473                 { 1550000, 500, 0xc4, 0x40},
474                 { 2050000, 500, 0xc4, 0x80},
475                 { 2150000, 500, 0xc4, 0xc0},
476         },
477 };
478
479 /*
480  * Philips TD1316 Tuner.
481  */
482 static void td1316_bw(struct dvb_frontend *fe, u8 *buf,
483                       const struct dvb_frontend_parameters *params)
484 {
485         u8 band;
486
487         /* determine band */
488         if (params->frequency < 161000000)
489                 band = 1;
490         else if (params->frequency < 444000000)
491                 band = 2;
492         else
493                 band = 4;
494
495         buf[3] |= band;
496
497         /* setup PLL filter */
498         if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
499                 buf[3] |= 1 << 3;
500 }
501
502 static struct dvb_pll_desc dvb_pll_philips_td1316 = {
503         .name  = "Philips TD1316",
504         .min   =  87000000,
505         .max   = 895000000,
506         .iffreq= 36166667,
507         .set   = td1316_bw,
508         .count = 9,
509         .entries = {
510                 {  93834000, 166667, 0xca, 0x60},
511                 { 123834000, 166667, 0xca, 0xa0},
512                 { 163834000, 166667, 0xca, 0xc0},
513                 { 253834000, 166667, 0xca, 0x60},
514                 { 383834000, 166667, 0xca, 0xa0},
515                 { 443834000, 166667, 0xca, 0xc0},
516                 { 583834000, 166667, 0xca, 0x60},
517                 { 793834000, 166667, 0xca, 0xa0},
518                 { 858834000, 166667, 0xca, 0xe0},
519         },
520 };
521
522 /* FE6600 used on DViCO Hybrid */
523 static struct dvb_pll_desc dvb_pll_thomson_fe6600 = {
524         .name = "Thomson FE6600",
525         .min =  44250000,
526         .max = 858000000,
527         .iffreq= 36125000,
528         .count = 4,
529         .entries = {
530                 { 250000000, 166667, 0xb4, 0x12 },
531                 { 455000000, 166667, 0xfe, 0x11 },
532                 { 775500000, 166667, 0xbc, 0x18 },
533                 { 999999999, 166667, 0xf4, 0x18 },
534         }
535 };
536
537 static void opera1_bw(struct dvb_frontend *fe, u8 *buf,
538                       const struct dvb_frontend_parameters *params)
539 {
540         if (params->u.ofdm.bandwidth == BANDWIDTH_8_MHZ)
541                 buf[2] |= 0x08;
542 }
543
544 static struct dvb_pll_desc dvb_pll_opera1 = {
545         .name  = "Opera Tuner",
546         .min   =  900000,
547         .max   = 2250000,
548         .iffreq= 0,
549         .set   = opera1_bw,
550         .count = 8,
551         .entries = {
552                 { 1064000, 500, 0xe5, 0xc6 },
553                 { 1169000, 500, 0xe5, 0xe6 },
554                 { 1299000, 500, 0xe5, 0x24 },
555                 { 1444000, 500, 0xe5, 0x44 },
556                 { 1606000, 500, 0xe5, 0x64 },
557                 { 1777000, 500, 0xe5, 0x84 },
558                 { 1941000, 500, 0xe5, 0xa4 },
559                 { 2250000, 500, 0xe5, 0xc4 },
560         }
561 };
562
563 /* Philips FCV1236D
564  */
565 static struct dvb_pll_desc dvb_pll_fcv1236d = {
566 /* Bit_0: RF Input select
567  * Bit_1: 0=digital, 1=analog
568  */
569         .name  = "Philips FCV1236D",
570         .min   =  53000000,
571         .max   = 803000000,
572         .iffreq= 44000000,
573         .count = 3,
574         .entries = {
575                 { 159000000, 62500, 0x8e, 0xa0 },
576                 { 453000000, 62500, 0x8e, 0x90 },
577                 { 999999999, 62500, 0x8e, 0x30 },
578         },
579 };
580
581 /* ----------------------------------------------------------- */
582
583 static struct dvb_pll_desc *pll_list[] = {
584         [DVB_PLL_UNDEFINED]              = NULL,
585         [DVB_PLL_THOMSON_DTT7579]        = &dvb_pll_thomson_dtt7579,
586         [DVB_PLL_THOMSON_DTT759X]        = &dvb_pll_thomson_dtt759x,
587         [DVB_PLL_THOMSON_DTT7610]        = &dvb_pll_thomson_dtt7610,
588         [DVB_PLL_LG_Z201]                = &dvb_pll_lg_z201,
589         [DVB_PLL_MICROTUNE_4042]         = &dvb_pll_microtune_4042,
590         [DVB_PLL_THOMSON_DTT761X]        = &dvb_pll_thomson_dtt761x,
591         [DVB_PLL_UNKNOWN_1]              = &dvb_pll_unknown_1,
592         [DVB_PLL_TUA6010XS]              = &dvb_pll_tua6010xs,
593         [DVB_PLL_ENV57H1XD5]             = &dvb_pll_env57h1xd5,
594         [DVB_PLL_TUA6034]                = &dvb_pll_tua6034,
595         [DVB_PLL_LG_TDVS_H06XF]          = &dvb_pll_lg_tdvs_h06xf,
596         [DVB_PLL_TDA665X]                = &dvb_pll_tda665x,
597         [DVB_PLL_FMD1216ME]              = &dvb_pll_fmd1216me,
598         [DVB_PLL_TDED4]                  = &dvb_pll_tded4,
599         [DVB_PLL_TUV1236D]               = &dvb_pll_tuv1236d,
600         [DVB_PLL_TDHU2]                  = &dvb_pll_tdhu2,
601         [DVB_PLL_SAMSUNG_TBMV]           = &dvb_pll_samsung_tbmv,
602         [DVB_PLL_PHILIPS_SD1878_TDA8261] = &dvb_pll_philips_sd1878_tda8261,
603         [DVB_PLL_PHILIPS_TD1316]         = &dvb_pll_philips_td1316,
604         [DVB_PLL_THOMSON_FE6600]         = &dvb_pll_thomson_fe6600,
605         [DVB_PLL_OPERA1]                 = &dvb_pll_opera1,
606         [DVB_PLL_FCV1236D]               = &dvb_pll_fcv1236d,
607 };
608
609 /* ----------------------------------------------------------- */
610 /* code                                                        */
611
612 static int dvb_pll_configure(struct dvb_frontend *fe, u8 *buf,
613                              const struct dvb_frontend_parameters *params)
614 {
615         struct dvb_pll_priv *priv = fe->tuner_priv;
616         struct dvb_pll_desc *desc = priv->pll_desc;
617         u32 div;
618         int i;
619
620         if (params->frequency != 0 && (params->frequency < desc->min ||
621                                        params->frequency > desc->max))
622                 return -EINVAL;
623
624         for (i = 0; i < desc->count; i++) {
625                 if (params->frequency > desc->entries[i].limit)
626                         continue;
627                 break;
628         }
629
630         if (debug)
631                 printk("pll: %s: freq=%d | i=%d/%d\n", desc->name,
632                        params->frequency, i, desc->count);
633         if (i == desc->count)
634                 return -EINVAL;
635
636         div = (params->frequency + desc->iffreq +
637                desc->entries[i].stepsize/2) / desc->entries[i].stepsize;
638         buf[0] = div >> 8;
639         buf[1] = div & 0xff;
640         buf[2] = desc->entries[i].config;
641         buf[3] = desc->entries[i].cb;
642
643         if (desc->set)
644                 desc->set(fe, buf, params);
645
646         if (debug)
647                 printk("pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
648                        desc->name, div, buf[0], buf[1], buf[2], buf[3]);
649
650         // calculate the frequency we set it to
651         return (div * desc->entries[i].stepsize) - desc->iffreq;
652 }
653
654 static int dvb_pll_release(struct dvb_frontend *fe)
655 {
656         kfree(fe->tuner_priv);
657         fe->tuner_priv = NULL;
658         return 0;
659 }
660
661 static int dvb_pll_sleep(struct dvb_frontend *fe)
662 {
663         struct dvb_pll_priv *priv = fe->tuner_priv;
664
665         if (priv->i2c == NULL)
666                 return -EINVAL;
667
668         if (priv->pll_desc->sleepdata) {
669                 struct i2c_msg msg = { .flags = 0,
670                         .addr = priv->pll_i2c_address,
671                         .buf = priv->pll_desc->sleepdata + 1,
672                         .len = priv->pll_desc->sleepdata[0] };
673
674                 int result;
675
676                 if (fe->ops.i2c_gate_ctrl)
677                         fe->ops.i2c_gate_ctrl(fe, 1);
678                 if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
679                         return result;
680                 }
681                 return 0;
682         }
683         /* Shouldn't be called when initdata is NULL, maybe BUG()? */
684         return -EINVAL;
685 }
686
687 static int dvb_pll_set_params(struct dvb_frontend *fe,
688                               struct dvb_frontend_parameters *params)
689 {
690         struct dvb_pll_priv *priv = fe->tuner_priv;
691         u8 buf[4];
692         struct i2c_msg msg =
693                 { .addr = priv->pll_i2c_address, .flags = 0,
694                   .buf = buf, .len = sizeof(buf) };
695         int result;
696         u32 frequency = 0;
697
698         if (priv->i2c == NULL)
699                 return -EINVAL;
700
701         if ((result = dvb_pll_configure(fe, buf, params)) < 0)
702                 return result;
703         else
704                 frequency = result;
705
706         if (fe->ops.i2c_gate_ctrl)
707                 fe->ops.i2c_gate_ctrl(fe, 1);
708         if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
709                 return result;
710         }
711
712         priv->frequency = frequency;
713         priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
714
715         return 0;
716 }
717
718 static int dvb_pll_calc_regs(struct dvb_frontend *fe,
719                              struct dvb_frontend_parameters *params,
720                              u8 *buf, int buf_len)
721 {
722         struct dvb_pll_priv *priv = fe->tuner_priv;
723         int result;
724         u32 frequency = 0;
725
726         if (buf_len < 5)
727                 return -EINVAL;
728
729         if ((result = dvb_pll_configure(fe, buf+1, params)) < 0)
730                 return result;
731         else
732                 frequency = result;
733
734         buf[0] = priv->pll_i2c_address;
735
736         priv->frequency = frequency;
737         priv->bandwidth = (fe->ops.info.type == FE_OFDM) ? params->u.ofdm.bandwidth : 0;
738
739         return 5;
740 }
741
742 static int dvb_pll_get_frequency(struct dvb_frontend *fe, u32 *frequency)
743 {
744         struct dvb_pll_priv *priv = fe->tuner_priv;
745         *frequency = priv->frequency;
746         return 0;
747 }
748
749 static int dvb_pll_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
750 {
751         struct dvb_pll_priv *priv = fe->tuner_priv;
752         *bandwidth = priv->bandwidth;
753         return 0;
754 }
755
756 static int dvb_pll_init(struct dvb_frontend *fe)
757 {
758         struct dvb_pll_priv *priv = fe->tuner_priv;
759
760         if (priv->i2c == NULL)
761                 return -EINVAL;
762
763         if (priv->pll_desc->initdata) {
764                 struct i2c_msg msg = { .flags = 0,
765                         .addr = priv->pll_i2c_address,
766                         .buf = priv->pll_desc->initdata + 1,
767                         .len = priv->pll_desc->initdata[0] };
768
769                 int result;
770                 if (fe->ops.i2c_gate_ctrl)
771                         fe->ops.i2c_gate_ctrl(fe, 1);
772                 if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
773                         return result;
774                 }
775                 return 0;
776         }
777         /* Shouldn't be called when initdata is NULL, maybe BUG()? */
778         return -EINVAL;
779 }
780
781 static struct dvb_tuner_ops dvb_pll_tuner_ops = {
782         .release = dvb_pll_release,
783         .sleep = dvb_pll_sleep,
784         .init = dvb_pll_init,
785         .set_params = dvb_pll_set_params,
786         .calc_regs = dvb_pll_calc_regs,
787         .get_frequency = dvb_pll_get_frequency,
788         .get_bandwidth = dvb_pll_get_bandwidth,
789 };
790
791 struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,
792                                     struct i2c_adapter *i2c,
793                                     unsigned int pll_desc_id)
794 {
795         u8 b1 [] = { 0 };
796         struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD,
797                                .buf = b1, .len = 1 };
798         struct dvb_pll_priv *priv = NULL;
799         int ret;
800         struct dvb_pll_desc *desc;
801
802         if ((id[dvb_pll_devcount] > DVB_PLL_UNDEFINED) &&
803             (id[dvb_pll_devcount] < ARRAY_SIZE(pll_list)))
804                 pll_desc_id = id[dvb_pll_devcount];
805
806         BUG_ON(pll_desc_id < 1 || pll_desc_id >= ARRAY_SIZE(pll_list));
807
808         desc = pll_list[pll_desc_id];
809
810         if (i2c != NULL) {
811                 if (fe->ops.i2c_gate_ctrl)
812                         fe->ops.i2c_gate_ctrl(fe, 1);
813
814                 ret = i2c_transfer (i2c, &msg, 1);
815                 if (ret != 1)
816                         return NULL;
817                 if (fe->ops.i2c_gate_ctrl)
818                              fe->ops.i2c_gate_ctrl(fe, 0);
819         }
820
821         priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL);
822         if (priv == NULL)
823                 return NULL;
824
825         priv->pll_i2c_address = pll_addr;
826         priv->i2c = i2c;
827         priv->pll_desc = desc;
828         priv->nr = dvb_pll_devcount++;
829
830         memcpy(&fe->ops.tuner_ops, &dvb_pll_tuner_ops,
831                sizeof(struct dvb_tuner_ops));
832
833         strncpy(fe->ops.tuner_ops.info.name, desc->name,
834                 sizeof(fe->ops.tuner_ops.info.name));
835         fe->ops.tuner_ops.info.frequency_min = desc->min;
836         fe->ops.tuner_ops.info.frequency_max = desc->max;
837         if (!desc->initdata)
838                 fe->ops.tuner_ops.init = NULL;
839         if (!desc->sleepdata)
840                 fe->ops.tuner_ops.sleep = NULL;
841
842         fe->tuner_priv = priv;
843
844         if (debug) {
845                 printk("dvb-pll[%d]", priv->nr);
846                 if (i2c != NULL)
847                         printk(" %d-%04x", i2c_adapter_id(i2c), pll_addr);
848                 printk(": id# %d (%s) attached, %s\n", pll_desc_id, desc->name,
849                        id[priv->nr] == pll_desc_id ?
850                                 "insmod option" : "autodetected");
851
852         }
853
854         return fe;
855 }
856 EXPORT_SYMBOL(dvb_pll_attach);
857
858 MODULE_DESCRIPTION("dvb pll library");
859 MODULE_AUTHOR("Gerd Knorr");
860 MODULE_LICENSE("GPL");