summaryrefslogtreecommitdiffstats
path: root/linux-2.6-v4l-dvb-add-kworld-a340-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'linux-2.6-v4l-dvb-add-kworld-a340-support.patch')
-rw-r--r--linux-2.6-v4l-dvb-add-kworld-a340-support.patch161
1 files changed, 161 insertions, 0 deletions
diff --git a/linux-2.6-v4l-dvb-add-kworld-a340-support.patch b/linux-2.6-v4l-dvb-add-kworld-a340-support.patch
new file mode 100644
index 000000000..0c7d24117
--- /dev/null
+++ b/linux-2.6-v4l-dvb-add-kworld-a340-support.patch
@@ -0,0 +1,161 @@
+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
+--- a/drivers/media/video/em28xx/em28xx-cards.c
++++ b/drivers/media/video/em28xx/em28xx-cards.c
+@@ -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
+--- a/drivers/media/video/em28xx/em28xx-dvb.c
++++ b/drivers/media/video/em28xx/em28xx-dvb.c
+@@ -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
+--- a/drivers/media/video/em28xx/em28xx.h
++++ b/drivers/media/video/em28xx/em28xx.h
+@@ -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
+