aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornibble.max <nibble.max@gmail.com>2014-10-30 04:01:14 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-11-03 15:24:15 -0500
commitf4df95bcbb7b142bdb4cf201f5e1bd3985f8c804 (patch)
tree2afe4b7d2ba8b166f0b8c862cfa7c03fce8ccb23
parent333829110f1d871df8ad9404833ecf49fc29aa34 (diff)
[media] m88ds3103: add support for the demod of M88RS6000
M88RS6000 is the integrated chip, which includes tuner and demod. Its internal demod is similar with M88DS3103 except some registers definition. The main different part of this internal demod from others is its clock/pll generation IP block sitting inside the tuner die. So clock/pll functions should be configed through its tuner i2c bus, NOT its demod i2c bus. The demod of M88RS6000 need the firmware: dvb-demod-m88rs6000.fw firmware download link: http://www.dvbsky.net/download/linux/dvbsky-firmware.tar.gz Signed-off-by: Nibble Max <nibble.max@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/dvb-frontends/m88ds3103.c242
-rw-r--r--drivers/media/dvb-frontends/m88ds3103_priv.h181
2 files changed, 345 insertions, 78 deletions
diff --git a/drivers/media/dvb-frontends/m88ds3103.c b/drivers/media/dvb-frontends/m88ds3103.c
index 81657e94c5a4..621d20fde2ab 100644
--- a/drivers/media/dvb-frontends/m88ds3103.c
+++ b/drivers/media/dvb-frontends/m88ds3103.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Montage M88DS3103 demodulator driver 2 * Montage M88DS3103/M88RS6000 demodulator driver
3 * 3 *
4 * Copyright (C) 2013 Antti Palosaari <crope@iki.fi> 4 * Copyright (C) 2013 Antti Palosaari <crope@iki.fi>
5 * 5 *
@@ -162,7 +162,7 @@ static int m88ds3103_wr_reg_val_tab(struct m88ds3103_priv *priv,
162 162
163 dev_dbg(&priv->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); 163 dev_dbg(&priv->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len);
164 164
165 if (tab_len > 83) { 165 if (tab_len > 86) {
166 ret = -EINVAL; 166 ret = -EINVAL;
167 goto err; 167 goto err;
168 } 168 }
@@ -246,7 +246,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
246 int ret, len; 246 int ret, len;
247 const struct m88ds3103_reg_val *init; 247 const struct m88ds3103_reg_val *init;
248 u8 u8tmp, u8tmp1, u8tmp2; 248 u8 u8tmp, u8tmp1, u8tmp2;
249 u8 buf[2]; 249 u8 buf[3];
250 u16 u16tmp, divide_ratio; 250 u16 u16tmp, divide_ratio;
251 u32 tuner_frequency, target_mclk; 251 u32 tuner_frequency, target_mclk;
252 s32 s32tmp; 252 s32 s32tmp;
@@ -262,6 +262,22 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
262 goto err; 262 goto err;
263 } 263 }
264 264
265 /* reset */
266 ret = m88ds3103_wr_reg(priv, 0x07, 0x80);
267 if (ret)
268 goto err;
269
270 ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
271 if (ret)
272 goto err;
273
274 /* Disable demod clock path */
275 if (priv->chip_id == M88RS6000_CHIP_ID) {
276 ret = m88ds3103_wr_reg(priv, 0x06, 0xe0);
277 if (ret)
278 goto err;
279 }
280
265 /* program tuner */ 281 /* program tuner */
266 if (fe->ops.tuner_ops.set_params) { 282 if (fe->ops.tuner_ops.set_params) {
267 ret = fe->ops.tuner_ops.set_params(fe); 283 ret = fe->ops.tuner_ops.set_params(fe);
@@ -282,14 +298,76 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
282 tuner_frequency = c->frequency; 298 tuner_frequency = c->frequency;
283 } 299 }
284 300
285 /* reset */ 301 /* select M88RS6000 demod main mclk and ts mclk from tuner die. */
286 ret = m88ds3103_wr_reg(priv, 0x07, 0x80); 302 if (priv->chip_id == M88RS6000_CHIP_ID) {
287 if (ret) 303 if (c->symbol_rate > 45010000)
288 goto err; 304 priv->mclk_khz = 110250;
305 else
306 priv->mclk_khz = 96000;
289 307
290 ret = m88ds3103_wr_reg(priv, 0x07, 0x00); 308 if (c->delivery_system == SYS_DVBS)
291 if (ret) 309 target_mclk = 96000;
292 goto err; 310 else
311 target_mclk = 144000;
312
313 /* Enable demod clock path */
314 ret = m88ds3103_wr_reg(priv, 0x06, 0x00);
315 if (ret)
316 goto err;
317 usleep_range(10000, 20000);
318 } else {
319 /* set M88DS3103 mclk and ts mclk. */
320 priv->mclk_khz = 96000;
321
322 if (c->delivery_system == SYS_DVBS)
323 target_mclk = 96000;
324 else {
325 switch (priv->cfg->ts_mode) {
326 case M88DS3103_TS_SERIAL:
327 case M88DS3103_TS_SERIAL_D7:
328 if (c->symbol_rate < 18000000)
329 target_mclk = 96000;
330 else
331 target_mclk = 144000;
332 break;
333 case M88DS3103_TS_PARALLEL:
334 case M88DS3103_TS_CI:
335 if (c->symbol_rate < 18000000)
336 target_mclk = 96000;
337 else if (c->symbol_rate < 28000000)
338 target_mclk = 144000;
339 else
340 target_mclk = 192000;
341 break;
342 default:
343 dev_dbg(&priv->i2c->dev, "%s: invalid ts_mode\n",
344 __func__);
345 ret = -EINVAL;
346 goto err;
347 }
348 }
349
350 switch (target_mclk) {
351 case 96000:
352 u8tmp1 = 0x02; /* 0b10 */
353 u8tmp2 = 0x01; /* 0b01 */
354 break;
355 case 144000:
356 u8tmp1 = 0x00; /* 0b00 */
357 u8tmp2 = 0x01; /* 0b01 */
358 break;
359 case 192000:
360 u8tmp1 = 0x03; /* 0b11 */
361 u8tmp2 = 0x00; /* 0b00 */
362 break;
363 }
364 ret = m88ds3103_wr_reg_mask(priv, 0x22, u8tmp1 << 6, 0xc0);
365 if (ret)
366 goto err;
367 ret = m88ds3103_wr_reg_mask(priv, 0x24, u8tmp2 << 6, 0xc0);
368 if (ret)
369 goto err;
370 }
293 371
294 ret = m88ds3103_wr_reg(priv, 0xb2, 0x01); 372 ret = m88ds3103_wr_reg(priv, 0xb2, 0x01);
295 if (ret) 373 if (ret)
@@ -301,36 +379,21 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
301 379
302 switch (c->delivery_system) { 380 switch (c->delivery_system) {
303 case SYS_DVBS: 381 case SYS_DVBS:
304 len = ARRAY_SIZE(m88ds3103_dvbs_init_reg_vals); 382 if (priv->chip_id == M88RS6000_CHIP_ID) {
305 init = m88ds3103_dvbs_init_reg_vals; 383 len = ARRAY_SIZE(m88rs6000_dvbs_init_reg_vals);
306 target_mclk = 96000; 384 init = m88rs6000_dvbs_init_reg_vals;
385 } else {
386 len = ARRAY_SIZE(m88ds3103_dvbs_init_reg_vals);
387 init = m88ds3103_dvbs_init_reg_vals;
388 }
307 break; 389 break;
308 case SYS_DVBS2: 390 case SYS_DVBS2:
309 len = ARRAY_SIZE(m88ds3103_dvbs2_init_reg_vals); 391 if (priv->chip_id == M88RS6000_CHIP_ID) {
310 init = m88ds3103_dvbs2_init_reg_vals; 392 len = ARRAY_SIZE(m88rs6000_dvbs2_init_reg_vals);
311 393 init = m88rs6000_dvbs2_init_reg_vals;
312 switch (priv->cfg->ts_mode) { 394 } else {
313 case M88DS3103_TS_SERIAL: 395 len = ARRAY_SIZE(m88ds3103_dvbs2_init_reg_vals);
314 case M88DS3103_TS_SERIAL_D7: 396 init = m88ds3103_dvbs2_init_reg_vals;
315 if (c->symbol_rate < 18000000)
316 target_mclk = 96000;
317 else
318 target_mclk = 144000;
319 break;
320 case M88DS3103_TS_PARALLEL:
321 case M88DS3103_TS_CI:
322 if (c->symbol_rate < 18000000)
323 target_mclk = 96000;
324 else if (c->symbol_rate < 28000000)
325 target_mclk = 144000;
326 else
327 target_mclk = 192000;
328 break;
329 default:
330 dev_dbg(&priv->i2c->dev, "%s: invalid ts_mode\n",
331 __func__);
332 ret = -EINVAL;
333 goto err;
334 } 397 }
335 break; 398 break;
336 default: 399 default:
@@ -347,6 +410,30 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
347 goto err; 410 goto err;
348 } 411 }
349 412
413 if (priv->chip_id == M88RS6000_CHIP_ID) {
414 if ((c->delivery_system == SYS_DVBS2)
415 && ((c->symbol_rate / 1000) <= 5000)) {
416 ret = m88ds3103_wr_reg(priv, 0xc0, 0x04);
417 if (ret)
418 goto err;
419 buf[0] = 0x09;
420 buf[1] = 0x22;
421 buf[2] = 0x88;
422 ret = m88ds3103_wr_regs(priv, 0x8a, buf, 3);
423 if (ret)
424 goto err;
425 }
426 ret = m88ds3103_wr_reg_mask(priv, 0x9d, 0x08, 0x08);
427 if (ret)
428 goto err;
429 ret = m88ds3103_wr_reg(priv, 0xf1, 0x01);
430 if (ret)
431 goto err;
432 ret = m88ds3103_wr_reg_mask(priv, 0x30, 0x80, 0x80);
433 if (ret)
434 goto err;
435 }
436
350 u8tmp1 = 0; /* silence compiler warning */ 437 u8tmp1 = 0; /* silence compiler warning */
351 switch (priv->cfg->ts_mode) { 438 switch (priv->cfg->ts_mode) {
352 case M88DS3103_TS_SERIAL: 439 case M88DS3103_TS_SERIAL:
@@ -420,29 +507,6 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
420 if (ret) 507 if (ret)
421 goto err; 508 goto err;
422 509
423 switch (target_mclk) {
424 case 96000:
425 u8tmp1 = 0x02; /* 0b10 */
426 u8tmp2 = 0x01; /* 0b01 */
427 break;
428 case 144000:
429 u8tmp1 = 0x00; /* 0b00 */
430 u8tmp2 = 0x01; /* 0b01 */
431 break;
432 case 192000:
433 u8tmp1 = 0x03; /* 0b11 */
434 u8tmp2 = 0x00; /* 0b00 */
435 break;
436 }
437
438 ret = m88ds3103_wr_reg_mask(priv, 0x22, u8tmp1 << 6, 0xc0);
439 if (ret)
440 goto err;
441
442 ret = m88ds3103_wr_reg_mask(priv, 0x24, u8tmp2 << 6, 0xc0);
443 if (ret)
444 goto err;
445
446 if (c->symbol_rate <= 3000000) 510 if (c->symbol_rate <= 3000000)
447 u8tmp = 0x20; 511 u8tmp = 0x20;
448 else if (c->symbol_rate <= 10000000) 512 else if (c->symbol_rate <= 10000000)
@@ -466,7 +530,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
466 if (ret) 530 if (ret)
467 goto err; 531 goto err;
468 532
469 u16tmp = DIV_ROUND_CLOSEST((c->symbol_rate / 1000) << 15, M88DS3103_MCLK_KHZ / 2); 533 u16tmp = DIV_ROUND_CLOSEST((c->symbol_rate / 1000) << 15, priv->mclk_khz / 2);
470 buf[0] = (u16tmp >> 0) & 0xff; 534 buf[0] = (u16tmp >> 0) & 0xff;
471 buf[1] = (u16tmp >> 8) & 0xff; 535 buf[1] = (u16tmp >> 8) & 0xff;
472 ret = m88ds3103_wr_regs(priv, 0x61, buf, 2); 536 ret = m88ds3103_wr_regs(priv, 0x61, buf, 2);
@@ -489,7 +553,7 @@ static int m88ds3103_set_frontend(struct dvb_frontend *fe)
489 (tuner_frequency - c->frequency)); 553 (tuner_frequency - c->frequency));
490 554
491 s32tmp = 0x10000 * (tuner_frequency - c->frequency); 555 s32tmp = 0x10000 * (tuner_frequency - c->frequency);
492 s32tmp = DIV_ROUND_CLOSEST(s32tmp, M88DS3103_MCLK_KHZ); 556 s32tmp = DIV_ROUND_CLOSEST(s32tmp, priv->mclk_khz);
493 if (s32tmp < 0) 557 if (s32tmp < 0)
494 s32tmp += 0x10000; 558 s32tmp += 0x10000;
495 559
@@ -520,7 +584,7 @@ static int m88ds3103_init(struct dvb_frontend *fe)
520 struct m88ds3103_priv *priv = fe->demodulator_priv; 584 struct m88ds3103_priv *priv = fe->demodulator_priv;
521 int ret, len, remaining; 585 int ret, len, remaining;
522 const struct firmware *fw = NULL; 586 const struct firmware *fw = NULL;
523 u8 *fw_file = M88DS3103_FIRMWARE; 587 u8 *fw_file;
524 u8 u8tmp; 588 u8 u8tmp;
525 589
526 dev_dbg(&priv->i2c->dev, "%s:\n", __func__); 590 dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
@@ -541,15 +605,6 @@ static int m88ds3103_init(struct dvb_frontend *fe)
541 if (ret) 605 if (ret)
542 goto err; 606 goto err;
543 607
544 /* reset */
545 ret = m88ds3103_wr_reg(priv, 0x07, 0x60);
546 if (ret)
547 goto err;
548
549 ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
550 if (ret)
551 goto err;
552
553 /* firmware status */ 608 /* firmware status */
554 ret = m88ds3103_rd_reg(priv, 0xb9, &u8tmp); 609 ret = m88ds3103_rd_reg(priv, 0xb9, &u8tmp);
555 if (ret) 610 if (ret)
@@ -560,10 +615,23 @@ static int m88ds3103_init(struct dvb_frontend *fe)
560 if (u8tmp) 615 if (u8tmp)
561 goto skip_fw_download; 616 goto skip_fw_download;
562 617
618 /* global reset, global diseqc reset, golbal fec reset */
619 ret = m88ds3103_wr_reg(priv, 0x07, 0xe0);
620 if (ret)
621 goto err;
622
623 ret = m88ds3103_wr_reg(priv, 0x07, 0x00);
624 if (ret)
625 goto err;
626
563 /* cold state - try to download firmware */ 627 /* cold state - try to download firmware */
564 dev_info(&priv->i2c->dev, "%s: found a '%s' in cold state\n", 628 dev_info(&priv->i2c->dev, "%s: found a '%s' in cold state\n",
565 KBUILD_MODNAME, m88ds3103_ops.info.name); 629 KBUILD_MODNAME, m88ds3103_ops.info.name);
566 630
631 if (priv->chip_id == M88RS6000_CHIP_ID)
632 fw_file = M88RS6000_FIRMWARE;
633 else
634 fw_file = M88DS3103_FIRMWARE;
567 /* request the firmware, this will block and timeout */ 635 /* request the firmware, this will block and timeout */
568 ret = request_firmware(&fw, fw_file, priv->i2c->dev.parent); 636 ret = request_firmware(&fw, fw_file, priv->i2c->dev.parent);
569 if (ret) { 637 if (ret) {
@@ -635,13 +703,18 @@ static int m88ds3103_sleep(struct dvb_frontend *fe)
635{ 703{
636 struct m88ds3103_priv *priv = fe->demodulator_priv; 704 struct m88ds3103_priv *priv = fe->demodulator_priv;
637 int ret; 705 int ret;
706 u8 u8tmp;
638 707
639 dev_dbg(&priv->i2c->dev, "%s:\n", __func__); 708 dev_dbg(&priv->i2c->dev, "%s:\n", __func__);
640 709
641 priv->delivery_system = SYS_UNDEFINED; 710 priv->delivery_system = SYS_UNDEFINED;
642 711
643 /* TS Hi-Z */ 712 /* TS Hi-Z */
644 ret = m88ds3103_wr_reg_mask(priv, 0x27, 0x00, 0x01); 713 if (priv->chip_id == M88RS6000_CHIP_ID)
714 u8tmp = 0x29;
715 else
716 u8tmp = 0x27;
717 ret = m88ds3103_wr_reg_mask(priv, u8tmp, 0x00, 0x01);
645 if (ret) 718 if (ret)
646 goto err; 719 goto err;
647 720
@@ -830,7 +903,7 @@ static int m88ds3103_get_frontend(struct dvb_frontend *fe)
830 goto err; 903 goto err;
831 904
832 c->symbol_rate = 1ull * ((buf[1] << 8) | (buf[0] << 0)) * 905 c->symbol_rate = 1ull * ((buf[1] << 8) | (buf[0] << 0)) *
833 M88DS3103_MCLK_KHZ * 1000 / 0x10000; 906 priv->mclk_khz * 1000 / 0x10000;
834 907
835 return 0; 908 return 0;
836err: 909err:
@@ -1310,18 +1383,22 @@ struct dvb_frontend *m88ds3103_attach(const struct m88ds3103_config *cfg,
1310 priv->i2c = i2c; 1383 priv->i2c = i2c;
1311 mutex_init(&priv->i2c_mutex); 1384 mutex_init(&priv->i2c_mutex);
1312 1385
1313 ret = m88ds3103_rd_reg(priv, 0x01, &chip_id); 1386 /* 0x00: chip id[6:0], 0x01: chip ver[7:0], 0x02: chip ver[15:8] */
1387 ret = m88ds3103_rd_reg(priv, 0x00, &chip_id);
1314 if (ret) 1388 if (ret)
1315 goto err; 1389 goto err;
1316 1390
1317 dev_dbg(&priv->i2c->dev, "%s: chip_id=%02x\n", __func__, chip_id); 1391 chip_id >>= 1;
1392 dev_info(&priv->i2c->dev, "%s: chip_id=%02x\n", __func__, chip_id);
1318 1393
1319 switch (chip_id) { 1394 switch (chip_id) {
1320 case 0xd0: 1395 case M88RS6000_CHIP_ID:
1396 case M88DS3103_CHIP_ID:
1321 break; 1397 break;
1322 default: 1398 default:
1323 goto err; 1399 goto err;
1324 } 1400 }
1401 priv->chip_id = chip_id;
1325 1402
1326 switch (priv->cfg->clock_out) { 1403 switch (priv->cfg->clock_out) {
1327 case M88DS3103_CLOCK_OUT_DISABLED: 1404 case M88DS3103_CLOCK_OUT_DISABLED:
@@ -1337,6 +1414,11 @@ struct dvb_frontend *m88ds3103_attach(const struct m88ds3103_config *cfg,
1337 goto err; 1414 goto err;
1338 } 1415 }
1339 1416
1417 /* 0x29 register is defined differently for m88rs6000. */
1418 /* set internal tuner address to 0x21 */
1419 if (chip_id == M88RS6000_CHIP_ID)
1420 u8tmp = 0x00;
1421
1340 ret = m88ds3103_wr_reg(priv, 0x29, u8tmp); 1422 ret = m88ds3103_wr_reg(priv, 0x29, u8tmp);
1341 if (ret) 1423 if (ret)
1342 goto err; 1424 goto err;
@@ -1364,6 +1446,9 @@ struct dvb_frontend *m88ds3103_attach(const struct m88ds3103_config *cfg,
1364 1446
1365 /* create dvb_frontend */ 1447 /* create dvb_frontend */
1366 memcpy(&priv->fe.ops, &m88ds3103_ops, sizeof(struct dvb_frontend_ops)); 1448 memcpy(&priv->fe.ops, &m88ds3103_ops, sizeof(struct dvb_frontend_ops));
1449 if (priv->chip_id == M88RS6000_CHIP_ID)
1450 strncpy(priv->fe.ops.info.name,
1451 "Montage M88RS6000", sizeof(priv->fe.ops.info.name));
1367 priv->fe.demodulator_priv = priv; 1452 priv->fe.demodulator_priv = priv;
1368 1453
1369 return &priv->fe; 1454 return &priv->fe;
@@ -1423,3 +1508,4 @@ MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>");
1423MODULE_DESCRIPTION("Montage M88DS3103 DVB-S/S2 demodulator driver"); 1508MODULE_DESCRIPTION("Montage M88DS3103 DVB-S/S2 demodulator driver");
1424MODULE_LICENSE("GPL"); 1509MODULE_LICENSE("GPL");
1425MODULE_FIRMWARE(M88DS3103_FIRMWARE); 1510MODULE_FIRMWARE(M88DS3103_FIRMWARE);
1511MODULE_FIRMWARE(M88RS6000_FIRMWARE);
diff --git a/drivers/media/dvb-frontends/m88ds3103_priv.h b/drivers/media/dvb-frontends/m88ds3103_priv.h
index 9169fdd143cf..a2c0958111f8 100644
--- a/drivers/media/dvb-frontends/m88ds3103_priv.h
+++ b/drivers/media/dvb-frontends/m88ds3103_priv.h
@@ -25,7 +25,10 @@
25#include <linux/math64.h> 25#include <linux/math64.h>
26 26
27#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw" 27#define M88DS3103_FIRMWARE "dvb-demod-m88ds3103.fw"
28#define M88RS6000_FIRMWARE "dvb-demod-m88rs6000.fw"
28#define M88DS3103_MCLK_KHZ 96000 29#define M88DS3103_MCLK_KHZ 96000
30#define M88RS6000_CHIP_ID 0x74
31#define M88DS3103_CHIP_ID 0x70
29 32
30struct m88ds3103_priv { 33struct m88ds3103_priv {
31 struct i2c_adapter *i2c; 34 struct i2c_adapter *i2c;
@@ -38,6 +41,10 @@ struct m88ds3103_priv {
38 u32 ber; 41 u32 ber;
39 bool warm; /* FW running */ 42 bool warm; /* FW running */
40 struct i2c_adapter *i2c_adapter; 43 struct i2c_adapter *i2c_adapter;
44 /* auto detect chip id to do different config */
45 u8 chip_id;
46 /* main mclk is calculated for M88RS6000 dynamically */
47 u32 mclk_khz;
41}; 48};
42 49
43struct m88ds3103_reg_val { 50struct m88ds3103_reg_val {
@@ -214,4 +221,178 @@ static const struct m88ds3103_reg_val m88ds3103_dvbs2_init_reg_vals[] = {
214 {0xb8, 0x00}, 221 {0xb8, 0x00},
215}; 222};
216 223
224static const struct m88ds3103_reg_val m88rs6000_dvbs_init_reg_vals[] = {
225 {0x23, 0x07},
226 {0x08, 0x03},
227 {0x0c, 0x02},
228 {0x20, 0x00},
229 {0x21, 0x54},
230 {0x25, 0x82},
231 {0x27, 0x31},
232 {0x30, 0x08},
233 {0x31, 0x40},
234 {0x32, 0x32},
235 {0x33, 0x35},
236 {0x35, 0xff},
237 {0x3a, 0x00},
238 {0x37, 0x10},
239 {0x38, 0x10},
240 {0x39, 0x02},
241 {0x42, 0x60},
242 {0x4a, 0x80},
243 {0x4b, 0x04},
244 {0x4d, 0x91},
245 {0x5d, 0xc8},
246 {0x50, 0x36},
247 {0x51, 0x36},
248 {0x52, 0x36},
249 {0x53, 0x36},
250 {0x63, 0x0f},
251 {0x64, 0x30},
252 {0x65, 0x40},
253 {0x68, 0x26},
254 {0x69, 0x4c},
255 {0x70, 0x20},
256 {0x71, 0x70},
257 {0x72, 0x04},
258 {0x73, 0x00},
259 {0x70, 0x40},
260 {0x71, 0x70},
261 {0x72, 0x04},
262 {0x73, 0x00},
263 {0x70, 0x60},
264 {0x71, 0x70},
265 {0x72, 0x04},
266 {0x73, 0x00},
267 {0x70, 0x80},
268 {0x71, 0x70},
269 {0x72, 0x04},
270 {0x73, 0x00},
271 {0x70, 0xa0},
272 {0x71, 0x70},
273 {0x72, 0x04},
274 {0x73, 0x00},
275 {0x70, 0x1f},
276 {0x76, 0x38},
277 {0x77, 0xa6},
278 {0x78, 0x0c},
279 {0x79, 0x80},
280 {0x7f, 0x14},
281 {0x7c, 0x00},
282 {0xae, 0x82},
283 {0x80, 0x64},
284 {0x81, 0x66},
285 {0x82, 0x44},
286 {0x85, 0x04},
287 {0xcd, 0xf4},
288 {0x90, 0x33},
289 {0xa0, 0x44},
290 {0xbe, 0x00},
291 {0xc0, 0x08},
292 {0xc3, 0x10},
293 {0xc4, 0x08},
294 {0xc5, 0xf0},
295 {0xc6, 0xff},
296 {0xc7, 0x00},
297 {0xc8, 0x1a},
298 {0xc9, 0x80},
299 {0xe0, 0xf8},
300 {0xe6, 0x8b},
301 {0xd0, 0x40},
302 {0xf8, 0x20},
303 {0xfa, 0x0f},
304 {0x00, 0x00},
305 {0xbd, 0x01},
306 {0xb8, 0x00},
307 {0x29, 0x11},
308};
309
310static const struct m88ds3103_reg_val m88rs6000_dvbs2_init_reg_vals[] = {
311 {0x23, 0x07},
312 {0x08, 0x07},
313 {0x0c, 0x02},
314 {0x20, 0x00},
315 {0x21, 0x54},
316 {0x25, 0x82},
317 {0x27, 0x31},
318 {0x30, 0x08},
319 {0x32, 0x32},
320 {0x33, 0x35},
321 {0x35, 0xff},
322 {0x3a, 0x00},
323 {0x37, 0x10},
324 {0x38, 0x10},
325 {0x39, 0x02},
326 {0x42, 0x60},
327 {0x4a, 0x80},
328 {0x4b, 0x04},
329 {0x4d, 0x91},
330 {0x5d, 0xc8},
331 {0x50, 0x36},
332 {0x51, 0x36},
333 {0x52, 0x36},
334 {0x53, 0x36},
335 {0x63, 0x0f},
336 {0x64, 0x10},
337 {0x65, 0x20},
338 {0x68, 0x46},
339 {0x69, 0xcd},
340 {0x70, 0x20},
341 {0x71, 0x70},
342 {0x72, 0x04},
343 {0x73, 0x00},
344 {0x70, 0x40},
345 {0x71, 0x70},
346 {0x72, 0x04},
347 {0x73, 0x00},
348 {0x70, 0x60},
349 {0x71, 0x70},
350 {0x72, 0x04},
351 {0x73, 0x00},
352 {0x70, 0x80},
353 {0x71, 0x70},
354 {0x72, 0x04},
355 {0x73, 0x00},
356 {0x70, 0xa0},
357 {0x71, 0x70},
358 {0x72, 0x04},
359 {0x73, 0x00},
360 {0x70, 0x1f},
361 {0x76, 0x38},
362 {0x77, 0xa6},
363 {0x78, 0x0c},
364 {0x79, 0x80},
365 {0x7f, 0x14},
366 {0x85, 0x08},
367 {0xcd, 0xf4},
368 {0x90, 0x33},
369 {0x86, 0x00},
370 {0x87, 0x0f},
371 {0x89, 0x00},
372 {0x8b, 0x44},
373 {0x8c, 0x66},
374 {0x9d, 0xc1},
375 {0x8a, 0x10},
376 {0xad, 0x40},
377 {0xa0, 0x44},
378 {0xbe, 0x00},
379 {0xc0, 0x08},
380 {0xc1, 0x10},
381 {0xc2, 0x08},
382 {0xc3, 0x10},
383 {0xc4, 0x08},
384 {0xc5, 0xf0},
385 {0xc6, 0xff},
386 {0xc7, 0x00},
387 {0xc8, 0x1a},
388 {0xc9, 0x80},
389 {0xca, 0x23},
390 {0xcb, 0x24},
391 {0xcc, 0xf4},
392 {0xce, 0x74},
393 {0x00, 0x00},
394 {0xbd, 0x01},
395 {0xb8, 0x00},
396 {0x29, 0x01},
397};
217#endif 398#endif