xref: /linux/drivers/media/dvb-frontends/dvb-pll.c (revision 79790b6818e96c58fe2bffee1b418c16e64e7b80)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * descriptions + helper functions for simple dvb plls.
4  *
5  * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
6  */
7 
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9 
10 #include <linux/slab.h>
11 #include <linux/module.h>
12 #include <linux/idr.h>
13 #include <linux/dvb/frontend.h>
14 #include <asm/types.h>
15 
16 #include "dvb-pll.h"
17 
18 #define dprintk(fmt, arg...) \
19 	printk(KERN_DEBUG pr_fmt("%s: " fmt), __func__, ##arg)
20 
21 struct dvb_pll_priv {
22 	/* pll number */
23 	int nr;
24 
25 	/* i2c details */
26 	int pll_i2c_address;
27 	struct i2c_adapter *i2c;
28 
29 	/* the PLL descriptor */
30 	const struct dvb_pll_desc *pll_desc;
31 
32 	/* cached frequency/bandwidth */
33 	u32 frequency;
34 	u32 bandwidth;
35 };
36 
37 #define DVB_PLL_MAX 64
38 static DEFINE_IDA(pll_ida);
39 
40 static int debug;
41 module_param(debug, int, 0644);
42 MODULE_PARM_DESC(debug, "enable verbose debug messages");
43 
44 static unsigned int id[DVB_PLL_MAX] =
45 	{ [ 0 ... (DVB_PLL_MAX-1) ] = DVB_PLL_UNDEFINED };
46 module_param_array(id, int, NULL, 0644);
47 MODULE_PARM_DESC(id, "force pll id to use (DEBUG ONLY)");
48 
49 /* ----------------------------------------------------------- */
50 
51 struct dvb_pll_desc {
52 	const char *name;
53 	u32  min;
54 	u32  max;
55 	u32  iffreq;
56 	void (*set)(struct dvb_frontend *fe, u8 *buf);
57 	u8   *initdata;
58 	u8   *initdata2;
59 	u8   *sleepdata;
60 	int  count;
61 	struct {
62 		u32 limit;
63 		u32 stepsize;
64 		u8  config;
65 		u8  cb;
66 	} entries[];
67 };
68 
69 /* ----------------------------------------------------------- */
70 /* descriptions                                                */
71 
72 static const struct dvb_pll_desc dvb_pll_thomson_dtt7579 = {
73 	.name  = "Thomson dtt7579",
74 	.min   = 177 * MHz,
75 	.max   = 858 * MHz,
76 	.iffreq= 36166667,
77 	.sleepdata = (u8[]){ 2, 0xb4, 0x03 },
78 	.count = 4,
79 	.entries = {
80 		{  443250000, 166667, 0xb4, 0x02 },
81 		{  542000000, 166667, 0xb4, 0x08 },
82 		{  771000000, 166667, 0xbc, 0x08 },
83 		{  999999999, 166667, 0xf4, 0x08 },
84 	},
85 };
86 
thomson_dtt759x_bw(struct dvb_frontend * fe,u8 * buf)87 static void thomson_dtt759x_bw(struct dvb_frontend *fe, u8 *buf)
88 {
89 	u32 bw = fe->dtv_property_cache.bandwidth_hz;
90 	if (bw == 7000000)
91 		buf[3] |= 0x10;
92 }
93 
94 static const struct dvb_pll_desc dvb_pll_thomson_dtt759x = {
95 	.name  = "Thomson dtt759x",
96 	.min   = 177 * MHz,
97 	.max   = 896 * MHz,
98 	.set   = thomson_dtt759x_bw,
99 	.iffreq= 36166667,
100 	.sleepdata = (u8[]){ 2, 0x84, 0x03 },
101 	.count = 5,
102 	.entries = {
103 		{  264000000, 166667, 0xb4, 0x02 },
104 		{  470000000, 166667, 0xbc, 0x02 },
105 		{  735000000, 166667, 0xbc, 0x08 },
106 		{  835000000, 166667, 0xf4, 0x08 },
107 		{  999999999, 166667, 0xfc, 0x08 },
108 	},
109 };
110 
thomson_dtt7520x_bw(struct dvb_frontend * fe,u8 * buf)111 static void thomson_dtt7520x_bw(struct dvb_frontend *fe, u8 *buf)
112 {
113 	u32 bw = fe->dtv_property_cache.bandwidth_hz;
114 	if (bw == 8000000)
115 		buf[3] ^= 0x10;
116 }
117 
118 static const struct dvb_pll_desc dvb_pll_thomson_dtt7520x = {
119 	.name  = "Thomson dtt7520x",
120 	.min   = 185 * MHz,
121 	.max   = 900 * MHz,
122 	.set   = thomson_dtt7520x_bw,
123 	.iffreq = 36166667,
124 	.count = 7,
125 	.entries = {
126 		{  305000000, 166667, 0xb4, 0x12 },
127 		{  405000000, 166667, 0xbc, 0x12 },
128 		{  445000000, 166667, 0xbc, 0x12 },
129 		{  465000000, 166667, 0xf4, 0x18 },
130 		{  735000000, 166667, 0xfc, 0x18 },
131 		{  835000000, 166667, 0xbc, 0x18 },
132 		{  999999999, 166667, 0xfc, 0x18 },
133 	},
134 };
135 
136 static const struct dvb_pll_desc dvb_pll_lg_z201 = {
137 	.name  = "LG z201",
138 	.min   = 174 * MHz,
139 	.max   = 862 * MHz,
140 	.iffreq= 36166667,
141 	.sleepdata = (u8[]){ 2, 0xbc, 0x03 },
142 	.count = 5,
143 	.entries = {
144 		{  157500000, 166667, 0xbc, 0x01 },
145 		{  443250000, 166667, 0xbc, 0x02 },
146 		{  542000000, 166667, 0xbc, 0x04 },
147 		{  830000000, 166667, 0xf4, 0x04 },
148 		{  999999999, 166667, 0xfc, 0x04 },
149 	},
150 };
151 
152 static const struct dvb_pll_desc dvb_pll_unknown_1 = {
153 	.name  = "unknown 1", /* used by dntv live dvb-t */
154 	.min   = 174 * MHz,
155 	.max   = 862 * MHz,
156 	.iffreq= 36166667,
157 	.count = 9,
158 	.entries = {
159 		{  150000000, 166667, 0xb4, 0x01 },
160 		{  173000000, 166667, 0xbc, 0x01 },
161 		{  250000000, 166667, 0xb4, 0x02 },
162 		{  400000000, 166667, 0xbc, 0x02 },
163 		{  420000000, 166667, 0xf4, 0x02 },
164 		{  470000000, 166667, 0xfc, 0x02 },
165 		{  600000000, 166667, 0xbc, 0x08 },
166 		{  730000000, 166667, 0xf4, 0x08 },
167 		{  999999999, 166667, 0xfc, 0x08 },
168 	},
169 };
170 
171 /* Infineon TUA6010XS
172  * used in Thomson Cable Tuner
173  */
174 static const struct dvb_pll_desc dvb_pll_tua6010xs = {
175 	.name  = "Infineon TUA6010XS",
176 	.min   = 44250 * kHz,
177 	.max   = 858 * MHz,
178 	.iffreq= 36125000,
179 	.count = 3,
180 	.entries = {
181 		{  115750000, 62500, 0x8e, 0x03 },
182 		{  403250000, 62500, 0x8e, 0x06 },
183 		{  999999999, 62500, 0x8e, 0x85 },
184 	},
185 };
186 
187 /* Panasonic env57h1xd5 (some Philips PLL ?) */
188 static const struct dvb_pll_desc dvb_pll_env57h1xd5 = {
189 	.name  = "Panasonic ENV57H1XD5",
190 	.min   = 44250 * kHz,
191 	.max   = 858 * MHz,
192 	.iffreq= 36125000,
193 	.count = 4,
194 	.entries = {
195 		{  153000000, 166667, 0xc2, 0x41 },
196 		{  470000000, 166667, 0xc2, 0x42 },
197 		{  526000000, 166667, 0xc2, 0x84 },
198 		{  999999999, 166667, 0xc2, 0xa4 },
199 	},
200 };
201 
202 /* Philips TDA6650/TDA6651
203  * used in Panasonic ENV77H11D5
204  */
tda665x_bw(struct dvb_frontend * fe,u8 * buf)205 static void tda665x_bw(struct dvb_frontend *fe, u8 *buf)
206 {
207 	u32 bw = fe->dtv_property_cache.bandwidth_hz;
208 	if (bw == 8000000)
209 		buf[3] |= 0x08;
210 }
211 
212 static const struct dvb_pll_desc dvb_pll_tda665x = {
213 	.name  = "Philips TDA6650/TDA6651",
214 	.min   = 44250 * kHz,
215 	.max   = 858 * MHz,
216 	.set   = tda665x_bw,
217 	.iffreq= 36166667,
218 	.initdata = (u8[]){ 4, 0x0b, 0xf5, 0x85, 0xab },
219 	.count = 12,
220 	.entries = {
221 		{   93834000, 166667, 0xca, 0x61 /* 011 0 0 0  01 */ },
222 		{  123834000, 166667, 0xca, 0xa1 /* 101 0 0 0  01 */ },
223 		{  161000000, 166667, 0xca, 0xa1 /* 101 0 0 0  01 */ },
224 		{  163834000, 166667, 0xca, 0xc2 /* 110 0 0 0  10 */ },
225 		{  253834000, 166667, 0xca, 0x62 /* 011 0 0 0  10 */ },
226 		{  383834000, 166667, 0xca, 0xa2 /* 101 0 0 0  10 */ },
227 		{  443834000, 166667, 0xca, 0xc2 /* 110 0 0 0  10 */ },
228 		{  444000000, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
229 		{  583834000, 166667, 0xca, 0x64 /* 011 0 0 1  00 */ },
230 		{  793834000, 166667, 0xca, 0xa4 /* 101 0 0 1  00 */ },
231 		{  444834000, 166667, 0xca, 0xc4 /* 110 0 0 1  00 */ },
232 		{  861000000, 166667, 0xca, 0xe4 /* 111 0 0 1  00 */ },
233 	}
234 };
235 
236 /* Infineon TUA6034
237  * used in LG TDTP E102P
238  */
tua6034_bw(struct dvb_frontend * fe,u8 * buf)239 static void tua6034_bw(struct dvb_frontend *fe, u8 *buf)
240 {
241 	u32 bw = fe->dtv_property_cache.bandwidth_hz;
242 	if (bw == 7000000)
243 		buf[3] |= 0x08;
244 }
245 
246 static const struct dvb_pll_desc dvb_pll_tua6034 = {
247 	.name  = "Infineon TUA6034",
248 	.min   = 44250 * kHz,
249 	.max   = 858 * MHz,
250 	.iffreq= 36166667,
251 	.count = 3,
252 	.set   = tua6034_bw,
253 	.entries = {
254 		{  174500000, 62500, 0xce, 0x01 },
255 		{  230000000, 62500, 0xce, 0x02 },
256 		{  999999999, 62500, 0xce, 0x04 },
257 	},
258 };
259 
260 /* ALPS TDED4
261  * used in Nebula-Cards and USB boxes
262  */
tded4_bw(struct dvb_frontend * fe,u8 * buf)263 static void tded4_bw(struct dvb_frontend *fe, u8 *buf)
264 {
265 	u32 bw = fe->dtv_property_cache.bandwidth_hz;
266 	if (bw == 8000000)
267 		buf[3] |= 0x04;
268 }
269 
270 static const struct dvb_pll_desc dvb_pll_tded4 = {
271 	.name = "ALPS TDED4",
272 	.min =  47 * MHz,
273 	.max = 863 * MHz,
274 	.iffreq= 36166667,
275 	.set   = tded4_bw,
276 	.count = 4,
277 	.entries = {
278 		{ 153000000, 166667, 0x85, 0x01 },
279 		{ 470000000, 166667, 0x85, 0x02 },
280 		{ 823000000, 166667, 0x85, 0x08 },
281 		{ 999999999, 166667, 0x85, 0x88 },
282 	}
283 };
284 
285 /* ALPS TDHU2
286  * used in AverTVHD MCE A180
287  */
288 static const struct dvb_pll_desc dvb_pll_tdhu2 = {
289 	.name = "ALPS TDHU2",
290 	.min =  54 * MHz,
291 	.max = 864 * MHz,
292 	.iffreq= 44000000,
293 	.count = 4,
294 	.entries = {
295 		{ 162000000, 62500, 0x85, 0x01 },
296 		{ 426000000, 62500, 0x85, 0x02 },
297 		{ 782000000, 62500, 0x85, 0x08 },
298 		{ 999999999, 62500, 0x85, 0x88 },
299 	}
300 };
301 
302 /* Samsung TBMV30111IN / TBMV30712IN1
303  * used in Air2PC ATSC - 2nd generation (nxt2002)
304  */
305 static const struct dvb_pll_desc dvb_pll_samsung_tbmv = {
306 	.name = "Samsung TBMV30111IN / TBMV30712IN1",
307 	.min =  54 * MHz,
308 	.max = 860 * MHz,
309 	.iffreq= 44000000,
310 	.count = 6,
311 	.entries = {
312 		{ 172000000, 166667, 0xb4, 0x01 },
313 		{ 214000000, 166667, 0xb4, 0x02 },
314 		{ 467000000, 166667, 0xbc, 0x02 },
315 		{ 721000000, 166667, 0xbc, 0x08 },
316 		{ 841000000, 166667, 0xf4, 0x08 },
317 		{ 999999999, 166667, 0xfc, 0x02 },
318 	}
319 };
320 
321 /*
322  * Philips SD1878 Tuner.
323  */
324 static const struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
325 	.name  = "Philips SD1878",
326 	.min   =  950 * MHz,
327 	.max   = 2150 * MHz,
328 	.iffreq= 249, /* zero-IF, offset 249 is to round up */
329 	.count = 4,
330 	.entries = {
331 		{ 1250000, 500, 0xc4, 0x00},
332 		{ 1450000, 500, 0xc4, 0x40},
333 		{ 2050000, 500, 0xc4, 0x80},
334 		{ 2150000, 500, 0xc4, 0xc0},
335 	},
336 };
337 
opera1_bw(struct dvb_frontend * fe,u8 * buf)338 static void opera1_bw(struct dvb_frontend *fe, u8 *buf)
339 {
340 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
341 	struct dvb_pll_priv *priv = fe->tuner_priv;
342 	u32 b_w  = (c->symbol_rate * 27) / 32000;
343 	struct i2c_msg msg = {
344 		.addr = priv->pll_i2c_address,
345 		.flags = 0,
346 		.buf = buf,
347 		.len = 4
348 	};
349 	int result;
350 	u8 lpf;
351 
352 	if (fe->ops.i2c_gate_ctrl)
353 		fe->ops.i2c_gate_ctrl(fe, 1);
354 
355 	result = i2c_transfer(priv->i2c, &msg, 1);
356 	if (result != 1)
357 		pr_err("%s: i2c_transfer failed:%d",
358 			__func__, result);
359 
360 	if (b_w <= 10000)
361 		lpf = 0xc;
362 	else if (b_w <= 12000)
363 		lpf = 0x2;
364 	else if (b_w <= 14000)
365 		lpf = 0xa;
366 	else if (b_w <= 16000)
367 		lpf = 0x6;
368 	else if (b_w <= 18000)
369 		lpf = 0xe;
370 	else if (b_w <= 20000)
371 		lpf = 0x1;
372 	else if (b_w <= 22000)
373 		lpf = 0x9;
374 	else if (b_w <= 24000)
375 		lpf = 0x5;
376 	else if (b_w <= 26000)
377 		lpf = 0xd;
378 	else if (b_w <= 28000)
379 		lpf = 0x3;
380 		else
381 		lpf = 0xb;
382 	buf[2] ^= 0x1c; /* Flip bits 3-5 */
383 	/* Set lpf */
384 	buf[2] |= ((lpf >> 2) & 0x3) << 3;
385 	buf[3] |= (lpf & 0x3) << 2;
386 
387 	return;
388 }
389 
390 static const struct dvb_pll_desc dvb_pll_opera1 = {
391 	.name  = "Opera Tuner",
392 	.min   =  900 * MHz,
393 	.max   = 2250 * MHz,
394 	.initdata = (u8[]){ 4, 0x08, 0xe5, 0xe1, 0x00 },
395 	.initdata2 = (u8[]){ 4, 0x08, 0xe5, 0xe5, 0x00 },
396 	.iffreq= 0,
397 	.set   = opera1_bw,
398 	.count = 8,
399 	.entries = {
400 		{ 1064000, 500, 0xf9, 0xc2 },
401 		{ 1169000, 500, 0xf9, 0xe2 },
402 		{ 1299000, 500, 0xf9, 0x20 },
403 		{ 1444000, 500, 0xf9, 0x40 },
404 		{ 1606000, 500, 0xf9, 0x60 },
405 		{ 1777000, 500, 0xf9, 0x80 },
406 		{ 1941000, 500, 0xf9, 0xa0 },
407 		{ 2250000, 500, 0xf9, 0xc0 },
408 	}
409 };
410 
samsung_dtos403ih102a_set(struct dvb_frontend * fe,u8 * buf)411 static void samsung_dtos403ih102a_set(struct dvb_frontend *fe, u8 *buf)
412 {
413 	struct dvb_pll_priv *priv = fe->tuner_priv;
414 	struct i2c_msg msg = {
415 		.addr = priv->pll_i2c_address,
416 		.flags = 0,
417 		.buf = buf,
418 		.len = 4
419 	};
420 	int result;
421 
422 	if (fe->ops.i2c_gate_ctrl)
423 		fe->ops.i2c_gate_ctrl(fe, 1);
424 
425 	result = i2c_transfer(priv->i2c, &msg, 1);
426 	if (result != 1)
427 		pr_err("%s: i2c_transfer failed:%d",
428 			__func__, result);
429 
430 	buf[2] = 0x9e;
431 	buf[3] = 0x90;
432 
433 	return;
434 }
435 
436 /* unknown pll used in Samsung DTOS403IH102A DVB-C tuner */
437 static const struct dvb_pll_desc dvb_pll_samsung_dtos403ih102a = {
438 	.name   = "Samsung DTOS403IH102A",
439 	.min    = 44250 * kHz,
440 	.max    = 858 * MHz,
441 	.iffreq =  36125000,
442 	.count  = 8,
443 	.set    = samsung_dtos403ih102a_set,
444 	.entries = {
445 		{ 135000000, 62500, 0xbe, 0x01 },
446 		{ 177000000, 62500, 0xf6, 0x01 },
447 		{ 370000000, 62500, 0xbe, 0x02 },
448 		{ 450000000, 62500, 0xf6, 0x02 },
449 		{ 466000000, 62500, 0xfe, 0x02 },
450 		{ 538000000, 62500, 0xbe, 0x08 },
451 		{ 826000000, 62500, 0xf6, 0x08 },
452 		{ 999999999, 62500, 0xfe, 0x08 },
453 	}
454 };
455 
456 /* Samsung TDTC9251DH0 DVB-T NIM, as used on AirStar 2 */
457 static const struct dvb_pll_desc dvb_pll_samsung_tdtc9251dh0 = {
458 	.name	= "Samsung TDTC9251DH0",
459 	.min	=  48 * MHz,
460 	.max	= 863 * MHz,
461 	.iffreq	=  36166667,
462 	.count	= 3,
463 	.entries = {
464 		{ 157500000, 166667, 0xcc, 0x09 },
465 		{ 443000000, 166667, 0xcc, 0x0a },
466 		{ 863000000, 166667, 0xcc, 0x08 },
467 	}
468 };
469 
470 /* Samsung TBDU18132 DVB-S NIM with TSA5059 PLL, used in SkyStar2 DVB-S 2.3 */
471 static const struct dvb_pll_desc dvb_pll_samsung_tbdu18132 = {
472 	.name = "Samsung TBDU18132",
473 	.min	=  950 * MHz,
474 	.max	= 2150 * MHz, /* guesses */
475 	.iffreq = 0,
476 	.count = 2,
477 	.entries = {
478 		{ 1550000, 125, 0x84, 0x82 },
479 		{ 4095937, 125, 0x84, 0x80 },
480 	}
481 	/* TSA5059 PLL has a 17 bit divisor rather than the 15 bits supported
482 	 * by this driver.  The two extra bits are 0x60 in the third byte.  15
483 	 * bits is enough for over 4 GHz, which is enough to cover the range
484 	 * of this tuner.  We could use the additional divisor bits by adding
485 	 * more entries, e.g.
486 	 { 0x0ffff * 125 + 125/2, 125, 0x84 | 0x20, },
487 	 { 0x17fff * 125 + 125/2, 125, 0x84 | 0x40, },
488 	 { 0x1ffff * 125 + 125/2, 125, 0x84 | 0x60, }, */
489 };
490 
491 /* Samsung TBMU24112 DVB-S NIM with SL1935 zero-IF tuner */
492 static const struct dvb_pll_desc dvb_pll_samsung_tbmu24112 = {
493 	.name = "Samsung TBMU24112",
494 	.min	=  950 * MHz,
495 	.max	= 2150 * MHz, /* guesses */
496 	.iffreq = 0,
497 	.count = 2,
498 	.entries = {
499 		{ 1500000, 125, 0x84, 0x18 },
500 		{ 9999999, 125, 0x84, 0x08 },
501 	}
502 };
503 
504 /* Alps TDEE4 DVB-C NIM, used on Cablestar 2 */
505 /* byte 4 : 1  *   *   AGD R3  R2  R1  R0
506  * byte 5 : C1 *   RE  RTS BS4 BS3 BS2 BS1
507  * AGD = 1, R3 R2 R1 R0 = 0 1 0 1 => byte 4 = 1**10101 = 0x95
508  * Range(MHz)  C1 *  RE RTS BS4 BS3 BS2 BS1  Byte 5
509  *  47 - 153   0  *  0   0   0   0   0   1   0x01
510  * 153 - 430   0  *  0   0   0   0   1   0   0x02
511  * 430 - 822   0  *  0   0   1   0   0   0   0x08
512  * 822 - 862   1  *  0   0   1   0   0   0   0x88 */
513 static const struct dvb_pll_desc dvb_pll_alps_tdee4 = {
514 	.name = "ALPS TDEE4",
515 	.min	=  47 * MHz,
516 	.max	= 862 * MHz,
517 	.iffreq	=  36125000,
518 	.count = 4,
519 	.entries = {
520 		{ 153000000, 62500, 0x95, 0x01 },
521 		{ 430000000, 62500, 0x95, 0x02 },
522 		{ 822000000, 62500, 0x95, 0x08 },
523 		{ 999999999, 62500, 0x95, 0x88 },
524 	}
525 };
526 
527 /* Infineon TUA6034 ISDB-T, used in Friio */
528 /* CP cur. 50uA, AGC takeover: 103dBuV, PORT3 on */
529 static const struct dvb_pll_desc dvb_pll_tua6034_friio = {
530 	.name   = "Infineon TUA6034 ISDB-T (Friio)",
531 	.min    =  90 * MHz,
532 	.max    = 770 * MHz,
533 	.iffreq =  57000000,
534 	.initdata = (u8[]){ 4, 0x9a, 0x50, 0xb2, 0x08 },
535 	.sleepdata = (u8[]){ 4, 0x9a, 0x70, 0xb3, 0x0b },
536 	.count = 3,
537 	.entries = {
538 		{ 170000000, 142857, 0xba, 0x09 },
539 		{ 470000000, 142857, 0xba, 0x0a },
540 		{ 770000000, 142857, 0xb2, 0x08 },
541 	}
542 };
543 
544 /* Philips TDA6651 ISDB-T, used in Earthsoft PT1 */
545 static const struct dvb_pll_desc dvb_pll_tda665x_earth_pt1 = {
546 	.name   = "Philips TDA6651 ISDB-T (EarthSoft PT1)",
547 	.min    =  90 * MHz,
548 	.max    = 770 * MHz,
549 	.iffreq =  57000000,
550 	.initdata = (u8[]){ 5, 0x0e, 0x7f, 0xc1, 0x80, 0x80 },
551 	.count = 10,
552 	.entries = {
553 		{ 140000000, 142857, 0xc1, 0x81 },
554 		{ 170000000, 142857, 0xc1, 0xa1 },
555 		{ 220000000, 142857, 0xc1, 0x62 },
556 		{ 330000000, 142857, 0xc1, 0xa2 },
557 		{ 402000000, 142857, 0xc1, 0xe2 },
558 		{ 450000000, 142857, 0xc1, 0x64 },
559 		{ 550000000, 142857, 0xc1, 0x84 },
560 		{ 600000000, 142857, 0xc1, 0xa4 },
561 		{ 700000000, 142857, 0xc1, 0xc4 },
562 		{ 770000000, 142857, 0xc1, 0xe4 },
563 	}
564 };
565 
566 /* ----------------------------------------------------------- */
567 
568 static const struct dvb_pll_desc *pll_list[] = {
569 	[DVB_PLL_UNDEFINED]              = NULL,
570 	[DVB_PLL_THOMSON_DTT7579]        = &dvb_pll_thomson_dtt7579,
571 	[DVB_PLL_THOMSON_DTT759X]        = &dvb_pll_thomson_dtt759x,
572 	[DVB_PLL_THOMSON_DTT7520X]       = &dvb_pll_thomson_dtt7520x,
573 	[DVB_PLL_LG_Z201]                = &dvb_pll_lg_z201,
574 	[DVB_PLL_UNKNOWN_1]              = &dvb_pll_unknown_1,
575 	[DVB_PLL_TUA6010XS]              = &dvb_pll_tua6010xs,
576 	[DVB_PLL_ENV57H1XD5]             = &dvb_pll_env57h1xd5,
577 	[DVB_PLL_TUA6034]                = &dvb_pll_tua6034,
578 	[DVB_PLL_TDA665X]                = &dvb_pll_tda665x,
579 	[DVB_PLL_TDED4]                  = &dvb_pll_tded4,
580 	[DVB_PLL_TDEE4]                  = &dvb_pll_alps_tdee4,
581 	[DVB_PLL_TDHU2]                  = &dvb_pll_tdhu2,
582 	[DVB_PLL_SAMSUNG_TBMV]           = &dvb_pll_samsung_tbmv,
583 	[DVB_PLL_PHILIPS_SD1878_TDA8261] = &dvb_pll_philips_sd1878_tda8261,
584 	[DVB_PLL_OPERA1]                 = &dvb_pll_opera1,
585 	[DVB_PLL_SAMSUNG_DTOS403IH102A]  = &dvb_pll_samsung_dtos403ih102a,
586 	[DVB_PLL_SAMSUNG_TDTC9251DH0]    = &dvb_pll_samsung_tdtc9251dh0,
587 	[DVB_PLL_SAMSUNG_TBDU18132]	 = &dvb_pll_samsung_tbdu18132,
588 	[DVB_PLL_SAMSUNG_TBMU24112]      = &dvb_pll_samsung_tbmu24112,
589 	[DVB_PLL_TUA6034_FRIIO]          = &dvb_pll_tua6034_friio,
590 	[DVB_PLL_TDA665X_EARTH_PT1]      = &dvb_pll_tda665x_earth_pt1,
591 };
592 
593 /* ----------------------------------------------------------- */
594 /* code                                                        */
595 
dvb_pll_configure(struct dvb_frontend * fe,u8 * buf,const u32 frequency)596 static int dvb_pll_configure(struct dvb_frontend *fe, u8 *buf,
597 			     const u32 frequency)
598 {
599 	struct dvb_pll_priv *priv = fe->tuner_priv;
600 	const struct dvb_pll_desc *desc = priv->pll_desc;
601 	u32 div;
602 	int i;
603 
604 	for (i = 0; i < desc->count; i++) {
605 		if (frequency > desc->entries[i].limit)
606 			continue;
607 		break;
608 	}
609 
610 	if (debug)
611 		dprintk("pll: %s: freq=%d | i=%d/%d\n", desc->name,
612 		       frequency, i, desc->count);
613 	if (i == desc->count)
614 		return -EINVAL;
615 
616 	div = (frequency + desc->iffreq +
617 	       desc->entries[i].stepsize/2) / desc->entries[i].stepsize;
618 	buf[0] = div >> 8;
619 	buf[1] = div & 0xff;
620 	buf[2] = desc->entries[i].config;
621 	buf[3] = desc->entries[i].cb;
622 
623 	if (desc->set)
624 		desc->set(fe, buf);
625 
626 	if (debug)
627 		dprintk("pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
628 		       desc->name, div, buf[0], buf[1], buf[2], buf[3]);
629 
630 	// calculate the frequency we set it to
631 	return (div * desc->entries[i].stepsize) - desc->iffreq;
632 }
633 
dvb_pll_release(struct dvb_frontend * fe)634 static void dvb_pll_release(struct dvb_frontend *fe)
635 {
636 	kfree(fe->tuner_priv);
637 	fe->tuner_priv = NULL;
638 }
639 
dvb_pll_sleep(struct dvb_frontend * fe)640 static int dvb_pll_sleep(struct dvb_frontend *fe)
641 {
642 	struct dvb_pll_priv *priv = fe->tuner_priv;
643 
644 	if (priv->i2c == NULL)
645 		return -EINVAL;
646 
647 	if (priv->pll_desc->sleepdata) {
648 		struct i2c_msg msg = { .flags = 0,
649 			.addr = priv->pll_i2c_address,
650 			.buf = priv->pll_desc->sleepdata + 1,
651 			.len = priv->pll_desc->sleepdata[0] };
652 
653 		int result;
654 
655 		if (fe->ops.i2c_gate_ctrl)
656 			fe->ops.i2c_gate_ctrl(fe, 1);
657 		if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
658 			return result;
659 		}
660 		return 0;
661 	}
662 	/* Shouldn't be called when initdata is NULL, maybe BUG()? */
663 	return -EINVAL;
664 }
665 
dvb_pll_set_params(struct dvb_frontend * fe)666 static int dvb_pll_set_params(struct dvb_frontend *fe)
667 {
668 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
669 	struct dvb_pll_priv *priv = fe->tuner_priv;
670 	u8 buf[4];
671 	struct i2c_msg msg =
672 		{ .addr = priv->pll_i2c_address, .flags = 0,
673 		  .buf = buf, .len = sizeof(buf) };
674 	int result;
675 	u32 frequency = 0;
676 
677 	if (priv->i2c == NULL)
678 		return -EINVAL;
679 
680 	result = dvb_pll_configure(fe, buf, c->frequency);
681 	if (result < 0)
682 		return result;
683 	else
684 		frequency = result;
685 
686 	if (fe->ops.i2c_gate_ctrl)
687 		fe->ops.i2c_gate_ctrl(fe, 1);
688 	if ((result = i2c_transfer(priv->i2c, &msg, 1)) != 1) {
689 		return result;
690 	}
691 
692 	priv->frequency = frequency;
693 	priv->bandwidth = c->bandwidth_hz;
694 
695 	return 0;
696 }
697 
dvb_pll_calc_regs(struct dvb_frontend * fe,u8 * buf,int buf_len)698 static int dvb_pll_calc_regs(struct dvb_frontend *fe,
699 			     u8 *buf, int buf_len)
700 {
701 	struct dtv_frontend_properties *c = &fe->dtv_property_cache;
702 	struct dvb_pll_priv *priv = fe->tuner_priv;
703 	int result;
704 	u32 frequency = 0;
705 
706 	if (buf_len < 5)
707 		return -EINVAL;
708 
709 	result = dvb_pll_configure(fe, buf + 1, c->frequency);
710 	if (result < 0)
711 		return result;
712 	else
713 		frequency = result;
714 
715 	buf[0] = priv->pll_i2c_address;
716 
717 	priv->frequency = frequency;
718 	priv->bandwidth = c->bandwidth_hz;
719 
720 	return 5;
721 }
722 
dvb_pll_get_frequency(struct dvb_frontend * fe,u32 * frequency)723 static int dvb_pll_get_frequency(struct dvb_frontend *fe, u32 *frequency)
724 {
725 	struct dvb_pll_priv *priv = fe->tuner_priv;
726 	*frequency = priv->frequency;
727 	return 0;
728 }
729 
dvb_pll_get_bandwidth(struct dvb_frontend * fe,u32 * bandwidth)730 static int dvb_pll_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
731 {
732 	struct dvb_pll_priv *priv = fe->tuner_priv;
733 	*bandwidth = priv->bandwidth;
734 	return 0;
735 }
736 
dvb_pll_init(struct dvb_frontend * fe)737 static int dvb_pll_init(struct dvb_frontend *fe)
738 {
739 	struct dvb_pll_priv *priv = fe->tuner_priv;
740 
741 	if (priv->i2c == NULL)
742 		return -EINVAL;
743 
744 	if (priv->pll_desc->initdata) {
745 		struct i2c_msg msg = { .flags = 0,
746 			.addr = priv->pll_i2c_address,
747 			.buf = priv->pll_desc->initdata + 1,
748 			.len = priv->pll_desc->initdata[0] };
749 
750 		int result;
751 		if (fe->ops.i2c_gate_ctrl)
752 			fe->ops.i2c_gate_ctrl(fe, 1);
753 		result = i2c_transfer(priv->i2c, &msg, 1);
754 		if (result != 1)
755 			return result;
756 		if (priv->pll_desc->initdata2) {
757 			msg.buf = priv->pll_desc->initdata2 + 1;
758 			msg.len = priv->pll_desc->initdata2[0];
759 			if (fe->ops.i2c_gate_ctrl)
760 				fe->ops.i2c_gate_ctrl(fe, 1);
761 			result = i2c_transfer(priv->i2c, &msg, 1);
762 			if (result != 1)
763 				return result;
764 		}
765 		return 0;
766 	}
767 	/* Shouldn't be called when initdata is NULL, maybe BUG()? */
768 	return -EINVAL;
769 }
770 
771 static const struct dvb_tuner_ops dvb_pll_tuner_ops = {
772 	.release = dvb_pll_release,
773 	.sleep = dvb_pll_sleep,
774 	.init = dvb_pll_init,
775 	.set_params = dvb_pll_set_params,
776 	.calc_regs = dvb_pll_calc_regs,
777 	.get_frequency = dvb_pll_get_frequency,
778 	.get_bandwidth = dvb_pll_get_bandwidth,
779 };
780 
dvb_pll_attach(struct dvb_frontend * fe,int pll_addr,struct i2c_adapter * i2c,unsigned int pll_desc_id)781 struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,
782 				    struct i2c_adapter *i2c,
783 				    unsigned int pll_desc_id)
784 {
785 	u8 *b1;
786 	struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .len = 1 };
787 	struct dvb_pll_priv *priv = NULL;
788 	int ret;
789 	const struct dvb_pll_desc *desc;
790 	int nr;
791 
792 	b1 = kmalloc(1, GFP_KERNEL);
793 	if (!b1)
794 		return NULL;
795 
796 	b1[0] = 0;
797 	msg.buf = b1;
798 
799 	nr = ida_alloc_max(&pll_ida, DVB_PLL_MAX - 1, GFP_KERNEL);
800 	if (nr < 0) {
801 		kfree(b1);
802 		return NULL;
803 	}
804 
805 	if (id[nr] > DVB_PLL_UNDEFINED && id[nr] < ARRAY_SIZE(pll_list))
806 		pll_desc_id = id[nr];
807 
808 	BUG_ON(pll_desc_id < 1 || pll_desc_id >= ARRAY_SIZE(pll_list));
809 
810 	desc = pll_list[pll_desc_id];
811 
812 	if (i2c != NULL) {
813 		if (fe->ops.i2c_gate_ctrl)
814 			fe->ops.i2c_gate_ctrl(fe, 1);
815 
816 		ret = i2c_transfer (i2c, &msg, 1);
817 		if (ret != 1)
818 			goto out;
819 		if (fe->ops.i2c_gate_ctrl)
820 			     fe->ops.i2c_gate_ctrl(fe, 0);
821 	}
822 
823 	priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL);
824 	if (!priv)
825 		goto out;
826 
827 	priv->pll_i2c_address = pll_addr;
828 	priv->i2c = i2c;
829 	priv->pll_desc = desc;
830 	priv->nr = nr;
831 
832 	memcpy(&fe->ops.tuner_ops, &dvb_pll_tuner_ops,
833 	       sizeof(struct dvb_tuner_ops));
834 
835 	strscpy(fe->ops.tuner_ops.info.name, desc->name,
836 		sizeof(fe->ops.tuner_ops.info.name));
837 
838 	fe->ops.tuner_ops.info.frequency_min_hz = desc->min;
839 	fe->ops.tuner_ops.info.frequency_max_hz = desc->max;
840 
841 	dprintk("%s tuner, frequency range: %u...%u\n",
842 		desc->name, desc->min, desc->max);
843 
844 	if (!desc->initdata)
845 		fe->ops.tuner_ops.init = NULL;
846 	if (!desc->sleepdata)
847 		fe->ops.tuner_ops.sleep = NULL;
848 
849 	fe->tuner_priv = priv;
850 
851 	if ((debug) || (id[priv->nr] == pll_desc_id)) {
852 		dprintk("dvb-pll[%d]", priv->nr);
853 		if (i2c != NULL)
854 			pr_cont(" %d-%04x", i2c_adapter_id(i2c), pll_addr);
855 		pr_cont(": id# %d (%s) attached, %s\n", pll_desc_id, desc->name,
856 		       id[priv->nr] == pll_desc_id ?
857 				"insmod option" : "autodetected");
858 	}
859 
860 	kfree(b1);
861 
862 	return fe;
863 out:
864 	kfree(b1);
865 	ida_free(&pll_ida, nr);
866 
867 	return NULL;
868 }
869 EXPORT_SYMBOL_GPL(dvb_pll_attach);
870 
871 
872 static int
dvb_pll_probe(struct i2c_client * client)873 dvb_pll_probe(struct i2c_client *client)
874 {
875 	const struct i2c_device_id *id = i2c_client_get_device_id(client);
876 	struct dvb_pll_config *cfg;
877 	struct dvb_frontend *fe;
878 	unsigned int desc_id;
879 
880 	cfg = client->dev.platform_data;
881 	fe = cfg->fe;
882 	i2c_set_clientdata(client, fe);
883 	desc_id = (unsigned int) id->driver_data;
884 
885 	if (!dvb_pll_attach(fe, client->addr, client->adapter, desc_id))
886 		return -ENOMEM;
887 
888 	/*
889 	 * Unset tuner_ops.release (== dvb_pll_release)
890 	 * which has been just set in the above dvb_pll_attach(),
891 	 * because if tuner_ops.release was left defined,
892 	 * this module would be 'put' twice on exit:
893 	 * once by dvb_frontend_detach() and another by dvb_module_release().
894 	 *
895 	 * dvb_pll_release is instead executed in the i2c driver's .remove(),
896 	 * keeping dvb_pll_attach untouched for legacy (dvb_attach) drivers.
897 	 */
898 	fe->ops.tuner_ops.release = NULL;
899 	dev_info(&client->dev, "DVB Simple Tuner attached.\n");
900 	return 0;
901 }
902 
dvb_pll_remove(struct i2c_client * client)903 static void dvb_pll_remove(struct i2c_client *client)
904 {
905 	struct dvb_frontend *fe = i2c_get_clientdata(client);
906 	struct dvb_pll_priv *priv = fe->tuner_priv;
907 
908 	ida_free(&pll_ida, priv->nr);
909 	dvb_pll_release(fe);
910 }
911 
912 
913 static const struct i2c_device_id dvb_pll_id[] = {
914 	{"dtt7579",		DVB_PLL_THOMSON_DTT7579},
915 	{"dtt759x",		DVB_PLL_THOMSON_DTT759X},
916 	{"z201",		DVB_PLL_LG_Z201},
917 	{"unknown_1",		DVB_PLL_UNKNOWN_1},
918 	{"tua6010xs",		DVB_PLL_TUA6010XS},
919 	{"env57h1xd5",		DVB_PLL_ENV57H1XD5},
920 	{"tua6034",		DVB_PLL_TUA6034},
921 	{"tda665x",		DVB_PLL_TDA665X},
922 	{"tded4",		DVB_PLL_TDED4},
923 	{"tdhu2",		DVB_PLL_TDHU2},
924 	{"tbmv",		DVB_PLL_SAMSUNG_TBMV},
925 	{"sd1878_tda8261",	DVB_PLL_PHILIPS_SD1878_TDA8261},
926 	{"opera1",		DVB_PLL_OPERA1},
927 	{"dtos403ih102a",	DVB_PLL_SAMSUNG_DTOS403IH102A},
928 	{"tdtc9251dh0",		DVB_PLL_SAMSUNG_TDTC9251DH0},
929 	{"tbdu18132",		DVB_PLL_SAMSUNG_TBDU18132},
930 	{"tbmu24112",		DVB_PLL_SAMSUNG_TBMU24112},
931 	{"tdee4",		DVB_PLL_TDEE4},
932 	{"dtt7520x",		DVB_PLL_THOMSON_DTT7520X},
933 	{"tua6034_friio",	DVB_PLL_TUA6034_FRIIO},
934 	{"tda665x_earthpt1",	DVB_PLL_TDA665X_EARTH_PT1},
935 	{}
936 };
937 
938 
939 MODULE_DEVICE_TABLE(i2c, dvb_pll_id);
940 
941 static struct i2c_driver dvb_pll_driver = {
942 	.driver = {
943 		.name = "dvb_pll",
944 	},
945 	.probe    = dvb_pll_probe,
946 	.remove   = dvb_pll_remove,
947 	.id_table = dvb_pll_id,
948 };
949 
950 module_i2c_driver(dvb_pll_driver);
951 
952 MODULE_DESCRIPTION("dvb pll library");
953 MODULE_AUTHOR("Gerd Knorr");
954 MODULE_LICENSE("GPL");
955