]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
1da177e4 LT |
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 | /* ----------------------------------------------------------- */ | |
28 | /* descriptions */ | |
29 | ||
30 | struct dvb_pll_desc dvb_pll_thomson_dtt7579 = { | |
31 | .name = "Thomson dtt7579", | |
32 | .min = 177000000, | |
33 | .max = 858000000, | |
34 | .count = 5, | |
35 | .entries = { | |
36 | { 0, 36166667, 166666, 0xb4, 0x03 }, /* go sleep */ | |
37 | { 443250000, 36166667, 166666, 0xb4, 0x02 }, | |
38 | { 542000000, 36166667, 166666, 0xb4, 0x08 }, | |
39 | { 771000000, 36166667, 166666, 0xbc, 0x08 }, | |
40 | { 999999999, 36166667, 166666, 0xf4, 0x08 }, | |
41 | }, | |
42 | }; | |
43 | EXPORT_SYMBOL(dvb_pll_thomson_dtt7579); | |
44 | ||
45 | struct dvb_pll_desc dvb_pll_thomson_dtt7610 = { | |
46 | .name = "Thomson dtt7610", | |
47 | .min = 44000000, | |
48 | .max = 958000000, | |
49 | .count = 3, | |
50 | .entries = { | |
51 | { 157250000, 44000000, 62500, 0x8e, 0x39 }, | |
52 | { 454000000, 44000000, 62500, 0x8e, 0x3a }, | |
53 | { 999999999, 44000000, 62500, 0x8e, 0x3c }, | |
54 | }, | |
55 | }; | |
56 | EXPORT_SYMBOL(dvb_pll_thomson_dtt7610); | |
57 | ||
49dc82fd | 58 | static void thomson_dtt759x_bw(u8 *buf, u32 freq, int bandwidth) |
1da177e4 LT |
59 | { |
60 | if (BANDWIDTH_7_MHZ == bandwidth) | |
61 | buf[3] |= 0x10; | |
62 | } | |
63 | ||
64 | struct dvb_pll_desc dvb_pll_thomson_dtt759x = { | |
65 | .name = "Thomson dtt759x", | |
66 | .min = 177000000, | |
67 | .max = 896000000, | |
68 | .setbw = thomson_dtt759x_bw, | |
69 | .count = 6, | |
70 | .entries = { | |
71 | { 0, 36166667, 166666, 0x84, 0x03 }, | |
72 | { 264000000, 36166667, 166666, 0xb4, 0x02 }, | |
73 | { 470000000, 36166667, 166666, 0xbc, 0x02 }, | |
74 | { 735000000, 36166667, 166666, 0xbc, 0x08 }, | |
75 | { 835000000, 36166667, 166666, 0xf4, 0x08 }, | |
76 | { 999999999, 36166667, 166666, 0xfc, 0x08 }, | |
77 | }, | |
78 | }; | |
79 | EXPORT_SYMBOL(dvb_pll_thomson_dtt759x); | |
80 | ||
81 | struct dvb_pll_desc dvb_pll_lg_z201 = { | |
82 | .name = "LG z201", | |
83 | .min = 174000000, | |
84 | .max = 862000000, | |
9e00e486 | 85 | .count = 6, |
1da177e4 LT |
86 | .entries = { |
87 | { 0, 36166667, 166666, 0xbc, 0x03 }, | |
9e00e486 GF |
88 | { 157500000, 36166667, 166666, 0xbc, 0x01 }, |
89 | { 443250000, 36166667, 166666, 0xbc, 0x02 }, | |
90 | { 542000000, 36166667, 166666, 0xbc, 0x04 }, | |
91 | { 830000000, 36166667, 166666, 0xf4, 0x04 }, | |
92 | { 999999999, 36166667, 166666, 0xfc, 0x04 }, | |
1da177e4 LT |
93 | }, |
94 | }; | |
95 | EXPORT_SYMBOL(dvb_pll_lg_z201); | |
96 | ||
d8667cbb MM |
97 | struct dvb_pll_desc dvb_pll_microtune_4042 = { |
98 | .name = "Microtune 4042 FI5", | |
99 | .min = 57000000, | |
100 | .max = 858000000, | |
101 | .count = 3, | |
102 | .entries = { | |
103 | { 162000000, 44000000, 62500, 0x8e, 0xa1 }, | |
104 | { 457000000, 44000000, 62500, 0x8e, 0x91 }, | |
105 | { 999999999, 44000000, 62500, 0x8e, 0x31 }, | |
106 | }, | |
107 | }; | |
108 | EXPORT_SYMBOL(dvb_pll_microtune_4042); | |
109 | ||
0d723c09 MK |
110 | struct dvb_pll_desc dvb_pll_thomson_dtt7611 = { |
111 | .name = "Thomson dtt7611", | |
112 | .min = 44000000, | |
113 | .max = 958000000, | |
114 | .count = 3, | |
115 | .entries = { | |
116 | { 157250000, 44000000, 62500, 0x8e, 0x39 }, | |
117 | { 454000000, 44000000, 62500, 0x8e, 0x3a }, | |
118 | { 999999999, 44000000, 62500, 0x8e, 0x3c }, | |
119 | }, | |
120 | }; | |
121 | EXPORT_SYMBOL(dvb_pll_thomson_dtt7611); | |
122 | ||
1da177e4 LT |
123 | struct dvb_pll_desc dvb_pll_unknown_1 = { |
124 | .name = "unknown 1", /* used by dntv live dvb-t */ | |
125 | .min = 174000000, | |
126 | .max = 862000000, | |
127 | .count = 9, | |
128 | .entries = { | |
129 | { 150000000, 36166667, 166666, 0xb4, 0x01 }, | |
130 | { 173000000, 36166667, 166666, 0xbc, 0x01 }, | |
131 | { 250000000, 36166667, 166666, 0xb4, 0x02 }, | |
132 | { 400000000, 36166667, 166666, 0xbc, 0x02 }, | |
133 | { 420000000, 36166667, 166666, 0xf4, 0x02 }, | |
134 | { 470000000, 36166667, 166666, 0xfc, 0x02 }, | |
135 | { 600000000, 36166667, 166666, 0xbc, 0x08 }, | |
136 | { 730000000, 36166667, 166666, 0xf4, 0x08 }, | |
137 | { 999999999, 36166667, 166666, 0xfc, 0x08 }, | |
138 | }, | |
139 | }; | |
140 | EXPORT_SYMBOL(dvb_pll_unknown_1); | |
141 | ||
776338e1 JS |
142 | /* Infineon TUA6010XS |
143 | * used in Thomson Cable Tuner | |
144 | */ | |
145 | struct dvb_pll_desc dvb_pll_tua6010xs = { | |
146 | .name = "Infineon TUA6010XS", | |
147 | .min = 44250000, | |
148 | .max = 858000000, | |
149 | .count = 3, | |
150 | .entries = { | |
151 | { 115750000, 36125000, 62500, 0x8e, 0x03 }, | |
152 | { 403250000, 36125000, 62500, 0x8e, 0x06 }, | |
153 | { 999999999, 36125000, 62500, 0x8e, 0x85 }, | |
154 | }, | |
155 | }; | |
156 | EXPORT_SYMBOL(dvb_pll_tua6010xs); | |
157 | ||
158 | /* Panasonic env57h1xd5 (some Philips PLL ?) */ | |
159 | struct dvb_pll_desc dvb_pll_env57h1xd5 = { | |
160 | .name = "Panasonic ENV57H1XD5", | |
161 | .min = 44250000, | |
162 | .max = 858000000, | |
163 | .count = 4, | |
164 | .entries = { | |
165 | { 153000000, 36291666, 166666, 0xc2, 0x41 }, | |
166 | { 470000000, 36291666, 166666, 0xc2, 0x42 }, | |
167 | { 526000000, 36291666, 166666, 0xc2, 0x84 }, | |
168 | { 999999999, 36291666, 166666, 0xc2, 0xa4 }, | |
169 | }, | |
170 | }; | |
171 | EXPORT_SYMBOL(dvb_pll_env57h1xd5); | |
172 | ||
173 | /* Philips TDA6650/TDA6651 | |
174 | * used in Panasonic ENV77H11D5 | |
175 | */ | |
49dc82fd | 176 | static void tda665x_bw(u8 *buf, u32 freq, int bandwidth) |
776338e1 JS |
177 | { |
178 | if (bandwidth == BANDWIDTH_8_MHZ) | |
179 | buf[3] |= 0x08; | |
180 | } | |
181 | ||
182 | struct dvb_pll_desc dvb_pll_tda665x = { | |
183 | .name = "Philips TDA6650/TDA6651", | |
184 | .min = 44250000, | |
185 | .max = 858000000, | |
186 | .setbw = tda665x_bw, | |
187 | .count = 12, | |
188 | .entries = { | |
189 | { 93834000, 36249333, 166667, 0xca, 0x61 /* 011 0 0 0 01 */ }, | |
190 | { 123834000, 36249333, 166667, 0xca, 0xa1 /* 101 0 0 0 01 */ }, | |
191 | { 161000000, 36249333, 166667, 0xca, 0xa1 /* 101 0 0 0 01 */ }, | |
192 | { 163834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, | |
193 | { 253834000, 36249333, 166667, 0xca, 0x62 /* 011 0 0 0 10 */ }, | |
194 | { 383834000, 36249333, 166667, 0xca, 0xa2 /* 101 0 0 0 10 */ }, | |
195 | { 443834000, 36249333, 166667, 0xca, 0xc2 /* 110 0 0 0 10 */ }, | |
196 | { 444000000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | |
197 | { 583834000, 36249333, 166667, 0xca, 0x63 /* 011 0 0 0 11 */ }, | |
198 | { 793834000, 36249333, 166667, 0xca, 0xa3 /* 101 0 0 0 11 */ }, | |
199 | { 444834000, 36249333, 166667, 0xca, 0xc3 /* 110 0 0 0 11 */ }, | |
200 | { 861000000, 36249333, 166667, 0xca, 0xe3 /* 111 0 0 0 11 */ }, | |
201 | } | |
202 | }; | |
203 | EXPORT_SYMBOL(dvb_pll_tda665x); | |
204 | ||
205 | /* Infineon TUA6034 | |
206 | * used in LG TDTP E102P | |
207 | */ | |
49dc82fd | 208 | static void tua6034_bw(u8 *buf, u32 freq, int bandwidth) |
776338e1 JS |
209 | { |
210 | if (BANDWIDTH_7_MHZ != bandwidth) | |
211 | buf[3] |= 0x08; | |
212 | } | |
213 | ||
214 | struct dvb_pll_desc dvb_pll_tua6034 = { | |
215 | .name = "Infineon TUA6034", | |
216 | .min = 44250000, | |
217 | .max = 858000000, | |
218 | .count = 3, | |
219 | .setbw = tua6034_bw, | |
220 | .entries = { | |
221 | { 174500000, 36166667, 62500, 0xce, 0x01 }, | |
222 | { 230000000, 36166667, 62500, 0xce, 0x02 }, | |
223 | { 999999999, 36166667, 62500, 0xce, 0x04 }, | |
224 | }, | |
225 | }; | |
226 | EXPORT_SYMBOL(dvb_pll_tua6034); | |
227 | ||
49dc82fd PB |
228 | /* Philips FMD1216ME |
229 | * used in Medion Hybrid PCMCIA card and USB Box | |
230 | */ | |
231 | static void fmd1216me_bw(u8 *buf, u32 freq, int bandwidth) | |
232 | { | |
233 | if (bandwidth == BANDWIDTH_8_MHZ && freq >= 158870000) | |
234 | buf[3] |= 0x08; | |
235 | } | |
236 | ||
237 | struct dvb_pll_desc dvb_pll_fmd1216me = { | |
0589b8e4 | 238 | .name = "Philips FMD1216ME", |
49dc82fd PB |
239 | .min = 50870000, |
240 | .max = 858000000, | |
241 | .setbw = fmd1216me_bw, | |
242 | .count = 7, | |
243 | .entries = { | |
244 | { 143870000, 36213333, 166667, 0xbc, 0x41 }, | |
245 | { 158870000, 36213333, 166667, 0xf4, 0x41 }, | |
246 | { 329870000, 36213333, 166667, 0xbc, 0x42 }, | |
247 | { 441870000, 36213333, 166667, 0xf4, 0x42 }, | |
248 | { 625870000, 36213333, 166667, 0xbc, 0x44 }, | |
249 | { 803870000, 36213333, 166667, 0xf4, 0x44 }, | |
250 | { 999999999, 36213333, 166667, 0xfc, 0x44 }, | |
251 | } | |
252 | }; | |
253 | EXPORT_SYMBOL(dvb_pll_fmd1216me); | |
254 | ||
0589b8e4 PB |
255 | /* ALPS TDED4 |
256 | * used in Nebula-Cards and USB boxes | |
257 | */ | |
258 | static void tded4_bw(u8 *buf, u32 freq, int bandwidth) | |
259 | { | |
260 | if (bandwidth == BANDWIDTH_8_MHZ) | |
261 | buf[3] |= 0x04; | |
262 | } | |
263 | ||
264 | struct dvb_pll_desc dvb_pll_tded4 = { | |
265 | .name = "ALPS TDED4", | |
266 | .min = 47000000, | |
267 | .max = 863000000, | |
268 | .setbw = tded4_bw, | |
269 | .count = 4, | |
270 | .entries = { | |
271 | { 153000000, 36166667, 166667, 0x85, 0x01 }, | |
272 | { 470000000, 36166667, 166667, 0x85, 0x02 }, | |
273 | { 823000000, 36166667, 166667, 0x85, 0x08 }, | |
274 | { 999999999, 36166667, 166667, 0x85, 0x88 }, | |
275 | } | |
276 | }; | |
277 | EXPORT_SYMBOL(dvb_pll_tded4); | |
278 | ||
1da177e4 LT |
279 | /* ----------------------------------------------------------- */ |
280 | /* code */ | |
281 | ||
282 | static int debug = 0; | |
283 | module_param(debug, int, 0644); | |
284 | MODULE_PARM_DESC(debug, "enable verbose debug messages"); | |
285 | ||
286 | int dvb_pll_configure(struct dvb_pll_desc *desc, u8 *buf, | |
287 | u32 freq, int bandwidth) | |
288 | { | |
289 | u32 div; | |
290 | int i; | |
291 | ||
292 | if (freq != 0 && (freq < desc->min || freq > desc->max)) | |
293 | return -EINVAL; | |
294 | ||
295 | for (i = 0; i < desc->count; i++) { | |
296 | if (freq > desc->entries[i].limit) | |
297 | continue; | |
298 | break; | |
299 | } | |
300 | if (debug) | |
301 | printk("pll: %s: freq=%d bw=%d | i=%d/%d\n", | |
302 | desc->name, freq, bandwidth, i, desc->count); | |
303 | BUG_ON(i == desc->count); | |
304 | ||
305 | div = (freq + desc->entries[i].offset) / desc->entries[i].stepsize; | |
306 | buf[0] = div >> 8; | |
307 | buf[1] = div & 0xff; | |
308 | buf[2] = desc->entries[i].cb1; | |
309 | buf[3] = desc->entries[i].cb2; | |
310 | ||
311 | if (desc->setbw) | |
49dc82fd | 312 | desc->setbw(buf, freq, bandwidth); |
1da177e4 LT |
313 | |
314 | if (debug) | |
315 | printk("pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n", | |
316 | desc->name, div, buf[0], buf[1], buf[2], buf[3]); | |
317 | ||
318 | return 0; | |
319 | } | |
320 | EXPORT_SYMBOL(dvb_pll_configure); | |
321 | ||
322 | MODULE_DESCRIPTION("dvb pll library"); | |
323 | MODULE_AUTHOR("Gerd Knorr"); | |
324 | MODULE_LICENSE("GPL"); |