diff options
author | Matthias Schwarzott <zzam@gentoo.org> | 2014-07-22 16:12:15 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2014-07-27 16:02:48 -0400 |
commit | dd2e7dd20cf482bc2fd989bfbd0354476ae904c2 (patch) | |
tree | 01deaaf5d448f3f4b82a68397975fba6fbf8dacb /drivers/media | |
parent | 6d3debafc8e718d5f3b2d87fe0387019b29b3bfa (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/Kconfig | 1 | ||||
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx-avcore.c | 1 | ||||
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx-cards.c | 92 | ||||
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx-core.c | 3 | ||||
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx-dvb.c | 34 | ||||
-rw-r--r-- | drivers/media/usb/cx231xx/cx231xx.h | 1 |
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 | }; |
708 | const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards); | 747 | const 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 | ||
930 | static 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 | |||
889 | void cx231xx_card_setup(struct cx231xx *dev) | 967 | void 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 | ||
37 | MODULE_DESCRIPTION("driver for cx231xx based DVB cards"); | 38 | MODULE_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 | ||
156 | static 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 | |||
155 | static inline void print_err_status(struct cx231xx *dev, int packet, int status) | 162 | static 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 |