21 #include <linux/slab.h>
22 #include <linux/module.h>
24 #include <asm/types.h>
44 #define DVB_PLL_MAX 64
46 static unsigned int dvb_pll_devcount;
81 .name =
"Thomson dtt7579",
85 .sleepdata = (
u8[]){ 2, 0xb4, 0x03 },
88 { 443250000, 166667, 0xb4, 0x02 },
89 { 542000000, 166667, 0xb4, 0x08 },
90 { 771000000, 166667, 0xbc, 0x08 },
91 { 999999999, 166667, 0xf4, 0x08 },
103 .name =
"Thomson dtt759x",
106 .set = thomson_dtt759x_bw,
108 .sleepdata = (
u8[]){ 2, 0x84, 0x03 },
111 { 264000000, 166667, 0xb4, 0x02 },
112 { 470000000, 166667, 0xbc, 0x02 },
113 { 735000000, 166667, 0xbc, 0x08 },
114 { 835000000, 166667, 0xf4, 0x08 },
115 { 999999999, 166667, 0xfc, 0x08 },
127 .name =
"Thomson dtt7520x",
130 .set = thomson_dtt7520x_bw,
134 { 305000000, 166667, 0xb4, 0x12 },
135 { 405000000, 166667, 0xbc, 0x12 },
136 { 445000000, 166667, 0xbc, 0x12 },
137 { 465000000, 166667, 0xf4, 0x18 },
138 { 735000000, 166667, 0xfc, 0x18 },
139 { 835000000, 166667, 0xbc, 0x18 },
140 { 999999999, 166667, 0xfc, 0x18 },
149 .sleepdata = (
u8[]){ 2, 0xbc, 0x03 },
152 { 157500000, 166667, 0xbc, 0x01 },
153 { 443250000, 166667, 0xbc, 0x02 },
154 { 542000000, 166667, 0xbc, 0x04 },
155 { 830000000, 166667, 0xf4, 0x04 },
156 { 999999999, 166667, 0xfc, 0x04 },
167 { 150000000, 166667, 0xb4, 0x01 },
168 { 173000000, 166667, 0xbc, 0x01 },
169 { 250000000, 166667, 0xb4, 0x02 },
170 { 400000000, 166667, 0xbc, 0x02 },
171 { 420000000, 166667, 0xf4, 0x02 },
172 { 470000000, 166667, 0xfc, 0x02 },
173 { 600000000, 166667, 0xbc, 0x08 },
174 { 730000000, 166667, 0xf4, 0x08 },
175 { 999999999, 166667, 0xfc, 0x08 },
183 .name =
"Infineon TUA6010XS",
189 { 115750000, 62500, 0x8e, 0x03 },
190 { 403250000, 62500, 0x8e, 0x06 },
191 { 999999999, 62500, 0x8e, 0x85 },
197 .name =
"Panasonic ENV57H1XD5",
203 { 153000000, 166667, 0xc2, 0x41 },
204 { 470000000, 166667, 0xc2, 0x42 },
205 { 526000000, 166667, 0xc2, 0x84 },
206 { 999999999, 166667, 0xc2, 0xa4 },
221 .name =
"Philips TDA6650/TDA6651",
226 .initdata = (
u8[]){ 4, 0x0b, 0xf5, 0x85, 0xab },
229 { 93834000, 166667, 0xca, 0x61 },
230 { 123834000, 166667, 0xca, 0xa1 },
231 { 161000000, 166667, 0xca, 0xa1 },
232 { 163834000, 166667, 0xca, 0xc2 },
233 { 253834000, 166667, 0xca, 0x62 },
234 { 383834000, 166667, 0xca, 0xa2 },
235 { 443834000, 166667, 0xca, 0xc2 },
236 { 444000000, 166667, 0xca, 0xc4 },
237 { 583834000, 166667, 0xca, 0x64 },
238 { 793834000, 166667, 0xca, 0xa4 },
239 { 444834000, 166667, 0xca, 0xc4 },
240 { 861000000, 166667, 0xca, 0xe4 },
255 .name =
"Infineon TUA6034",
262 { 174500000, 62500, 0xce, 0x01 },
263 { 230000000, 62500, 0xce, 0x02 },
264 { 999999999, 62500, 0xce, 0x04 },
279 .name =
"ALPS TDED4",
286 { 153000000, 166667, 0x85, 0x01 },
287 { 470000000, 166667, 0x85, 0x02 },
288 { 823000000, 166667, 0x85, 0x08 },
289 { 999999999, 166667, 0x85, 0x88 },
297 .name =
"ALPS TDHU2",
303 { 162000000, 62500, 0x85, 0x01 },
304 { 426000000, 62500, 0x85, 0x02 },
305 { 782000000, 62500, 0x85, 0x08 },
306 { 999999999, 62500, 0x85, 0x88 },
314 .name =
"Samsung TBMV30111IN / TBMV30712IN1",
320 { 172000000, 166667, 0xb4, 0x01 },
321 { 214000000, 166667, 0xb4, 0x02 },
322 { 467000000, 166667, 0xbc, 0x02 },
323 { 721000000, 166667, 0xbc, 0x08 },
324 { 841000000, 166667, 0xf4, 0x08 },
325 { 999999999, 166667, 0xfc, 0x02 },
332 static struct dvb_pll_desc dvb_pll_philips_sd1878_tda8261 = {
333 .name =
"Philips SD1878",
339 { 1250000, 500, 0xc4, 0x00},
340 { 1450000, 500, 0xc4, 0x40},
341 { 2050000, 500, 0xc4, 0x80},
342 { 2150000, 500, 0xc4, 0xc0},
360 if (fe->
ops.i2c_gate_ctrl)
361 fe->
ops.i2c_gate_ctrl(fe, 1);
370 else if (b_w <= 12000)
372 else if (b_w <= 14000)
374 else if (b_w <= 16000)
376 else if (b_w <= 18000)
378 else if (b_w <= 20000)
380 else if (b_w <= 22000)
382 else if (b_w <= 24000)
384 else if (b_w <= 26000)
386 else if (b_w <= 28000)
392 buf[2] |= ((lpf >> 2) & 0x3) << 3;
393 buf[3] |= (lpf & 0x3) << 2;
399 .name =
"Opera Tuner",
402 .initdata = (
u8[]){ 4, 0x08, 0xe5, 0xe1, 0x00 },
403 .initdata2 = (
u8[]){ 4, 0x08, 0xe5, 0xe5, 0x00 },
408 { 1064000, 500, 0xf9, 0xc2 },
409 { 1169000, 500, 0xf9, 0xe2 },
410 { 1299000, 500, 0xf9, 0x20 },
411 { 1444000, 500, 0xf9, 0x40 },
412 { 1606000, 500, 0xf9, 0x60 },
413 { 1777000, 500, 0xf9, 0x80 },
414 { 1941000, 500, 0xf9, 0xa0 },
415 { 2250000, 500, 0xf9, 0xc0 },
419 static void samsung_dtos403ih102a_set(
struct dvb_frontend *fe,
u8 *buf)
430 if (fe->
ops.i2c_gate_ctrl)
431 fe->
ops.i2c_gate_ctrl(fe, 1);
445 static struct dvb_pll_desc dvb_pll_samsung_dtos403ih102a = {
446 .name =
"Samsung DTOS403IH102A",
451 .set = samsung_dtos403ih102a_set,
453 { 135000000, 62500, 0xbe, 0x01 },
454 { 177000000, 62500, 0xf6, 0x01 },
455 { 370000000, 62500, 0xbe, 0x02 },
456 { 450000000, 62500, 0xf6, 0x02 },
457 { 466000000, 62500, 0xfe, 0x02 },
458 { 538000000, 62500, 0xbe, 0x08 },
459 { 826000000, 62500, 0xf6, 0x08 },
460 { 999999999, 62500, 0xfe, 0x08 },
465 static struct dvb_pll_desc dvb_pll_samsung_tdtc9251dh0 = {
466 .name =
"Samsung TDTC9251DH0",
472 { 157500000, 166667, 0xcc, 0x09 },
473 { 443000000, 166667, 0xcc, 0x0a },
474 { 863000000, 166667, 0xcc, 0x08 },
479 static struct dvb_pll_desc dvb_pll_samsung_tbdu18132 = {
480 .name =
"Samsung TBDU18132",
486 { 1550000, 125, 0x84, 0x82 },
487 { 4095937, 125, 0x84, 0x80 },
500 static struct dvb_pll_desc dvb_pll_samsung_tbmu24112 = {
501 .name =
"Samsung TBMU24112",
507 { 1500000, 125, 0x84, 0x18 },
508 { 9999999, 125, 0x84, 0x08 },
522 .name =
"ALPS TDEE4",
528 { 153000000, 62500, 0x95, 0x01 },
529 { 430000000, 62500, 0x95, 0x02 },
530 { 822000000, 62500, 0x95, 0x08 },
531 { 999999999, 62500, 0x95, 0x88 },
571 if (frequency && (frequency < desc->
min || frequency > desc->
max))
574 for (i = 0; i < desc->
count; i++) {
575 if (frequency > desc->
entries[i].limit)
581 printk(
"pll: %s: freq=%d | i=%d/%d\n", desc->
name,
582 frequency, i, desc->
count);
583 if (i == desc->
count)
586 div = (frequency + desc->
iffreq +
590 buf[2] = desc->
entries[i].config;
597 printk(
"pll: %s: div=%d | buf=0x%02x,0x%02x,0x%02x,0x%02x\n",
598 desc->
name, div, buf[0], buf[1], buf[2], buf[3]);
621 .buf = priv->
pll_desc->sleepdata + 1,
622 .len = priv->
pll_desc->sleepdata[0] };
626 if (fe->
ops.i2c_gate_ctrl)
627 fe->
ops.i2c_gate_ctrl(fe, 1);
644 .buf =
buf, .len =
sizeof(
buf) };
651 result = dvb_pll_configure(fe, buf, c->
frequency);
657 if (fe->
ops.i2c_gate_ctrl)
658 fe->
ops.i2c_gate_ctrl(fe, 1);
670 u8 *buf,
int buf_len)
680 result = dvb_pll_configure(fe, buf + 1, c->
frequency);
694 static int dvb_pll_get_frequency(
struct dvb_frontend *fe,
u32 *frequency)
718 .buf = priv->
pll_desc->initdata + 1,
719 .len = priv->
pll_desc->initdata[0] };
722 if (fe->
ops.i2c_gate_ctrl)
723 fe->
ops.i2c_gate_ctrl(fe, 1);
730 if (fe->
ops.i2c_gate_ctrl)
731 fe->
ops.i2c_gate_ctrl(fe, 1);
743 .release = dvb_pll_release,
744 .sleep = dvb_pll_sleep,
745 .init = dvb_pll_init,
746 .set_params = dvb_pll_set_params,
747 .calc_regs = dvb_pll_calc_regs,
748 .get_frequency = dvb_pll_get_frequency,
749 .get_bandwidth = dvb_pll_get_bandwidth,
754 unsigned int pll_desc_id)
758 .buf = b1, .len = 1 };
764 (
id[dvb_pll_devcount] <
ARRAY_SIZE(pll_list)))
765 pll_desc_id =
id[dvb_pll_devcount];
769 desc = pll_list[pll_desc_id];
772 if (fe->
ops.i2c_gate_ctrl)
773 fe->
ops.i2c_gate_ctrl(fe, 1);
778 if (fe->
ops.i2c_gate_ctrl)
779 fe->
ops.i2c_gate_ctrl(fe, 0);
789 priv->
nr = dvb_pll_devcount++;
791 memcpy(&fe->
ops.tuner_ops, &dvb_pll_tuner_ops,
795 sizeof(fe->
ops.tuner_ops.info.name));
796 fe->
ops.tuner_ops.info.frequency_min = desc->
min;
797 fe->
ops.tuner_ops.info.frequency_max = desc->
max;
801 fe->
ops.tuner_ops.sleep =
NULL;
805 if ((
debug) || (
id[priv->
nr] == pll_desc_id)) {
808 printk(
" %d-%04x", i2c_adapter_id(i2c), pll_addr);
809 printk(
": id# %d (%s) attached, %s\n", pll_desc_id, desc->
name,
810 id[priv->
nr] == pll_desc_id ?
811 "insmod option" :
"autodetected");