From ac548522adc3a636f4412677860f7b20494c1451 Mon Sep 17 00:00:00 2001
From: Steven Vanden Branden <stevenvandenbrandenstift@gmail.com>
Date: Wed, 10 Jun 2015 18:02:29 +0200
Subject: [PATCH 1/7] add turbosight VID and tbs5980 PID

---
 drivers/media/dvb-core/dvb-usb-ids.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/media/dvb-core/dvb-usb-ids.h b/drivers/media/dvb-core/dvb-usb-ids.h
index c117fb3..0ea1e94 100644
--- a/drivers/media/dvb-core/dvb-usb-ids.h
+++ b/drivers/media/dvb-core/dvb-usb-ids.h
@@ -70,6 +70,7 @@
 #define USB_VID_EVOLUTEPC			0x1e59
 #define USB_VID_AZUREWAVE			0x13d3
 #define USB_VID_TECHNISAT			0x14f7
+#define USB_VID_TURBOSIGHT			0x734c
 
 /* Product IDs */
 #define USB_PID_ADSTECH_USB2_COLD			0xa333
@@ -388,4 +389,5 @@
 #define USB_PID_PCTV_2002E_SE                           0x025d
 #define USB_PID_SVEON_STV27                             0xd3af
 #define USB_PID_TURBOX_DTT_2000                         0xd3a4
+#define USB_PID_TURBOSIGHT_5980				0x5980
 #endif
-- 
2.4.2


From e9d3c9b079650e69f09a09802d2536b58e0a69cb Mon Sep 17 00:00:00 2001
From: Steven Vanden Branden <stevenvandenbrandenstift@gmail.com>
Date: Wed, 10 Jun 2015 18:17:49 +0200
Subject: [PATCH 2/7] initial driver support tbs 5980

---
 drivers/media/usb/dvb-usb/dw2102.c | 87 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 85 insertions(+), 2 deletions(-)

diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
index f1f357f..ede24e7 100644
--- a/drivers/media/usb/dvb-usb/dw2102.c
+++ b/drivers/media/usb/dvb-usb/dw2102.c
@@ -3,7 +3,8 @@
  *	TeVii S600, S630, S650, S660, S480, S421, S632
  *	Prof 1100, 7500,
  *	Geniatech SU3000, T220,
- *	TechnoTrend S2-4600 Cards
+ *	TechnoTrend S2-4600 Cards,
+ *	Turbosight TBS5980
  * Copyright (C) 2008-2012 Igor M. Liplianin (liplianin@me.by)
  *
  *	This program is free software; you can redistribute it and/or modify it
@@ -110,6 +111,7 @@
 #define S660_FIRMWARE   "dvb-usb-s660.fw"
 #define P1100_FIRMWARE  "dvb-usb-p1100.fw"
 #define P7500_FIRMWARE  "dvb-usb-p7500.fw"
+#define T5980_FIRMWARE  "dvb-usb-tbsqbox-id5980.fw"
 
 #define	err_str "did not find the firmware file. (%s) " \
 		"Please see linux/Documentation/dvb/ for more details " \
@@ -629,6 +631,17 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
 					goto unlock;
 				}
 
+				if(le16_to_cpu(udev->descriptor.idProduct)
+					== 0x5980 && num == 1) {
+					u8 obuf[3];
+					obuf[0] = msg[0].len;
+					obuf[1] = msg[0].addr << 1;
+					obuf[2] = 0x00;
+					dw210x_op_rw(d->udev, 0x90,0,0,
+						ibuf, msg[j].len,
+						DW210X_READ_MSG);
+				}
+
 				dw210x_op_rw(d->udev, 0x91, 0, 0,
 						ibuf, msg[j].len,
 						DW210X_READ_MSG);
@@ -669,9 +682,10 @@ static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],
 				memcpy(obuf + 2, msg[j].buf, msg[j].len);
 				dw210x_op_rw(d->udev,
 						le16_to_cpu(udev->descriptor.idProduct) ==
-						0x7500 ? 0x92 : 0x90, 0, 0,
+						0x5980 ? 0x92 : 0x90, 0, 0,
 						obuf, msg[j].len + 2,
 						DW210X_WRITE_MSG);
