Jesse Keating 2f82dda
[PATCH] dvb: add support for kworld 340u and ub435-q to em28xx-dvb
Jesse Keating 2f82dda
Jesse Keating 2f82dda
This adds support for the KWorld PlusTV 340U and KWorld UB345-Q ATSC
Jesse Keating 2f82dda
sticks, which are really the same device. The sticks have an eMPIA
Jesse Keating 2f82dda
em2870 usb bridge chipset, an LG Electronics LGDT3304 ATSC/QAM
Jesse Keating 2f82dda
demodulator and an NXP TDA18271HD tuner -- early versions of the 340U
Jesse Keating 2f82dda
have a a TDA18271HD/C1, later models and the UB435-Q have a C2.
Jesse Keating 2f82dda
Jesse Keating 2f82dda
The stick has been tested succesfully with both VSB_8 and QAM_256 signals.
Jesse Keating 2f82dda
Its using lgdt3304 support added to the lgdt3305 driver by a prior patch,
Jesse Keating 2f82dda
rather than the current lgdt3304 driver, as its severely lacking in
Jesse Keating 2f82dda
functionality by comparison (see said patch for details).
Jesse Keating 2f82dda
Jesse Keating 2f82dda
Signed-off-by: Jarod Wilson <jarod@redhat.com>
Jesse Keating 2f82dda
Jesse Keating 2f82dda
---
Jesse Keating 2f82dda
Index: linux-2.6.32.noarch/drivers/media/video/em28xx/em28xx-cards.c
Jesse Keating 2f82dda
===================================================================
Jesse Keating 2f82dda
--- linux-2.6.32.noarch.orig/drivers/media/video/em28xx/em28xx-cards.c
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/media/video/em28xx/em28xx-cards.c
Jesse Keating 2f82dda
@@ -157,6 +157,22 @@ static struct em28xx_reg_seq evga_indtub
Jesse Keating 2f82dda
 	{ -1,			-1,	-1,		-1},
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
+/*
Jesse Keating 2f82dda
+ * KWorld PlusTV 340U and UB435-Q (ATSC) GPIOs map:
Jesse Keating 2f82dda
+ * EM_GPIO_0 - currently unknown
Jesse Keating 2f82dda
+ * EM_GPIO_1 - LED disable/enable (1 = off, 0 = on)
Jesse Keating 2f82dda
+ * EM_GPIO_2 - currently unknown
Jesse Keating 2f82dda
+ * EM_GPIO_3 - currently unknown
Jesse Keating 2f82dda
+ * EM_GPIO_4 - TDA18271HD/C1 tuner (1 = active, 0 = in reset)
Jesse Keating 2f82dda
+ * EM_GPIO_5 - LGDT3304 ATSC/QAM demod (1 = active, 0 = in reset)
Jesse Keating 2f82dda
+ * EM_GPIO_6 - currently unknown
Jesse Keating 2f82dda
+ * EM_GPIO_7 - currently unknown
Jesse Keating 2f82dda
+ */
Jesse Keating 2f82dda
+static struct em28xx_reg_seq kworld_a340_digital[] = {
Jesse Keating 2f82dda
+	{EM28XX_R08_GPIO,	0x6d,		~EM_GPIO_4,	10},
Jesse Keating 2f82dda
+	{ -1,			-1,		-1,		-1},
Jesse Keating 2f82dda
+};
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
 /* Pinnacle Hybrid Pro eb1a:2881 */
Jesse Keating 2f82dda
 static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
Jesse Keating 2f82dda
 	{EM28XX_R08_GPIO,	0xfd,   ~EM_GPIO_4,	10},
Jesse Keating 2f82dda
@@ -1587,6 +1603,16 @@ struct em28xx_board em28xx_boards[] = {
Jesse Keating 2f82dda
 		.tuner_gpio    = reddo_dvb_c_usb_box,
Jesse Keating 2f82dda
 		.has_dvb       = 1,
Jesse Keating 2f82dda
 	},
