| From c34c78838f02693a70808e38309629e85aa50266 Mon Sep 17 00:00:00 2001 |
| From: Jarod Wilson <jarod@redhat.com> |
| Date: Thu, 20 May 2010 10:03:13 -0400 |
| Subject: [PATCH] dvb: add support for kworld 340u and ub435-q to em28xx-dvb |
| |
| This adds support for the KWorld PlusTV 340U and KWorld UB345-Q ATSC |
| sticks, which are really the same device. The sticks have an eMPIA |
| em2870 usb bridge chipset, an LG Electronics LGDT3304 ATSC/QAM |
| demodulator and an NXP TDA18271HD tuner -- early versions of the 340U |
| have a a TDA18271HD/C1, later models and the UB435-Q have a C2. |
| |
| The stick has been tested succesfully with both VSB_8 and QAM_256 signals. |
| Its using lgdt3304 support added to the lgdt3305 driver by a prior patch, |
| rather than the current lgdt3304 driver, as its severely lacking in |
| functionality by comparison (see said patch for details). |
| |
| Signed-off-by: Jarod Wilson <jarod@redhat.com> |
| |
| drivers/media/video/em28xx/em28xx-cards.c | 28 ++++++++++++++++++++++++ |
| drivers/media/video/em28xx/em28xx-dvb.c | 33 +++++++++++++++++++++++++++++ |
| drivers/media/video/em28xx/em28xx.h | 1 + |
| 3 files changed, 62 insertions(+), 0 deletions(-) |
| |
| diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c |
| index b0fb083..6312e76 100644 |
| |
| |
| @@ -158,6 +158,22 @@ static struct em28xx_reg_seq evga_indtube_digital[] = { |
| { -1, -1, -1, -1}, |
| }; |
| |
| +/* |
| + * KWorld PlusTV 340U and UB435-Q (ATSC) GPIOs map: |
| + * EM_GPIO_0 - currently unknown |
| + * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on) |
| + * EM_GPIO_2 - currently unknown |
| + * EM_GPIO_3 - currently unknown |
| + * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset) |
| + * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset) |
| + * EM_GPIO_6 - currently unknown |
| + * EM_GPIO_7 - currently unknown |
| + */ |
| +static struct em28xx_reg_seq kworld_a340_digital[] = { |
| + {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10}, |
| + { -1, -1, -1, -1}, |
| +}; |
| + |
| /* Pinnacle Hybrid Pro eb1a:2881 */ |
| static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = { |
| {EM28XX_R08_GPIO, 0xfd, ~EM_GPIO_4, 10}, |
| @@ -1649,6 +1665,16 @@ struct em28xx_board em28xx_boards[] = { |
| .tuner_gpio = reddo_dvb_c_usb_box, |
| .has_dvb = 1, |
| }, |
| + /* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold |
| + * initially as the KWorld PlusTV 340U, then as the UB435-Q. |
| + * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */ |
| + [EM2870_BOARD_KWORLD_A340] = { |
| + .name = "KWorld PlusTV 340U or UB435-Q (ATSC)", |
| + .tuner_type = TUNER_ABSENT, /* Digital-only TDA18271HD */ |
| + .has_dvb = 1, |
| + .dvb_gpio = kworld_a340_digital, |
| + .tuner_gpio = default_tuner_gpio, |
| + }, |
| }; |
| const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); |
| |
| @@ -1768,6 +1794,8 @@ struct usb_device_id em28xx_id_table[] = { |
| .driver_info = EM2820_BOARD_IODATA_GVMVP_SZ }, |
| { USB_DEVICE(0xeb1a, 0x50a6), |
| .driver_info = EM2860_BOARD_GADMEI_UTV330 }, |
| + { USB_DEVICE(0x1b80, 0xa340), |
| + .driver_info = EM2870_BOARD_KWORLD_A340 }, |
| { }, |
| }; |
| MODULE_DEVICE_TABLE(usb, em28xx_id_table); |
| diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c |
| index bcd3c37..ce8a9ee 100644 |
| |
| |
| @@ -30,11 +30,13 @@ |
| #include "tuner-simple.h" |
| |
| #include "lgdt330x.h" |
| +#include "lgdt3305.h" |
| #include "zl10353.h" |
| #include "s5h1409.h" |
| #include "mt352.h" |
| #include "mt352_priv.h" /* FIXME */ |
| #include "tda1002x.h" |
| +#include "tda18271.h" |
| |
| MODULE_DESCRIPTION("driver for em28xx based DVB cards"); |
| MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>"); |
| @@ -231,6 +233,18 @@ static struct lgdt330x_config em2880_lgdt3303_dev = { |
| .demod_chip = LGDT3303, |
| }; |
| |
| +static struct lgdt3305_config em2870_lgdt3304_dev = { |
| + .i2c_addr = 0x0e, |
| + .demod_chip = LGDT3304, |
| + .spectral_inversion = 1, |
| + .deny_i2c_rptr = 1, |
| + .mpeg_mode = LGDT3305_MPEG_PARALLEL, |
| + .tpclk_edge = LGDT3305_TPCLK_FALLING_EDGE, |
| + .tpvalid_polarity = LGDT3305_TP_VALID_HIGH, |
| + .vsb_if_khz = 3250, |
| + .qam_if_khz = 4000, |
| +}; |
| + |
| static struct zl10353_config em28xx_zl10353_with_xc3028 = { |
| .demod_address = (0x1e >> 1), |
| .no_tuner = 1, |
| @@ -247,6 +261,17 @@ static struct s5h1409_config em28xx_s5h1409_with_xc3028 = { |
| .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK |
| }; |
| |
| +static struct tda18271_std_map kworld_a340_std_map = { |
| + .atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 0, |
| + .if_lvl = 1, .rfagc_top = 0x37, }, |
| + .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 1, |
| + .if_lvl = 1, .rfagc_top = 0x37, }, |
| +}; |
| + |
| +static struct tda18271_config kworld_a340_config = { |
| + .std_map = &kworld_a340_std_map, |
| +}; |
| + |
| static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = { |
| .demod_address = (0x1e >> 1), |
| .no_tuner = 1, |
| @@ -570,6 +595,14 @@ static int dvb_init(struct em28xx *dev) |
| } |
| } |
| break; |
| + case EM2870_BOARD_KWORLD_A340: |
| + dvb->frontend = dvb_attach(lgdt3305_attach, |
| + &em2870_lgdt3304_dev, |
| + &dev->i2c_adap); |
| + if (dvb->frontend != NULL) |
| + dvb_attach(tda18271_attach, dvb->frontend, 0x60, |
| + &dev->i2c_adap, &kworld_a340_config); |
| + break; |
| default: |
| em28xx_errdev("/2: The frontend of your DVB/ATSC card" |
| " isn't supported yet\n"); |
| diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h |
| index ba6fe5d..9f3fdad 100644 |
| |
| |
| @@ -112,6 +112,7 @@ |
| #define EM2870_BOARD_REDDO_DVB_C_USB_BOX 73 |
| #define EM2800_BOARD_VC211A 74 |
| #define EM2882_BOARD_DIKOM_DK300 75 |
| +#define EM2870_BOARD_KWORLD_A340 76 |
| |
| /* Limits minimum and default number of buffers */ |
| #define EM28XX_MIN_BUF 4 |
| -- |
| 1.7.0.1 |
| |