aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/dvb/dvb-usb/Kconfig1
-rw-r--r--drivers/media/dvb/dvb-usb/af9035.c88
-rw-r--r--drivers/media/dvb/frontends/af9033.c4
-rw-r--r--drivers/media/dvb/frontends/af9033_priv.h61
4 files changed, 154 insertions, 0 deletions
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig
index df229fcc8f07..cf57c0659d5b 100644
--- a/drivers/media/dvb/dvb-usb/Kconfig
+++ b/drivers/media/dvb/dvb-usb/Kconfig
@@ -428,6 +428,7 @@ config DVB_USB_AF9035
428 depends on DVB_USB 428 depends on DVB_USB
429 select DVB_AF9033 429 select DVB_AF9033
430 select MEDIA_TUNER_TUA9001 if !MEDIA_TUNER_CUSTOMISE 430 select MEDIA_TUNER_TUA9001 if !MEDIA_TUNER_CUSTOMISE
431 select MEDIA_TUNER_FC0011 if !MEDIA_TUNER_CUSTOMISE
431 help 432 help
432 Say Y here to support the Afatech AF9035 based DVB USB receiver. 433 Say Y here to support the Afatech AF9035 based DVB USB receiver.
433 434
diff --git a/drivers/media/dvb/dvb-usb/af9035.c b/drivers/media/dvb/dvb-usb/af9035.c
index d5c1fa7947ac..15dcb9bc0742 100644
--- a/drivers/media/dvb/dvb-usb/af9035.c
+++ b/drivers/media/dvb/dvb-usb/af9035.c
@@ -22,6 +22,7 @@
22#include "af9035.h" 22#include "af9035.h"
23#include "af9033.h" 23#include "af9033.h"
24#include "tua9001.h" 24#include "tua9001.h"
25#include "fc0011.h"
25 26
26DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); 27DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
27static DEFINE_MUTEX(af9035_usb_mutex); 28static DEFINE_MUTEX(af9035_usb_mutex);
@@ -498,6 +499,7 @@ static int af9035_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
498 499
499 switch (tmp) { 500 switch (tmp) {
500 case AF9033_TUNER_TUA9001: 501 case AF9033_TUNER_TUA9001:
502 case AF9033_TUNER_FC0011:
501 af9035_af9033_config[i].spec_inv = 1; 503 af9035_af9033_config[i].spec_inv = 1;
502 break; 504 break;
503 default: 505 default:
@@ -542,6 +544,83 @@ err:
542 return ret; 544 return ret;
543} 545}
544 546
547static int af9035_fc0011_tuner_callback(struct dvb_usb_device *d,
548 int cmd, int arg)
549{
550 int err;
551
552 switch (cmd) {
553 case FC0011_FE_CALLBACK_POWER:
554 /* Tuner enable */
555 err = af9035_wr_reg_mask(d, 0xd8eb, 1, 1);
556 if (err)
557 return err;
558 err = af9035_wr_reg_mask(d, 0xd8ec, 1, 1);
559 if (err)
560 return err;
561 err = af9035_wr_reg_mask(d, 0xd8ed, 1, 1);
562 if (err)
563 return err;
564 /* LED */
565 err = af9035_wr_reg_mask(d, 0xd8d0, 1, 1);
566 if (err)
567 return err;
568 err = af9035_wr_reg_mask(d, 0xd8d1, 1, 1);
569 if (err)
570 return err;
571 msleep(10);
572 break;
573 case FC0011_FE_CALLBACK_RESET:
574 err = af9035_wr_reg(d, 0xd8e9, 1);
575 if (err)
576 return err;
577 err = af9035_wr_reg(d, 0xd8e8, 1);
578 if (err)
579 return err;
580 err = af9035_wr_reg(d, 0xd8e7, 1);
581 if (err)
582 return err;
583 msleep(10);
584 err = af9035_wr_reg(d, 0xd8e7, 0);
585 if (err)
586 return err;
587 msleep(10);
588 break;
589 default:
590 return -EINVAL;
591 }
592
593 return 0;
594}
595
596static int af9035_tuner_callback(struct dvb_usb_device *d, int cmd, int arg)
597{
598 switch (af9035_af9033_config[0].tuner) {
599 case AF9033_TUNER_FC0011:
600 return af9035_fc0011_tuner_callback(d, cmd, arg);
601 default:
602 break;
603 }
604
605 return -ENODEV;
606}
607
608static int af9035_frontend_callback(void *adapter_priv, int component,
609 int cmd, int arg)
610{
611 struct i2c_adapter *adap = adapter_priv;
612 struct dvb_usb_device *d = i2c_get_adapdata(adap);
613
614 switch (component) {
615 case DVB_FRONTEND_COMPONENT_TUNER:
616 return af9035_tuner_callback(d, cmd, arg);
617 default:
618 break;
619 }
620
621 return -EINVAL;
622}
623
545static int af9035_frontend_attach(struct dvb_usb_adapter *adap) 624static int af9035_frontend_attach(struct dvb_usb_adapter *adap)
546{ 625{
547 int ret; 626 int ret;
@@ -570,6 +649,7 @@ static int af9035_frontend_attach(struct dvb_usb_adapter *adap)
570 ret = -ENODEV; 649 ret = -ENODEV;
571 goto err; 650 goto err;
572 } 651 }
652 adap->fe_adap[0].fe->callback = af9035_frontend_callback;
573 653
574 return 0; 654 return 0;
575 655
@@ -583,6 +663,10 @@ static struct tua9001_config af9035_tua9001_config = {
583 .i2c_addr = 0x60, 663 .i2c_addr = 0x60,
584}; 664};
585 665
666static const struct fc0011_config af9035_fc0011_config = {
667 .i2c_address = 0x60,
668};
669
586static int af9035_tuner_attach(struct dvb_usb_adapter *adap) 670static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
587{ 671{
588 int ret; 672 int ret;
@@ -631,6 +715,10 @@ static int af9035_tuner_attach(struct dvb_usb_adapter *adap)
631 fe = dvb_attach(tua9001_attach, adap->fe_adap[0].fe, 715 fe = dvb_attach(tua9001_attach, adap->fe_adap[0].fe,
632 &adap->dev->i2c_adap, &af9035_tua9001_config); 716 &adap->dev->i2c_adap, &af9035_tua9001_config);
633 break; 717 break;
718 case AF9033_TUNER_FC0011:
719 fe = dvb_attach(fc0011_attach, adap->fe_adap[0].fe,
720 &adap->dev->i2c_adap, &af9035_fc0011_config);
721 break;
634 default: 722 default:
635 fe = NULL; 723 fe = NULL;
636 } 724 }
diff --git a/drivers/media/dvb/frontends/af9033.c b/drivers/media/dvb/frontends/af9033.c
index 277255481607..9eedf93c6384 100644
--- a/drivers/media/dvb/frontends/af9033.c
+++ b/drivers/media/dvb/frontends/af9033.c
@@ -297,6 +297,10 @@ static int af9033_init(struct dvb_frontend *fe)
297 len = ARRAY_SIZE(tuner_init_tua9001); 297 len = ARRAY_SIZE(tuner_init_tua9001);
298 init = tuner_init_tua9001; 298 init = tuner_init_tua9001;
299 break; 299 break;
300 case AF9033_TUNER_FC0011:
301 len = ARRAY_SIZE(tuner_init_fc0011);
302 init = tuner_init_fc0011;
303 break;
300 default: 304 default:
301 pr_debug("%s: unsupported tuner ID=%d\n", __func__, 305 pr_debug("%s: unsupported tuner ID=%d\n", __func__,
302 state->cfg.tuner); 306 state->cfg.tuner);
diff --git a/drivers/media/dvb/frontends/af9033_priv.h b/drivers/media/dvb/frontends/af9033_priv.h
index f0096298d2ac..337964257dab 100644
--- a/drivers/media/dvb/frontends/af9033_priv.h
+++ b/drivers/media/dvb/frontends/af9033_priv.h
@@ -336,5 +336,66 @@ static const struct reg_val tuner_init_tua9001[] = {
336 { 0x80f1e6, 0x00 }, 336 { 0x80f1e6, 0x00 },
337}; 337};
338 338
339/* Fitipower fc0011 tuner init
340 AF9033_TUNER_FC0011 = 0x28 */
341static const struct reg_val tuner_init_fc0011[] = {
342 { 0x800046, AF9033_TUNER_FC0011 },
343 { 0x800057, 0x00 },
344 { 0x800058, 0x01 },
345 { 0x80005f, 0x00 },
346 { 0x800060, 0x00 },
347 { 0x800068, 0xa5 },
348 { 0x80006e, 0x01 },
349 { 0x800071, 0x0A },
350 { 0x800072, 0x02 },
351 { 0x800074, 0x01 },
352 { 0x800079, 0x01 },
353 { 0x800093, 0x00 },
354 { 0x800094, 0x00 },
355 { 0x800095, 0x00 },
356 { 0x800096, 0x00 },
357 { 0x80009b, 0x2D },
358 { 0x80009c, 0x60 },
359 { 0x80009d, 0x23 },
360 { 0x8000a4, 0x50 },
361 { 0x8000ad, 0x50 },
362 { 0x8000b3, 0x01 },
363 { 0x8000b7, 0x88 },
364 { 0x8000b8, 0xa6 },
365 { 0x8000c3, 0x01 },
366 { 0x8000c4, 0x01 },
367 { 0x8000c7, 0x69 },
368 { 0x80F007, 0x00 },
369 { 0x80F00A, 0x1B },
370 { 0x80F00B, 0x1B },
371 { 0x80F00C, 0x1B },
372 { 0x80F00D, 0x1B },
373 { 0x80F00E, 0xFF },
374 { 0x80F00F, 0x01 },
375 { 0x80F010, 0x00 },
376 { 0x80F011, 0x02 },
377 { 0x80F012, 0xFF },
378 { 0x80F013, 0x01 },
379 { 0x80F014, 0x00 },
380 { 0x80F015, 0x02 },
381 { 0x80F01B, 0xEF },
382 { 0x80F01C, 0x01 },
383 { 0x80F01D, 0x0f },
384 { 0x80F01E, 0x02 },
385 { 0x80F01F, 0x6E },
386 { 0x80F020, 0x00 },
387 { 0x80F025, 0xDE },
388 { 0x80F026, 0x00 },
389 { 0x80F027, 0x0A },
390 { 0x80F028, 0x03 },
391 { 0x80F029, 0x6E },
392 { 0x80F02A, 0x00 },
393 { 0x80F047, 0x00 },
394 { 0x80F054, 0x00 },
395 { 0x80F055, 0x00 },
396 { 0x80F077, 0x01 },
397 { 0x80F1E6, 0x00 },
398};
399
339#endif /* AF9033_PRIV_H */ 400#endif /* AF9033_PRIV_H */
340 401