Jesse Keating 2f82dda
+	/* 1b80:a340 - Empia EM2870, NXP TDA18271HD and LG DT3304, sold
Jesse Keating 2f82dda
+	 * initially as the KWorld PlusTV 340U, then as the UB435-Q.
Jesse Keating 2f82dda
+	 * Early variants have a TDA18271HD/C1, later ones a TDA18271HD/C2 */
Jesse Keating 2f82dda
+	[EM2870_BOARD_KWORLD_A340] = {
Jesse Keating 2f82dda
+		.name       = "KWorld PlusTV 340U or UB435-Q (ATSC)",
Jesse Keating 2f82dda
+		.tuner_type = TUNER_ABSENT,	/* Digital-only TDA18271HD */
Jesse Keating 2f82dda
+		.has_dvb    = 1,
Jesse Keating 2f82dda
+		.dvb_gpio   = kworld_a340_digital,
Jesse Keating 2f82dda
+		.tuner_gpio = default_tuner_gpio,
Jesse Keating 2f82dda
+	},
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards);
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
@@ -1704,6 +1730,8 @@ struct usb_device_id em28xx_id_table[] =
Jesse Keating 2f82dda
 			.driver_info = EM2820_BOARD_IODATA_GVMVP_SZ },
Jesse Keating 2f82dda
 	{ USB_DEVICE(0xeb1a, 0x50a6),
Jesse Keating 2f82dda
 			.driver_info = EM2860_BOARD_GADMEI_UTV330 },
Jesse Keating 2f82dda
+	{ USB_DEVICE(0x1b80, 0xa340),
Jesse Keating 2f82dda
+			.driver_info = EM2870_BOARD_KWORLD_A340 },
Jesse Keating 2f82dda
 	{ },
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 MODULE_DEVICE_TABLE(usb, em28xx_id_table);
Jesse Keating 2f82dda
Index: linux-2.6.32.noarch/drivers/media/video/em28xx/em28xx-dvb.c
Jesse Keating 2f82dda
===================================================================
Jesse Keating 2f82dda
--- linux-2.6.32.noarch.orig/drivers/media/video/em28xx/em28xx-dvb.c
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/media/video/em28xx/em28xx-dvb.c
Jesse Keating 2f82dda
@@ -29,11 +29,13 @@
Jesse Keating 2f82dda
 #include "tuner-simple.h"
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 #include "lgdt330x.h"
Jesse Keating 2f82dda
+#include "lgdt3305.h"
Jesse Keating 2f82dda
 #include "zl10353.h"
Jesse Keating 2f82dda
 #include "s5h1409.h"
Jesse Keating 2f82dda
 #include "mt352.h"
Jesse Keating 2f82dda
 #include "mt352_priv.h" /* FIXME */
Jesse Keating 2f82dda
 #include "tda1002x.h"
Jesse Keating 2f82dda
+#include "tda18271.h"
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 MODULE_DESCRIPTION("driver for em28xx based DVB cards");
Jesse Keating 2f82dda
 MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@infradead.org>");