+				//TODO: modded from 0x7500
 				break;
 			} else {
 				/* write registers */
@@ -1101,6 +1115,18 @@ static struct stv0900_config prof_7500_stv0900_config = {
 	.set_lock_led = dw210x_led_ctrl,
 };
 
+static struct stv0900_config turbosight_5980_stv0900_config = {
+	.demod_address = 0x6a,//ok
+	.demod_mode = 0,
+	.xtal = 27000000, //ok
+	.clkmode = 3,// no change
+	.diseqc_mode = 2,  //guess 22 KHZ
+	.tun1_maddress = 0,// 0x60
+	.tun1_adc = 2,
+	.path1_mode = 3,
+	.set_lock_led = dw210x_led_ctrl,
+};
+
 static struct ds3000_config su3000_ds3000_config = {
 	.demod_address = 0x68,
 	.ci_mode = 1,
@@ -1217,6 +1243,36 @@ static int dw2104_frontend_attach(struct dvb_usb_adapter *d)
 	return -EIO;
 }
 
+static int turbosight_5980_frontend_attach(struct dvb_usb_adapter *d)
+{
+	struct dvb_tuner_ops *tuner_ops = NULL;
+	u8 obuf[] = {7,1};
+	u8 obuf2[] = {1,1};
+	u8 obuf3[] = {6,1};
+
+	d->fe_adap[0].fe = dvb_attach(stv0900_attach, &turbosight_5980_stv0900_config,
+				&d->dev->i2c_adap, 0);
+	if (d->fe_adap[0].fe == NULL)
+		return -EIO;
+
+	if (dvb_attach(stb6100_attach, d->fe_adap[0].fe, &dw2104a_stb6100_config,
+				&d->dev->i2c_adap)) {
+				tuner_ops = &d->fe_adap[0].fe->ops.tuner_ops;
+				tuner_ops->set_frequency = stb6100_set_freq;
+				tuner_ops->get_frequency = stb6100_get_freq;
+				tuner_ops->set_bandwidth = stb6100_set_bandw;
+				tuner_ops->get_bandwidth = stb6100_get_bandw;
+				d->fe_adap[0].fe->ops.set_voltage = dw210x_set_voltage;
+				info("Attached STV0900+STB6100!\n");
+	}
+
+	dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf, 2, DW210X_WRITE_MSG);
+	dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf2, 2, DW210X_WRITE_MSG);
+	dw210x_op_rw(d->dev->udev, 0x8a, 0, 0, obuf3, 2, DW210X_WRITE_MSG);
+
+	return 0;
+}
+
 static struct dvb_usb_device_properties dw2102_properties;
 static struct dvb_usb_device_properties dw2104_properties;
 static struct dvb_usb_device_properties s6x0_properties;
