diff options
author | Nibble Max <nibble.max@gmail.com> | 2014-11-13 03:10:41 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-11-25 09:20:27 -0500 |
commit | b43a590d44d2678dc26c93a02aba88411acd18cf (patch) | |
tree | 2bbc273197825ea9c450270ee236753eb7b4760c | |
parent | 034e1ec0ce299b9e90056793dcb3187e7add6b62 (diff) |
[media] dvb-usb-dvbsky: add T680CI dvb-t2/t/c usb ci box support
DVBSky T680CI dvb-t2/t/c usb ci box:
1>dvb frontend: SI2158A20(tuner), SI2168A30(demod)
2>usb controller: CY7C86013A
3>ci controller: CIMAX SP2 or its clone.
Signed-off-by: Nibble Max <nibble.max@gmail.com>
Reviewed-by: Olli Salonen <olli.salonen@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/Kconfig | 2 | ||||
-rw-r--r-- | drivers/media/usb/dvb-usb-v2/dvbsky.c | 122 |
2 files changed, 124 insertions, 0 deletions
diff --git a/drivers/media/usb/dvb-usb-v2/Kconfig b/drivers/media/usb/dvb-usb-v2/Kconfig index 74230339f62b..0982e734fab5 100644 --- a/drivers/media/usb/dvb-usb-v2/Kconfig +++ b/drivers/media/usb/dvb-usb-v2/Kconfig | |||
@@ -145,7 +145,9 @@ config DVB_USB_DVBSKY | |||
145 | tristate "DVBSky USB support" | 145 | tristate "DVBSky USB support" |
146 | depends on DVB_USB_V2 | 146 | depends on DVB_USB_V2 |
147 | select DVB_M88DS3103 if MEDIA_SUBDRV_AUTOSELECT | 147 | select DVB_M88DS3103 if MEDIA_SUBDRV_AUTOSELECT |
148 | select DVB_SI2168 if MEDIA_SUBDRV_AUTOSELECT | ||
148 | select MEDIA_TUNER_M88TS2022 if MEDIA_SUBDRV_AUTOSELECT | 149 | select MEDIA_TUNER_M88TS2022 if MEDIA_SUBDRV_AUTOSELECT |
150 | select MEDIA_TUNER_SI2157 if MEDIA_SUBDRV_AUTOSELECT | ||
149 | select DVB_SP2 if MEDIA_SUBDRV_AUTOSELECT | 151 | select DVB_SP2 if MEDIA_SUBDRV_AUTOSELECT |
150 | help | 152 | help |
151 | Say Y here to support the USB receivers from DVBSky. | 153 | Say Y here to support the USB receivers from DVBSky. |
diff --git a/drivers/media/usb/dvb-usb-v2/dvbsky.c b/drivers/media/usb/dvb-usb-v2/dvbsky.c index 8be8447fb2be..b6326c6dac13 100644 --- a/drivers/media/usb/dvb-usb-v2/dvbsky.c +++ b/drivers/media/usb/dvb-usb-v2/dvbsky.c | |||
@@ -22,6 +22,8 @@ | |||
22 | #include "m88ds3103.h" | 22 | #include "m88ds3103.h" |
23 | #include "m88ts2022.h" | 23 | #include "m88ts2022.h" |
24 | #include "sp2.h" | 24 | #include "sp2.h" |
25 | #include "si2168.h" | ||
26 | #include "si2157.h" | ||
25 | 27 | ||
26 | #define DVBSKY_MSG_DELAY 0/*2000*/ | 28 | #define DVBSKY_MSG_DELAY 0/*2000*/ |
27 | #define DVBSKY_BUF_LEN 64 | 29 | #define DVBSKY_BUF_LEN 64 |
@@ -37,6 +39,7 @@ struct dvbsky_state { | |||
37 | u8 ibuf[DVBSKY_BUF_LEN]; | 39 | u8 ibuf[DVBSKY_BUF_LEN]; |
38 | u8 obuf[DVBSKY_BUF_LEN]; | 40 | u8 obuf[DVBSKY_BUF_LEN]; |
39 | u8 last_lock; | 41 | u8 last_lock; |
42 | struct i2c_client *i2c_client_demod; | ||
40 | struct i2c_client *i2c_client_tuner; | 43 | struct i2c_client *i2c_client_tuner; |
41 | struct i2c_client *i2c_client_ci; | 44 | struct i2c_client *i2c_client_ci; |
42 | 45 | ||
@@ -517,6 +520,90 @@ fail_attach: | |||
517 | return ret; | 520 | return ret; |
518 | } | 521 | } |
519 | 522 | ||
523 | static int dvbsky_t680c_attach(struct dvb_usb_adapter *adap) | ||
524 | { | ||
525 | struct dvbsky_state *state = adap_to_priv(adap); | ||
526 | struct dvb_usb_device *d = adap_to_d(adap); | ||
527 | int ret = 0; | ||
528 | struct i2c_adapter *i2c_adapter; | ||
529 | struct i2c_client *client_demod, *client_tuner, *client_ci; | ||
530 | struct i2c_board_info info; | ||
531 | struct si2168_config si2168_config; | ||
532 | struct si2157_config si2157_config; | ||
533 | struct sp2_config sp2_config; | ||
534 | |||
535 | /* attach demod */ | ||
536 | memset(&si2168_config, 0, sizeof(si2168_config)); | ||
537 | si2168_config.i2c_adapter = &i2c_adapter; | ||
538 | si2168_config.fe = &adap->fe[0]; | ||
539 | si2168_config.ts_mode = SI2168_TS_PARALLEL; | ||
540 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
541 | strlcpy(info.type, "si2168", I2C_NAME_SIZE); | ||
542 | info.addr = 0x64; | ||
543 | info.platform_data = &si2168_config; | ||
544 | |||
545 | request_module(info.type); | ||
546 | client_demod = i2c_new_device(&d->i2c_adap, &info); | ||
547 | if (client_demod == NULL || | ||
548 | client_demod->dev.driver == NULL) | ||
549 | goto fail_demod_device; | ||
550 | if (!try_module_get(client_demod->dev.driver->owner)) | ||
551 | goto fail_demod_module; | ||
552 | |||
553 | /* attach tuner */ | ||
554 | memset(&si2157_config, 0, sizeof(si2157_config)); | ||
555 | si2157_config.fe = adap->fe[0]; | ||
556 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
557 | strlcpy(info.type, "si2157", I2C_NAME_SIZE); | ||
558 | info.addr = 0x60; | ||
559 | info.platform_data = &si2157_config; | ||
560 | |||
561 | request_module(info.type); | ||
562 | client_tuner = i2c_new_device(i2c_adapter, &info); | ||
563 | if (client_tuner == NULL || | ||
564 | client_tuner->dev.driver == NULL) | ||
565 | goto fail_tuner_device; | ||
566 | if (!try_module_get(client_tuner->dev.driver->owner)) | ||
567 | goto fail_tuner_module; | ||
568 | |||
569 | /* attach ci controller */ | ||
570 | memset(&sp2_config, 0, sizeof(sp2_config)); | ||
571 | sp2_config.dvb_adap = &adap->dvb_adap; | ||
572 | sp2_config.priv = d; | ||
573 | sp2_config.ci_control = dvbsky_ci_ctrl; | ||
574 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
575 | strlcpy(info.type, "sp2", I2C_NAME_SIZE); | ||
576 | info.addr = 0x40; | ||
577 | info.platform_data = &sp2_config; | ||
578 | |||
579 | request_module(info.type); | ||
580 | client_ci = i2c_new_device(&d->i2c_adap, &info); | ||
581 | |||
582 | if (client_ci == NULL || client_ci->dev.driver == NULL) | ||
583 | goto fail_ci_device; | ||
584 | |||
585 | if (!try_module_get(client_ci->dev.driver->owner)) | ||
586 | goto fail_ci_module; | ||
587 | |||
588 | state->i2c_client_demod = client_demod; | ||
589 | state->i2c_client_tuner = client_tuner; | ||
590 | state->i2c_client_ci = client_ci; | ||
591 | return ret; | ||
592 | fail_ci_module: | ||
593 | i2c_unregister_device(client_ci); | ||
594 | fail_ci_device: | ||
595 | module_put(client_tuner->dev.driver->owner); | ||
596 | fail_tuner_module: | ||
597 | i2c_unregister_device(client_tuner); | ||
598 | fail_tuner_device: | ||
599 | module_put(client_demod->dev.driver->owner); | ||
600 | fail_demod_module: | ||
601 | i2c_unregister_device(client_demod); | ||
602 | fail_demod_device: | ||
603 | ret = -ENODEV; | ||
604 | return ret; | ||
605 | } | ||
606 | |||
520 | static int dvbsky_identify_state(struct dvb_usb_device *d, const char **name) | 607 | static int dvbsky_identify_state(struct dvb_usb_device *d, const char **name) |
521 | { | 608 | { |
522 | dvbsky_gpio_ctrl(d, 0x04, 1); | 609 | dvbsky_gpio_ctrl(d, 0x04, 1); |
@@ -559,6 +646,12 @@ static void dvbsky_exit(struct dvb_usb_device *d) | |||
559 | module_put(client->dev.driver->owner); | 646 | module_put(client->dev.driver->owner); |
560 | i2c_unregister_device(client); | 647 | i2c_unregister_device(client); |
561 | } | 648 | } |
649 | client = state->i2c_client_demod; | ||
650 | /* remove I2C demod */ | ||
651 | if (client) { | ||
652 | module_put(client->dev.driver->owner); | ||
653 | i2c_unregister_device(client); | ||
654 | } | ||
562 | client = state->i2c_client_ci; | 655 | client = state->i2c_client_ci; |
563 | /* remove I2C ci */ | 656 | /* remove I2C ci */ |
564 | if (client) { | 657 | if (client) { |
@@ -622,11 +715,40 @@ static struct dvb_usb_device_properties dvbsky_s960c_props = { | |||
622 | } | 715 | } |
623 | }; | 716 | }; |
624 | 717 | ||
718 | static struct dvb_usb_device_properties dvbsky_t680c_props = { | ||
719 | .driver_name = KBUILD_MODNAME, | ||
720 | .owner = THIS_MODULE, | ||
721 | .adapter_nr = adapter_nr, | ||
722 | .size_of_priv = sizeof(struct dvbsky_state), | ||
723 | |||
724 | .generic_bulk_ctrl_endpoint = 0x01, | ||
725 | .generic_bulk_ctrl_endpoint_response = 0x81, | ||
726 | .generic_bulk_ctrl_delay = DVBSKY_MSG_DELAY, | ||
727 | |||
728 | .i2c_algo = &dvbsky_i2c_algo, | ||
729 | .frontend_attach = dvbsky_t680c_attach, | ||
730 | .init = dvbsky_init, | ||
731 | .get_rc_config = dvbsky_get_rc_config, | ||
732 | .streaming_ctrl = dvbsky_streaming_ctrl, | ||
733 | .identify_state = dvbsky_identify_state, | ||
734 | .exit = dvbsky_exit, | ||
735 | .read_mac_address = dvbsky_read_mac_addr, | ||
736 | |||
737 | .num_adapters = 1, | ||
738 | .adapter = { | ||
739 | { | ||
740 | .stream = DVB_USB_STREAM_BULK(0x82, 8, 4096), | ||
741 | } | ||
742 | } | ||
743 | }; | ||
744 | |||
625 | static const struct usb_device_id dvbsky_id_table[] = { | 745 | static const struct usb_device_id dvbsky_id_table[] = { |
626 | { DVB_USB_DEVICE(0x0572, 0x6831, | 746 | { DVB_USB_DEVICE(0x0572, 0x6831, |
627 | &dvbsky_s960_props, "DVBSky S960/S860", RC_MAP_DVBSKY) }, | 747 | &dvbsky_s960_props, "DVBSky S960/S860", RC_MAP_DVBSKY) }, |
628 | { DVB_USB_DEVICE(0x0572, 0x960c, | 748 | { DVB_USB_DEVICE(0x0572, 0x960c, |
629 | &dvbsky_s960c_props, "DVBSky S960CI", RC_MAP_DVBSKY) }, | 749 | &dvbsky_s960c_props, "DVBSky S960CI", RC_MAP_DVBSKY) }, |
750 | { DVB_USB_DEVICE(0x0572, 0x680c, | ||
751 | &dvbsky_t680c_props, "DVBSky T680CI", RC_MAP_DVBSKY) }, | ||
630 | { } | 752 | { } |
631 | }; | 753 | }; |
632 | MODULE_DEVICE_TABLE(usb, dvbsky_id_table); | 754 | MODULE_DEVICE_TABLE(usb, dvbsky_id_table); |