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
21struct 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
38static DEFINE_IDA(pll_ida);
39
40static int debug;
41module_param(debug, int, 0644);
42MODULE_PARM_DESC(debug, "enable verbose debug messages");
43
44static unsigned int id[DVB_PLL_MAX] =
45	{ [ 0 ... (DVB_PLL_MAX-1) ] = DVB_PLL_UNDEFINED };
46module_param_array(id, int, NULL, 0644);
47MODULE_PARM_DESC(id, "force pll id to use (DEBUG ONLY)");
48
49/* ----------------------------------------------------------- */
50
51struct 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
72static 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
87static 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
94static 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
111static 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
118static 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
136static 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
152static 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 */
174static 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 ?) */
188static 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 */
205static 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
212static 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 */
239static 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
246static 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 */
263static 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
270static 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 */
288static 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 */
305static 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 */
324static 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
338static 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
390static 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
411static 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 */
437static 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 */
457static 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 */
471static 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 */
492static 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 */
513static 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 */
529static 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 */
545static 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
568static 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
596static 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
634static void dvb_pll_release(struct dvb_frontend *fe)
635{
636	kfree(fe->tuner_priv);
637	fe->tuner_priv = NULL;
638}
639
640static 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
666static 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
698static 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
723static 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
730static 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
737static 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
771static 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
781struct 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;
863out:
864	kfree(b1);
865	ida_free(&pll_ida, nr);
866
867	return NULL;
868}
869EXPORT_SYMBOL_GPL(dvb_pll_attach);
870
871
872static int
873dvb_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
903static 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
913static 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
939MODULE_DEVICE_TABLE(i2c, dvb_pll_id);
940
941static 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
950module_i2c_driver(dvb_pll_driver);
951
952MODULE_DESCRIPTION("dvb pll library");
953MODULE_AUTHOR("Gerd Knorr");
954MODULE_LICENSE("GPL");
955