Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
1da177e4 LT |
2 | * |
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> | |
10 | ||
11 | /* ---------------------------------------------------------------------- */ | |
12 | ||
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 | |
21 | */ | |
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 | |
27 | ||
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 | |
37 | */ | |
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 | |
42 | ||
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 | |
51 | */ | |
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' | |
55 | ||
f7ce3cc6 MCC |
56 | /* Control byte */ |
57 | ||
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 | |
63 | ||
64 | #define TUNER_CHARGE_PUMP 0x40 /* Bit cb6 */ | |
65 | ||
66 | /* Status byte */ | |
67 | ||
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 | |
74 | ||
75 | #define TUNER_PLL_LOCKED 0x40 | |
76 | #define TUNER_STEREO_MK3 0x04 | |
1da177e4 LT |
77 | |
78 | /* ---------------------------------------------------------------------- */ | |
79 | ||
80 | struct tunertype | |
81 | { | |
82 | char *name; | |
83 | unsigned char Vendor; | |
84 | unsigned char Type; | |
85 | ||
86 | unsigned short thresh1; /* band switch VHF_LO <=> VHF_HI */ | |
87 | unsigned short thresh2; /* band switch VHF_HI <=> UHF */ | |
88 | unsigned char VHF_L; | |
89 | unsigned char VHF_H; | |
90 | unsigned char UHF; | |
91 | unsigned char config; | |
92 | unsigned short IFPCoff; /* 622.4=16*38.90 MHz PAL, | |
93 | 732 =16*45.75 NTSCi, | |
94 | 940 =16*58.75 NTSC-Japan | |
95 | 704 =16*44 ATSC */ | |
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 | */ | |
103 | static struct tunertype tuners[] = { | |
1c94aeec | 104 | /* 0-9 */ |
4ac97914 | 105 | { "Temic PAL (4002 FH5)", TEMIC, PAL, |
1da177e4 LT |
106 | 16*140.25,16*463.25,0x02,0x04,0x01,0x8e,623}, |
107 | { "Philips PAL_I (FI1246 and compatibles)", Philips, PAL_I, | |
108 | 16*140.25,16*463.25,0xa0,0x90,0x30,0x8e,623}, | |
109 | { "Philips NTSC (FI1236,FM1236 and compatibles)", Philips, NTSC, | |
110 | 16*157.25,16*451.25,0xA0,0x90,0x30,0x8e,732}, | |
111 | { "Philips (SECAM+PAL_BG) (FI1216MF, FM1216MF, FR1216MF)", Philips, SECAM, | |
112 | 16*168.25,16*447.25,0xA7,0x97,0x37,0x8e,623}, | |
1da177e4 LT |
113 | { "NoTuner", NoTuner, NOTUNER, |
114 | 0,0,0x00,0x00,0x00,0x00,0x00}, | |
115 | { "Philips PAL_BG (FI1216 and compatibles)", Philips, PAL, | |
116 | 16*168.25,16*447.25,0xA0,0x90,0x30,0x8e,623}, | |
117 | { "Temic NTSC (4032 FY5)", TEMIC, NTSC, | |
118 | 16*157.25,16*463.25,0x02,0x04,0x01,0x8e,732}, | |
119 | { "Temic PAL_I (4062 FY5)", TEMIC, PAL_I, | |
120 | 16*170.00,16*450.00,0x02,0x04,0x01,0x8e,623}, | |
4ac97914 | 121 | { "Temic NTSC (4036 FY5)", TEMIC, NTSC, |
1da177e4 | 122 | 16*157.25,16*463.25,0xa0,0x90,0x30,0x8e,732}, |
4ac97914 | 123 | { "Alps HSBH1", TEMIC, NTSC, |
1da177e4 | 124 | 16*137.25,16*385.25,0x01,0x02,0x08,0x8e,732}, |
1c94aeec MCC |
125 | |
126 | /* 10-19 */ | |
4ac97914 | 127 | { "Alps TSBE1", TEMIC, PAL, |
1da177e4 | 128 | 16*137.25,16*385.25,0x01,0x02,0x08,0x8e,732}, |
4ac97914 | 129 | { "Alps TSBB5", Alps, PAL_I, /* tested (UK UHF) with Modulartech MM205 */ |
1da177e4 | 130 | 16*133.25,16*351.25,0x01,0x02,0x08,0x8e,632}, |
4ac97914 | 131 | { "Alps TSBE5", Alps, PAL, /* untested - data sheet guess. Only IF differs. */ |
1da177e4 | 132 | 16*133.25,16*351.25,0x01,0x02,0x08,0x8e,622}, |
4ac97914 | 133 | { "Alps TSBC5", Alps, PAL, /* untested - data sheet guess. Only IF differs. */ |
1da177e4 LT |
134 | 16*133.25,16*351.25,0x01,0x02,0x08,0x8e,608}, |
135 | { "Temic PAL_BG (4006FH5)", TEMIC, PAL, | |
136 | 16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, | |
4ac97914 MCC |
137 | { "Alps TSCH6", Alps, NTSC, |
138 | 16*137.25,16*385.25,0x14,0x12,0x11,0x8e,732}, | |
139 | { "Temic PAL_DK (4016 FY5)", TEMIC, PAL, | |
140 | 16*168.25,16*456.25,0xa0,0x90,0x30,0x8e,623}, | |
141 | { "Philips NTSC_M (MK2)", Philips, NTSC, | |
142 | 16*160.00,16*454.00,0xa0,0x90,0x30,0x8e,732}, | |
143 | { "Temic PAL_I (4066 FY5)", TEMIC, PAL_I, | |
144 | 16*169.00, 16*454.00, 0xa0,0x90,0x30,0x8e,623}, | |
145 | { "Temic PAL* auto (4006 FN5)", TEMIC, PAL, | |
146 | 16*169.00, 16*454.00, 0xa0,0x90,0x30,0x8e,623}, | |
1da177e4 | 147 | |
1c94aeec | 148 | /* 20-29 */ |
4ac97914 MCC |
149 | { "Temic PAL_BG (4009 FR5) or PAL_I (4069 FR5)", TEMIC, PAL, |
150 | 16*141.00, 16*464.00, 0xa0,0x90,0x30,0x8e,623}, | |
151 | { "Temic NTSC (4039 FR5)", TEMIC, NTSC, | |
152 | 16*158.00, 16*453.00, 0xa0,0x90,0x30,0x8e,732}, | |
153 | { "Temic PAL/SECAM multi (4046 FM5)", TEMIC, PAL, | |
154 | 16*169.00, 16*454.00, 0xa0,0x90,0x30,0x8e,623}, | |
155 | { "Philips PAL_DK (FI1256 and compatibles)", Philips, PAL, | |
1da177e4 | 156 | 16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, |
1da177e4 LT |
157 | { "Philips PAL/SECAM multi (FQ1216ME)", Philips, PAL, |
158 | 16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, | |
159 | { "LG PAL_I+FM (TAPC-I001D)", LGINNOTEK, PAL_I, | |
160 | 16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, | |
161 | { "LG PAL_I (TAPC-I701D)", LGINNOTEK, PAL_I, | |
162 | 16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, | |
163 | { "LG NTSC+FM (TPI8NSR01F)", LGINNOTEK, NTSC, | |
164 | 16*210.00,16*497.00,0xa0,0x90,0x30,0x8e,732}, | |
1da177e4 LT |
165 | { "LG PAL_BG+FM (TPI8PSB01D)", LGINNOTEK, PAL, |
166 | 16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, | |
167 | { "LG PAL_BG (TPI8PSB11D)", LGINNOTEK, PAL, | |
168 | 16*170.00,16*450.00,0xa0,0x90,0x30,0x8e,623}, | |
1c94aeec MCC |
169 | |
170 | /* 30-39 */ | |
1da177e4 LT |
171 | { "Temic PAL* auto + FM (4009 FN5)", TEMIC, PAL, |
172 | 16*141.00, 16*464.00, 0xa0,0x90,0x30,0x8e,623}, | |
173 | { "SHARP NTSC_JP (2U5JF5540)", SHARP, NTSC, /* 940=16*58.75 NTSC@Japan */ | |
174 | 16*137.25,16*317.25,0x01,0x02,0x08,0x8e,940 }, | |
1c94aeec | 175 | { "Samsung PAL TCPM9091PD27", Samsung, PAL, /* from sourceforge v3tv */ |
4ac97914 | 176 | 16*169,16*464,0xA0,0x90,0x30,0x8e,623}, |
1c94aeec | 177 | { "MT20xx universal", Microtune, PAL|NTSC, |
1da177e4 LT |
178 | /* see mt20xx.c for details */ }, |
179 | { "Temic PAL_BG (4106 FH5)", TEMIC, PAL, | |
4ac97914 | 180 | 16*141.00, 16*464.00, 0xa0,0x90,0x30,0x8e,623}, |
1da177e4 | 181 | { "Temic PAL_DK/SECAM_L (4012 FY5)", TEMIC, PAL, |
4ac97914 | 182 | 16*140.25, 16*463.25, 0x02,0x04,0x01,0x8e,623}, |
1da177e4 | 183 | { "Temic NTSC (4136 FY5)", TEMIC, NTSC, |
4ac97914 MCC |
184 | 16*158.00, 16*453.00, 0xa0,0x90,0x30,0x8e,732}, |
185 | { "LG PAL (newer TAPC series)", LGINNOTEK, PAL, | |
186 | 16*170.00, 16*450.00, 0x01,0x02,0x08,0x8e,623}, | |
1da177e4 | 187 | { "Philips PAL/SECAM multi (FM1216ME MK3)", Philips, PAL, |
6f3c343b | 188 | 16*158.00,16*442.00,0x01,0x02,0x04,0x8e,623 }, |
1da177e4 | 189 | { "LG NTSC (newer TAPC series)", LGINNOTEK, NTSC, |
4ac97914 | 190 | 16*170.00, 16*450.00, 0x01,0x02,0x08,0x8e,732}, |
1da177e4 | 191 | |
1c94aeec | 192 | /* 40-49 */ |
1da177e4 LT |
193 | { "HITACHI V7-J180AT", HITACHI, NTSC, |
194 | 16*170.00, 16*450.00, 0x01,0x02,0x08,0x8e,940 }, | |
195 | { "Philips PAL_MK (FI1216 MK)", Philips, PAL, | |
196 | 16*140.25,16*463.25,0x01,0xc2,0xcf,0x8e,623}, | |
1c94aeec | 197 | { "Philips 1236D ATSC/NTSC daul in", Philips, ATSC, |
1da177e4 | 198 | 16*157.25,16*454.00,0xa0,0x90,0x30,0x8e,732}, |
4ac97914 MCC |
199 | { "Philips NTSC MK3 (FM1236MK3 or FM1236/F)", Philips, NTSC, |
200 | 16*160.00,16*442.00,0x01,0x02,0x04,0x8e,732}, | |
201 | { "Philips 4 in 1 (ATI TV Wonder Pro/Conexant)", Philips, NTSC, | |
202 | 16*160.00,16*442.00,0x01,0x02,0x04,0x8e,732}, | |
1c94aeec | 203 | { "Microtune 4049 FM5", Microtune, PAL, |
1da177e4 LT |
204 | 16*141.00,16*464.00,0xa0,0x90,0x30,0x8e,623}, |
205 | { "Panasonic VP27s/ENGE4324D", Panasonic, NTSC, | |
206 | 16*160.00,16*454.00,0x01,0x02,0x08,0xce,940}, | |
4ac97914 MCC |
207 | { "LG NTSC (TAPE series)", LGINNOTEK, NTSC, |
208 | 16*160.00,16*442.00,0x01,0x02,0x04,0x8e,732 }, | |
209 | { "Tenna TNF 8831 BGFF)", Philips, PAL, | |
210 | 16*161.25,16*463.25,0xa0,0x90,0x30,0x8e,623}, | |
1da177e4 LT |
211 | { "Microtune 4042 FI5 ATSC/NTSC dual in", Microtune, NTSC, |
212 | 16*162.00,16*457.00,0xa2,0x94,0x31,0x8e,732}, | |
1c94aeec MCC |
213 | |
214 | /* 50-59 */ | |
4ac97914 MCC |
215 | { "TCL 2002N", TCL, NTSC, |
216 | 16*172.00,16*448.00,0x01,0x02,0x08,0x8e,732}, | |
1da177e4 LT |
217 | { "Philips PAL/SECAM_D (FM 1256 I-H3)", Philips, PAL, |
218 | 16*160.00,16*442.00,0x01,0x02,0x04,0x8e,623 }, | |
1da177e4 LT |
219 | { "Thomson DDT 7610 (ATSC/NTSC)", THOMSON, ATSC, |
220 | 16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732}, | |
221 | { "Philips FQ1286", Philips, NTSC, | |
1c94aeec MCC |
222 | 16*160.00,16*454.00,0x41,0x42,0x04,0x8e,940}, /* UHF band untested */ |
223 | { "tda8290+75", Philips, PAL|NTSC, | |
1da177e4 | 224 | /* see tda8290.c for details */ }, |
20f441f6 | 225 | { "TCL 2002MB", TCL, PAL, |
4ac97914 | 226 | 16*170.00, 16*450.00, 0x01,0x02,0x08,0xce,623}, |
586b0cab MCC |
227 | { "Philips PAL/SECAM multi (FQ1216AME MK4)", Philips, PAL, |
228 | 16*160.00,16*442.00,0x01,0x02,0x04,0xce,623 }, | |
229 | { "Philips FQ1236A MK4", Philips, NTSC, | |
230 | 16*160.00,16*442.00,0x01,0x02,0x04,0x8e,732 }, | |
f7ce3cc6 | 231 | { "Ymec TVision TVF-8531MF/8831MF/8731MF", Philips, NTSC, |
391cd727 MCC |
232 | 16*160.00,16*454.00,0xa0,0x90,0x30,0x8e,732}, |
233 | { "Ymec TVision TVF-5533MF", Philips, NTSC, | |
234 | 16*160.00,16*454.00,0x01,0x02,0x04,0x8e,732}, | |
f7ce3cc6 | 235 | |
e976f937 | 236 | /* 60-68 */ |
3c1d0185 MK |
237 | { "Thomson DDT 7611 (ATSC/NTSC)", THOMSON, ATSC, |
238 | 16*157.25,16*454.00,0x39,0x3a,0x3c,0x8e,732}, | |
f7ce3cc6 | 239 | { "Tena TNF9533-D/IF/TNF9533-B/DF", Philips, PAL, |
4ac97914 | 240 | 16*160.25,16*464.25,0x01,0x02,0x04,0x8e,623}, |
f7ce3cc6 | 241 | { "Philips TEA5767HN FM Radio", Philips, RADIO, |
4ac97914 | 242 | /* see tea5767.c for details */}, |
586b0cab MCC |
243 | { "Philips FMD1216ME MK3 Hybrid Tuner", Philips, PAL, |
244 | 16*160.00,16*442.00,0x51,0x52,0x54,0x86,623 }, | |
4c93b07a | 245 | { "LG TDVS-H062F/TUA6034", LGINNOTEK, ATSC, |
fd3113e8 | 246 | 16*160.00,16*455.00,0x01,0x02,0x04,0x8e,732}, |
fd3113e8 | 247 | { "Ymec TVF66T5-B/DFF", Philips, PAL, |
4ac97914 MCC |
248 | 16*160.25,16*464.25,0x01,0x02,0x08,0x8e,623}, |
249 | { "LG NTSC (TALN mini series)", LGINNOTEK, NTSC, | |
5adc1c30 | 250 | 16*137.25,16*373.25,0x01,0x02,0x08,0x8e,732 }, |
93df3413 HH |
251 | { "Philips TD1316 Hybrid Tuner", Philips, PAL, |
252 | 16*160.00,16*442.00,0xa1,0xa2,0xa4,0xc8,623 }, | |
e976f937 KL |
253 | { "Philips TUV1236D ATSC/NTSC dual in", Philips, ATSC, |
254 | 16*157.25,16*454.00,0x01,0x02,0x03,0xce,732 }, | |
1da177e4 | 255 | }; |
56fc08ca | 256 | |
1da177e4 LT |
257 | unsigned const int tuner_count = ARRAY_SIZE(tuners); |
258 | ||
259 | /* ---------------------------------------------------------------------- */ | |
260 | ||
261 | static int tuner_getstatus(struct i2c_client *c) | |
262 | { | |
263 | unsigned char byte; | |
264 | ||
265 | if (1 != i2c_master_recv(c,&byte,1)) | |
266 | return 0; | |
56fc08ca | 267 | |
1da177e4 LT |
268 | return byte; |
269 | } | |
270 | ||
1da177e4 LT |
271 | static int tuner_signal(struct i2c_client *c) |
272 | { | |
56fc08ca | 273 | return (tuner_getstatus(c) & TUNER_SIGNAL) << 13; |
1da177e4 LT |
274 | } |
275 | ||
276 | static int tuner_stereo(struct i2c_client *c) | |
277 | { | |
56fc08ca MCC |
278 | int stereo, status; |
279 | struct tuner *t = i2c_get_clientdata(c); | |
280 | ||
281 | status = tuner_getstatus (c); | |
282 | ||
283 | switch (t->type) { | |
4ac97914 | 284 | case TUNER_PHILIPS_FM1216ME_MK3: |
56fc08ca MCC |
285 | case TUNER_PHILIPS_FM1236_MK3: |
286 | case TUNER_PHILIPS_FM1256_IH3: | |
287 | stereo = ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3); | |
288 | break; | |
289 | default: | |
290 | stereo = status & TUNER_STEREO; | |
291 | } | |
292 | ||
293 | return stereo; | |
1da177e4 LT |
294 | } |
295 | ||
1da177e4 LT |
296 | |
297 | /* ---------------------------------------------------------------------- */ | |
298 | ||
299 | static void default_set_tv_freq(struct i2c_client *c, unsigned int freq) | |
300 | { | |
301 | struct tuner *t = i2c_get_clientdata(c); | |
302 | u8 config; | |
303 | u16 div; | |
304 | struct tunertype *tun; | |
4ac97914 | 305 | unsigned char buffer[4]; |
1da177e4 LT |
306 | int rc; |
307 | ||
308 | tun = &tuners[t->type]; | |
309 | if (freq < tun->thresh1) { | |
310 | config = tun->VHF_L; | |
311 | tuner_dbg("tv: VHF lowrange\n"); | |
312 | } else if (freq < tun->thresh2) { | |
313 | config = tun->VHF_H; | |
314 | tuner_dbg("tv: VHF high range\n"); | |
315 | } else { | |
316 | config = tun->UHF; | |
317 | tuner_dbg("tv: UHF range\n"); | |
318 | } | |
319 | ||
320 | ||
321 | /* tv norm specific stuff for multi-norm tuners */ | |
322 | switch (t->type) { | |
323 | case TUNER_PHILIPS_SECAM: // FI1216MF | |
324 | /* 0x01 -> ??? no change ??? */ | |
325 | /* 0x02 -> PAL BDGHI / SECAM L */ | |
326 | /* 0x04 -> ??? PAL others / SECAM others ??? */ | |
327 | config &= ~0x02; | |
328 | if (t->std & V4L2_STD_SECAM) | |
329 | config |= 0x02; | |
330 | break; | |
331 | ||
332 | case TUNER_TEMIC_4046FM5: | |
333 | config &= ~0x0f; | |
334 | ||
335 | if (t->std & V4L2_STD_PAL_BG) { | |
336 | config |= TEMIC_SET_PAL_BG; | |
337 | ||
338 | } else if (t->std & V4L2_STD_PAL_I) { | |
339 | config |= TEMIC_SET_PAL_I; | |
340 | ||
341 | } else if (t->std & V4L2_STD_PAL_DK) { | |
342 | config |= TEMIC_SET_PAL_DK; | |
343 | ||
344 | } else if (t->std & V4L2_STD_SECAM_L) { | |
345 | config |= TEMIC_SET_PAL_L; | |
346 | ||
347 | } | |
348 | break; | |
349 | ||
350 | case TUNER_PHILIPS_FQ1216ME: | |
351 | config &= ~0x0f; | |
352 | ||
353 | if (t->std & (V4L2_STD_PAL_BG|V4L2_STD_PAL_DK)) { | |
354 | config |= PHILIPS_SET_PAL_BGDK; | |
355 | ||
356 | } else if (t->std & V4L2_STD_PAL_I) { | |
357 | config |= PHILIPS_SET_PAL_I; | |
358 | ||
359 | } else if (t->std & V4L2_STD_SECAM_L) { | |
360 | config |= PHILIPS_SET_PAL_L; | |
361 | ||
362 | } | |
363 | break; | |
364 | ||
365 | case TUNER_PHILIPS_ATSC: | |
366 | /* 0x00 -> ATSC antenna input 1 */ | |
367 | /* 0x01 -> ATSC antenna input 2 */ | |
368 | /* 0x02 -> NTSC antenna input 1 */ | |
369 | /* 0x03 -> NTSC antenna input 2 */ | |
370 | config &= ~0x03; | |
371 | if (!(t->std & V4L2_STD_ATSC)) | |
372 | config |= 2; | |
373 | /* FIXME: input */ | |
374 | break; | |
375 | ||
376 | case TUNER_MICROTUNE_4042FI5: | |
377 | /* Set the charge pump for fast tuning */ | |
f7ce3cc6 | 378 | tun->config |= TUNER_CHARGE_PUMP; |
1da177e4 | 379 | break; |
e976f937 KL |
380 | |
381 | case TUNER_PHILIPS_TUV1236D: | |
382 | /* 0x40 -> ATSC antenna input 1 */ | |
383 | /* 0x48 -> ATSC antenna input 2 */ | |
384 | /* 0x00 -> NTSC antenna input 1 */ | |
385 | /* 0x08 -> NTSC antenna input 2 */ | |
386 | config &= ~0x40; | |
387 | if (t->std & V4L2_STD_ATSC) | |
388 | config |= 0x40; | |
389 | /* FIXME: input */ | |
390 | break; | |
1da177e4 LT |
391 | } |
392 | ||
393 | /* | |
394 | * Philips FI1216MK2 remark from specification : | |
395 | * for channel selection involving band switching, and to ensure | |
396 | * smooth tuning to the desired channel without causing | |
397 | * unnecessary charge pump action, it is recommended to consider | |
398 | * the difference between wanted channel frequency and the | |
399 | * current channel frequency. Unnecessary charge pump action | |
400 | * will result in very low tuning voltage which may drive the | |
401 | * oscillator to extreme conditions. | |
402 | * | |
403 | * Progfou: specification says to send config data before | |
404 | * frequency in case (wanted frequency < current frequency). | |
405 | */ | |
406 | ||
407 | div=freq + tun->IFPCoff; | |
408 | if (t->type == TUNER_PHILIPS_SECAM && freq < t->freq) { | |
409 | buffer[0] = tun->config; | |
410 | buffer[1] = config; | |
411 | buffer[2] = (div>>8) & 0x7f; | |
412 | buffer[3] = div & 0xff; | |
413 | } else { | |
414 | buffer[0] = (div>>8) & 0x7f; | |
415 | buffer[1] = div & 0xff; | |
416 | buffer[2] = tun->config; | |
417 | buffer[3] = config; | |
418 | } | |
419 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", | |
420 | buffer[0],buffer[1],buffer[2],buffer[3]); | |
421 | ||
4ac97914 | 422 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
1da177e4 LT |
423 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
424 | ||
425 | if (t->type == TUNER_MICROTUNE_4042FI5) { | |
426 | // FIXME - this may also work for other tuners | |
427 | unsigned long timeout = jiffies + msecs_to_jiffies(1); | |
428 | u8 status_byte = 0; | |
429 | ||
430 | /* Wait until the PLL locks */ | |
431 | for (;;) { | |
432 | if (time_after(jiffies,timeout)) | |
433 | return; | |
434 | if (1 != (rc = i2c_master_recv(c,&status_byte,1))) { | |
435 | tuner_warn("i2c i/o read error: rc == %d (should be 1)\n",rc); | |
436 | break; | |
437 | } | |
f7ce3cc6 | 438 | if (status_byte & TUNER_PLL_LOCKED) |
1da177e4 LT |
439 | break; |
440 | udelay(10); | |
441 | } | |
442 | ||
443 | /* Set the charge pump for optimized phase noise figure */ | |
f7ce3cc6 | 444 | tun->config &= ~TUNER_CHARGE_PUMP; |
1da177e4 LT |
445 | buffer[0] = (div>>8) & 0x7f; |
446 | buffer[1] = div & 0xff; | |
447 | buffer[2] = tun->config; | |
448 | buffer[3] = config; | |
449 | tuner_dbg("tv 0x%02x 0x%02x 0x%02x 0x%02x\n", | |
450 | buffer[0],buffer[1],buffer[2],buffer[3]); | |
451 | ||
452 | if (4 != (rc = i2c_master_send(c,buffer,4))) | |
453 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); | |
454 | } | |
455 | } | |
456 | ||
457 | static void default_set_radio_freq(struct i2c_client *c, unsigned int freq) | |
458 | { | |
459 | struct tunertype *tun; | |
460 | struct tuner *t = i2c_get_clientdata(c); | |
4ac97914 | 461 | unsigned char buffer[4]; |
1da177e4 LT |
462 | unsigned div; |
463 | int rc; | |
464 | ||
f7ce3cc6 MCC |
465 | tun = &tuners[t->type]; |
466 | div = (20 * freq / 16000) + (int)(20*10.7); /* IF 10.7 MHz */ | |
467 | buffer[2] = (tun->config & ~TUNER_RATIO_MASK) | TUNER_RATIO_SELECT_50; /* 50 kHz step */ | |
1da177e4 LT |
468 | |
469 | switch (t->type) { | |
56fc08ca | 470 | case TUNER_TENA_9533_DI: |
391cd727 | 471 | case TUNER_YMEC_TVF_5533MF: |
f7ce3cc6 MCC |
472 | tuner_dbg ("This tuner doesn't have FM. Most cards has a TEA5767 for FM\n"); |
473 | return; | |
1da177e4 LT |
474 | case TUNER_PHILIPS_FM1216ME_MK3: |
475 | case TUNER_PHILIPS_FM1236_MK3: | |
586b0cab | 476 | case TUNER_PHILIPS_FMD1216ME_MK3: |
1da177e4 LT |
477 | buffer[3] = 0x19; |
478 | break; | |
479 | case TUNER_PHILIPS_FM1256_IH3: | |
f7ce3cc6 | 480 | div = (20 * freq) / 16000 + (int)(33.3 * 20); /* IF 33.3 MHz */ |
1da177e4 LT |
481 | buffer[3] = 0x19; |
482 | break; | |
483 | case TUNER_LG_PAL_FM: | |
484 | buffer[3] = 0xa5; | |
485 | break; | |
33ac6b52 MCC |
486 | case TUNER_MICROTUNE_4049FM5: |
487 | div = (20 * freq) / 16000 + (int)(33.3 * 20); /* IF 33.3 MHz */ | |
488 | buffer[3] = 0xa4; | |
489 | break; | |
1da177e4 LT |
490 | default: |
491 | buffer[3] = 0xa4; | |
492 | break; | |
493 | } | |
4ac97914 MCC |
494 | buffer[0] = (div>>8) & 0x7f; |
495 | buffer[1] = div & 0xff; | |
1da177e4 LT |
496 | |
497 | tuner_dbg("radio 0x%02x 0x%02x 0x%02x 0x%02x\n", | |
498 | buffer[0],buffer[1],buffer[2],buffer[3]); | |
499 | ||
4ac97914 | 500 | if (4 != (rc = i2c_master_send(c,buffer,4))) |
1da177e4 LT |
501 | tuner_warn("i2c i/o error: rc == %d (should be 4)\n",rc); |
502 | } | |
503 | ||
504 | int default_tuner_init(struct i2c_client *c) | |
505 | { | |
506 | struct tuner *t = i2c_get_clientdata(c); | |
507 | ||
508 | tuner_info("type set to %d (%s)\n", | |
509 | t->type, tuners[t->type].name); | |
510 | strlcpy(c->name, tuners[t->type].name, sizeof(c->name)); | |
511 | ||
512 | t->tv_freq = default_set_tv_freq; | |
513 | t->radio_freq = default_set_radio_freq; | |
514 | t->has_signal = tuner_signal; | |
515 | t->is_stereo = tuner_stereo; | |
793cf9e6 | 516 | t->standby = NULL; |
586b0cab | 517 | |
1da177e4 LT |
518 | return 0; |
519 | } | |
520 | ||
521 | /* | |
522 | * Overrides for Emacs so that we follow Linus's tabbing style. | |
523 | * --------------------------------------------------------------------------- | |
524 | * Local variables: | |
525 | * c-basic-offset: 8 | |
526 | * End: | |
527 | */ |