|
@@ -704,6 +704,45 @@ struct cx231xx_board cx231xx_boards[] = {
|
|
|
}
|
|
|
},
|
|
|
},
|
|
|
+ [CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx] = {
|
|
|
+ .name = "Hauppauge WinTV 930C-HD (1113xx)",
|
|
|
+ .tuner_type = TUNER_NXP_TDA18271,
|
|
|
+ .tuner_addr = 0x60,
|
|
|
+ .tuner_gpio = RDE250_XCV_TUNER,
|
|
|
+ .tuner_sif_gpio = 0x05,
|
|
|
+ .tuner_scl_gpio = 0x1a,
|
|
|
+ .tuner_sda_gpio = 0x1b,
|
|
|
+ .decoder = CX231XX_AVDECODER,
|
|
|
+ .output_mode = OUT_MODE_VIP11,
|
|
|
+ .demod_xfer_mode = 0,
|
|
|
+ .ctl_pin_status_mask = 0xFFFFFFC4,
|
|
|
+ .agc_analog_digital_select_gpio = 0x0c,
|
|
|
+ .gpio_pin_status_mask = 0x4001000,
|
|
|
+ .tuner_i2c_master = 1,
|
|
|
+ .demod_i2c_master = 2,
|
|
|
+ .has_dvb = 1,
|
|
|
+ .demod_addr = 0x0e,
|
|
|
+ .norm = V4L2_STD_PAL,
|
|
|
+
|
|
|
+ .input = {{
|
|
|
+ .type = CX231XX_VMUX_TELEVISION,
|
|
|
+ .vmux = CX231XX_VIN_3_1,
|
|
|
+ .amux = CX231XX_AMUX_VIDEO,
|
|
|
+ .gpio = NULL,
|
|
|
+ }, {
|
|
|
+ .type = CX231XX_VMUX_COMPOSITE1,
|
|
|
+ .vmux = CX231XX_VIN_2_1,
|
|
|
+ .amux = CX231XX_AMUX_LINE_IN,
|
|
|
+ .gpio = NULL,
|
|
|
+ }, {
|
|
|
+ .type = CX231XX_VMUX_SVIDEO,
|
|
|
+ .vmux = CX231XX_VIN_1_1 |
|
|
|
+ (CX231XX_VIN_1_2 << 8) |
|
|
|
+ CX25840_SVIDEO_ON,
|
|
|
+ .amux = CX231XX_AMUX_LINE_IN,
|
|
|
+ .gpio = NULL,
|
|
|
+ } },
|
|
|
+ },
|
|
|
};
|
|
|
const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards);
|
|
|
|
|
@@ -733,6 +772,8 @@ struct usb_device_id cx231xx_id_table[] = {
|
|
|
.driver_info = CX231XX_BOARD_HAUPPAUGE_USB2_FM_NTSC},
|
|
|
{USB_DEVICE(0x2040, 0xb120),
|
|
|
.driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
|
|
|
+ {USB_DEVICE(0x2040, 0xb130),
|
|
|
+ .driver_info = CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx},
|
|
|
{USB_DEVICE(0x2040, 0xb140),
|
|
|
.driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER},
|
|
|
{USB_DEVICE(0x2040, 0xc200),
|
|
@@ -886,6 +927,43 @@ static void cx231xx_config_tuner(struct cx231xx *dev)
|
|
|
|
|
|
}
|
|
|
|
|
|
+static int read_eeprom(struct cx231xx *dev, u8 *eedata, int len)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+ u8 addr = 0xa0 >> 1;
|
|
|
+ u8 start_offset = 0;
|
|
|
+ int len_todo = len;
|
|
|
+ u8 *eedata_cur = eedata;
|
|
|
+ int i;
|
|
|
+ struct i2c_msg msg_write = { .addr = addr, .flags = 0,
|
|
|
+ .buf = &start_offset, .len = 1 };
|
|
|
+ struct i2c_msg msg_read = { .addr = addr, .flags = I2C_M_RD };
|
|
|
+
|
|
|
+ /* mutex_lock(&dev->i2c_lock); */
|
|
|
+ cx231xx_enable_i2c_port_3(dev, false);
|
|
|
+
|
|
|
+ /* start reading at offset 0 */
|
|
|
+ ret = i2c_transfer(&dev->i2c_bus[1].i2c_adap, &msg_write, 1);
|
|
|
+
|
|
|
+ while (len_todo > 0) {
|
|
|
+ msg_read.len = (len_todo > 64) ? 64 : len_todo;
|
|
|
+ msg_read.buf = eedata_cur;
|
|
|
+
|
|
|
+ ret = i2c_transfer(&dev->i2c_bus[1].i2c_adap, &msg_read, 1);
|
|
|
+
|
|
|
+ eedata_cur += msg_read.len;
|
|
|
+ len_todo -= msg_read.len;
|
|
|
+ }
|
|
|
+
|
|
|
+ cx231xx_enable_i2c_port_3(dev, true);
|
|
|
+ /* mutex_unlock(&dev->i2c_lock); */
|
|
|
+
|
|
|
+ for (i = 0; i + 15 < len; i += 16)
|
|
|
+ cx231xx_info("i2c eeprom %02x: %*ph\n", i, 16, &eedata[i]);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
void cx231xx_card_setup(struct cx231xx *dev)
|
|
|
{
|
|
|
|
|
@@ -917,6 +995,20 @@ void cx231xx_card_setup(struct cx231xx *dev)
|
|
|
else
|
|
|
cx231xx_config_tuner(dev);
|
|
|
}
|
|
|
+
|
|
|
+ switch (dev->model) {
|
|
|
+ case CX231XX_BOARD_HAUPPAUGE_930C_HD_1113xx:
|
|
|
+ {
|
|
|
+ struct tveeprom tvee;
|
|
|
+ static u8 eeprom[256];
|
|
|
+
|
|
|
+ read_eeprom(dev, eeprom, sizeof(eeprom));
|
|
|
+ tveeprom_hauppauge_analog(&dev->i2c_bus[1].i2c_client,
|
|
|
+ &tvee, eeprom + 0xc0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/*
|