aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video
diff options
context:
space:
mode:
authorRobert Krakora <rob.krakora@messagenetsystems.com>2009-01-18 19:59:34 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2009-01-29 05:39:18 -0500
commit6e7b9ea0937eeb75fa166ef7bd22b5f3bb5676d1 (patch)
tree74bc56ad98e7e60f627eb8e131aef68aaeb2211f /drivers/media/video
parent7e4b15e4201a101840c226dafe0d3df7ee652bf6 (diff)
V4L/DVB (10257): em28xx: Fix for KWorld 330U Board
Fix for KWorld 330U Board Many thanks to Devin and Mauro!!! Signed-off-by: Robert Krakora <rob.krakora@messagenetsystems.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video')
-rw-r--r--drivers/media/video/em28xx/em28xx-cards.c32
-rw-r--r--drivers/media/video/em28xx/em28xx-dvb.c20
-rw-r--r--drivers/media/video/em28xx/em28xx-video.c4
-rw-r--r--drivers/media/video/em28xx/em28xx.h2
4 files changed, 49 insertions, 9 deletions
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c
index ef9bf008a924..3b3ca3f46d52 100644
--- a/drivers/media/video/em28xx/em28xx-cards.c
+++ b/drivers/media/video/em28xx/em28xx-cards.c
@@ -102,6 +102,18 @@ static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
102/* Board - EM2870 Kworld 355u 102/* Board - EM2870 Kworld 355u
103 Analog - No input analog */ 103 Analog - No input analog */
104 104
105static struct em28xx_reg_seq kworld_330u_analog[] = {
106 {EM28XX_R08_GPIO, 0x6d, ~EM_GPIO_4, 10},
107 {EM2880_R04_GPO, 0x00, 0xff, 10},
108 { -1, -1, -1, -1},
109};
110
111static struct em28xx_reg_seq kworld_330u_digital[] = {
112 {EM28XX_R08_GPIO, 0x6e, ~EM_GPIO_4, 10},
113 {EM2880_R04_GPO, 0x08, 0xff, 10},
114 { -1, -1, -1, -1},
115};
116
105/* Callback for the most boards */ 117/* Callback for the most boards */
106static struct em28xx_reg_seq default_tuner_gpio[] = { 118static struct em28xx_reg_seq default_tuner_gpio[] = {
107 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10}, 119 {EM28XX_R08_GPIO, EM_GPIO_4, EM_GPIO_4, 10},
@@ -1177,29 +1189,33 @@ struct em28xx_board em28xx_boards[] = {
1177 .gpio = hauppauge_wintv_hvr_900_analog, 1189 .gpio = hauppauge_wintv_hvr_900_analog,
1178 } }, 1190 } },
1179 }, 1191 },
1180 [EM2883_BOARD_KWORLD_HYBRID_A316] = { 1192 [EM2883_BOARD_KWORLD_HYBRID_330U] = {
1181 .name = "Kworld PlusTV HD Hybrid 330", 1193 .name = "Kworld PlusTV HD Hybrid 330",
1182 .tuner_type = TUNER_XC2028, 1194 .tuner_type = TUNER_XC2028,
1183 .tuner_gpio = default_tuner_gpio, 1195 .tuner_gpio = default_tuner_gpio,
1184 .decoder = EM28XX_TVP5150, 1196 .decoder = EM28XX_TVP5150,
1185 .mts_firmware = 1, 1197 .mts_firmware = 1,
1186 .has_dvb = 1, 1198 .has_dvb = 1,
1187 .dvb_gpio = default_digital, 1199 .dvb_gpio = kworld_330u_digital,
1200 .xclk = EM28XX_XCLK_FREQUENCY_12MHZ,
1201 .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_EEPROM_ON_BOARD | EM28XX_I2C_EEPROM_KEY_VALID,
1188 .input = { { 1202 .input = { {
1189 .type = EM28XX_VMUX_TELEVISION, 1203 .type = EM28XX_VMUX_TELEVISION,
1190 .vmux = TVP5150_COMPOSITE0, 1204 .vmux = TVP5150_COMPOSITE0,
1191 .amux = EM28XX_AMUX_VIDEO, 1205 .amux = EM28XX_AMUX_VIDEO,
1192 .gpio = default_analog, 1206 .gpio = kworld_330u_analog,
1207 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1193 }, { 1208 }, {
1194 .type = EM28XX_VMUX_COMPOSITE1, 1209 .type = EM28XX_VMUX_COMPOSITE1,
1195 .vmux = TVP5150_COMPOSITE1, 1210 .vmux = TVP5150_COMPOSITE1,
1196 .amux = EM28XX_AMUX_LINE_IN, 1211 .amux = EM28XX_AMUX_LINE_IN,
1197 .gpio = hauppauge_wintv_hvr_900_analog, 1212 .gpio = kworld_330u_analog,
1213 .aout = EM28XX_AOUT_PCM_IN | EM28XX_AOUT_PCM_STEREO,
1198 }, { 1214 }, {
1199 .type = EM28XX_VMUX_SVIDEO, 1215 .type = EM28XX_VMUX_SVIDEO,
1200 .vmux = TVP5150_SVIDEO, 1216 .vmux = TVP5150_SVIDEO,
1201 .amux = EM28XX_AMUX_LINE_IN, 1217 .amux = EM28XX_AMUX_LINE_IN,
1202 .gpio = hauppauge_wintv_hvr_900_analog, 1218 .gpio = kworld_330u_analog,
1203 } }, 1219 } },
1204 }, 1220 },
1205 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = { 1221 [EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU] = {
@@ -1249,7 +1265,7 @@ struct usb_device_id em28xx_id_table [] = {
1249 { USB_DEVICE(0xeb1a, 0xe310), 1265 { USB_DEVICE(0xeb1a, 0xe310),
1250 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD }, 1266 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD },
1251 { USB_DEVICE(0xeb1a, 0xa316), 1267 { USB_DEVICE(0xeb1a, 0xa316),
1252 .driver_info = EM2883_BOARD_KWORLD_HYBRID_A316 }, 1268 .driver_info = EM2883_BOARD_KWORLD_HYBRID_330U },
1253 { USB_DEVICE(0xeb1a, 0xe320), 1269 { USB_DEVICE(0xeb1a, 0xe320),
1254 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II }, 1270 .driver_info = EM2880_BOARD_MSI_DIGIVOX_AD_II },
1255 { USB_DEVICE(0xeb1a, 0xe323), 1271 { USB_DEVICE(0xeb1a, 0xe323),
@@ -1526,6 +1542,10 @@ static void em28xx_setup_xc3028(struct em28xx *dev, struct xc2028_ctrl *ctl)
1526 /* FIXME: Better to specify the needed IF */ 1542 /* FIXME: Better to specify the needed IF */
1527 ctl->demod = XC3028_FE_DEFAULT; 1543 ctl->demod = XC3028_FE_DEFAULT;
1528 break; 1544 break;
1545 case EM2883_BOARD_KWORLD_HYBRID_330U:
1546 ctl->demod = XC3028_FE_CHINA;
1547 ctl->fname = XC2028_DEFAULT_FIRMWARE;
1548 break;
1529 default: 1549 default:
1530 ctl->demod = XC3028_FE_OREN538; 1550 ctl->demod = XC3028_FE_OREN538;
1531 } 1551 }
diff --git a/drivers/media/video/em28xx/em28xx-dvb.c b/drivers/media/video/em28xx/em28xx-dvb.c
index d38cb21834d9..9ad8527b3fda 100644
--- a/drivers/media/video/em28xx/em28xx-dvb.c
+++ b/drivers/media/video/em28xx/em28xx-dvb.c
@@ -28,6 +28,7 @@
28 28
29#include "lgdt330x.h" 29#include "lgdt330x.h"
30#include "zl10353.h" 30#include "zl10353.h"
31#include "s5h1409.h"
31#ifdef EM28XX_DRX397XD_SUPPORT 32#ifdef EM28XX_DRX397XD_SUPPORT
32#include "drx397xD.h" 33#include "drx397xD.h"
33#endif 34#endif
@@ -232,6 +233,15 @@ static struct zl10353_config em28xx_zl10353_with_xc3028 = {
232 .if2 = 45600, 233 .if2 = 45600,
233}; 234};
234 235
236static struct s5h1409_config em28xx_s5h1409_with_xc3028 = {
237 .demod_address = 0x32 >> 1,
238 .output_mode = S5H1409_PARALLEL_OUTPUT,
239 .gpio = S5H1409_GPIO_OFF,
240 .inversion = S5H1409_INVERSION_OFF,
241 .status_mode = S5H1409_DEMODLOCKING,
242 .mpeg_timing = S5H1409_MPEGTIMING_CONTINOUS_NONINVERTING_CLOCK
243};
244
235#ifdef EM28XX_DRX397XD_SUPPORT 245#ifdef EM28XX_DRX397XD_SUPPORT
236/* [TODO] djh - not sure yet what the device config needs to contain */ 246/* [TODO] djh - not sure yet what the device config needs to contain */
237static struct drx397xD_config em28xx_drx397xD_with_xc3028 = { 247static struct drx397xD_config em28xx_drx397xD_with_xc3028 = {
@@ -412,7 +422,6 @@ static int dvb_init(struct em28xx *dev)
412 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850: 422 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850:
413 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950: 423 case EM2883_BOARD_HAUPPAUGE_WINTV_HVR_950:
414 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO: 424 case EM2880_BOARD_PINNACLE_PCTV_HD_PRO:
415 case EM2883_BOARD_KWORLD_HYBRID_A316:
416 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600: 425 case EM2880_BOARD_AMD_ATI_TV_WONDER_HD_600:
417 dvb->frontend = dvb_attach(lgdt330x_attach, 426 dvb->frontend = dvb_attach(lgdt330x_attach,
418 &em2880_lgdt3303_dev, 427 &em2880_lgdt3303_dev,
@@ -433,6 +442,15 @@ static int dvb_init(struct em28xx *dev)
433 goto out_free; 442 goto out_free;
434 } 443 }
435 break; 444 break;
445 case EM2883_BOARD_KWORLD_HYBRID_330U:
446 dvb->frontend = dvb_attach(s5h1409_attach,
447 &em28xx_s5h1409_with_xc3028,
448 &dev->i2c_adap);
449 if (attach_xc3028(0x61, dev) < 0) {
450 result = -EINVAL;
451 goto out_free;
452 }
453 break;
436 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2: 454 case EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900_R2:
437#ifdef EM28XX_DRX397XD_SUPPORT 455#ifdef EM28XX_DRX397XD_SUPPORT
438 /* We don't have the config structure properly populated, so 456 /* We don't have the config structure properly populated, so
diff --git a/drivers/media/video/em28xx/em28xx-video.c b/drivers/media/video/em28xx/em28xx-video.c
index d40650655f74..8e61b2ca9167 100644
--- a/drivers/media/video/em28xx/em28xx-video.c
+++ b/drivers/media/video/em28xx/em28xx-video.c
@@ -1956,6 +1956,7 @@ static struct video_device *em28xx_vdev_init(struct em28xx *dev,
1956 1956
1957int em28xx_register_analog_devices(struct em28xx *dev) 1957int em28xx_register_analog_devices(struct em28xx *dev)
1958{ 1958{
1959 u8 val;
1959 int ret; 1960 int ret;
1960 1961
1961 printk(KERN_INFO "%s: v4l2 driver version %d.%d.%d\n", 1962 printk(KERN_INFO "%s: v4l2 driver version %d.%d.%d\n",
@@ -1983,7 +1984,8 @@ int em28xx_register_analog_devices(struct em28xx *dev)
1983 /* enable vbi capturing */ 1984 /* enable vbi capturing */
1984 1985
1985/* em28xx_write_reg(dev, EM28XX_R0E_AUDIOSRC, 0xc0); audio register */ 1986/* em28xx_write_reg(dev, EM28XX_R0E_AUDIOSRC, 0xc0); audio register */
1986/* em28xx_write_reg(dev, EM28XX_R0F_XCLK, 0x80); clk register */ 1987 val = (u8)em28xx_read_reg(dev, EM28XX_R0F_XCLK);
1988 em28xx_write_reg(dev, EM28XX_R0F_XCLK, (EM28XX_XCLK_AUDIO_UNMUTE | val));
1987 em28xx_write_reg(dev, EM28XX_R11_VINCTRL, 0x51); 1989 em28xx_write_reg(dev, EM28XX_R11_VINCTRL, 0x51);
1988 1990
1989 em28xx_set_outfmt(dev); 1991 em28xx_set_outfmt(dev);
diff --git a/drivers/media/video/em28xx/em28xx.h b/drivers/media/video/em28xx/em28xx.h
index e15ca2f0fb11..dd2cd36fb1bb 100644
--- a/drivers/media/video/em28xx/em28xx.h
+++ b/drivers/media/video/em28xx/em28xx.h
@@ -94,7 +94,7 @@
94#define EM2882_BOARD_KWORLD_VS_DVBT 54 94#define EM2882_BOARD_KWORLD_VS_DVBT 54
95#define EM2882_BOARD_TERRATEC_HYBRID_XS 55 95#define EM2882_BOARD_TERRATEC_HYBRID_XS 55
96#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56 96#define EM2882_BOARD_PINNACLE_HYBRID_PRO 56
97#define EM2883_BOARD_KWORLD_HYBRID_A316 57 97#define EM2883_BOARD_KWORLD_HYBRID_330U 57
98#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58 98#define EM2820_BOARD_COMPRO_VIDEOMATE_FORYOU 58
99#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60 99#define EM2883_BOARD_HAUPPAUGE_WINTV_HVR_850 60
100#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61 100#define EM2820_BOARD_PROLINK_PLAYTV_BOX4_USB2 61