V4L (1021): Tuner description now follows the same CodingStyle as the others
[linux-2.6/linux-loongson.git] / drivers / media / video / tuner-simple.c
blobcf241ab1e1b02a35311ce53a83b5dcc471983fa5
1 /*
3 * i2c tv tuner chip device driver
4 * controls all those simple 4-control-bytes style tuners.
5 */
6 #include <linux/delay.h>
7 #include <linux/i2c.h>
8 #include <linux/videodev.h>
9 #include <media/tuner.h>
11 /* ---------------------------------------------------------------------- */
13 /* tv standard selection for Temic 4046 FM5
14 this value takes the low bits of control byte 2
15 from datasheet Rev.01, Feb.00
16 standard BG I L L2 D
17 picture IF 38.9 38.9 38.9 33.95 38.9
18 sound 1 33.4 32.9 32.4 40.45 32.4
19 sound 2 33.16
20 NICAM 33.05 32.348 33.05 33.05
22 #define TEMIC_SET_PAL_I 0x05
23 #define TEMIC_SET_PAL_DK 0x09
24 #define TEMIC_SET_PAL_L 0x0a // SECAM ?
25 #define TEMIC_SET_PAL_L2 0x0b // change IF !
26 #define TEMIC_SET_PAL_BG 0x0c
28 /* tv tuner system standard selection for Philips FQ1216ME
29 this value takes the low bits of control byte 2
30 from datasheet "1999 Nov 16" (supersedes "1999 Mar 23")
31 standard BG DK I L L`
32 picture carrier 38.90 38.90 38.90 38.90 33.95
33 colour 34.47 34.47 34.47 34.47 38.38
34 sound 1 33.40 32.40 32.90 32.40 40.45
35 sound 2 33.16 - - - -
36 NICAM 33.05 33.05 32.35 33.05 39.80
38 #define PHILIPS_SET_PAL_I 0x01 /* Bit 2 always zero !*/
39 #define PHILIPS_SET_PAL_BGDK 0x09
40 #define PHILIPS_SET_PAL_L2 0x0a
41 #define PHILIPS_SET_PAL_L 0x0b
43 /* system switching for Philips FI1216MF MK2
44 from datasheet "1996 Jul 09",
45 standard BG L L'
46 picture carrier 38.90 38.90 33.95
47 colour 34.47 34.37 38.38
48 sound 1 33.40 32.40 40.45
49 sound 2 33.16 - -
50 NICAM 33.05 33.05 39.80
52 #define PHILIPS_MF_SET_BG 0x01 /* Bit 2 must be zero, Bit 3 is system output */
53 #define PHILIPS_MF_SET_PAL_L 0x03 // France
54 #define PHILIPS_MF_SET_PAL_L2 0x02 // L'
56 /* Control byte */
58 #define TUNER_RATIO_MASK 0x06 /* Bit cb1:cb2 */
59 #define TUNER_RATIO_SELECT_50 0x00
60 #define TUNER_RATIO_SELECT_32 0x02
61 #define TUNER_RATIO_SELECT_166 0x04
62 #define TUNER_RATIO_SELECT_62 0x06
64 #define TUNER_CHARGE_PUMP 0x40 /* Bit cb6 */
66 /* Status byte */
68 #define TUNER_POR 0x80
69 #define TUNER_FL 0x40
70 #define TUNER_MODE 0x38
71 #define TUNER_AFC 0x07
72 #define TUNER_SIGNAL 0x07
73 #define TUNER_STEREO 0x10
75 #define TUNER_PLL_LOCKED 0x40
76 #define TUNER_STEREO_MK3 0x04
78 /* ---------------------------------------------------------------------- */
80 struct tunertype
82 char *name;
84 unsigned short thresh1; /* band switch VHF_LO <=> VHF_HI */
85 unsigned short thresh2; /* band switch VHF_HI <=> UHF */
86 unsigned char VHF_L;
87 unsigned char VHF_H;
88 unsigned char UHF;
89 unsigned char config;
93 * The floats in the tuner struct are computed at compile time
94 * by gcc and cast back to integers. Thus we don't violate the
95 * "no float in kernel" rule.
97 static struct tunertype tuners[] = {
98 /* 0-9 */
99 [TUNER_TEMIC_PAL] = { /* TEMIC PAL */
100 .name = "Temic PAL (4002 FH5)",
101 .thresh1= 16 * 140.25 /*MHz*/,
102 .thresh2= 16 * 463.25 /*MHz*/,
103 .VHF_L = 0x02,
104 .VHF_H = 0x04,
105 .UHF = 0x01,
106 .config = 0x8e,
108 [TUNER_PHILIPS_PAL_I] = { /* Philips PAL_I */
109 .name = "Philips PAL_I (FI1246 and compatibles)",
110 .thresh1= 16 * 140.25 /*MHz*/,
111 .thresh2= 16 * 463.25 /*MHz*/,
112 .VHF_L = 0xa0,
113 .VHF_H = 0x90,
114 .UHF = 0x30,
115 .config = 0x8e,
117 [TUNER_PHILIPS_NTSC] = { /* Philips NTSC */
118 .name = "Philips NTSC (FI1236,FM1236 and compatibles)",
119 .thresh1= 16 * 157.25 /*MHz*/,
120 .thresh2= 16 * 451.25 /*MHz*/,
121 .VHF_L = 0xa0,
122 .VHF_H = 0x90,
123 .UHF = 0x30,
124 .config = 0x8e,
126 [TUNER_PHILIPS_SECAM] = { /* Philips SECAM */
127 .name = "Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF)",
128 .thresh1= 16 * 168.25 /*MHz*/,
129 .thresh2= 16 * 447.25 /*MHz*/,
130 .VHF_L = 0xa7,
131 .VHF_H = 0x97,
132 .UHF = 0x37,
133 .config = 0x8e,
135 [TUNER_ABSENT] = { /* Tuner Absent */
136 .name = "NoTuner",
137 .thresh1= 0 /*MHz*/,
138 .thresh2= 0 /*MHz*/,
139 .VHF_L = 0x00,
140 .VHF_H = 0x00,
141 .UHF = 0x00,
142 .config = 0x00,
144 [TUNER_PHILIPS_PAL] = { /* Philips PAL */
145 .name = "Philips PAL_BG (FI1216 and compatibles)",
146 .thresh1= 16 * 168.25 /*MHz*/,
147 .thresh2= 16 * 447.25 /*MHz*/,
148 .VHF_L = 0xa0,
149 .VHF_H = 0x90,
150 .UHF = 0x30,
151 .config = 0x8e,
153 [TUNER_TEMIC_NTSC] = { /* TEMIC NTSC */
154 .name = "Temic NTSC (4032 FY5)",
155 .thresh1= 16 * 157.25 /*MHz*/,
156 .thresh2= 16 * 463.25 /*MHz*/,
157 .VHF_L = 0x02,
158 .VHF_H = 0x04,
159 .UHF = 0x01,
160 .config = 0x8e,
162 [TUNER_TEMIC_PAL_I] = { /* TEMIC PAL_I */
163 .name = "Temic PAL_I (4062 FY5)",
164 .thresh1= 16 * 170.00 /*MHz*/,
165 .thresh2= 16 * 450.00 /*MHz*/,
166 .VHF_L = 0x02,
167 .VHF_H = 0x04,
168 .UHF = 0x01,
169 .config = 0x8e,
171 [TUNER_TEMIC_4036FY5_NTSC] = { /* TEMIC NTSC */
172 .name = "Temic NTSC (4036 FY5)",
173 .thresh1= 16 * 157.25 /*MHz*/,
174 .thresh2= 16 * 463.25 /*MHz*/,
175 .VHF_L = 0xa0,
176 .VHF_H = 0x90,
177 .UHF = 0x30,
178 .config = 0x8e,
180 [TUNER_ALPS_TSBH1_NTSC] = { /* TEMIC NTSC */
181 .name = "Alps HSBH1",
182 .thresh1= 16 * 137.25 /*MHz*/,
183 .thresh2= 16 * 385.25 /*MHz*/,
184 .VHF_L = 0x01,
185 .VHF_H = 0x02,
186 .UHF = 0x08,
187 .config = 0x8e,
190 /* 10-19 */
191 [TUNER_ALPS_TSBE1_PAL] = { /* TEMIC PAL */
192 .name = "Alps TSBE1",
193 .thresh1= 16 * 137.25 /*MHz*/,
194 .thresh2= 16 * 385.25 /*MHz*/,
195 .VHF_L = 0x01,
196 .VHF_H = 0x02,
197 .UHF = 0x08,
198 .config = 0x8e,
200 [TUNER_ALPS_TSBB5_PAL_I] = { /* Alps PAL_I */
201 .name = "Alps TSBB5",
202 .thresh1= 16 * 133.25 /*MHz*/,
203 .thresh2= 16 * 351.25 /*MHz*/,
204 .VHF_L = 0x01,
205 .VHF_H = 0x02,
206 .UHF = 0x08,
207 .config = 0x8e,
209 [TUNER_ALPS_TSBE5_PAL] = { /* Alps PAL */
210 .name = "Alps TSBE5",
211 .thresh1= 16 * 133.25 /*MHz*/,
212 .thresh2= 16 * 351.25 /*MHz*/,
213 .VHF_L = 0x01,
214 .VHF_H = 0x02,
215 .UHF = 0x08,
216 .config = 0x8e,
218 [TUNER_ALPS_TSBC5_PAL] = { /* Alps PAL */
219 .name = "Alps TSBC5",
220 .thresh1= 16 * 133.25 /*MHz*/,
221 .thresh2= 16 * 351.25 /*MHz*/,
222 .VHF_L = 0x01,
223 .VHF_H = 0x02,
224 .UHF = 0x08,
225 .config = 0x8e,
227 [TUNER_TEMIC_4006FH5_PAL] = { /* TEMIC PAL */
228 .name = "Temic PAL_BG (4006FH5)",
229 .thresh1= 16 * 170.00 /*MHz*/,
230 .thresh2= 16 * 450.00 /*MHz*/,
231 .VHF_L = 0xa0,
232 .VHF_H = 0x90,
233 .UHF = 0x30,
234 .config = 0x8e,
236 [TUNER_ALPS_TSHC6_NTSC] = { /* Alps NTSC */
237 .name = "Alps TSCH6",
238 .thresh1= 16 * 137.25 /*MHz*/,
239 .thresh2= 16 * 385.25 /*MHz*/,
240 .VHF_L = 0x14,
241 .VHF_H = 0x12,
242 .UHF = 0x11,
243 .config = 0x8e,
245 [TUNER_TEMIC_PAL_DK] = { /* TEMIC PAL */
246 .name = "Temic PAL_DK (4016 FY5)",
247 .thresh1= 16 * 168.25 /*MHz*/,
248 .thresh2= 16 * 456.25 /*MHz*/,
249 .VHF_L = 0xa0,
250 .VHF_H = 0x90,
251 .UHF = 0x30,
252 .config = 0x8e,
254 [TUNER_PHILIPS_NTSC_M] = { /* Philips NTSC */
255 .name = "Philips NTSC_M (MK2)",
256 .thresh1= 16 * 160.00 /*MHz*/,
257 .thresh2= 16 * 454.00 /*MHz*/,
258 .VHF_L = 0xa0,
259 .VHF_H = 0x90,
260 .UHF = 0x30,
261 .config = 0x8e,
263 [TUNER_TEMIC_4066FY5_PAL_I] = { /* TEMIC PAL_I */
264 .name = "Temic PAL_I (4066 FY5)",
265 .thresh1= 16 * 169.00 /*MHz*/,
266 .thresh2= 16 * 454.00 /*MHz*/,
267 .VHF_L = 0xa0,
268 .VHF_H = 0x90,
269 .UHF = 0x30,
270 .config = 0x8e,
272 [TUNER_TEMIC_4006FN5_MULTI_PAL] = { /* TEMIC PAL */
273 .name = "Temic PAL* auto (4006 FN5)",
274 .thresh1= 16 * 169.00 /*MHz*/,
275 .thresh2= 16 * 454.00 /*MHz*/,
276 .VHF_L = 0xa0,
277 .VHF_H = 0x90,
278 .UHF = 0x30,
279 .config = 0x8e,
282 /* 20-29 */
283 [TUNER_TEMIC_4009FR5_PAL] = { /* TEMIC PAL */
284 .name = "Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5)",
285 .thresh1= 16 * 141.00 /*MHz*/,
286 .thresh2= 16 * 464.00 /*MHz*/,
287 .VHF_L = 0xa0,
288 .VHF_H = 0x90,
289 .UHF = 0x30,
290 .config = 0x8e,
292 [TUNER_TEMIC_4039FR5_NTSC] = { /* TEMIC NTSC */
293 .name = "Temic NTSC (4039 FR5)",
294 .thresh1= 16 * 158.00 /*MHz*/,
295 .thresh2= 16 * 453.00 /*MHz*/,
296 .VHF_L = 0xa0,
297 .VHF_H = 0x90,
298 .UHF = 0x30,
299 .config = 0x8e,
301 [TUNER_TEMIC_4046FM5] = { /* TEMIC PAL */
302 .name = "Temic PAL/SECAM multi (4046 FM5)",
303 .thresh1= 16 * 169.00 /*MHz*/,
304 .thresh2= 16 * 454.00 /*MHz*/,
305 .VHF_L = 0xa0,
306 .VHF_H = 0x90,
307 .UHF = 0x30,
308 .config = 0x8e,
310 [TUNER_PHILIPS_PAL_DK] = { /* Philips PAL */
311 .name = "Philips PAL_DK (FI1256 and compatibles)",
312 .thresh1= 16 * 170.00 /*MHz*/,
313 .thresh2= 16 * 450.00 /*MHz*/,
314 .VHF_L = 0xa0,
315 .VHF_H = 0x90,
316 .UHF = 0x30,
317 .config = 0x8e,
319 [TUNER_PHILIPS_FQ1216ME] = { /* Philips PAL */
320 .name = "Philips PAL/SECAM multi (FQ1216ME)",
321 .thresh1= 16 * 170.00 /*MHz*/,
322 .thresh2= 16 * 450.00 /*MHz*/,
323 .VHF_L = 0xa0,
324 .VHF_H = 0x90,
325 .UHF = 0x30,
326 .config = 0x8e,
328 [TUNER_LG_PAL_I_FM] = { /* LGINNOTEK PAL_I */
329 .name = "LG PAL_I+FM (TAPC-I001D)",
330 .thresh1= 16 * 170.00 /*MHz*/,
331 .thresh2= 16 * 450.00 /*MHz*/,
332 .VHF_L = 0xa0,
333 .VHF_H = 0x90,
334 .UHF = 0x30,
335 .config = 0x8e,
337 [TUNER_LG_PAL_I] = { /* LGINNOTEK PAL_I */
338 .name = "LG PAL_I (TAPC-I701D)",
339 .thresh1= 16 * 170.00 /*MHz*/,
340 .thresh2= 16 * 450.00 /*MHz*/,
341 .VHF_L = 0xa0,
342 .VHF_H = 0x90,
343 .UHF = 0x30,
344 .config = 0x8e,
346 [TUNER_LG_NTSC_FM] = { /* LGINNOTEK NTSC */
347 .name = "LG NTSC+FM (TPI8NSR01F)",
348 .thresh1= 16 * 210.00 /*MHz*/,
349 .thresh2= 16 * 497.00 /*MHz*/,
350 .VHF_L = 0xa0,
351 .VHF_H = 0x90,
352 .UHF = 0x30,
353 .config = 0x8e,
355 [TUNER_LG_PAL_FM] = { /* LGINNOTEK PAL */
356 .name = "LG PAL_BG+FM (TPI8PSB01D)",
357 .thresh1= 16 * 170.00 /*MHz*/,
358 .thresh2= 16 * 450.00 /*MHz*/,
359 .VHF_L = 0xa0,
360 .VHF_H = 0x90,
361 .UHF = 0x30,
362 .config = 0x8e,
364 [TUNER_LG_PAL] = { /* LGINNOTEK PAL */
365 .name = "LG PAL_BG (TPI8PSB11D)",
366 .thresh1= 16 * 170.00 /*MHz*/,
367 .thresh2= 16 * 450.00 /*MHz*/,
368 .VHF_L = 0xa0,
369 .VHF_H = 0x90,
370 .UHF = 0x30,
371 .config = 0x8e,
374 /* 30-39 */
375 [TUNER_TEMIC_4009FN5_MULTI_PAL_FM] = { /* TEMIC PAL */
376 .name = "Temic PAL* auto + FM (4009 FN5)",
377 .thresh1= 16 * 141.00 /*MHz*/,
378 .thresh2= 16 * 464.00 /*MHz*/,
379 .VHF_L = 0xa0,
380 .VHF_H = 0x90,
381 .UHF = 0x30,
382 .config = 0x8e,
384 [TUNER_SHARP_2U5JF5540_NTSC] = { /* SHARP NTSC */
385 .name = "SHARP NTSC_JP (2U5JF5540)",
386 .thresh1= 16 * 137.25 /*MHz*/,
387 .thresh2= 16 * 317.25 /*MHz*/,
388 .VHF_L = 0x01,
389 .VHF_H = 0x02,
390 .UHF = 0x08,
391 .config = 0x8e,
393 [TUNER_Samsung_PAL_TCPM9091PD27] = { /* Samsung PAL */
394 .name = "Samsung PAL TCPM9091PD27",
395 .thresh1= 16 * 169 /*MHz*/,
396 .thresh2= 16 * 464 /*MHz*/,
397 .VHF_L = 0xa0,
398 .VHF_H = 0x90,
399 .UHF = 0x30,
400 .config = 0x8e,
402 [TUNER_MT2032] = { /* Microtune PAL|NTSC */
403 .name = "MT20xx universal",
404 /* see mt20xx.c for details */ },
405 [TUNER_TEMIC_4106FH5] = { /* TEMIC PAL */
406 .name = "Temic PAL_BG (4106 FH5)",
407 .thresh1= 16 * 141.00 /*MHz*/,
408 .thresh2= 16 * 464.00 /*MHz*/,
409 .VHF_L = 0xa0,
410 .VHF_H = 0x90,
411 .UHF = 0x30,
412 .config = 0x8e,
414 [TUNER_TEMIC_4012FY5] = { /* TEMIC PAL */
415 .name = "Temic PAL_DK/SECAM_L (4012 FY5)",
416 .thresh1= 16 * 140.25 /*MHz*/,
417 .thresh2= 16 * 463.25 /*MHz*/,
418 .VHF_L = 0x02,
419 .VHF_H = 0x04,
420 .UHF = 0x01,
421 .config = 0x8e,
423 [TUNER_TEMIC_4136FY5] = { /* TEMIC NTSC */
424 .name = "Temic NTSC (4136 FY5)",
425 .thresh1= 16 * 158.00 /*MHz*/,
426 .thresh2= 16 * 453.00 /*MHz*/,
427 .VHF_L = 0xa0,
428 .VHF_H = 0x90,
429 .UHF = 0x30,
430 .config = 0x8e,
432 [TUNER_LG_PAL_NEW_TAPC] = { /* LGINNOTEK PAL */
433 .name = "LG PAL (newer TAPC series)",
434 .thresh1= 16 * 170.00 /*MHz*/,
435 .thresh2= 16 * 450.00 /*MHz*/,
436 .VHF_L = 0x01,
437 .VHF_H = 0x02,
438 .UHF = 0x08,
439 .config = 0x8e,
441 [TUNER_PHILIPS_FM1216ME_MK3] = { /* Philips PAL */
442 .name = "Philips PAL/SECAM multi (FM1216ME MK3)",
443 .thresh1= 16 * 158.00 /*MHz*/,
444 .thresh2= 16 * 442.00 /*MHz*/,
445 .VHF_L = 0x01,
446 .VHF_H = 0x02,
447 .UHF = 0x04,
448 .config = 0x8e,
450 [TUNER_LG_NTSC_NEW_TAPC] = { /* LGINNOTEK NTSC */
451 .name = "LG NTSC (newer TAPC series)",
452 .thresh1= 16 * 170.00 /*MHz*/,
453 .thresh2= 16 * 450.00 /*MHz*/,
454 .VHF_L = 0x01,
455 .VHF_H = 0x02,
456 .UHF = 0x08,
457 .config = 0x8e,
460 /* 40-49 */
461 [TUNER_HITACHI_NTSC] = { /* HITACHI NTSC */
462 .name = "HITACHI V7-J180AT",
463 .thresh1= 16 * 170.00 /*MHz*/,
464 .thresh2= 16 * 450.00 /*MHz*/,
465 .VHF_L = 0x01,
466 .VHF_H = 0x02,
467 .UHF = 0x08,
468 .config = 0x8e,
470 [TUNER_PHILIPS_PAL_MK] = { /* Philips PAL */
471 .name = "Philips PAL_MK (FI1216 MK)",
472 .thresh1= 16 * 140.25 /*MHz*/,
473 .thresh2= 16 * 463.25 /*MHz*/,
474 .VHF_L = 0x01,
475 .VHF_H = 0xc2,
476 .UHF = 0xcf,
477 .config = 0x8e,
479 [TUNER_PHILIPS_ATSC] = { /* Philips ATSC */
480 .name = "Philips 1236D ATSC/NTSC daul in",
481 .thresh1= 16 * 157.25 /*MHz*/,
482 .thresh2= 16 * 454.00 /*MHz*/,
483 .VHF_L = 0xa0,
484 .VHF_H = 0x90,
485 .UHF = 0x30,
486 .config = 0x8e,
488 [TUNER_PHILIPS_FM1236_MK3] = { /* Philips NTSC */
489 .name = "Philips NTSC MK3 (FM1236MK3 or FM1236/F)",
490 .thresh1= 16 * 160.00 /*MHz*/,
491 .thresh2= 16 * 442.00 /*MHz*/,
492 .VHF_L = 0x01,
493 .VHF_H = 0x02,
494 .UHF = 0x04,
495 .config = 0x8e,
497 [TUNER_PHILIPS_4IN1] = { /* Philips NTSC */
498 .name = "Philips 4 in 1 (ATI TV Wonder Pro/Conexant)",
499 .thresh1= 16 * 160.00 /*MHz*/,
500 .thresh2= 16 * 442.00 /*MHz*/,
501 .VHF_L = 0x01,
502 .VHF_H = 0x02,
503 .UHF = 0x04,
504 .config = 0x8e,
506 [TUNER_MICROTUNE_4049FM5] = { /* Microtune PAL */
507 .name = "Microtune 4049 FM5",
508 .thresh1= 16 * 141.00 /*MHz*/,
509 .thresh2= 16 * 464.00 /*MHz*/,
510 .VHF_L = 0xa0,
511 .VHF_H = 0x90,
512 .UHF = 0x30,
513 .config = 0x8e,
515 [TUNER_MICROTUNE_4042_FI5] = { /* Panasonic NTSC */
516 .name = "Panasonic VP27s/ENGE4324D",
517 .thresh1= 16 * 160.00 /*MHz*/,
518 .thresh2= 16 * 454.00 /*MHz*/,
519 .VHF_L = 0x01,
520 .VHF_H = 0x02,
521 .UHF = 0x08,
522 .config = 0xce,
524 [TUNER_LG_NTSC_TAPE] = { /* LGINNOTEK NTSC */
525 .name = "LG NTSC (TAPE series)",
526 .thresh1= 16 * 160.00 /*MHz*/,
527 .thresh2= 16 * 442.00 /*MHz*/,
528 .VHF_L = 0x01,
529 .VHF_H = 0x02,
530 .UHF = 0x04,
531 .config = 0x8e,
533 [TUNER_TNF_8831BGFF] = { /* Philips PAL */
534 .name = "Tenna TNF 8831 BGFF)",
535 .thresh1= 16 * 161.25 /*MHz*/,
536 .thresh2= 16 * 463.25 /*MHz*/,
537 .VHF_L = 0xa0,
538 .VHF_H = 0x90,
539 .UHF = 0x30,
540 .config = 0x8e,
542 [TUNER_MICROTUNE_4042FI5] = { /* Microtune NTSC */
543 .name = "Microtune 4042 FI5 ATSC/NTSC dual in",
544 .thresh1= 16 * 162.00 /*MHz*/,
545 .thresh2= 16 * 457.00 /*MHz*/,
546 .VHF_L = 0xa2,
547 .VHF_H = 0x94,
548 .UHF = 0x31,
549 .config = 0x8e,
552 /* 50-59 */
553 [TUNER_TCL_2002N] = { /* TCL NTSC */
554 .name = "TCL 2002N",
555 .thresh1= 16 * 172.00 /*MHz*/,
556 .thresh2= 16 * 448.00 /*MHz*/,
557 .VHF_L = 0x01,
558 .VHF_H = 0x02,
559 .UHF = 0x08,
560 .config = 0x8e,
562 [TUNER_PHILIPS_FM1256_IH3] = { /* Philips PAL */
563 .name = "Philips PAL/SECAM_D (FM 1256 I-H3)",
564 .thresh1= 16 * 160.00 /*MHz*/,
565 .thresh2= 16 * 442.00 /*MHz*/,
566 .VHF_L = 0x01,
567 .VHF_H = 0x02,
568 .UHF = 0x04,
569 .config = 0x8e,
571 [TUNER_THOMSON_DTT7610] = { /* THOMSON ATSC */
572 .name = "Thomson DDT 7610 (ATSC/NTSC)",
573 .thresh1= 16 * 157.25 /*MHz*/,
574 .thresh2= 16 * 454.00 /*MHz*/,
575 .VHF_L = 0x39,
576 .VHF_H = 0x3a,
577 .UHF = 0x3c,
578 .config = 0x8e,
580 [TUNER_PHILIPS_FQ1286] = { /* Philips NTSC */
581 .name = "Philips FQ1286",
582 .thresh1= 16 * 160.00 /*MHz*/,
583 .thresh2= 16 * 454.00 /*MHz*/,
584 .VHF_L = 0x41,
585 .VHF_H = 0x42,
586 .UHF = 0x04,
587 .config = 0x8e,
589 [TUNER_PHILIPS_TDA8290] = { /* Philips PAL|NTSC */
590 .name = "tda8290+75",
591 /* see tda8290.c for details */ },
592 [TUNER_TCL_2002MB] = { /* TCL PAL */
593 .name = "TCL 2002MB",
594 .thresh1= 16 * 170.00 /*MHz*/,
595 .thresh2= 16 * 450.00 /*MHz*/,
596 .VHF_L = 0x01,
597 .VHF_H = 0x02,
598 .UHF = 0x08,
599 .config = 0xce,
601 [TUNER_PHILIPS_FQ1216AME_MK4] = { /* Philips PAL */
602 .name = "Philips PAL/SECAM multi (FQ1216AME MK4)",
603 .thresh1= 16 * 160.00 /*MHz*/,
604 .thresh2= 16 * 442.00 /*MHz*/,
605 .VHF_L = 0x01,
606 .VHF_H = 0x02,
607 .UHF = 0x04,
608 .config = 0xce,
610 [TUNER_PHILIPS_FQ1236A_MK4] = { /* Philips NTSC */
611 .name = "Philips FQ1236A MK4",
612 .thresh1= 16 * 160.00 /*MHz*/,
613 .thresh2= 16 * 442.00 /*MHz*/,
614 .VHF_L = 0x01,
615 .VHF_H = 0x02,
616 .UHF = 0x04,
617 .config = 0x8e,
619 [TUNER_YMEC_TVF_8531MF] = { /* Philips NTSC */
620 .name = "Ymec TVision TVF-8531MF/8831MF/8731MF",
621 .thresh1= 16 * 160.00 /*MHz*/,
622 .thresh2= 16 * 454.00 /*MHz*/,
623 .VHF_L = 0xa0,
624 .VHF_H = 0x90,
625 .UHF = 0x30,
626 .config = 0x8e,
628 [TUNER_YMEC_TVF_5533MF] = { /* Philips NTSC */
629 .name = "Ymec TVision TVF-5533MF",
630 .thresh1= 16 * 160.00 /*MHz*/,
631 .thresh2= 16 * 454.00 /*MHz*/,
632 .VHF_L = 0x01,
633 .VHF_H = 0x02,
634 .UHF = 0x04,
635 .config = 0x8e,
638 /* 60-69 */
639 [TUNER_THOMSON_DTT7611] = { /* THOMSON ATSC */
640 .name = "Thomson DDT 7611 (ATSC/NTSC)",
641 .thresh1= 16 * 157.25 /*MHz*/,
642 .thresh2= 16 * 454.00 /*MHz*/,
643 .VHF_L = 0x39,
644 .VHF_H = 0x3a,
645 .UHF = 0x3c,
646 .config = 0x8e,
648 [TUNER_TENA_9533_DI] = { /* Philips PAL */
649 .name = "Tena TNF9533-D/IF/TNF9533-B/DF",
650 .thresh1= 16 * 160.25 /*MHz*/,
651 .thresh2= 16 * 464.25 /*MHz*/,
652 .VHF_L = 0x01,
653 .VHF_H = 0x02,
654 .UHF = 0x04,
655 .config = 0x8e,
657 [TUNER_TEA5767] = { /* Philips RADIO */
658 .name = "Philips TEA5767HN FM Radio",
659 /* see tea5767.c for details */},
660 [TUNER_PHILIPS_FMD1216ME_MK3] = { /* Philips PAL */
661 .name = "Philips FMD1216ME MK3 Hybrid Tuner",
662 .thresh1= 16 * 160.00 /*MHz*/,
663 .thresh2= 16 * 442.00 /*MHz*/,
664 .VHF_L = 0x51,
665 .VHF_H = 0x52,
666 .UHF = 0x54,
667 .config = 0x86,
669 [TUNER_LG_TDVS_H062F] = { /* LGINNOTEK ATSC */
670 .name = "LG TDVS-H062F/TUA6034",
671 .thresh1= 16 * 160.00 /*MHz*/,
672 .thresh2= 16 * 455.00 /*MHz*/,
673 .VHF_L = 0x01,
674 .VHF_H = 0x02,
675 .UHF = 0x04,
676 .config = 0x8e,
678 [TUNER_YMEC_TVF66T5_B_DFF] = { /* Philips PAL */
679 .name = "Ymec TVF66T5-B/DFF",
680 .thresh1= 16 * 160.25 /*MHz*/,
681 .thresh2= 16 * 464.25 /*MHz*/,
682 .VHF_L = 0x01,
683 .VHF_H = 0x02,
684 .UHF = 0x08,
685 .config = 0x8e,
687 [TUNER_LG_NTSC_TALN_MINI] = { /* LGINNOTEK NTSC */
688 .name = "LG NTSC (TALN mini series)",
689 .thresh1= 16 * 137.25 /*MHz*/,
690 .thresh2= 16 * 373.25 /*MHz*/,
691 .VHF_L = 0x01,
692 .VHF_H = 0x02,
693 .UHF = 0x08,
694 .config = 0x8e,
696 [TUNER_PHILIPS_TD1316] = { /* Philips PAL */
697 .name = "Philips TD1316 Hybrid Tuner",
698 .thresh1= 16 * 160.00 /*MHz*/,
699 .thresh2= 16 * 442.00 /*MHz*/,
700 .VHF_L = 0xa1,
701 .VHF_H = 0xa2,
702 .UHF = 0xa4,
703 .config = 0xc8,
705 [TUNER_PHILIPS_TUV1236D] = { /* Philips ATSC */
706 .name = "Philips TUV1236D ATSC/NTSC dual in",
707 .thresh1= 16 * 157.25 /*MHz*/,
708 .thresh2= 16 * 454.00 /*MHz*/,
709 .VHF_L = 0x01,
710 .VHF_H = 0x02,
711 .UHF = 0x04,
712 .config = 0xce,
714 [TUNER_TNF_5335MF] = { /* Philips NTSC */
715 .name = "Tena TNF 5335 MF",
716 .thresh1= 16 * 157.25 /*MHz*/,
717 .thresh2= 16 * 454.00 /*MHz*/,
718 .VHF_L = 0x01,
719 .VHF_H = 0x02,
720 .UHF = 0x04,
721 .config = 0x8e,
725 unsigned const int tuner_count = ARRAY_SIZE(tuners);
727 /* ---------------------------------------------------------------------- */
729 static int tuner_getstatus(struct i2c_client *c)
731 unsigned char byte;
733 if (1 != i2c_master_recv(c,&byte,1))
734 return 0;
736 return byte;
739 static int tuner_signal(struct i2c_client *c)
741 return (tuner_getstatus(c) & TUNER_SIGNAL) << 13;
744 static int tuner_stereo(struct i2c_client *c)
746 int stereo, status;
747 struct tuner *t = i2c_get_clientdata(c);
749 status = tuner_getstatus (c);
751 switch (t->type) {
752 case TUNER_PHILIPS_FM1216ME_MK3:
753 case TUNER_PHILIPS_FM1236_MK3:
754 case TUNER_PHILIPS_FM1256_IH3:
755 stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
756 break;
757 default:
758 stereo = status & TUNER_STEREO;
761 return stereo;
765 /* ---------------------------------------------------------------------- */
767 static void default_set_tv_freq(struct i2c_client *c, unsigned int freq)
769 struct tuner *t = i2c_get_clientdata(c);
770 u8 config, tuneraddr;
771 u16 div;
772 struct tunertype *tun;
773 unsigned char buffer[4];
774 int rc, IFPCoff;
776 tun = &tuners[t->type];
777 if (freq < tun->thresh1) {
778 config = tun->VHF_L;
779 tuner_dbg("tv: VHF lowrange\n");
780 } else if (freq < tun->thresh2) {
781 config = tun->VHF_H;
782 tuner_dbg("tv: VHF high range\n");
783 } else {
784 config = tun->UHF;
785 tuner_dbg("tv: UHF range\n");
789 /* tv norm specific stuff for multi-norm tuners */
790 switch (t->type) {
791 case TUNER_PHILIPS_SECAM: // FI1216MF
792 /* 0x01 -> ??? no change ??? */
793 /* 0x02 -> PAL BDGHI / SECAM L */
794 /* 0x04 -> ??? PAL others / SECAM others ??? */
795 config &= ~0x02;
796 if (t->std & V4L2_STD_SECAM)
797 config |= 0x02;
798 break;
800 case TUNER_TEMIC_4046FM5:
801 config &= ~0x0f;
803 if (t->std & V4L2_STD_PAL_BG) {
804 config |= TEMIC_SET_PAL_BG;
806 } else if (t->std & V4L2_STD_PAL_I) {
807 config |= TEMIC_SET_PAL_I;
809 } else if (t->std & V4L2_STD_PAL_DK) {
810 config |= TEMIC_SET_PAL_DK;
812 } else if (t->std & V4L2_STD_SECAM_L) {
813 config |= TEMIC_SET_PAL_L;
816 break;
818 case TUNER_PHILIPS_FQ1216ME:
819 config &= ~0x0f;
821 if (t->std & (V4L2_STD_PAL_BG|V4L2_STD_PAL_DK)) {
822 config |= PHILIPS_SET_PAL_BGDK;
824 } else if (t->std & V4L2_STD_PAL_I) {
825 config |= PHILIPS_SET_PAL_I;
827 } else if (t->std & V4L2_STD_SECAM_L) {
828 config |= PHILIPS_SET_PAL_L;
831 break;
833 case TUNER_PHILIPS_ATSC:
834 /* 0x00 -> ATSC antenna input 1 */
835 /* 0x01 -> ATSC antenna input 2 */
836 /* 0x02 -> NTSC antenna input 1 */
837 /* 0x03 -> NTSC antenna input 2 */
838 config &= ~0x03;
839 if (!(t->std & V4L2_STD_ATSC))
840 config |= 2;
841 /* FIXME: input */
842 break;
844 case TUNER_MICROTUNE_4042FI5:
845 /* Set the charge pump for fast tuning */
846 tun->config |= TUNER_CHARGE_PUMP;
847 break;
849 case TUNER_PHILIPS_TUV1236D:
850 /* 0x40 -> ATSC antenna input 1 */
851 /* 0x48 -> ATSC antenna input 2 */
852 /* 0x00 -> NTSC antenna input 1 */
853 /* 0x08 -> NTSC antenna input 2 */
854 buffer[0] = 0x14;
855 buffer[1] = 0x00;
856 buffer[2] = 0x17;
857 buffer[3] = 0x00;
858 config &= ~0x40;
859 if (t->std & V4L2_STD_ATSC) {
860 config |= 0x40;
861 buffer[1] = 0x04;
863 /* set to the correct mode (analog or digital) */
864 tuneraddr = c->addr;
865 c->addr = 0x0a;
866 if (2 != (rc = i2c_master_send(c,&buffer[0],2)))
867 tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc);
868 if (2 != (rc = i2c_master_send(c,&buffer[2],2)))
869 tuner_warn("i2c i/o error: rc == %d (should be 2)\n",rc);
870 c->addr = tuneraddr;
871 /* FIXME: input */
872 break;
876 * Philips FI1216MK2 remark from specification :
877 * for channel selection involving band switching, and to ensure
878 * smooth tuning to the desired channel without causing
879 * unnecessary charge pump action, it is recommended to consider
880 * the difference between wanted channel frequency and the
881 * current channel frequency. Unnecessary charge pump action
882 * will result in very low tuning voltage which may drive the
883 * oscillator to extreme conditions.
885 * Progfou: specification says to send config data before
886 * frequency in case (wanted frequency < current frequency).
889 /* IFPCoff = Video Intermediate Frequency - Vif:
890 940 =16*58.75 NTSC/J (Japan)
891 732 =16*45.75 M/N STD
892 704 =16*44 ATSC (at DVB code)
893 632 =16*39.50 I U.K.
894 622.4=16*38.90 B/G D/K I, L STD
895 592 =16*37.00 D China
896 590 =16.36.875 B Australia
897 543.2=16*33.95 L' STD
898 171.2=16*10.70 FM Radio (at set_radio_freq)
901 if (t->std & V4L2_STD_NTSC_M_JP) {
902 IFPCoff = 940;
903 } else if (t->std & V4L2_STD_MN) {
904 IFPCoff = 732;
905 } else if (t->std & V4L2_STD_SECAM_LC) {
906 IFPCoff = 543;
907 } else {
908 IFPCoff = 623;
911 div=freq + IFPCoff;
912 if (t->type == TUNER_PHILIPS_SECAM && freq < t->freq) {
913 buffer[0] = tun->config;
914 buffer[1] = config;
915 buffer[2] = (div>>8) & 0x7f;
916 buffer[3] = div & 0xff;
917 } else {
918 buffer[0] = (div>>8) & 0x7f;
919 buffer[1] = div & 0xff;
920 buffer[2] = tun->config;
921 buffer[3] = config;
923 tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
924 buffer[0],buffer[1],buffer[2],buffer[3]);
926 if (4 != (rc = i2c_master_send(c,buffer,4)))
927 tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
929 if (t->type == TUNER_MICROTUNE_4042FI5) {
930 // FIXME - this may also work for other tuners
931 unsigned long timeout = jiffies + msecs_to_jiffies(1);
932 u8 status_byte = 0;
934 /* Wait until the PLL locks */
935 for (;;) {
936 if (time_after(jiffies,timeout))
937 return;
938 if (1 != (rc = i2c_master_recv(c,&status_byte,1))) {
939 tuner_warn("i2c i/o read error: rc == %d (should be 1)\n",rc);
940 break;
942 if (status_byte & TUNER_PLL_LOCKED)
943 break;
944 udelay(10);
947 /* Set the charge pump for optimized phase noise figure */
948 tun->config &= ~TUNER_CHARGE_PUMP;
949 buffer[0] = (div>>8) & 0x7f;
950 buffer[1] = div & 0xff;
951 buffer[2] = tun->config;
952 buffer[3] = config;
953 tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n",
954 buffer[0],buffer[1],buffer[2],buffer[3]);
956 if (4 != (rc = i2c_master_send(c,buffer,4)))
957 tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
961 static void default_set_radio_freq(struct i2c_client *c, unsigned int freq)
963 struct tunertype *tun;
964 struct tuner *t = i2c_get_clientdata(c);
965 unsigned char buffer[4];
966 unsigned div;
967 int rc;
969 tun = &tuners[t->type];
970 div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */
971 buffer[2] = (tun->config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */
973 switch (t->type) {
974 case TUNER_TENA_9533_DI:
975 case TUNER_YMEC_TVF_5533MF:
976 tuner_dbg ("This tuner doesn't have FM. Most cards has a TEA5767 for FM\n");
977 return;
978 case TUNER_PHILIPS_FM1216ME_MK3:
979 case TUNER_PHILIPS_FM1236_MK3:
980 case TUNER_PHILIPS_FMD1216ME_MK3:
981 buffer[3] = 0x19;
982 break;
983 case TUNER_PHILIPS_FM1256_IH3:
984 div = (20 * freq) / 16000 + (int)(33.3 * 20); /* IF 33.3 MHz */
985 buffer[3] = 0x19;
986 break;
987 case TUNER_LG_PAL_FM:
988 buffer[3] = 0xa5;
989 break;
990 case TUNER_MICROTUNE_4049FM5:
991 div = (20 * freq) / 16000 + (int)(33.3 * 20); /* IF 33.3 MHz */
992 buffer[3] = 0xa4;
993 break;
994 default:
995 buffer[3] = 0xa4;
996 break;
998 buffer[0] = (div>>8) & 0x7f;
999 buffer[1] = div & 0xff;
1001 tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n",
1002 buffer[0],buffer[1],buffer[2],buffer[3]);
1004 if (4 != (rc = i2c_master_send(c,buffer,4)))
1005 tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc);
1008 int default_tuner_init(struct i2c_client *c)
1010 struct tuner *t = i2c_get_clientdata(c);
1012 tuner_info("type set to %d (%s)\n",
1013 t->type, tuners[t->type].name);
1014 strlcpy(c->name, tuners[t->type].name, sizeof(c->name));
1016 t->tv_freq = default_set_tv_freq;
1017 t->radio_freq = default_set_radio_freq;
1018 t->has_signal = tuner_signal;
1019 t->is_stereo = tuner_stereo;
1020 t->standby = NULL;
1022 return 0;
1026 * Overrides for Emacs so that we follow Linus's tabbing style.
1027 * ---------------------------------------------------------------------------
1028 * Local variables:
1029 * c-basic-offset: 8
1030 * End: