diff options
Diffstat (limited to 'drivers/media/video/tuner-simple.c')
-rw-r--r-- | drivers/media/video/tuner-simple.c | 794 |
1 files changed, 47 insertions, 747 deletions
diff --git a/drivers/media/video/tuner-simple.c b/drivers/media/video/tuner-simple.c index e5fb74365836..37977ff49780 100644 --- a/drivers/media/video/tuner-simple.c +++ b/drivers/media/video/tuner-simple.c | |||
@@ -79,722 +79,16 @@ MODULE_PARM_DESC(offset,"Allows to specify an offset for tuner"); | |||
79 | #define TUNER_PLL_LOCKED 0x40 | 79 | #define TUNER_PLL_LOCKED 0x40 |
80 | #define TUNER_STEREO_MK3 0x04 | 80 | #define TUNER_STEREO_MK3 0x04 |
81 | 81 | ||
82 | #define TUNER_MAX_RANGES 3 | 82 | #define TUNER_PARAM_ANALOG 0 /* to be removed */ |
83 | 83 | /* FIXME: | |
84 | /* ---------------------------------------------------------------------- */ | 84 | * Right now, all tuners are using the first tuner_params[] array element |
85 | 85 | * for analog mode. In the future, we will be merging similar tuner | |
86 | struct tunertype | 86 | * definitions together, such that each tuner definition will have a |
87 | { | 87 | * tuner_params struct for each available video standard. At that point, |
88 | char *name; | 88 | * TUNER_PARAM_ANALOG will be removed, and the tuner_params[] array |
89 | 89 | * element will be chosen based on the video standard in use. | |
90 | int count; | 90 | * |
91 | struct { | ||
92 | unsigned short thresh; | ||
93 | unsigned char cb; | ||
94 | } ranges[TUNER_MAX_RANGES]; | ||
95 | unsigned char config; | ||
96 | }; | ||
97 | |||
98 | /* | ||
99 | * The floats in the tuner struct are computed at compile time | ||
100 | * by gcc and cast back to integers. Thus we don't violate the | ||
101 | * "no float in kernel" rule. | ||
102 | */ | 91 | */ |
103 | static struct tunertype tuners[] = { | ||
104 | /* 0-9 */ | ||
105 | [TUNER_TEMIC_PAL] = { /* TEMIC PAL */ | ||
106 | .name = "Temic PAL (4002 FH5)", | ||
107 | .count = 3, | ||
108 | .ranges = { | ||
109 | { 16 * 140.25 /*MHz*/, 0x02, }, | ||
110 | { 16 * 463.25 /*MHz*/, 0x04, }, | ||
111 | { 16 * 999.99 , 0x01, }, | ||
112 | }, | ||
113 | .config = 0x8e, | ||
114 | }, | ||
115 | [TUNER_PHILIPS_PAL_I] = { /* Philips PAL_I */ | ||
116 | .name = "Philips PAL_I (FI1246 and compatibles)", | ||
117 | .count = 3, | ||
118 | .ranges = { | ||
119 | { 16 * 140.25 /*MHz*/, 0xa0, }, | ||
120 | { 16 * 463.25 /*MHz*/, 0x90, }, | ||
121 | { 16 * 999.99 , 0x30, }, | ||
122 | }, | ||
123 | .config = 0x8e, | ||
124 | }, | ||
125 | [TUNER_PHILIPS_NTSC] = { /* Philips NTSC */ | ||
126 | .name = "Philips NTSC (FI1236,FM1236 and compatibles)", | ||
127 | .count = 3, | ||
128 | .ranges = { | ||
129 | { 16 * 157.25 /*MHz*/, 0xa0, }, | ||
130 | { 16 * 451.25 /*MHz*/, 0x90, }, | ||
131 | { 16 * 999.99 , 0x30, }, | ||
132 | }, | ||
133 | .config = 0x8e, | ||
134 | }, | ||
135 | [TUNER_PHILIPS_SECAM] = { /* Philips SECAM */ | ||
136 | .name = "Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF)", | ||
137 | .count = 3, | ||
138 | .ranges = { | ||
139 | { 16 * 168.25 /*MHz*/, 0xa7, }, | ||
140 | { 16 * 447.25 /*MHz*/, 0x97, }, | ||
141 | { 16 * 999.99 , 0x37, }, | ||
142 | }, | ||
143 | .config = 0x8e, | ||
144 | }, | ||
145 | [TUNER_ABSENT] = { /* Tuner Absent */ | ||
146 | .name = "NoTuner", | ||
147 | .count = 1, | ||
148 | .ranges = { | ||
149 | { 0, 0x00, }, | ||
150 | }, | ||
151 | .config = 0x00, | ||
152 | }, | ||
153 | [TUNER_PHILIPS_PAL] = { /* Philips PAL */ | ||
154 | .name = "Philips PAL_BG (FI1216 and compatibles)", | ||
155 | .count = 3, | ||
156 | .ranges = { | ||
157 | { 16 * 168.25 /*MHz*/, 0xa0, }, | ||
158 | { 16 * 447.25 /*MHz*/, 0x90, }, | ||
159 | { 16 * 999.99 , 0x30, }, | ||
160 | }, | ||
161 | .config = 0x8e, | ||
162 | }, | ||
163 | [TUNER_TEMIC_NTSC] = { /* TEMIC NTSC */ | ||
164 | .name = "Temic NTSC (4032 FY5)", | ||
165 | .count = 3, | ||
166 | .ranges = { | ||
167 | { 16 * 157.25 /*MHz*/, 0x02, }, | ||
168 | { 16 * 463.25 /*MHz*/, 0x04, }, | ||
169 | { 16 * 999.99 , 0x01, }, | ||
170 | }, | ||
171 | .config = 0x8e, | ||
172 | }, | ||
173 | [TUNER_TEMIC_PAL_I] = { /* TEMIC PAL_I */ | ||
174 | .name = "Temic PAL_I (4062 FY5)", | ||
175 | .count = 3, | ||
176 | .ranges = { | ||
177 | { 16 * 170.00 /*MHz*/, 0x02, }, | ||
178 | { 16 * 450.00 /*MHz*/, 0x04, }, | ||
179 | { 16 * 999.99 , 0x01, }, | ||
180 | }, | ||
181 | .config = 0x8e, | ||
182 | }, | ||
183 | [TUNER_TEMIC_4036FY5_NTSC] = { /* TEMIC NTSC */ | ||
184 | .name = "Temic NTSC (4036 FY5)", | ||
185 | .count = 3, | ||
186 | .ranges = { | ||
187 | { 16 * 157.25 /*MHz*/, 0xa0, }, | ||
188 | { 16 * 463.25 /*MHz*/, 0x90, }, | ||
189 | { 16 * 999.99 , 0x30, }, | ||
190 | }, | ||
191 | .config = 0x8e, | ||
192 | }, | ||
193 | [TUNER_ALPS_TSBH1_NTSC] = { /* TEMIC NTSC */ | ||
194 | .name = "Alps HSBH1", | ||
195 | .count = 3, | ||
196 | .ranges = { | ||
197 | { 16 * 137.25 /*MHz*/, 0x01, }, | ||
198 | { 16 * 385.25 /*MHz*/, 0x02, }, | ||
199 | { 16 * 999.99 , 0x08, }, | ||
200 | }, | ||
201 | .config = 0x8e, | ||
202 | }, | ||
203 | |||
204 | /* 10-19 */ | ||
205 | [TUNER_ALPS_TSBE1_PAL] = { /* TEMIC PAL */ | ||
206 | .name = "Alps TSBE1", | ||
207 | .count = 3, | ||
208 | .ranges = { | ||
209 | { 16 * 137.25 /*MHz*/, 0x01, }, | ||
210 | { 16 * 385.25 /*MHz*/, 0x02, }, | ||
211 | { 16 * 999.99 , 0x08, }, | ||
212 | }, | ||
213 | .config = 0x8e, | ||
214 | }, | ||
215 | [TUNER_ALPS_TSBB5_PAL_I] = { /* Alps PAL_I */ | ||
216 | .name = "Alps TSBB5", | ||
217 | .count = 3, | ||
218 | .ranges = { | ||
219 | { 16 * 133.25 /*MHz*/, 0x01, }, | ||
220 | { 16 * 351.25 /*MHz*/, 0x02, }, | ||
221 | { 16 * 999.99 , 0x08, }, | ||
222 | }, | ||
223 | .config = 0x8e, | ||
224 | }, | ||
225 | [TUNER_ALPS_TSBE5_PAL] = { /* Alps PAL */ | ||
226 | .name = "Alps TSBE5", | ||
227 | .count = 3, | ||
228 | .ranges = { | ||
229 | { 16 * 133.25 /*MHz*/, 0x01, }, | ||
230 | { 16 * 351.25 /*MHz*/, 0x02, }, | ||
231 | { 16 * 999.99 , 0x08, }, | ||
232 | }, | ||
233 | .config = 0x8e, | ||
234 | }, | ||
235 | [TUNER_ALPS_TSBC5_PAL] = { /* Alps PAL */ | ||
236 | .name = "Alps TSBC5", | ||
237 | .count = 3, | ||
238 | .ranges = { | ||
239 | { 16 * 133.25 /*MHz*/, 0x01, }, | ||
240 | { 16 * 351.25 /*MHz*/, 0x02, }, | ||
241 | { 16 * 999.99 , 0x08, }, | ||
242 | }, | ||
243 | .config = 0x8e, | ||
244 | }, | ||
245 | [TUNER_TEMIC_4006FH5_PAL] = { /* TEMIC PAL */ | ||
246 | .name = "Temic PAL_BG (4006FH5)", | ||
247 | .count = 3, | ||
248 | .ranges = { | ||
249 | { 16 * 170.00 /*MHz*/, 0xa0, }, | ||
250 | { 16 * 450.00 /*MHz*/, 0x90, }, | ||
251 | { 16 * 999.99 , 0x30, }, | ||
252 | }, | ||
253 | .config = 0x8e, | ||
254 | }, | ||
255 | [TUNER_ALPS_TSHC6_NTSC] = { /* Alps NTSC */ | ||
256 | .name = "Alps TSCH6", | ||
257 | .count = 3, | ||
258 | .ranges = { | ||
259 | { 16 * 137.25 /*MHz*/, 0x14, }, | ||
260 | { 16 * 385.25 /*MHz*/, 0x12, }, | ||
261 | { 16 * 999.99 , 0x11, }, | ||
262 | }, | ||
263 | .config = 0x8e, | ||
264 | }, | ||
265 | [TUNER_TEMIC_PAL_DK] = { /* TEMIC PAL */ | ||
266 | .name = "Temic PAL_DK (4016 FY5)", | ||
267 | .count = 3, | ||
268 | .ranges = { | ||
269 | { 16 * 168.25 /*MHz*/, 0xa0, }, | ||
270 | { 16 * 456.25 /*MHz*/, 0x90, }, | ||
271 | { 16 * 999.99 , 0x30, }, | ||
272 | }, | ||
273 | .config = 0x8e, | ||
274 | }, | ||
275 | [TUNER_PHILIPS_NTSC_M] = { /* Philips NTSC */ | ||
276 | .name = "Philips NTSC_M (MK2)", | ||
277 | .count = 3, | ||
278 | .ranges = { | ||
279 | { 16 * 160.00 /*MHz*/, 0xa0, }, | ||
280 | { 16 * 454.00 /*MHz*/, 0x90, }, | ||
281 | { 16 * 999.99 , 0x30, }, | ||
282 | }, | ||
283 | .config = 0x8e, | ||
284 | }, | ||
285 | [TUNER_TEMIC_4066FY5_PAL_I] = { /* TEMIC PAL_I */ | ||
286 | .name = "Temic PAL_I (4066 FY5)", | ||
287 | .count = 3, | ||
288 | .ranges = { | ||
289 | { 16 * 169.00 /*MHz*/, 0xa0, }, | ||
290 | { 16 * 454.00 /*MHz*/, 0x90, }, | ||
291 | { 16 * 999.99 , 0x30, }, | ||
292 | }, | ||
293 | .config = 0x8e, | ||
294 | }, | ||
295 | [TUNER_TEMIC_4006FN5_MULTI_PAL] = { /* TEMIC PAL */ | ||
296 | .name = "Temic PAL* auto (4006 FN5)", | ||
297 | .count = 3, | ||
298 | .ranges = { | ||
299 | { 16 * 169.00 /*MHz*/, 0xa0, }, | ||
300 | { 16 * 454.00 /*MHz*/, 0x90, }, | ||
301 | { 16 * 999.99 , 0x30, }, | ||
302 | }, | ||
303 | .config = 0x8e, | ||
304 | }, | ||
305 | |||
306 | /* 20-29 */ | ||
307 | [TUNER_TEMIC_4009FR5_PAL] = { /* TEMIC PAL */ | ||
308 | .name = "Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5)", | ||
309 | .count = 3, | ||
310 | .ranges = { | ||
311 | { 16 * 141.00 /*MHz*/, 0xa0, }, | ||
312 | { 16 * 464.00 /*MHz*/, 0x90, }, | ||
313 | { 16 * 999.99 , 0x30, }, | ||
314 | }, | ||
315 | .config = 0x8e, | ||
316 | }, | ||
317 | [TUNER_TEMIC_4039FR5_NTSC] = { /* TEMIC NTSC */ | ||
318 | .name = "Temic NTSC (4039 FR5)", | ||
319 | .count = 3, | ||
320 | .ranges = { | ||
321 | { 16 * 158.00 /*MHz*/, 0xa0, }, | ||
322 | { 16 * 453.00 /*MHz*/, 0x90, }, | ||
323 | { 16 * 999.99 , 0x30, }, | ||
324 | }, | ||
325 | .config = 0x8e, | ||
326 | }, | ||
327 | [TUNER_TEMIC_4046FM5] = { /* TEMIC PAL */ | ||
328 | .name = "Temic PAL/SECAM multi (4046 FM5)", | ||
329 | .count = 3, | ||
330 | .ranges = { | ||
331 | { 16 * 169.00 /*MHz*/, 0xa0, }, | ||
332 | { 16 * 454.00 /*MHz*/, 0x90, }, | ||
333 | { 16 * 999.99 , 0x30, }, | ||
334 | }, | ||
335 | .config = 0x8e, | ||
336 | }, | ||
337 | [TUNER_PHILIPS_PAL_DK] = { /* Philips PAL */ | ||
338 | .name = "Philips PAL_DK (FI1256 and compatibles)", | ||
339 | .count = 3, | ||
340 | .ranges = { | ||
341 | { 16 * 170.00 /*MHz*/, 0xa0, }, | ||
342 | { 16 * 450.00 /*MHz*/, 0x90, }, | ||
343 | { 16 * 999.99 , 0x30, }, | ||
344 | }, | ||
345 | .config = 0x8e, | ||
346 | }, | ||
347 | [TUNER_PHILIPS_FQ1216ME] = { /* Philips PAL */ | ||
348 | .name = "Philips PAL/SECAM multi (FQ1216ME)", | ||
349 | .count = 3, | ||
350 | .ranges = { | ||
351 | { 16 * 170.00 /*MHz*/, 0xa0, }, | ||
352 | { 16 * 450.00 /*MHz*/, 0x90, }, | ||
353 | { 16 * 999.99 , 0x30, }, | ||
354 | }, | ||
355 | .config = 0x8e, | ||
356 | }, | ||
357 | [TUNER_LG_PAL_I_FM] = { /* LGINNOTEK PAL_I */ | ||
358 | .name = "LG PAL_I+FM (TAPC-I001D)", | ||
359 | .count = 3, | ||
360 | .ranges = { | ||
361 | { 16 * 170.00 /*MHz*/, 0xa0, }, | ||
362 | { 16 * 450.00 /*MHz*/, 0x90, }, | ||
363 | { 16 * 999.99 , 0x30, }, | ||
364 | }, | ||
365 | .config = 0x8e, | ||
366 | }, | ||
367 | [TUNER_LG_PAL_I] = { /* LGINNOTEK PAL_I */ | ||
368 | .name = "LG PAL_I (TAPC-I701D)", | ||
369 | .count = 3, | ||
370 | .ranges = { | ||
371 | { 16 * 170.00 /*MHz*/, 0xa0, }, | ||
372 | { 16 * 450.00 /*MHz*/, 0x90, }, | ||
373 | { 16 * 999.99 , 0x30, }, | ||
374 | }, | ||
375 | .config = 0x8e, | ||
376 | }, | ||
377 | [TUNER_LG_NTSC_FM] = { /* LGINNOTEK NTSC */ | ||
378 | .name = "LG NTSC+FM (TPI8NSR01F)", | ||
379 | .count = 3, | ||
380 | .ranges = { | ||
381 | { 16 * 210.00 /*MHz*/, 0xa0, }, | ||
382 | { 16 * 497.00 /*MHz*/, 0x90, }, | ||
383 | { 16 * 999.99 , 0x30, }, | ||
384 | }, | ||
385 | .config = 0x8e, | ||
386 | }, | ||
387 | [TUNER_LG_PAL_FM] = { /* LGINNOTEK PAL */ | ||
388 | .name = "LG PAL_BG+FM (TPI8PSB01D)", | ||
389 | .count = 3, | ||
390 | .ranges = { | ||
391 | { 16 * 170.00 /*MHz*/, 0xa0, }, | ||
392 | { 16 * 450.00 /*MHz*/, 0x90, }, | ||
393 | { 16 * 999.99 , 0x30, }, | ||
394 | }, | ||
395 | .config = 0x8e, | ||
396 | }, | ||
397 | [TUNER_LG_PAL] = { /* LGINNOTEK PAL */ | ||
398 | .name = "LG PAL_BG (TPI8PSB11D)", | ||
399 | .count = 3, | ||
400 | .ranges = { | ||
401 | { 16 * 170.00 /*MHz*/, 0xa0, }, | ||
402 | { 16 * 450.00 /*MHz*/, 0x90, }, | ||
403 | { 16 * 999.99 , 0x30, }, | ||
404 | }, | ||
405 | .config = 0x8e, | ||
406 | }, | ||
407 | |||
408 | /* 30-39 */ | ||
409 | [TUNER_TEMIC_4009FN5_MULTI_PAL_FM] = { /* TEMIC PAL */ | ||
410 | .name = "Temic PAL* auto + FM (4009 FN5)", | ||
411 | .count = 3, | ||
412 | .ranges = { | ||
413 | { 16 * 141.00 /*MHz*/, 0xa0, }, | ||
414 | { 16 * 464.00 /*MHz*/, 0x90, }, | ||
415 | { 16 * 999.99 , 0x30, }, | ||
416 | }, | ||
417 | .config = 0x8e, | ||
418 | }, | ||
419 | [TUNER_SHARP_2U5JF5540_NTSC] = { /* SHARP NTSC */ | ||
420 | .name = "SHARP NTSC_JP (2U5JF5540)", | ||
421 | .count = 3, | ||
422 | .ranges = { | ||
423 | { 16 * 137.25 /*MHz*/, 0x01, }, | ||
424 | { 16 * 317.25 /*MHz*/, 0x02, }, | ||
425 | { 16 * 999.99 , 0x08, }, | ||
426 | }, | ||
427 | .config = 0x8e, | ||
428 | }, | ||
429 | [TUNER_Samsung_PAL_TCPM9091PD27] = { /* Samsung PAL */ | ||
430 | .name = "Samsung PAL TCPM9091PD27", | ||
431 | .count = 3, | ||
432 | .ranges = { | ||
433 | { 16 * 169 /*MHz*/, 0xa0, }, | ||
434 | { 16 * 464 /*MHz*/, 0x90, }, | ||
435 | { 16 * 999.99 , 0x30, }, | ||
436 | }, | ||
437 | .config = 0x8e, | ||
438 | }, | ||
439 | [TUNER_MT2032] = { /* Microtune PAL|NTSC */ | ||
440 | .name = "MT20xx universal", | ||
441 | /* see mt20xx.c for details */ }, | ||
442 | [TUNER_TEMIC_4106FH5] = { /* TEMIC PAL */ | ||
443 | .name = "Temic PAL_BG (4106 FH5)", | ||
444 | .count = 3, | ||
445 | .ranges = { | ||
446 | { 16 * 141.00 /*MHz*/, 0xa0, }, | ||
447 | { 16 * 464.00 /*MHz*/, 0x90, }, | ||
448 | { 16 * 999.99 , 0x30, }, | ||
449 | }, | ||
450 | .config = 0x8e, | ||
451 | }, | ||
452 | [TUNER_TEMIC_4012FY5] = { /* TEMIC PAL */ | ||
453 | .name = "Temic PAL_DK/SECAM_L (4012 FY5)", | ||
454 | .count = 3, | ||
455 | .ranges = { | ||
456 | { 16 * 140.25 /*MHz*/, 0x02, }, | ||
457 | { 16 * 463.25 /*MHz*/, 0x04, }, | ||
458 | { 16 * 999.99 , 0x01, }, | ||
459 | }, | ||
460 | .config = 0x8e, | ||
461 | }, | ||
462 | [TUNER_TEMIC_4136FY5] = { /* TEMIC NTSC */ | ||
463 | .name = "Temic NTSC (4136 FY5)", | ||
464 | .count = 3, | ||
465 | .ranges = { | ||
466 | { 16 * 158.00 /*MHz*/, 0xa0, }, | ||
467 | { 16 * 453.00 /*MHz*/, 0x90, }, | ||
468 | { 16 * 999.99 , 0x30, }, | ||
469 | }, | ||
470 | .config = 0x8e, | ||
471 | }, | ||
472 | [TUNER_LG_PAL_NEW_TAPC] = { /* LGINNOTEK PAL */ | ||
473 | .name = "LG PAL (newer TAPC series)", | ||
474 | .count = 3, | ||
475 | .ranges = { | ||
476 | { 16 * 170.00 /*MHz*/, 0x01, }, | ||
477 | { 16 * 450.00 /*MHz*/, 0x02, }, | ||
478 | { 16 * 999.99 , 0x08, }, | ||
479 | }, | ||
480 | .config = 0x8e, | ||
481 | }, | ||
482 | [TUNER_PHILIPS_FM1216ME_MK3] = { /* Philips PAL */ | ||
483 | .name = "Philips PAL/SECAM multi (FM1216ME MK3)", | ||
484 | .count = 3, | ||
485 | .ranges = { | ||
486 | { 16 * 158.00 /*MHz*/, 0x01, }, | ||
487 | { 16 * 442.00 /*MHz*/, 0x02, }, | ||
488 | { 16 * 999.99 , 0x04, }, | ||
489 | }, | ||
490 | .config = 0x8e, | ||
491 | }, | ||
492 | [TUNER_LG_NTSC_NEW_TAPC] = { /* LGINNOTEK NTSC */ | ||
493 | .name = "LG NTSC (newer TAPC series)", | ||
494 | .count = 3, | ||
495 | .ranges = { | ||
496 | { 16 * 170.00 /*MHz*/, 0x01, }, | ||
497 | { 16 * 450.00 /*MHz*/, 0x02, }, | ||
498 | { 16 * 999.99 , 0x08, }, | ||
499 | }, | ||
500 | .config = 0x8e, | ||
501 | }, | ||
502 | |||
503 | /* 40-49 */ | ||
504 | [TUNER_HITACHI_NTSC] = { /* HITACHI NTSC */ | ||
505 | .name = "HITACHI V7-J180AT", | ||
506 | .count = 3, | ||
507 | .ranges = { | ||
508 | { 16 * 170.00 /*MHz*/, 0x01, }, | ||
509 | { 16 * 450.00 /*MHz*/, 0x02, }, | ||
510 | { 16 * 999.99 , 0x08, }, | ||
511 | }, | ||
512 | .config = 0x8e, | ||
513 | }, | ||
514 | [TUNER_PHILIPS_PAL_MK] = { /* Philips PAL */ | ||
515 | .name = "Philips PAL_MK (FI1216 MK)", | ||
516 | .count = 3, | ||
517 | .ranges = { | ||
518 | { 16 * 140.25 /*MHz*/, 0x01, }, | ||
519 | { 16 * 463.25 /*MHz*/, 0xc2, }, | ||
520 | { 16 * 999.99 , 0xcf, }, | ||
521 | }, | ||
522 | .config = 0x8e, | ||
523 | }, | ||
524 | [TUNER_PHILIPS_ATSC] = { /* Philips ATSC */ | ||
525 | .name = "Philips 1236D ATSC/NTSC dual in", | ||
526 | .count = 3, | ||
527 | .ranges = { | ||
528 | { 16 * 157.25 /*MHz*/, 0xa0, }, | ||
529 | { 16 * 454.00 /*MHz*/, 0x90, }, | ||
530 | { 16 * 999.99 , 0x30, }, | ||
531 | }, | ||
532 | .config = 0x8e, | ||
533 | }, | ||
534 | [TUNER_PHILIPS_FM1236_MK3] = { /* Philips NTSC */ | ||
535 | .name = "Philips NTSC MK3 (FM1236MK3 or FM1236/F)", | ||
536 | .count = 3, | ||
537 | .ranges = { | ||
538 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
539 | { 16 * 442.00 /*MHz*/, 0x02, }, | ||
540 | { 16 * 999.99 , 0x04, }, | ||
541 | }, | ||
542 | .config = 0x8e, | ||
543 | }, | ||
544 | [TUNER_PHILIPS_4IN1] = { /* Philips NTSC */ | ||
545 | .name = "Philips 4 in 1 (ATI TV Wonder Pro/Conexant)", | ||
546 | .count = 3, | ||
547 | .ranges = { | ||
548 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
549 | { 16 * 442.00 /*MHz*/, 0x02, }, | ||
550 | { 16 * 999.99 , 0x04, }, | ||
551 | }, | ||
552 | .config = 0x8e, | ||
553 | }, | ||
554 | [TUNER_MICROTUNE_4049FM5] = { /* Microtune PAL */ | ||
555 | .name = "Microtune 4049 FM5", | ||
556 | .count = 3, | ||
557 | .ranges = { | ||
558 | { 16 * 141.00 /*MHz*/, 0xa0, }, | ||
559 | { 16 * 464.00 /*MHz*/, 0x90, }, | ||
560 | { 16 * 999.99 , 0x30, }, | ||
561 | }, | ||
562 | .config = 0x8e, | ||
563 | }, | ||
564 | [TUNER_PANASONIC_VP27] = { /* Panasonic NTSC */ | ||
565 | .name = "Panasonic VP27s/ENGE4324D", | ||
566 | .count = 3, | ||
567 | .ranges = { | ||
568 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
569 | { 16 * 454.00 /*MHz*/, 0x02, }, | ||
570 | { 16 * 999.99 , 0x08, }, | ||
571 | }, | ||
572 | .config = 0xce, | ||
573 | }, | ||
574 | [TUNER_LG_NTSC_TAPE] = { /* LGINNOTEK NTSC */ | ||
575 | .name = "LG NTSC (TAPE series)", | ||
576 | .count = 3, | ||
577 | .ranges = { | ||
578 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
579 | { 16 * 442.00 /*MHz*/, 0x02, }, | ||
580 | { 16 * 999.99 , 0x04, }, | ||
581 | }, | ||
582 | .config = 0x8e, | ||
583 | }, | ||
584 | [TUNER_TNF_8831BGFF] = { /* Philips PAL */ | ||
585 | .name = "Tenna TNF 8831 BGFF)", | ||
586 | .count = 3, | ||
587 | .ranges = { | ||
588 | { 16 * 161.25 /*MHz*/, 0xa0, }, | ||
589 | { 16 * 463.25 /*MHz*/, 0x90, }, | ||
590 | { 16 * 999.99 , 0x30, }, | ||
591 | }, | ||
592 | .config = 0x8e, | ||
593 | }, | ||
594 | [TUNER_MICROTUNE_4042FI5] = { /* Microtune NTSC */ | ||
595 | .name = "Microtune 4042 FI5 ATSC/NTSC dual in", | ||
596 | .count = 3, | ||
597 | .ranges = { | ||
598 | { 16 * 162.00 /*MHz*/, 0xa2, }, | ||
599 | { 16 * 457.00 /*MHz*/, 0x94, }, | ||
600 | { 16 * 999.99 , 0x31, }, | ||
601 | }, | ||
602 | .config = 0x8e, | ||
603 | }, | ||
604 | |||
605 | /* 50-59 */ | ||
606 | [TUNER_TCL_2002N] = { /* TCL NTSC */ | ||
607 | .name = "TCL 2002N", | ||
608 | .count = 3, | ||
609 | .ranges = { | ||
610 | { 16 * 172.00 /*MHz*/, 0x01, }, | ||
611 | { 16 * 448.00 /*MHz*/, 0x02, }, | ||
612 | { 16 * 999.99 , 0x08, }, | ||
613 | }, | ||
614 | .config = 0x8e, | ||
615 | }, | ||
616 | [TUNER_PHILIPS_FM1256_IH3] = { /* Philips PAL */ | ||
617 | .name = "Philips PAL/SECAM_D (FM 1256 I-H3)", | ||
618 | .count = 3, | ||
619 | .ranges = { | ||
620 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
621 | { 16 * 442.00 /*MHz*/, 0x02, }, | ||
622 | { 16 * 999.99 , 0x04, }, | ||
623 | }, | ||
624 | .config = 0x8e, | ||
625 | }, | ||
626 | [TUNER_THOMSON_DTT7610] = { /* THOMSON ATSC */ | ||
627 | .name = "Thomson DTT 7610 (ATSC/NTSC)", | ||
628 | .count = 3, | ||
629 | .ranges = { | ||
630 | { 16 * 157.25 /*MHz*/, 0x39, }, | ||
631 | { 16 * 454.00 /*MHz*/, 0x3a, }, | ||
632 | { 16 * 999.99 , 0x3c, }, | ||
633 | }, | ||
634 | .config = 0x8e, | ||
635 | }, | ||
636 | [TUNER_PHILIPS_FQ1286] = { /* Philips NTSC */ | ||
637 | .name = "Philips FQ1286", | ||
638 | .count = 3, | ||
639 | .ranges = { | ||
640 | { 16 * 160.00 /*MHz*/, 0x41, }, | ||
641 | { 16 * 454.00 /*MHz*/, 0x42, }, | ||
642 | { 16 * 999.99 , 0x04, }, | ||
643 | }, | ||
644 | .config = 0x8e, | ||
645 | }, | ||
646 | [TUNER_PHILIPS_TDA8290] = { /* Philips PAL|NTSC */ | ||
647 | .name = "tda8290+75", | ||
648 | /* see tda8290.c for details */ }, | ||
649 | [TUNER_TCL_2002MB] = { /* TCL PAL */ | ||
650 | .name = "TCL 2002MB", | ||
651 | .count = 3, | ||
652 | .ranges = { | ||
653 | { 16 * 170.00 /*MHz*/, 0x01, }, | ||
654 | { 16 * 450.00 /*MHz*/, 0x02, }, | ||
655 | { 16 * 999.99 , 0x08, }, | ||
656 | }, | ||
657 | .config = 0xce, | ||
658 | }, | ||
659 | [TUNER_PHILIPS_FQ1216AME_MK4] = { /* Philips PAL */ | ||
660 | .name = "Philips PAL/SECAM multi (FQ1216AME MK4)", | ||
661 | .count = 3, | ||
662 | .ranges = { | ||
663 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
664 | { 16 * 442.00 /*MHz*/, 0x02, }, | ||
665 | { 16 * 999.99 , 0x04, }, | ||
666 | }, | ||
667 | .config = 0xce, | ||
668 | }, | ||
669 | [TUNER_PHILIPS_FQ1236A_MK4] = { /* Philips NTSC */ | ||
670 | .name = "Philips FQ1236A MK4", | ||
671 | .count = 3, | ||
672 | .ranges = { | ||
673 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
674 | { 16 * 442.00 /*MHz*/, 0x02, }, | ||
675 | { 16 * 999.99 , 0x04, }, | ||
676 | }, | ||
677 | .config = 0x8e, | ||
678 | }, | ||
679 | [TUNER_YMEC_TVF_8531MF] = { /* Philips NTSC */ | ||
680 | .name = "Ymec TVision TVF-8531MF/8831MF/8731MF", | ||
681 | .count = 3, | ||
682 | .ranges = { | ||
683 | { 16 * 160.00 /*MHz*/, 0xa0, }, | ||
684 | { 16 * 454.00 /*MHz*/, 0x90, }, | ||
685 | { 16 * 999.99 , 0x30, }, | ||
686 | }, | ||
687 | .config = 0x8e, | ||
688 | }, | ||
689 | [TUNER_YMEC_TVF_5533MF] = { /* Philips NTSC */ | ||
690 | .name = "Ymec TVision TVF-5533MF", | ||
691 | .count = 3, | ||
692 | .ranges = { | ||
693 | { 16 * 160.00 /*MHz*/, 0x01, }, | ||
694 | { 16 * 454.00 /*MHz*/, 0x02, }, | ||
695 | { 16 * 999.99 , 0x04, }, | ||
696 | }, | ||
697 | .config = 0x8e, | ||
698 | }, | ||
699 | |||
700 | /* 60-69 */ | ||
701 | [TUNER_THOMSON_DTT761X] = { /* THOMSON ATSC */ | ||
702 | /* DTT 7611 7611A 7612 7613 7613A 7614 7615 7615A */ | ||
703 | .name = "Thomson DTT 761X (ATSC/NTSC)", | ||
704 | .count = 3, | ||
705 | .ranges = { | ||
706 | { 16 * 145.25 /*MHz*/, 0x39, }, | ||
707 | { 16 * 415.25 /*MHz*/, 0x3a, }, | ||
708 | { 16 * 999.99 , 0x3c, }, | ||
709 | }, | ||
710 | .config = 0x8e, | ||
711 | }, | ||
712 | [TUNER_TENA_9533_DI] = { /* Philips PAL */ | ||
713 | .name = "Tena TNF9533-D/IF/TNF9533-B/DF", | ||
714 | .count = 3, | ||
715 | .ranges = { | ||
716 | { 16 * 160.25 /*MHz*/, 0x01, }, | ||
717 | { 16 * 464.25 /*MHz*/, 0x02, }, | ||
718 | { 16 * 999.99 , 0x04, }, | ||
719 | }, | ||
720 | .config = 0x8e, | ||
721 | }, | ||
722 | [TUNER_TEA5767] = { /* Philips RADIO */ | ||
723 | .name = "Philips TEA5767HN FM Radio", | ||
724 | /* see tea5767.c for details */}, | ||
725 | [TUNER_PHILIPS_FMD1216ME_MK3] = { /* Philips PAL */ | ||
726 | .name = "Philips FMD1216ME MK3 Hybrid Tuner", | ||
727 | .count = 3, | ||
728 | .ranges = { | ||
729 | { 16 * 160.00 /*MHz*/, 0x51, }, | ||
730 | { 16 * 442.00 /*MHz*/, 0x52, }, | ||
731 | { 16 * 999.99 , 0x54, }, | ||
732 | }, | ||
733 | .config = 0x86, | ||
734 | }, | ||
735 | [TUNER_LG_TDVS_H062F] = { /* LGINNOTEK ATSC */ | ||
736 | .name = "LG TDVS-H062F/TUA6034", | ||
737 | .count = 3, | ||
738 | .ranges = { | ||
739 | { 16 * 160.00 /*MHz*/, 0x01 }, | ||
740 | { 16 * 455.00 /*MHz*/, 0x02 }, | ||
741 | { 16 * 999.99 , 0x04 }, | ||
742 | }, | ||
743 | .config = 0x8e, | ||
744 | }, | ||
745 | [TUNER_YMEC_TVF66T5_B_DFF] = { /* Philips PAL */ | ||
746 | .name = "Ymec TVF66T5-B/DFF", | ||
747 | .count = 3, | ||
748 | .ranges = { | ||
749 | { 16 * 160.25 /*MHz*/, 0x01, }, | ||
750 | { 16 * 464.25 /*MHz*/, 0x02, }, | ||
751 | { 16 * 999.99 , 0x08, }, | ||
752 | }, | ||
753 | .config = 0x8e, | ||
754 | }, | ||
755 | [TUNER_LG_NTSC_TALN_MINI] = { /* LGINNOTEK NTSC */ | ||
756 | .name = "LG NTSC (TALN mini series)", | ||
757 | .count = 3, | ||
758 | .ranges = { | ||
759 | { 16 * 137.25 /*MHz*/, 0x01, }, | ||
760 | { 16 * 373.25 /*MHz*/, 0x02, }, | ||
761 | { 16 * 999.99 , 0x08, }, | ||
762 | }, | ||
763 | .config = 0x8e, | ||
764 | }, | ||
765 | [TUNER_PHILIPS_TD1316] = { /* Philips PAL */ | ||
766 | .name = "Philips TD1316 Hybrid Tuner", | ||
767 | .count = 3, | ||
768 | .ranges = { | ||
769 | { 16 * 160.00 /*MHz*/, 0xa1, }, | ||
770 | { 16 * 442.00 /*MHz*/, 0xa2, }, | ||
771 | { 16 * 999.99 , 0xa4, }, | ||
772 | }, | ||
773 | .config = 0xc8, | ||
774 | }, | ||
775 | [TUNER_PHILIPS_TUV1236D] = { /* Philips ATSC */ | ||
776 | .name = "Philips TUV1236D ATSC/NTSC dual in", | ||
777 | .count = 3, | ||
778 | .ranges = { | ||
779 | { 16 * 157.25 /*MHz*/, 0x01, }, | ||
780 | { 16 * 454.00 /*MHz*/, 0x02, }, | ||
781 | { 16 * 999.99 , 0x04, }, | ||
782 | }, | ||
783 | .config = 0xce, | ||
784 | }, | ||
785 | [TUNER_TNF_5335MF] = { /* Philips NTSC */ | ||
786 | .name = "Tena TNF 5335 MF", | ||
787 | .count = 3, | ||
788 | .ranges = { | ||
789 | { 16 * 157.25 /*MHz*/, 0x01, }, | ||
790 | { 16 * 454.00 /*MHz*/, 0x02, }, | ||
791 | { 16 * 999.99 , 0x04, }, | ||
792 | }, | ||
793 | .config = 0x8e, | ||
794 | }, | ||
795 | }; | ||
796 | |||
797 | unsigned const int tuner_count = ARRAY_SIZE(tuners); | ||
798 | 92 | ||
799 | /* ---------------------------------------------------------------------- */ | 93 | /* ---------------------------------------------------------------------- */ |
800 | 94 | ||
@@ -842,16 +136,23 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
842 | u8 config, tuneraddr; | 136 | u8 config, tuneraddr; |
843 | u16 div; | 137 | u16 div; |
844 | struct tunertype *tun; | 138 | struct tunertype *tun; |
845 | unsigned char buffer[4]; | 139 | u8 buffer[4]; |
846 | int rc, IFPCoff, i; | 140 | int rc, IFPCoff, i, j; |
847 | 141 | ||
848 | tun = &tuners[t->type]; | 142 | tun = &tuners[t->type]; |
849 | for (i = 0; i < tun->count; i++) { | 143 | j = TUNER_PARAM_ANALOG; |
850 | if (freq > tun->ranges[i].thresh) | 144 | |
145 | for (i = 0; i < tun->params[j].count; i++) { | ||
146 | if (freq > tun->params[j].ranges[i].limit) | ||
851 | continue; | 147 | continue; |
852 | break; | 148 | break; |
853 | } | 149 | } |
854 | config = tun->ranges[i].cb; | 150 | if (i == tun->params[j].count) { |
151 | tuner_dbg("TV frequency out of range (%d > %d)", | ||
152 | freq, tun->params[j].ranges[i - 1].limit); | ||
153 | freq = tun->params[j].ranges[--i].limit; | ||
154 | } | ||
155 | config = tun->params[j].ranges[i].cb; | ||
855 | /* i == 0 -> VHF_LO */ | 156 | /* i == 0 -> VHF_LO */ |
856 | /* i == 1 -> VHF_HI */ | 157 | /* i == 1 -> VHF_HI */ |
857 | /* i == 2 -> UHF */ | 158 | /* i == 2 -> UHF */ |
@@ -914,7 +215,7 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
914 | 215 | ||
915 | case TUNER_MICROTUNE_4042FI5: | 216 | case TUNER_MICROTUNE_4042FI5: |
916 | /* Set the charge pump for fast tuning */ | 217 | /* Set the charge pump for fast tuning */ |
917 | tun->config |= TUNER_CHARGE_PUMP; | 218 | tun->params[j].config |= TUNER_CHARGE_PUMP; |
918 | break; | 219 | break; |
919 | 220 | ||
920 | case TUNER_PHILIPS_TUV1236D: | 221 | case TUNER_PHILIPS_TUV1236D: |
@@ -943,20 +244,6 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
943 | break; | 244 | break; |
944 | } | 245 | } |
945 | 246 | ||
946 | /* | ||
947 | * Philips FI1216MK2 remark from specification : | ||
948 | * for channel selection involving band switching, and to ensure | ||
949 | * smooth tuning to the desired channel without causing | ||
950 | * unnecessary charge pump action, it is recommended to consider | ||
951 | * the difference between wanted channel frequency and the | ||
952 | * current channel frequency. Unnecessary charge pump action | ||
953 | * will result in very low tuning voltage which may drive the | ||
954 | * oscillator to extreme conditions. | ||
955 | * | ||
956 | * Progfou: specification says to send config data before | ||
957 | * frequency in case (wanted frequency < current frequency). | ||
958 | */ | ||
959 | |||
960 | /* IFPCoff = Video Intermediate Frequency - Vif: | 247 | /* IFPCoff = Video Intermediate Frequency - Vif: |
961 | 940 =16*58.75 NTSC/J (Japan) | 248 | 940 =16*58.75 NTSC/J (Japan) |
962 | 732 =16*45.75 M/N STD | 249 | 732 =16*45.75 M/N STD |
@@ -988,17 +275,18 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
988 | offset / 16, offset % 16 * 100 / 16, | 275 | offset / 16, offset % 16 * 100 / 16, |
989 | div); | 276 | div); |
990 | 277 | ||
991 | if (t->type == TUNER_PHILIPS_SECAM && freq < t->freq) { | 278 | if (tuners[t->type].params->cb_first_if_lower_freq && div < t->last_div) { |
992 | buffer[0] = tun->config; | 279 | buffer[0] = tun->params[j].config; |
993 | buffer[1] = config; | 280 | buffer[1] = config; |
994 | buffer[2] = (div>>8) & 0x7f; | 281 | buffer[2] = (div>>8) & 0x7f; |
995 | buffer[3] = div & 0xff; | 282 | buffer[3] = div & 0xff; |
996 | } else { | 283 | } else { |
997 | buffer[0] = (div>>8) & 0x7f; | 284 | buffer[0] = (div>>8) & 0x7f; |
998 | buffer[1] = div & 0xff; | 285 | buffer[1] = div & 0xff; |
999 | buffer[2] = tun->config; | 286 | buffer[2] = tun->params[j].config; |
1000 | buffer[3] = config; | 287 | buffer[3] = config; |
1001 | } | 288 | } |
289 | t->last_div = div; | ||
1002 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", | 290 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", |
1003 | buffer[0],buffer[1],buffer[2],buffer[3]); | 291 | buffer[0],buffer[1],buffer[2],buffer[3]); |
1004 | 292 | ||
@@ -1024,10 +312,10 @@ static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |||
1024 | } | 312 | } |
1025 | 313 | ||
1026 | /* Set the charge pump for optimized phase noise figure */ | 314 | /* Set the charge pump for optimized phase noise figure */ |
1027 | tun->config &= ~TUNER_CHARGE_PUMP; | 315 | tun->params[j].config &= ~TUNER_CHARGE_PUMP; |
1028 | buffer[0] = (div>>8) & 0x7f; | 316 | buffer[0] = (div>>8) & 0x7f; |
1029 | buffer[1] = div & 0xff; | 317 | buffer[1] = div & 0xff; |
1030 | buffer[2] = tun->config; | 318 | buffer[2] = tun->params[j].config; |
1031 | buffer[3] = config; | 319 | buffer[3] = config; |
1032 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", | 320 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", |
1033 | buffer[0],buffer[1],buffer[2],buffer[3]); | 321 | buffer[0],buffer[1],buffer[2],buffer[3]); |
@@ -1041,13 +329,15 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) | |||
1041 | { | 329 | { |
1042 | struct tunertype *tun; | 330 | struct tunertype *tun; |
1043 | struct tuner *t = i2c_get_clientdata(c); | 331 | struct tuner *t = i2c_get_clientdata(c); |
1044 | unsigned char buffer[4]; | 332 | u8 buffer[4]; |
1045 | unsigned div; | 333 | u16 div; |
1046 | int rc; | 334 | int rc, j; |
1047 | 335 | ||
1048 | tun = &tuners[t->type]; | 336 | tun = &tuners[t->type]; |
337 | j = TUNER_PARAM_ANALOG; | ||
338 | |||
1049 | div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */ | 339 | div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */ |
1050 | buffer[2] = (tun->config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */ | 340 | buffer[2] = (tun->params[j].config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */ |
1051 | 341 | ||
1052 | switch (t->type) { | 342 | switch (t->type) { |
1053 | case TUNER_TENA_9533_DI: | 343 | case TUNER_TENA_9533_DI: |
@@ -1076,9 +366,19 @@ static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) | |||
1076 | } | 366 | } |
1077 | buffer[0] = (div>>8) & 0x7f; | 367 | buffer[0] = (div>>8) & 0x7f; |
1078 | buffer[1] = div & 0xff; | 368 | buffer[1] = div & 0xff; |
369 | if (tuners[t->type].params->cb_first_if_lower_freq && div < t->last_div) { | ||
370 | buffer[0] = buffer[2]; | ||
371 | buffer[1] = buffer[3]; | ||
372 | buffer[2] = (div>>8) & 0x7f; | ||
373 | buffer[3] = div & 0xff; | ||
374 | } else { | ||
375 | buffer[0] = (div>>8) & 0x7f; | ||
376 | buffer[1] = div & 0xff; | ||
377 | } | ||
1079 | 378 | ||
1080 | tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n", | 379 | tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n", |
1081 | buffer[0],buffer[1],buffer[2],buffer[3]); | 380 | buffer[0],buffer[1],buffer[2],buffer[3]); |
381 | t->last_div = div; | ||
1082 | 382 | ||
1083 | if (4 != (rc = i2c_master_send(c,buffer,4))) | 383 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
1084 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | 384 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
@@ -1092,10 +392,10 @@ int default_tuner_init(struct i2c_client *c) | |||
1092 | t->type, tuners[t->type].name); | 392 | t->type, tuners[t->type].name); |
1093 | strlcpy(c->name, tuners[t->type].name, sizeof(c->name)); | 393 | strlcpy(c->name, tuners[t->type].name, sizeof(c->name)); |
1094 | 394 | ||
1095 | t->tv_freq = default_set_tv_freq; | 395 | t->set_tv_freq = default_set_tv_freq; |
1096 | t->radio_freq = default_set_radio_freq; | 396 | t->set_radio_freq = default_set_radio_freq; |
1097 | t->has_signal = tuner_signal; | 397 | t->has_signal = tuner_signal; |
1098 | t->is_stereo = tuner_stereo; | 398 | t->is_stereo = tuner_stereo; |
1099 | t->standby = NULL; | 399 | t->standby = NULL; |
1100 | 400 | ||
1101 | return 0; | 401 | return 0; |