aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/usb
diff options
context:
space:
mode:
authorNibble Max <nibble.max@gmail.com>2014-11-26 07:34:46 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-12-04 10:28:38 -0500
commit0a5a4f32acc131de73c6c4ffc994371384db11fc (patch)
tree695a44504e89071012b3c9cce4cdf0f9f57f9628 /drivers/media/usb
parent32af858cc96b0ce588f4aeb37bf68940c727364b (diff)
[media] dvb-usb-dvbsky: add T330 dvb-t2/t/c usb stick support
DVBSky T330 dvb-t2/t/c usb stick: 1>dvb frontend: SI2157A30(tuner), SI2168B40(demod) 2>usb controller: CY7C68013A Signed-off-by: Nibble Max <nibble.max@gmail.com> Reviewed-by: Olli Salonen <olli.salonen@iki.fi> Reviewed-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/usb')
-rw-r--r--drivers/media/usb/dvb-usb-v2/dvbsky.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/drivers/media/usb/dvb-usb-v2/dvbsky.c b/drivers/media/usb/dvb-usb-v2/dvbsky.c
index b6326c6dac13..86db80056605 100644
--- a/drivers/media/usb/dvb-usb-v2/dvbsky.c
+++ b/drivers/media/usb/dvb-usb-v2/dvbsky.c
@@ -604,6 +604,65 @@ fail_demod_device:
604 return ret; 604 return ret;
605} 605}
606 606
607static int dvbsky_t330_attach(struct dvb_usb_adapter *adap)
608{
609 struct dvbsky_state *state = adap_to_priv(adap);
610 struct dvb_usb_device *d = adap_to_d(adap);
611 int ret = 0;
612 struct i2c_adapter *i2c_adapter;
613 struct i2c_client *client_demod, *client_tuner;
614 struct i2c_board_info info;
615 struct si2168_config si2168_config;
616 struct si2157_config si2157_config;
617
618 /* attach demod */
619 memset(&si2168_config, 0, sizeof(si2168_config));
620 si2168_config.i2c_adapter = &i2c_adapter;
621 si2168_config.fe = &adap->fe[0];
622 si2168_config.ts_mode = SI2168_TS_PARALLEL | 0x40;
623 memset(&info, 0, sizeof(struct i2c_board_info));
624 strlcpy(info.type, "si2168", I2C_NAME_SIZE);
625 info.addr = 0x64;
626 info.platform_data = &si2168_config;
627
628 request_module(info.type);
629 client_demod = i2c_new_device(&d->i2c_adap, &info);
630 if (client_demod == NULL ||
631 client_demod->dev.driver == NULL)
632 goto fail_demod_device;
633 if (!try_module_get(client_demod->dev.driver->owner))
634 goto fail_demod_module;
635
636 /* attach tuner */
637 memset(&si2157_config, 0, sizeof(si2157_config));
638 si2157_config.fe = adap->fe[0];
639 memset(&info, 0, sizeof(struct i2c_board_info));
640 strlcpy(info.type, "si2157", I2C_NAME_SIZE);
641 info.addr = 0x60;
642 info.platform_data = &si2157_config;
643
644 request_module(info.type);
645 client_tuner = i2c_new_device(i2c_adapter, &info);
646 if (client_tuner == NULL ||
647 client_tuner->dev.driver == NULL)
648 goto fail_tuner_device;
649 if (!try_module_get(client_tuner->dev.driver->owner))
650 goto fail_tuner_module;
651
652 state->i2c_client_demod = client_demod;
653 state->i2c_client_tuner = client_tuner;
654 return ret;
655fail_tuner_module:
656 i2c_unregister_device(client_tuner);
657fail_tuner_device:
658 module_put(client_demod->dev.driver->owner);
659fail_demod_module:
660 i2c_unregister_device(client_demod);
661fail_demod_device:
662 ret = -ENODEV;
663 return ret;
664}
665
607static int dvbsky_identify_state(struct dvb_usb_device *d, const char **name) 666static int dvbsky_identify_state(struct dvb_usb_device *d, const char **name)
608{ 667{
609 dvbsky_gpio_ctrl(d, 0x04, 1); 668 dvbsky_gpio_ctrl(d, 0x04, 1);
@@ -742,6 +801,33 @@ static struct dvb_usb_device_properties dvbsky_t680c_props = {
742 } 801 }
743}; 802};
744 803
804static struct dvb_usb_device_properties dvbsky_t330_props = {
805 .driver_name = KBUILD_MODNAME,
806 .owner = THIS_MODULE,
807 .adapter_nr = adapter_nr,
808 .size_of_priv = sizeof(struct dvbsky_state),
809
810 .generic_bulk_ctrl_endpoint = 0x01,
811 .generic_bulk_ctrl_endpoint_response = 0x81,
812 .generic_bulk_ctrl_delay = DVBSKY_MSG_DELAY,
813
814 .i2c_algo = &dvbsky_i2c_algo,
815 .frontend_attach = dvbsky_t330_attach,
816 .init = dvbsky_init,
817 .get_rc_config = dvbsky_get_rc_config,
818 .streaming_ctrl = dvbsky_streaming_ctrl,
819 .identify_state = dvbsky_identify_state,
820 .exit = dvbsky_exit,
821 .read_mac_address = dvbsky_read_mac_addr,
822
823 .num_adapters = 1,
824 .adapter = {
825 {
826 .stream = DVB_USB_STREAM_BULK(0x82, 8, 4096),
827 }
828 }
829};
830
745static const struct usb_device_id dvbsky_id_table[] = { 831static const struct usb_device_id dvbsky_id_table[] = {
746 { DVB_USB_DEVICE(0x0572, 0x6831, 832 { DVB_USB_DEVICE(0x0572, 0x6831,
747 &dvbsky_s960_props, "DVBSky S960/S860", RC_MAP_DVBSKY) }, 833 &dvbsky_s960_props, "DVBSky S960/S860", RC_MAP_DVBSKY) },
@@ -749,6 +835,8 @@ static const struct usb_device_id dvbsky_id_table[] = {
749 &dvbsky_s960c_props, "DVBSky S960CI", RC_MAP_DVBSKY) }, 835 &dvbsky_s960c_props, "DVBSky S960CI", RC_MAP_DVBSKY) },
750 { DVB_USB_DEVICE(0x0572, 0x680c, 836 { DVB_USB_DEVICE(0x0572, 0x680c,
751 &dvbsky_t680c_props, "DVBSky T680CI", RC_MAP_DVBSKY) }, 837 &dvbsky_t680c_props, "DVBSky T680CI", RC_MAP_DVBSKY) },
838 { DVB_USB_DEVICE(0x0572, 0x0320,
839 &dvbsky_t330_props, "DVBSky T330", RC_MAP_DVBSKY) },
752 { } 840 { }
753}; 841};
754MODULE_DEVICE_TABLE(usb, dvbsky_id_table); 842MODULE_DEVICE_TABLE(usb, dvbsky_id_table);