aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorMatthias Schwarzott <zzam@gentoo.org>2014-07-22 16:12:15 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-07-27 16:02:48 -0400
commitdd2e7dd20cf482bc2fd989bfbd0354476ae904c2 (patch)
tree01deaaf5d448f3f4b82a68397975fba6fbf8dacb /drivers/media
parent6d3debafc8e718d5f3b2d87fe0387019b29b3bfa (diff)
[media] cx231xx: Add digital support for HVR 930c-HD model 1113xx
Add support for: [2040:b130] Hauppauge WinTV 930C-HD (model 1113xx) After loading the driver the first open to dvb device node fails. Signed-off-by: Matthias Schwarzott <zzam@gentoo.org> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/usb/cx231xx/Kconfig1
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-avcore.c1
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-cards.c92
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-core.c3
-rw-r--r--drivers/media/usb/cx231xx/cx231xx-dvb.c34
-rw-r--r--drivers/media/usb/cx231xx/cx231xx.h1
6 files changed, 132 insertions, 0 deletions
diff --git a/drivers/media/usb/cx231xx/Kconfig b/drivers/media/usb/cx231xx/Kconfig
index f14c5e89a567..036454ede5c0 100644
--- a/drivers/media/usb/cx231xx/Kconfig
+++ b/drivers/media/usb/cx231xx/Kconfig
@@ -47,6 +47,7 @@ config VIDEO_CX231XX_DVB
47 select DVB_MB86A20S if MEDIA_SUBDRV_AUTOSELECT 47 select DVB_MB86A20S if MEDIA_SUBDRV_AUTOSELECT
48 select DVB_LGDT3305 if MEDIA_SUBDRV_AUTOSELECT 48 select DVB_LGDT3305 if MEDIA_SUBDRV_AUTOSELECT
49 select DVB_TDA18271C2DD if MEDIA_SUBDRV_AUTOSELECT 49 select DVB_TDA18271C2DD if MEDIA_SUBDRV_AUTOSELECT
50 select DVB_SI2165 if MEDIA_SUBDRV_AUTOSELECT
50 51
51 ---help--- 52 ---help---
52 This adds support for DVB cards based on the 53 This adds support for DVB cards based on the
diff --git a/drivers/media/usb/cx231xx/cx231xx-avcore.c b/drivers/media/usb/cx231xx/cx231xx-avcore.c
index 89de00bf4f82..a428c10e1a16 100644
--- a/drivers/media/usb/cx231xx/cx231xx-avcore.c
+++ b/drivers/media/usb/cx231xx/cx231xx-avcore.c
@@ -352,6 +352,7 @@ int cx231xx_afe_update_power_control(struct cx231xx *dev,
352 case CX231XX_BOARD_CNXT_RDU_253S: 352 case CX231XX_BOARD_CNXT_RDU_253S:
353 case CX231XX_BOARD_CNXT_VIDEO_GRABBER: 353 case CX231XX_BOARD_CNXT_VIDEO_GRABBER:
354 case CX231XX_BOARD_HAUPPAUGE_EXETER: 354 case CX231XX_BOARD_HAUPPAUGE_EXETER:
355 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
355 case CX231XX_BOARD_HAUPPAUGE_USBLIVE2: 356 case CX231XX_BOARD_HAUPPAUGE_USBLIVE2:
356 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID: 357 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
357 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL: 358 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
diff --git a/drivers/media/usb/cx231xx/cx231xx-cards.c b/drivers/media/usb/cx231xx/cx231xx-cards.c
index db69307d86ae..5dd185e629cd 100644
--- a/drivers/media/usb/cx231xx/cx231xx-cards.c
+++ b/drivers/media/usb/cx231xx/cx231xx-cards.c
@@ -704,6 +704,45 @@ struct cx231xx_board cx231xx_boards[] = {
704 } 704 }
705 }, 705 },
706 }, 706 },
707 [CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {
708 .name = "Hauppauge WinTV 930C-HD (1113xx)",
709 .tuner_type = TUNER_NXP_TDA18271,
710 .tuner_addr = 0x60,
711 .tuner_gpio = RDE250_XCV_TUNER,
712 .tuner_sif_gpio = 0x05,
713 .tuner_scl_gpio = 0x1a,
714 .tuner_sda_gpio = 0x1b,
715 .decoder = CX231XX_AVDECODER,
716 .output_mode = OUT_MODE_VIP11,
717 .demod_xfer_mode = 0,
718 .ctl_pin_status_mask = 0xFFFFFFC4,
719 .agc_analog_digital_select_gpio = 0x0c,
720 .gpio_pin_status_mask = 0x4001000,
721 .tuner_i2c_master = 1,
722 .demod_i2c_master = 2,
723 .has_dvb = 1,
724 .demod_addr = 0x0e,
725 .norm = V4L2_STD_PAL,
726
727 .input = {{
728 .type = CX231XX_VMUX_TELEVISION,
729 .vmux = CX231XX_VIN_3_1,
730 .amux = CX231XX_AMUX_VIDEO,
731 .gpio = NULL,
732 }, {
733 .type = CX231XX_VMUX_COMPOSITE1,
734 .vmux = CX231XX_VIN_2_1,
735 .amux = CX231XX_AMUX_LINE_IN,
736 .gpio = NULL,
737 }, {
738 .type = CX231XX_VMUX_SVIDEO,
739 .vmux = CX231XX_VIN_1_1 |
740 (CX231XX_VIN_1_2 << 8) |
741 CX25840_SVIDEO_ON,
742 .amux = CX231XX_AMUX_LINE_IN,
743 .gpio = NULL,
744 } },
745 },
707}; 746};
708const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards); 747const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
709 748
@@ -733,6 +772,8 @@ struct usb_device_id cx231xx_id_table[] = {
733 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC}, 772 .driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
734 {USB_DEVICE(0x2040, 0xb120), 773 {USB_DEVICE(0x2040, 0xb120),
735 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER}, 774 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
775 {USB_DEVICE(0x2040, 0xb130),
776 .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
736 {USB_DEVICE(0x2040, 0xb140), 777 {USB_DEVICE(0x2040, 0xb140),
737 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER}, 778 .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
738 {USB_DEVICE(0x2040, 0xc200), 779 {USB_DEVICE(0x2040, 0xc200),
@@ -886,6 +927,43 @@ static void cx231xx_config_tuner(struct cx231xx *dev)
886 927
887} 928}
888 929
930static int read_eeprom(struct cx231xx *dev, u8 *eedata, int len)
931{
932 int ret = 0;
933 u8 addr = 0xa0 >> 1;
934 u8 start_offset = 0;
935 int len_todo = len;
936 u8 *eedata_cur = eedata;
937 int i;
938 struct i2c_msg msg_write = { .addr = addr, .flags = 0,
939 .buf = &start_offset, .len = 1 };
940 struct i2c_msg msg_read = { .addr = addr, .flags = I2C_M_RD };
941
942 /* mutex_lock(&dev->i2c_lock); */
943 cx231xx_enable_i2c_port_3(dev, false);
944
945 /* start reading at offset 0 */
946 ret = i2c_transfer(&dev->i2c_bus[1].i2c_adap, &msg_write, 1);
947
948 while (len_todo > 0) {
949 msg_read.len = (len_todo > 64) ? 64 : len_todo;
950 msg_read.buf = eedata_cur;
951
952 ret = i2c_transfer(&dev->i2c_bus[1].i2c_adap, &msg_read, 1);
953
954 eedata_cur += msg_read.len;
955 len_todo -= msg_read.len;
956 }
957
958 cx231xx_enable_i2c_port_3(dev, true);
959 /* mutex_unlock(&dev->i2c_lock); */
960
961 for (i = 0; i + 15 < len; i += 16)
962 cx231xx_info("i2c eeprom %02x: %*ph\n", i, 16, &eedata[i]);
963
964 return 0;
965}
966
889void cx231xx_card_setup(struct cx231xx *dev) 967void cx231xx_card_setup(struct cx231xx *dev)
890{ 968{
891 969
@@ -917,6 +995,20 @@ void cx231xx_card_setup(struct cx231xx *dev)
917 else 995 else
918 cx231xx_config_tuner(dev); 996 cx231xx_config_tuner(dev);
919 } 997 }
998
999 switch (dev->model) {
1000 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1001 {
1002 struct tveeprom tvee;
1003 static u8 eeprom[256];
1004
1005 read_eeprom(dev, eeprom, sizeof(eeprom));
1006 tveeprom_hauppauge_analog(&dev->i2c_bus[1].i2c_client,
1007 &tvee, eeprom + 0xc0);
1008 break;
1009 }
1010 }
1011
920} 1012}
921 1013
922/* 1014/*
diff --git a/drivers/media/usb/cx231xx/cx231xx-core.c b/drivers/media/usb/cx231xx/cx231xx-core.c
index 4ba3ce09b713..513194aa6561 100644
--- a/drivers/media/usb/cx231xx/cx231xx-core.c
+++ b/drivers/media/usb/cx231xx/cx231xx-core.c
@@ -726,6 +726,7 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
726 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1); 726 errCode = cx231xx_set_agc_analog_digital_mux_select(dev, 1);
727 break; 727 break;
728 case CX231XX_BOARD_HAUPPAUGE_EXETER: 728 case CX231XX_BOARD_HAUPPAUGE_EXETER:
729 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
729 errCode = cx231xx_set_power_mode(dev, 730 errCode = cx231xx_set_power_mode(dev,
730 POLARIS_AVMODE_DIGITAL); 731 POLARIS_AVMODE_DIGITAL);
731 break; 732 break;
@@ -744,6 +745,7 @@ int cx231xx_set_mode(struct cx231xx *dev, enum cx231xx_mode set_mode)
744 case CX231XX_BOARD_CNXT_RDE_253S: 745 case CX231XX_BOARD_CNXT_RDE_253S:
745 case CX231XX_BOARD_CNXT_RDU_253S: 746 case CX231XX_BOARD_CNXT_RDU_253S:
746 case CX231XX_BOARD_HAUPPAUGE_EXETER: 747 case CX231XX_BOARD_HAUPPAUGE_EXETER:
748 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
747 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID: 749 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
748 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL: 750 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
749 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC: 751 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
@@ -1379,6 +1381,7 @@ int cx231xx_dev_init(struct cx231xx *dev)
1379 case CX231XX_BOARD_CNXT_RDE_253S: 1381 case CX231XX_BOARD_CNXT_RDE_253S:
1380 case CX231XX_BOARD_CNXT_RDU_253S: 1382 case CX231XX_BOARD_CNXT_RDU_253S:
1381 case CX231XX_BOARD_HAUPPAUGE_EXETER: 1383 case CX231XX_BOARD_HAUPPAUGE_EXETER:
1384 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
1382 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID: 1385 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
1383 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL: 1386 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_PAL:
1384 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC: 1387 case CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC:
diff --git a/drivers/media/usb/cx231xx/cx231xx-dvb.c b/drivers/media/usb/cx231xx/cx231xx-dvb.c
index 5c69be707a30..4ff6f7f7aa5c 100644
--- a/drivers/media/usb/cx231xx/cx231xx-dvb.c
+++ b/drivers/media/usb/cx231xx/cx231xx-dvb.c
@@ -32,6 +32,7 @@
32#include "tda18271.h" 32#include "tda18271.h"
33#include "s5h1411.h" 33#include "s5h1411.h"
34#include "lgdt3305.h" 34#include "lgdt3305.h"
35#include "si2165.h"
35#include "mb86a20s.h" 36#include "mb86a20s.h"
36 37
37MODULE_DESCRIPTION("driver for cx231xx based DVB cards"); 38MODULE_DESCRIPTION("driver for cx231xx based DVB cards");
@@ -152,6 +153,12 @@ static struct tda18271_config pv_tda18271_config = {
152 .small_i2c = TDA18271_03_BYTE_CHUNK_INIT, 153 .small_i2c = TDA18271_03_BYTE_CHUNK_INIT,
153}; 154};
154 155
156static const struct si2165_config hauppauge_930C_HD_1113xx_si2165_config = {
157 .i2c_addr = 0x64,
158 .chip_mode = SI2165_MODE_PLL_XTAL,
159 .ref_freq_Hz = 16000000,
160};
161
155static inline void print_err_status(struct cx231xx *dev, int packet, int status) 162static inline void print_err_status(struct cx231xx *dev, int packet, int status)
156{ 163{
157 char *errmsg = "Unknown"; 164 char *errmsg = "Unknown";
@@ -712,6 +719,33 @@ static int dvb_init(struct cx231xx *dev)
712 &hcw_tda18271_config); 719 &hcw_tda18271_config);
713 break; 720 break;
714 721
722 case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
723
724 dev->dvb->frontend = dvb_attach(si2165_attach,
725 &hauppauge_930C_HD_1113xx_si2165_config,
726 &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap
727 );
728
729 if (dev->dvb->frontend == NULL) {
730 printk(DRIVER_NAME
731 ": Failed to attach SI2165 front end\n");
732 result = -EINVAL;
733 goto out_free;
734 }
735
736 dev->dvb->frontend->ops.i2c_gate_ctrl = 0;
737
738 /* define general-purpose callback pointer */
739 dvb->frontend->callback = cx231xx_tuner_callback;
740
741 dvb_attach(tda18271_attach, dev->dvb->frontend,
742 0x60,
743 &dev->i2c_bus[dev->board.tuner_i2c_master].i2c_adap,
744 &hcw_tda18271_config);
745
746 dev->cx231xx_reset_analog_tuner = NULL;
747 break;
748
715 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID: 749 case CX231XX_BOARD_PV_PLAYTV_USB_HYBRID:
716 case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID: 750 case CX231XX_BOARD_KWORLD_UB430_USB_HYBRID:
717 751
diff --git a/drivers/media/usb/cx231xx/cx231xx.h b/drivers/media/usb/cx231xx/cx231xx.h
index babca7fb85e2..a6373ba781ab 100644
--- a/drivers/media/usb/cx231xx/cx231xx.h
+++ b/drivers/media/usb/cx231xx/cx231xx.h
@@ -73,6 +73,7 @@
73#define CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2 16 73#define CX231XX_BOARD_ELGATO_VIDEO_CAPTURE_V2 16
74#define CX231XX_BOARD_OTG102 17 74#define CX231XX_BOARD_OTG102 17
75#define CX231XX_BOARD_KWORLD_UB445_USB_HYBRID 18 75#define CX231XX_BOARD_KWORLD_UB445_USB_HYBRID 18
76#define CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx 19
76 77
77/* Limits minimum and default number of buffers */ 78/* Limits minimum and default number of buffers */
78#define CX231XX_MIN_BUF 4 79#define CX231XX_MIN_BUF 4