@@ -1657,6 +1713,7 @@ enum dw2102_table_entry {
 	GOTVIEW_SAT_HD,
 	GENIATECH_T220,
 	TECHNOTREND_S2_4600,
+	TURBOSIGHT_5980,
 };
 
 static struct usb_device_id dw2102_table[] = {
@@ -1682,6 +1739,7 @@ static struct usb_device_id dw2102_table[] = {
 	[GENIATECH_T220] = {USB_DEVICE(0x1f4d, 0xD220)},
 	[TECHNOTREND_S2_4600] = {USB_DEVICE(USB_VID_TECHNOTREND,
 		USB_PID_TECHNOTREND_CONNECT_S2_4600)},
+	[TURBOSIGHT_5980] = {USB_DEVICE(USB_VID_TURBOSIGHT, USB_PID_TURBOSIGHT_5980)},
 	{ }
 };
 
@@ -2045,6 +2103,13 @@ static struct dvb_usb_device_description d632 = {
 	{NULL},
 };
 
+static struct dvb_usb_device_properties *t5980;
+static struct dvb_usb_device_description d5980 = {
+	"TBS 5980 USB DVB-S2 CI",
+	{&dw2102_table[TURBOSIGHT_5980], NULL},
+	{NULL},
+};
+
 static struct dvb_usb_device_properties su3000_properties = {
 	.caps = DVB_USB_IS_AN_I2C_ADAPTER,
 	.usb_ctrl = DEVICE_SPECIFIC,
@@ -2263,6 +2328,22 @@ static int dw2102_probe(struct usb_interface *intf,
 	s421->devices[1] = d632;
 	s421->adapter->fe[0].frontend_attach = m88rs2000_frontend_attach;
 
+	t5980 = kmemdup(&dw2104_properties,
+	sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
+	if (!t5980) {
+		kfree(p1100);
+		kfree(s660);
+		kfree(p7500);
+		kfree(t5980);
+		return -ENOMEM;
+	}
+	t5980->num_device_descs = 1;
+	t5980->devices[0] = d5980;
+	t5980->i2c_algo=&s6x0_i2c_algo;
+	t5980->read_mac_address = s6x0_read_mac_address;
+	t5980->firmware = T5980_FIRMWARE;
+	t5980->adapter->fe[0].frontend_attach = turbosight_5980_frontend_attach;
+
 	if (0 == dvb_usb_device_init(intf, &dw2102_properties,
 			THIS_MODULE, NULL, adapter_nr) ||
 	    0 == dvb_usb_device_init(intf, &dw2104_properties,
@@ -2277,6 +2358,8 @@ static int dw2102_probe(struct usb_interface *intf,
 			THIS_MODULE, NULL, adapter_nr) ||
 	    0 == dvb_usb_device_init(intf, p7500,
 			THIS_MODULE, NULL, adapter_nr) ||
+	    0 == dvb_usb_device_init(intf, t5980,
+			THIS_MODULE, NULL, adapter_nr) ||
 	    0 == dvb_usb_device_init(intf, s421,
 			THIS_MODULE, NULL, adapter_nr) ||
 	    0 == dvb_usb_device_init(intf, &su3000_properties,
-- 
2.4.2


From 85d7345b2a2a38ae2b2e47dc1f70c22a39e0af23 Mon Sep 17 00:00:00 2001
From: Steven Vanden Branden <stevenvandenbrandenstift@gmail.com>
Date: Wed, 10 Jun 2015 18:41:08 +0200
Subject: [PATCH 3/7] firmware module

---
 drivers/media/usb/dvb-usb/dw2102.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
index ede24e7..1a9e7ed 100644
--- a/drivers/media/usb/dvb-usb/dw2102.c
+++ b/drivers/media/usb/dvb-usb/dw2102.c
@@ -2415,3 +2415,4 @@ MODULE_FIRMWARE(S630_FIRMWARE);
 MODULE_FIRMWARE(S660_FIRMWARE);
 MODULE_FIRMWARE(P1100_FIRMWARE);
 MODULE_FIRMWARE(P7500_FIRMWARE);
+MODULE_FIRMWARE(T5980_FIRMWARE);
-- 
2.4.2


From 322d060ac5548c5825acef806547d5fa7388d618 Mon Sep 17 00:00:00 2001
From: Steven Vanden Branden <stevenvandenbrandenstift@gmail.com>
Date: Wed, 10 Jun 2015 18:43:29 +0200
Subject: [PATCH 4/7] change PID and VID temporarly

---
 drivers/media/usb/dvb-usb/dw2102.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
index 1a9e7ed..dfae6e6 100644
--- a/drivers/media/usb/dvb-usb/dw2102.c
+++ b/drivers/media/usb/dvb-usb/dw2102.c
@@ -1739,7 +1739,7 @@ static struct usb_device_id dw2102_table[] = {
 	[GENIATECH_T220] = {USB_DEVICE(0x1f4d, 0xD220)},
 	[TECHNOTREND_S2_4600] = {USB_DEVICE(USB_VID_TECHNOTREND,
 		USB_PID_TECHNOTREND_CONNECT_S2_4600)},
-	[TURBOSIGHT_5980] = {USB_DEVICE(USB_VID_TURBOSIGHT, USB_PID_TURBOSIGHT_5980)},
+	[TURBOSIGHT_5980] = {USB_DEVICE(USB_VID_CYPRESS, USB_PID_ULTIMA_TVBOX_USB2_FX_COLD)},
 	{ }
 };
 
-- 
2.4.2


From e26a064f30f828b724830692aad871bad43196da Mon Sep 17 00:00:00 2001
From: Steven Vanden Branden <stevenvandenbrandenstift@gmail.com>
Date: Wed, 10 Jun 2015 22:12:39 +0200
Subject: [PATCH 5/7] Revert "firmware module"

This reverts commit 85d7345b2a2a38ae2b2e47dc1f70c22a39e0af23.
---
 drivers/media/usb/dvb-usb/dw2102.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
index dfae6e6..6963bff 100644
--- a/drivers/media/usb/dvb-usb/dw2102.c
+++ b/drivers/media/usb/dvb-usb/dw2102.c
@@ -2415,4 +2415,3 @@ MODULE_FIRMWARE(S630_FIRMWARE);
 MODULE_FIRMWARE(S660_FIRMWARE);
 MODULE_FIRMWARE(P1100_FIRMWARE);
 MODULE_FIRMWARE(P7500_FIRMWARE);
-MODULE_FIRMWARE(T5980_FIRMWARE);
-- 
2.4.2


From 1ba2bc2a2db90d0fb865a7ab50f60c0936b506e4 Mon Sep 17 00:00:00 2001
From: Steven Vanden Branden <stevenvandenbrandenstift@gmail.com>
Date: Wed, 10 Jun 2015 22:14:10 +0200
Subject: [PATCH 6/7] Revert "Revert "firmware module""

This reverts commit e26a064f30f828b724830692aad871bad43196da.
---
 drivers/media/usb/dvb-usb/dw2102.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
index 6963bff..dfae6e6 100644
--- a/drivers/media/usb/dvb-usb/dw2102.c
+++ b/drivers/media/usb/dvb-usb/dw2102.c
@@ -2415,3 +2415,4 @@ MODULE_FIRMWARE(S630_FIRMWARE);
 MODULE_FIRMWARE(S660_FIRMWARE);
 MODULE_FIRMWARE(P1100_FIRMWARE);
 MODULE_FIRMWARE(P7500_FIRMWARE);
+MODULE_FIRMWARE(T5980_FIRMWARE);
-- 
2.4.2


From 8adff5c5ddb5a6a205ee3eb95ba6c2d09191b3ed Mon Sep 17 00:00:00 2001
From: Steven Vanden Branden <stevenvandenbrandenstift@gmail.com>
Date: Wed, 10 Jun 2015 22:14:36 +0200
Subject: [PATCH 7/7] Revert "change PID and VID temporarly"

This reverts commit 322d060ac5548c5825acef806547d5fa7388d618.
---
 drivers/media/usb/dvb-usb/dw2102.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/media/usb/dvb-usb/dw2102.c b/drivers/media/usb/dvb-usb/dw2102.c
index dfae6e6..1a9e7ed 100644
--- a/drivers/media/usb/dvb-usb/dw2102.c
+++ b/drivers/media/usb/dvb-usb/dw2102.c
@@ -1739,7 +1739,7 @@ static struct usb_device_id dw2102_table[] = {
 	[GENIATECH_T220] = {USB_DEVICE(0x1f4d, 0xD220)},
 	[TECHNOTREND_S2_4600] = {USB_DEVICE(USB_VID_TECHNOTREND,
 		USB_PID_TECHNOTREND_CONNECT_S2_4600)},
-	[TURBOSIGHT_5980] = {USB_DEVICE(USB_VID_CYPRESS, USB_PID_ULTIMA_TVBOX_USB2_FX_COLD)},
+	[TURBOSIGHT_5980] = {USB_DEVICE(USB_VID_TURBOSIGHT, USB_PID_TURBOSIGHT_5980)},
 	{ }
 };
 
-- 
2.4.2

