Re: [PATCH 2/2] em28xx: Add support for Terratec Cinergy T2 Stick HD

2014-11-23 Thread Antti Palosaari

On 11/23/2014 10:17 PM, Olli Salonen wrote:

Terratec Cinergy T2 Stick HD [eb1a:8179] is a USB DVB-T/T2/C tuner that 
contains following components:

* Empia EM28178 USB bridge
* Silicon Labs Si2168-A30 demodulator
* Silicon Labs Si2146-A10 tuner

I don't have the remote, so the RC_MAP is a best guess based on the pictures of 
the remote controllers and other supported Terratec devices with a similar 
remote.

Signed-off-by: Olli Salonen 


Reviewed-by: Antti Palosaari 

Antti

--
http://palosaari.fi/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 2/2] em28xx: Add support for Terratec Cinergy T2 Stick HD

2014-11-23 Thread Olli Salonen
Terratec Cinergy T2 Stick HD [eb1a:8179] is a USB DVB-T/T2/C tuner that 
contains following components:

* Empia EM28178 USB bridge
* Silicon Labs Si2168-A30 demodulator
* Silicon Labs Si2146-A10 tuner

I don't have the remote, so the RC_MAP is a best guess based on the pictures of 
the remote controllers and other supported Terratec devices with a similar 
remote.

Signed-off-by: Olli Salonen 
---
 drivers/media/usb/em28xx/em28xx-cards.c | 27 +++
 drivers/media/usb/em28xx/em28xx-dvb.c   | 58 +
 drivers/media/usb/em28xx/em28xx.h   |  1 +
 3 files changed, 86 insertions(+)

diff --git a/drivers/media/usb/em28xx/em28xx-cards.c 
b/drivers/media/usb/em28xx/em28xx-cards.c
index 71fa51e..382018d 100644
--- a/drivers/media/usb/em28xx/em28xx-cards.c
+++ b/drivers/media/usb/em28xx/em28xx-cards.c
@@ -479,6 +479,20 @@ static struct em28xx_reg_seq pctv_292e[] = {
{-1, -1,   -1, -1},
 };
 
+static struct em28xx_reg_seq terratec_t2_stick_hd[] = {
+   {EM2874_R80_GPIO_P0_CTRL,   0xff,   0xff,   0},
+   {0x0d,  0xff,   0xff,   600},
+   {EM2874_R80_GPIO_P0_CTRL,   0xfc,   0xff,   10},
+   {EM2874_R80_GPIO_P0_CTRL,   0xbc,   0xff,   100},
+   {EM2874_R80_GPIO_P0_CTRL,   0xfc,   0xff,   100},
+   {EM2874_R80_GPIO_P0_CTRL,   0x00,   0xff,   300},
+   {EM2874_R80_GPIO_P0_CTRL,   0xf8,   0xff,   100},
+   {EM2874_R80_GPIO_P0_CTRL,   0xfc,   0xff,   300},
+   {0x0d,  0x42,   0xff,   1000},
+   {EM2874_R5F_TS_ENABLE,  0x85,   0xff,   0},
+   {-1, -1,   -1, -1},
+};
+
 /*
  *  Button definitions
  */
@@ -2243,6 +2257,17 @@ struct em28xx_board em28xx_boards[] = {
.has_dvb   = 1,
.ir_codes  = RC_MAP_PINNACLE_PCTV_HD,
},
+   /* eb1a:8179 Terratec Cinergy T2 Stick HD.
+* Empia EM28178, Silicon Labs Si2168, Silicon Labs Si2146 */
+   [EM28178_BOARD_TERRATEC_T2_STICK_HD] = {
+   .name  = "Terratec Cinergy T2 Stick HD",
+   .def_i2c_bus   = 1,
+   .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | 
EM28XX_I2C_FREQ_400_KHZ,
+   .tuner_type= TUNER_ABSENT,
+   .tuner_gpio= terratec_t2_stick_hd,
+   .has_dvb   = 1,
+   .ir_codes  = RC_MAP_TERRATEC_SLIM_2,
+   },
 };
 EXPORT_SYMBOL_GPL(em28xx_boards);
 
@@ -2424,6 +2449,8 @@ struct usb_device_id em28xx_id_table[] = {
.driver_info = EM28178_BOARD_PCTV_461E },
{ USB_DEVICE(0x2013, 0x025f),
.driver_info = EM28178_BOARD_PCTV_292E },
+   { USB_DEVICE(0xeb1a, 0x8179),
+   .driver_info = EM28178_BOARD_TERRATEC_T2_STICK_HD },
{ },
 };
 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c 
b/drivers/media/usb/em28xx/em28xx-dvb.c
index 65a456d..536815f 100644
--- a/drivers/media/usb/em28xx/em28xx-dvb.c
+++ b/drivers/media/usb/em28xx/em28xx-dvb.c
@@ -1603,6 +1603,64 @@ static int em28xx_dvb_init(struct em28xx *dev)
dvb->fe[0]->ops.set_lna = em28xx_pctv_292e_set_lna;
}
break;
+   case EM28178_BOARD_TERRATEC_T2_STICK_HD:
+   {
+   struct i2c_adapter *adapter;
+   struct i2c_client *client;
+   struct i2c_board_info info;
+   struct si2168_config si2168_config;
+   struct si2157_config si2157_config;
+
+   /* attach demod */
+   si2168_config.i2c_adapter = &adapter;
+   si2168_config.fe = &dvb->fe[0];
+   si2168_config.ts_mode = SI2168_TS_PARALLEL;
+   memset(&info, 0, sizeof(struct i2c_board_info));
+   strlcpy(info.type, "si2168", I2C_NAME_SIZE);
+   info.addr = 0x64;
+   info.platform_data = &si2168_config;
+   request_module(info.type);
+   client = 
i2c_new_device(&dev->i2c_adap[dev->def_i2c_bus], &info);
+   if (client == NULL || client->dev.driver == NULL) {
+   result = -ENODEV;
+   goto out_free;
+   }
+
+   if (!try_module_get(client->dev.driver->owner)) {
+   i2c_unregister_device(client);
+   result = -ENODEV;
+   goto out_free;
+   }
+
+   dvb->i2c_client_demod = client;
+
+   /* attach tuner */
+   memset(&si2157_config, 0, sizeof(si2157_config));
+   si2157_config.fe = dvb->fe[0];
+