Jesse Keating 2f82dda
@@ -230,6 +232,18 @@ static struct lgdt330x_config em2880_lgd
Jesse Keating 2f82dda
 	.demod_chip = LGDT3303,
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
+static struct lgdt3305_config em2870_lgdt3304_dev = {
Jesse Keating 2f82dda
+	.i2c_addr           = 0x0e,
Jesse Keating 2f82dda
+	.demod_chip         = LGDT3304,
Jesse Keating 2f82dda
+	.spectral_inversion = 1,
Jesse Keating 2f82dda
+	.deny_i2c_rptr      = 1,
Jesse Keating 2f82dda
+	.mpeg_mode          = LGDT3305_MPEG_PARALLEL,
Jesse Keating 2f82dda
+	.tpclk_edge         = LGDT3305_TPCLK_FALLING_EDGE,
Jesse Keating 2f82dda
+	.tpvalid_polarity   = LGDT3305_TP_VALID_HIGH,
Jesse Keating 2f82dda
+	.vsb_if_khz         = 3250,
Jesse Keating 2f82dda
+	.qam_if_khz         = 4000,
Jesse Keating 2f82dda
+};
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
 static struct zl10353_config em28xx_zl10353_with_xc3028 = {
Jesse Keating 2f82dda
 	.demod_address = (0x1e >> 1),
Jesse Keating 2f82dda
 	.no_tuner = 1,
Jesse Keating 2f82dda
@@ -246,6 +260,17 @@ static struct s5h1409_config em28xx_s5h1
Jesse Keating 2f82dda
 	.mpeg_timing   = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
+static struct tda18271_std_map kworld_a340_std_map = {
Jesse Keating 2f82dda
+	.atsc_6   = { .if_freq = 3250, .agc_mode = 3, .std = 0,
Jesse Keating 2f82dda
+		      .if_lvl = 1, .rfagc_top = 0x37, },
Jesse Keating 2f82dda
+	.qam_6    = { .if_freq = 4000, .agc_mode = 3, .std = 1,
Jesse Keating 2f82dda
+		      .if_lvl = 1, .rfagc_top = 0x37, },
Jesse Keating 2f82dda
+};
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+static struct tda18271_config kworld_a340_config = {
Jesse Keating 2f82dda
+	.std_map           = &kworld_a340_std_map,
Jesse Keating 2f82dda
+};
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
 static struct zl10353_config em28xx_zl10353_xc3028_no_i2c_gate = {
Jesse Keating 2f82dda
 	.demod_address = (0x1e >> 1),
Jesse Keating 2f82dda
 	.no_tuner = 1,
Jesse Keating 2f82dda
@@ -568,6 +593,14 @@ static int dvb_init(struct em28xx *dev)
Jesse Keating 2f82dda
 			}
Jesse Keating 2f82dda
 		}
Jesse Keating 2f82dda
 		break;
Jesse Keating 2f82dda
+	case EM2870_BOARD_KWORLD_A340:
Jesse Keating 2f82dda
+		dvb->frontend = dvb_attach(lgdt3305_attach,
Jesse Keating 2f82dda
+					   &em2870_lgdt3304_dev,
Jesse Keating 2f82dda
+					   &dev->i2c_adap);
Jesse Keating 2f82dda
+		if (dvb->frontend != NULL)
Jesse Keating 2f82dda
+			dvb_attach(tda18271_attach, dvb->frontend, 0x60,
Jesse Keating 2f82dda
+				   &dev->i2c_adap, &kworld_a340_config);
Jesse Keating 2f82dda
+		break;
Jesse Keating 2f82dda
 	default:
Jesse Keating 2f82dda
 		printk(KERN_ERR "%s/2: The frontend of your DVB/ATSC card"
Jesse Keating 2f82dda
 				" isn't supported yet\n",
Jesse Keating 2f82dda
Index: linux-2.6.32.noarch/drivers/media/video/em28xx/em28xx.h
Jesse Keating 2f82dda
===================================================================
Jesse Keating 2f82dda
--- linux-2.6.32.noarch.orig/drivers/media/video/em28xx/em28xx.h
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/media/video/em28xx/em28xx.h
Jesse Keating 2f82dda
@@ -110,6 +110,7 @@
Jesse Keating 2f82dda
 #define EM2820_BOARD_SILVERCREST_WEBCAM           71
Jesse Keating 2f82dda
 #define EM2861_BOARD_GADMEI_UTV330PLUS           72
Jesse Keating 2f82dda
 #define EM2870_BOARD_REDDO_DVB_C_USB_BOX          73
Jesse Keating 2f82dda
+#define EM2870_BOARD_KWORLD_A340		  76
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 /* Limits minimum and default number of buffers */
Jesse Keating 2f82dda
 #define EM28XX_MIN_BUF 4