Commit d6a5f921 authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab

[media] Add support for PCTV nanoStick T2 290e [2013:024f]

Supports DVB-T/T2/C, USB ID: 2013:024f.
Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2.
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 27cfc85e
...@@ -39,6 +39,7 @@ config VIDEO_EM28XX_DVB ...@@ -39,6 +39,7 @@ config VIDEO_EM28XX_DVB
select DVB_TDA10023 if !DVB_FE_CUSTOMISE select DVB_TDA10023 if !DVB_FE_CUSTOMISE
select DVB_S921 if !DVB_FE_CUSTOMISE select DVB_S921 if !DVB_FE_CUSTOMISE
select DVB_DRXD if !DVB_FE_CUSTOMISE select DVB_DRXD if !DVB_FE_CUSTOMISE
select DVB_CXD2820R if !DVB_FE_CUSTOMISE
select VIDEOBUF_DVB select VIDEOBUF_DVB
---help--- ---help---
This adds support for DVB cards based on the This adds support for DVB cards based on the
......
...@@ -289,6 +289,16 @@ static struct em28xx_reg_seq leadership_reset[] = { ...@@ -289,6 +289,16 @@ static struct em28xx_reg_seq leadership_reset[] = {
{ -1, -1, -1, -1}, { -1, -1, -1, -1},
}; };
/* 2013:024f PCTV Systems nanoStick T2 290e
* GPIO_6 - demod reset
* GPIO_7 - LED
*/
static struct em28xx_reg_seq pctv_290e[] = {
{EM2874_R80_GPIO, 0x00, 0xff, 80},
{EM2874_R80_GPIO, 0x40, 0xff, 80}, /* GPIO_6 = 1 */
{EM2874_R80_GPIO, 0xc0, 0xff, 80}, /* GPIO_7 = 1 */
{-1, -1, -1, -1},
};
/* /*
* Board definitions * Board definitions
...@@ -1760,6 +1770,17 @@ struct em28xx_board em28xx_boards[] = { ...@@ -1760,6 +1770,17 @@ struct em28xx_board em28xx_boards[] = {
.dvb_gpio = kworld_a340_digital, .dvb_gpio = kworld_a340_digital,
.tuner_gpio = default_tuner_gpio, .tuner_gpio = default_tuner_gpio,
}, },
/* 2013:024f PCTV Systems nanoStick T2 290e.
* Empia EM28174, Sony CXD2820R and NXP TDA18271HD/C2 */
[EM28174_BOARD_PCTV_290E] = {
.i2c_speed = EM2874_I2C_SECONDARY_BUS_SELECT |
EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_100_KHZ,
.xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
.name = "PCTV Systems nanoStick T2 290e",
.tuner_type = TUNER_ABSENT,
.tuner_gpio = pctv_290e,
.has_dvb = 1,
},
}; };
const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
...@@ -1887,6 +1908,8 @@ struct usb_device_id em28xx_id_table[] = { ...@@ -1887,6 +1908,8 @@ struct usb_device_id em28xx_id_table[] = {
.driver_info = EM2860_BOARD_GADMEI_UTV330 }, .driver_info = EM2860_BOARD_GADMEI_UTV330 },
{ USB_DEVICE(0x1b80, 0xa340), { USB_DEVICE(0x1b80, 0xa340),
.driver_info = EM2870_BOARD_KWORLD_A340 }, .driver_info = EM2870_BOARD_KWORLD_A340 },
{ USB_DEVICE(0x2013, 0x024f),
.driver_info = EM28174_BOARD_PCTV_290E },
{ }, { },
}; };
MODULE_DEVICE_TABLE(usb, em28xx_id_table); MODULE_DEVICE_TABLE(usb, em28xx_id_table);
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include "tda18271.h" #include "tda18271.h"
#include "s921.h" #include "s921.h"
#include "drxd.h" #include "drxd.h"
#include "cxd2820r.h"
MODULE_DESCRIPTION("driver for em28xx based DVB cards"); MODULE_DESCRIPTION("driver for em28xx based DVB cards");
MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
...@@ -334,6 +335,26 @@ static struct tda10023_config em28xx_tda10023_config = { ...@@ -334,6 +335,26 @@ static struct tda10023_config em28xx_tda10023_config = {
.invert = 1, .invert = 1,
}; };
static struct cxd2820r_config em28xx_cxd2820r_config = {
.i2c_address = (0xd8 >> 1),
.ts_mode = CXD2820R_TS_SERIAL,
.if_dvbt_6 = 3300,
.if_dvbt_7 = 3500,
.if_dvbt_8 = 4000,
.if_dvbt2_6 = 3300,
.if_dvbt2_7 = 3500,
.if_dvbt2_8 = 4000,
.if_dvbc = 5000,
/* enable LNA for DVB-T2 and DVB-C */
.gpio_dvbt2[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L,
.gpio_dvbc[0] = CXD2820R_GPIO_E | CXD2820R_GPIO_O | CXD2820R_GPIO_L,
};
static struct tda18271_config em28xx_cxd2820r_tda18271_config = {
.output_opt = TDA18271_OUTPUT_LT_OFF,
};
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */
static int attach_xc3028(u8 addr, struct em28xx *dev) static int attach_xc3028(u8 addr, struct em28xx *dev)
...@@ -640,6 +661,34 @@ static int dvb_init(struct em28xx *dev) ...@@ -640,6 +661,34 @@ static int dvb_init(struct em28xx *dev)
dvb_attach(tda18271_attach, dvb->fe[0], 0x60, dvb_attach(tda18271_attach, dvb->fe[0], 0x60,
&dev->i2c_adap, &kworld_a340_config); &dev->i2c_adap, &kworld_a340_config);
break; break;
case EM28174_BOARD_PCTV_290E:
/* MFE
* FE 0 = DVB-T/T2 + FE 1 = DVB-C, both sharing same tuner. */
/* FE 0 */
dvb->fe[0] = dvb_attach(cxd2820r_attach,
&em28xx_cxd2820r_config, &dev->i2c_adap, NULL);
if (dvb->fe[0]) {
struct i2c_adapter *i2c_tuner;
i2c_tuner = cxd2820r_get_tuner_i2c_adapter(dvb->fe[0]);
/* FE 0 attach tuner */
if (!dvb_attach(tda18271_attach, dvb->fe[0], 0x60,
i2c_tuner, &em28xx_cxd2820r_tda18271_config)) {
dvb_frontend_detach(dvb->fe[0]);
result = -EINVAL;
goto out_free;
}
/* FE 1. This dvb_attach() cannot fail. */
dvb->fe[1] = dvb_attach(cxd2820r_attach, NULL, NULL,
dvb->fe[0]);
dvb->fe[1]->id = 1;
/* FE 1 attach tuner */
if (!dvb_attach(tda18271_attach, dvb->fe[1], 0x60,
i2c_tuner, &em28xx_cxd2820r_tda18271_config)) {
dvb_frontend_detach(dvb->fe[1]);
/* leave FE 0 still active */
}
}
break;
default: default:
em28xx_errdev("/2: The frontend of your DVB/ATSC card" em28xx_errdev("/2: The frontend of your DVB/ATSC card"
" isn't supported yet\n"); " isn't supported yet\n");
......
...@@ -118,6 +118,7 @@ ...@@ -118,6 +118,7 @@
#define EM2882_BOARD_DIKOM_DK300 75 #define EM2882_BOARD_DIKOM_DK300 75
#define EM2870_BOARD_KWORLD_A340 76 #define EM2870_BOARD_KWORLD_A340 76
#define EM2874_LEADERSHIP_ISDBT 77 #define EM2874_LEADERSHIP_ISDBT 77
#define EM28174_BOARD_PCTV_290E 78
/* Limits minimum and default number of buffers */ /* Limits minimum and default number of buffers */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment