diff options
-rw-r--r-- | drivers/media/dvb/dvb-usb/Kconfig | 1 | ||||
-rw-r--r-- | drivers/media/dvb/dvb-usb/af9035.c | 88 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/af9033.c | 4 | ||||
-rw-r--r-- | drivers/media/dvb/frontends/af9033_priv.h | 61 |
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 | ||
26 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 27 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
27 | static DEFINE_MUTEX(af9035_usb_mutex); | 28 | static 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 | ||
547 | static 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 | |||
596 | static 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 | |||
608 | static 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 | |||
545 | static int af9035_frontend_attach(struct dvb_usb_adapter *adap) | 624 | static 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 | ||
666 | static const struct fc0011_config af9035_fc0011_config = { | ||
667 | .i2c_address = 0x60, | ||
668 | }; | ||
669 | |||
586 | static int af9035_tuner_attach(struct dvb_usb_adapter *adap) | 670 | static 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 */ | ||
341 | static 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 | ||