diff options
Diffstat (limited to 'drivers/media/video/em28xx/em28xx-cards.c')
-rw-r--r-- | drivers/media/video/em28xx/em28xx-cards.c | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/drivers/media/video/em28xx/em28xx-cards.c b/drivers/media/video/em28xx/em28xx-cards.c index 7e3c78239fa9..bdb249bd9d5d 100644 --- a/drivers/media/video/em28xx/em28xx-cards.c +++ b/drivers/media/video/em28xx/em28xx-cards.c | |||
@@ -170,6 +170,19 @@ static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = { | |||
170 | { -1, -1, -1, -1}, | 170 | { -1, -1, -1, -1}, |
171 | }; | 171 | }; |
172 | 172 | ||
173 | /* eb1a:2868 Reddo DVB-C USB TV Box | ||
174 | GPIO4 - CU1216L NIM | ||
175 | Other GPIOs seems to be don't care. */ | ||
176 | static struct em28xx_reg_seq reddo_dvb_c_usb_box[] = { | ||
177 | {EM28XX_R08_GPIO, 0xfe, 0xff, 10}, | ||
178 | {EM28XX_R08_GPIO, 0xde, 0xff, 10}, | ||
179 | {EM28XX_R08_GPIO, 0xfe, 0xff, 10}, | ||
180 | {EM28XX_R08_GPIO, 0xff, 0xff, 10}, | ||
181 | {EM28XX_R08_GPIO, 0x7f, 0xff, 10}, | ||
182 | {EM28XX_R08_GPIO, 0x6f, 0xff, 10}, | ||
183 | {EM28XX_R08_GPIO, 0xff, 0xff, 10}, | ||
184 | {-1, -1, -1, -1}, | ||
185 | }; | ||
173 | 186 | ||
174 | /* Callback for the most boards */ | 187 | /* Callback for the most boards */ |
175 | static struct em28xx_reg_seq default_tuner_gpio[] = { | 188 | static struct em28xx_reg_seq default_tuner_gpio[] = { |
@@ -1566,6 +1579,14 @@ struct em28xx_board em28xx_boards[] = { | |||
1566 | .gpio = evga_indtube_analog, | 1579 | .gpio = evga_indtube_analog, |
1567 | } }, | 1580 | } }, |
1568 | }, | 1581 | }, |
1582 | /* eb1a:2868 Empia EM2870 + Philips CU1216L NIM (Philips TDA10023 + | ||
1583 | Infineon TUA6034) */ | ||
1584 | [EM2870_BOARD_REDDO_DVB_C_USB_BOX] = { | ||
1585 | .name = "Reddo DVB-C USB TV Box", | ||
1586 | .tuner_type = TUNER_ABSENT, | ||
1587 | .has_dvb = 1, | ||
1588 | .dvb_gpio = reddo_dvb_c_usb_box, | ||
1589 | }, | ||
1569 | }; | 1590 | }; |
1570 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); | 1591 | const unsigned int em28xx_bcount = ARRAY_SIZE(em28xx_boards); |
1571 | 1592 | ||
@@ -1593,6 +1614,8 @@ struct usb_device_id em28xx_id_table[] = { | |||
1593 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1614 | .driver_info = EM2820_BOARD_UNKNOWN }, |
1594 | { USB_DEVICE(0xeb1a, 0x2883), | 1615 | { USB_DEVICE(0xeb1a, 0x2883), |
1595 | .driver_info = EM2820_BOARD_UNKNOWN }, | 1616 | .driver_info = EM2820_BOARD_UNKNOWN }, |
1617 | { USB_DEVICE(0xeb1a, 0x2868), | ||
1618 | .driver_info = EM2820_BOARD_UNKNOWN }, | ||
1596 | { USB_DEVICE(0xeb1a, 0xe300), | 1619 | { USB_DEVICE(0xeb1a, 0xe300), |
1597 | .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U }, | 1620 | .driver_info = EM2861_BOARD_KWORLD_PVRTV_300U }, |
1598 | { USB_DEVICE(0xeb1a, 0xe303), | 1621 | { USB_DEVICE(0xeb1a, 0xe303), |
@@ -1696,6 +1719,7 @@ static struct em28xx_hash_table em28xx_eeprom_hash[] = { | |||
1696 | {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028}, | 1719 | {0x166a0441, EM2880_BOARD_EMPIRE_DUAL_TV, TUNER_XC2028}, |
1697 | {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028}, | 1720 | {0xcee44a99, EM2882_BOARD_EVGA_INDTUBE, TUNER_XC2028}, |
1698 | {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028}, | 1721 | {0xb8846b20, EM2881_BOARD_PINNACLE_HYBRID_PRO, TUNER_XC2028}, |
1722 | {0x63f653bd, EM2870_BOARD_REDDO_DVB_C_USB_BOX, TUNER_ABSENT}, | ||
1699 | }; | 1723 | }; |
1700 | 1724 | ||
1701 | /* I2C devicelist hash table for devices with generic USB IDs */ | 1725 | /* I2C devicelist hash table for devices with generic USB IDs */ |
@@ -2348,55 +2372,55 @@ void em28xx_card_setup(struct em28xx *dev) | |||
2348 | 2372 | ||
2349 | /* request some modules */ | 2373 | /* request some modules */ |
2350 | if (dev->board.has_msp34xx) | 2374 | if (dev->board.has_msp34xx) |
2351 | v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap, | 2375 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, |
2352 | "msp3400", "msp3400", msp3400_addrs); | 2376 | "msp3400", "msp3400", 0, msp3400_addrs); |
2353 | 2377 | ||
2354 | if (dev->board.decoder == EM28XX_SAA711X) | 2378 | if (dev->board.decoder == EM28XX_SAA711X) |
2355 | v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap, | 2379 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, |
2356 | "saa7115", "saa7115_auto", saa711x_addrs); | 2380 | "saa7115", "saa7115_auto", 0, saa711x_addrs); |
2357 | 2381 | ||
2358 | if (dev->board.decoder == EM28XX_TVP5150) | 2382 | if (dev->board.decoder == EM28XX_TVP5150) |
2359 | v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, &dev->i2c_adap, | 2383 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, |
2360 | "tvp5150", "tvp5150", tvp5150_addrs); | 2384 | "tvp5150", "tvp5150", 0, tvp5150_addrs); |
2361 | 2385 | ||
2362 | if (dev->em28xx_sensor == EM28XX_MT9V011) { | 2386 | if (dev->em28xx_sensor == EM28XX_MT9V011) { |
2363 | struct v4l2_subdev *sd; | 2387 | struct v4l2_subdev *sd; |
2364 | 2388 | ||
2365 | sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, | 2389 | sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, |
2366 | &dev->i2c_adap, "mt9v011", "mt9v011", mt9v011_addrs); | 2390 | &dev->i2c_adap, "mt9v011", "mt9v011", 0, mt9v011_addrs); |
2367 | v4l2_subdev_call(sd, core, s_config, 0, &dev->sensor_xtal); | 2391 | v4l2_subdev_call(sd, core, s_config, 0, &dev->sensor_xtal); |
2368 | } | 2392 | } |
2369 | 2393 | ||
2370 | 2394 | ||
2371 | if (dev->board.adecoder == EM28XX_TVAUDIO) | 2395 | if (dev->board.adecoder == EM28XX_TVAUDIO) |
2372 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, | 2396 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, |
2373 | "tvaudio", "tvaudio", dev->board.tvaudio_addr); | 2397 | "tvaudio", "tvaudio", dev->board.tvaudio_addr, NULL); |
2374 | 2398 | ||
2375 | if (dev->board.tuner_type != TUNER_ABSENT) { | 2399 | if (dev->board.tuner_type != TUNER_ABSENT) { |
2376 | int has_demod = (dev->tda9887_conf & TDA9887_PRESENT); | 2400 | int has_demod = (dev->tda9887_conf & TDA9887_PRESENT); |
2377 | 2401 | ||
2378 | if (dev->board.radio.type) | 2402 | if (dev->board.radio.type) |
2379 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, | 2403 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, |
2380 | "tuner", "tuner", dev->board.radio_addr); | 2404 | "tuner", "tuner", dev->board.radio_addr, NULL); |
2381 | 2405 | ||
2382 | if (has_demod) | 2406 | if (has_demod) |
2383 | v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, | 2407 | v4l2_i2c_new_subdev(&dev->v4l2_dev, |
2384 | &dev->i2c_adap, "tuner", "tuner", | 2408 | &dev->i2c_adap, "tuner", "tuner", |
2385 | v4l2_i2c_tuner_addrs(ADDRS_DEMOD)); | 2409 | 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD)); |
2386 | if (dev->tuner_addr == 0) { | 2410 | if (dev->tuner_addr == 0) { |
2387 | enum v4l2_i2c_tuner_type type = | 2411 | enum v4l2_i2c_tuner_type type = |
2388 | has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV; | 2412 | has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV; |
2389 | struct v4l2_subdev *sd; | 2413 | struct v4l2_subdev *sd; |
2390 | 2414 | ||
2391 | sd = v4l2_i2c_new_probed_subdev(&dev->v4l2_dev, | 2415 | sd = v4l2_i2c_new_subdev(&dev->v4l2_dev, |
2392 | &dev->i2c_adap, "tuner", "tuner", | 2416 | &dev->i2c_adap, "tuner", "tuner", |
2393 | v4l2_i2c_tuner_addrs(type)); | 2417 | 0, v4l2_i2c_tuner_addrs(type)); |
2394 | 2418 | ||
2395 | if (sd) | 2419 | if (sd) |
2396 | dev->tuner_addr = v4l2_i2c_subdev_addr(sd); | 2420 | dev->tuner_addr = v4l2_i2c_subdev_addr(sd); |
2397 | } else { | 2421 | } else { |
2398 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, | 2422 | v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap, |
2399 | "tuner", "tuner", dev->tuner_addr); | 2423 | "tuner", "tuner", dev->tuner_addr, NULL); |
2400 | } | 2424 | } |
2401 | } | 2425 | } |
2402 | 2426 | ||
@@ -2570,7 +2594,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
2570 | * Default format, used for tvp5150 or saa711x output formats | 2594 | * Default format, used for tvp5150 or saa711x output formats |
2571 | */ | 2595 | */ |
2572 | dev->vinmode = 0x10; | 2596 | dev->vinmode = 0x10; |
2573 | dev->vinctl = 0x11; | 2597 | dev->vinctl = EM28XX_VINCTRL_INTERLACED | |
2598 | EM28XX_VINCTRL_CCIR656_ENABLE; | ||
2574 | 2599 | ||
2575 | /* Do board specific init and eeprom reading */ | 2600 | /* Do board specific init and eeprom reading */ |
2576 | em28xx_card_setup(dev); | 2601 | em28xx_card_setup(dev); |
@@ -2589,6 +2614,8 @@ static int em28xx_init_dev(struct em28xx **devhandle, struct usb_device *udev, | |||
2589 | /* init video dma queues */ | 2614 | /* init video dma queues */ |
2590 | INIT_LIST_HEAD(&dev->vidq.active); | 2615 | INIT_LIST_HEAD(&dev->vidq.active); |
2591 | INIT_LIST_HEAD(&dev->vidq.queued); | 2616 | INIT_LIST_HEAD(&dev->vidq.queued); |
2617 | INIT_LIST_HEAD(&dev->vbiq.active); | ||
2618 | INIT_LIST_HEAD(&dev->vbiq.queued); | ||
2592 | 2619 | ||
2593 | 2620 | ||
2594 | if (dev->board.has_msp34xx) { | 2621 | if (dev->board.has_msp34xx) { |