diff options
author | Devin Heitmueller <dheitmueller@hauppauge.com> | 2010-07-30 23:49:01 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-10-20 23:17:28 -0400 |
commit | 4270c3cac41e248ee339d18e01251989b74a30f1 (patch) | |
tree | e5b303f254fd41a70ee320fd57f87e0f9682c57b | |
parent | 8d4c20c960aa9325bd3b9995f518e1f05c374856 (diff) |
[media] cx231xx: Add initial support for Hauppauge USB-Live2
Add initial support for the Hauppauge USBLive 2 (2040:c200). Note that I
had to copy a bunch of the case statements used for the Conexant video grabber
reference design (which also doesn't have a tuner). This will likely need to
be refactored out into the board profile.
Signed-off-by: Devin Heitmueller <dheitmueller@hauppauge.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-avcore.c | 1 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-cards.c | 33 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-core.c | 9 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx-video.c | 9 | ||||
-rw-r--r-- | drivers/media/video/cx231xx/cx231xx.h | 1 |
5 files changed, 41 insertions, 12 deletions
diff --git a/drivers/media/video/cx231xx/cx231xx-avcore.c b/drivers/media/video/cx231xx/cx231xx-avcore.c index 0d358e675984..917812d6ab21 100644 --- a/drivers/media/video/cx231xx/cx231xx-avcore.c +++ b/drivers/media/video/cx231xx/cx231xx-avcore.c | |||
@@ -353,6 +353,7 @@ int cx231xx_afe_update_power_control(struct cx231xx *dev, | |||
353 | case CX231XX_BOARD_CNXT_RDU_253S: | 353 | case CX231XX_BOARD_CNXT_RDU_253S: |
354 | case CX231XX_BOARD_CNXT_VIDEO_GRABBER: | 354 | case CX231XX_BOARD_CNXT_VIDEO_GRABBER: |
355 | case CX231XX_BOARD_HAUPPAUGE_EXETER: | 355 | case CX231XX_BOARD_HAUPPAUGE_EXETER: |
356 | case CX231XX_BOARD_HAUPPAUGE_USBLIVE2: | ||
356 | if (avmode == POLARIS_AVMODE_ANALOGT_TV) { | 357 | if (avmode == POLARIS_AVMODE_ANALOGT_TV) { |
357 | while (afe_power_status != (FLD_PWRDN_TUNING_BIAS | | 358 | while (afe_power_status != (FLD_PWRDN_TUNING_BIAS | |
358 | FLD_PWRDN_ENABLE_PLL)) { | 359 | FLD_PWRDN_ENABLE_PLL)) { |
diff --git a/drivers/media/video/cx231xx/cx231xx-cards.c b/drivers/media/video/cx231xx/cx231xx-cards.c index ed8139acf19a..4d37cb7b0750 100644 --- a/drivers/media/video/cx231xx/cx231xx-cards.c +++ b/drivers/media/video/cx231xx/cx231xx-cards.c | |||
@@ -378,11 +378,29 @@ struct cx231xx_board cx231xx_boards[] = { | |||
378 | .gpio = 0, | 378 | .gpio = 0, |
379 | } }, | 379 | } }, |
380 | }, | 380 | }, |
381 | 381 | [CX231XX_BOARD_HAUPPAUGE_USBLIVE2] = { | |
382 | 382 | .name = "Hauppauge USB Live 2", | |
383 | 383 | .tuner_type = TUNER_ABSENT, | |
384 | 384 | .decoder = CX231XX_AVDECODER, | |
385 | 385 | .demod_xfer_mode = 0, | |
386 | .ctl_pin_status_mask = 0xFFFFFFC4, | ||
387 | .agc_analog_digital_select_gpio = 0x0c, | ||
388 | .gpio_pin_status_mask = 0x4001000, | ||
389 | .norm = V4L2_STD_NTSC, | ||
390 | .input = {{ | ||
391 | .type = CX231XX_VMUX_COMPOSITE1, | ||
392 | .vmux = CX231XX_VIN_2_1, | ||
393 | .amux = CX231XX_AMUX_LINE_IN, | ||
394 | .gpio = 0, | ||
395 | }, { | ||
396 | .type = CX231XX_VMUX_SVIDEO, | ||
397 | .vmux = CX231XX_VIN_1_1 | | ||
398 | (CX231XX_VIN_1_2 << 8) | | ||
399 | CX25840_SVIDEO_ON, | ||
400 | .amux = CX231XX_AMUX_LINE_IN, | ||
401 | .gpio = 0, | ||
402 | } }, | ||
403 | }, | ||
386 | }; | 404 | }; |
387 | const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards); | 405 | const unsigned int cx231xx_bcount = ARRAY_SIZE(cx231xx_boards); |
388 | 406 | ||
@@ -410,6 +428,8 @@ struct usb_device_id cx231xx_id_table[] = { | |||
410 | .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER}, | 428 | .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER}, |
411 | {USB_DEVICE(0x2040, 0xb140), | 429 | {USB_DEVICE(0x2040, 0xb140), |
412 | .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER}, | 430 | .driver_info = CX231XX_BOARD_HAUPPAUGE_EXETER}, |
431 | {USB_DEVICE(0x2040, 0xc200), | ||
432 | .driver_info = CX231XX_BOARD_HAUPPAUGE_USBLIVE2}, | ||
413 | {}, | 433 | {}, |
414 | }; | 434 | }; |
415 | 435 | ||
@@ -688,7 +708,8 @@ static int cx231xx_init_dev(struct cx231xx **devhandle, struct usb_device *udev, | |||
688 | 708 | ||
689 | /*To workaround error number=-71 on EP0 for VideoGrabber, | 709 | /*To workaround error number=-71 on EP0 for VideoGrabber, |
690 | need set alt here.*/ | 710 | need set alt here.*/ |
691 | if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) { | 711 | if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER || |
712 | dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) { | ||
692 | cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3); | 713 | cx231xx_set_alt_setting(dev, INDEX_VIDEO, 3); |
693 | cx231xx_set_alt_setting(dev, INDEX_VANC, 1); | 714 | cx231xx_set_alt_setting(dev, INDEX_VANC, 1); |
694 | } | 715 | } |
diff --git a/drivers/media/video/cx231xx/cx231xx-core.c b/drivers/media/video/cx231xx/cx231xx-core.c index fe3d500424f3..5406ff28852e 100644 --- a/drivers/media/video/cx231xx/cx231xx-core.c +++ b/drivers/media/video/cx231xx/cx231xx-core.c | |||
@@ -628,7 +628,8 @@ int cx231xx_set_alt_setting(struct cx231xx *dev, u8 index, u8 alt) | |||
628 | usb_interface_index, alt); | 628 | usb_interface_index, alt); |
629 | /*To workaround error number=-71 on EP0 for videograbber, | 629 | /*To workaround error number=-71 on EP0 for videograbber, |
630 | need add following codes.*/ | 630 | need add following codes.*/ |
631 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER) | 631 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER && |
632 | dev->model != CX231XX_BOARD_HAUPPAUGE_USBLIVE2) | ||
632 | return -1; | 633 | return -1; |
633 | } | 634 | } |
634 | 635 | ||
@@ -1327,7 +1328,8 @@ int cx231xx_dev_init(struct cx231xx *dev) | |||
1327 | /* init hardware */ | 1328 | /* init hardware */ |
1328 | /* Note : with out calling set power mode function, | 1329 | /* Note : with out calling set power mode function, |
1329 | afe can not be set up correctly */ | 1330 | afe can not be set up correctly */ |
1330 | if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) { | 1331 | if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER || |
1332 | dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) { | ||
1331 | errCode = cx231xx_set_power_mode(dev, | 1333 | errCode = cx231xx_set_power_mode(dev, |
1332 | POLARIS_AVMODE_ENXTERNAL_AV); | 1334 | POLARIS_AVMODE_ENXTERNAL_AV); |
1333 | if (errCode < 0) { | 1335 | if (errCode < 0) { |
@@ -1427,7 +1429,8 @@ int cx231xx_dev_init(struct cx231xx *dev) | |||
1427 | cx231xx_set_alt_setting(dev, INDEX_TS1, 0); | 1429 | cx231xx_set_alt_setting(dev, INDEX_TS1, 0); |
1428 | 1430 | ||
1429 | /* set the I2C master port to 3 on channel 1 */ | 1431 | /* set the I2C master port to 3 on channel 1 */ |
1430 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER) | 1432 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER && |
1433 | dev->model != CX231XX_BOARD_HAUPPAUGE_USBLIVE2) | ||
1431 | errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3); | 1434 | errCode = cx231xx_enable_i2c_for_tuner(dev, I2C_3); |
1432 | 1435 | ||
1433 | return errCode; | 1436 | return errCode; |
diff --git a/drivers/media/video/cx231xx/cx231xx-video.c b/drivers/media/video/cx231xx/cx231xx-video.c index 0880edd3a49b..38367ee07cc5 100644 --- a/drivers/media/video/cx231xx/cx231xx-video.c +++ b/drivers/media/video/cx231xx/cx231xx-video.c | |||
@@ -2256,7 +2256,8 @@ static int cx231xx_v4l2_open(struct file *filp) | |||
2256 | dev->height = norm_maxh(dev); | 2256 | dev->height = norm_maxh(dev); |
2257 | 2257 | ||
2258 | /* Power up in Analog TV mode */ | 2258 | /* Power up in Analog TV mode */ |
2259 | if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER) | 2259 | if (dev->model == CX231XX_BOARD_CNXT_VIDEO_GRABBER || |
2260 | dev->model == CX231XX_BOARD_HAUPPAUGE_USBLIVE2) | ||
2260 | cx231xx_set_power_mode(dev, | 2261 | cx231xx_set_power_mode(dev, |
2261 | POLARIS_AVMODE_ENXTERNAL_AV); | 2262 | POLARIS_AVMODE_ENXTERNAL_AV); |
2262 | else | 2263 | else |
@@ -2296,7 +2297,8 @@ static int cx231xx_v4l2_open(struct file *filp) | |||
2296 | if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) { | 2297 | if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) { |
2297 | /* Set the required alternate setting VBI interface works in | 2298 | /* Set the required alternate setting VBI interface works in |
2298 | Bulk mode only */ | 2299 | Bulk mode only */ |
2299 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER) | 2300 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER && |
2301 | dev->model != CX231XX_BOARD_HAUPPAUGE_USBLIVE2) | ||
2300 | cx231xx_set_alt_setting(dev, INDEX_VANC, 0); | 2302 | cx231xx_set_alt_setting(dev, INDEX_VANC, 0); |
2301 | 2303 | ||
2302 | videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_vbi_qops, | 2304 | videobuf_queue_vmalloc_init(&fh->vb_vidq, &cx231xx_vbi_qops, |
@@ -2371,7 +2373,8 @@ static int cx231xx_v4l2_close(struct file *filp) | |||
2371 | 2373 | ||
2372 | /*To workaround error number=-71 on EP0 for VideoGrabber, | 2374 | /*To workaround error number=-71 on EP0 for VideoGrabber, |
2373 | need exclude following.*/ | 2375 | need exclude following.*/ |
2374 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER) | 2376 | if (dev->model != CX231XX_BOARD_CNXT_VIDEO_GRABBER && |
2377 | dev->model != CX231XX_BOARD_HAUPPAUGE_USBLIVE2) | ||
2375 | if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) { | 2378 | if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE) { |
2376 | videobuf_stop(&fh->vb_vidq); | 2379 | videobuf_stop(&fh->vb_vidq); |
2377 | videobuf_mmap_free(&fh->vb_vidq); | 2380 | videobuf_mmap_free(&fh->vb_vidq); |
diff --git a/drivers/media/video/cx231xx/cx231xx.h b/drivers/media/video/cx231xx/cx231xx.h index aa273428d021..8d4fcf70387f 100644 --- a/drivers/media/video/cx231xx/cx231xx.h +++ b/drivers/media/video/cx231xx/cx231xx.h | |||
@@ -63,6 +63,7 @@ | |||
63 | #define CX231XX_BOARD_CNXT_RDE_250 6 | 63 | #define CX231XX_BOARD_CNXT_RDE_250 6 |
64 | #define CX231XX_BOARD_CNXT_RDU_250 7 | 64 | #define CX231XX_BOARD_CNXT_RDU_250 7 |
65 | #define CX231XX_BOARD_HAUPPAUGE_EXETER 8 | 65 | #define CX231XX_BOARD_HAUPPAUGE_EXETER 8 |
66 | #define CX231XX_BOARD_HAUPPAUGE_USBLIVE2 9 | ||
66 | 67 | ||
67 | /* Limits minimum and default number of buffers */ | 68 | /* Limits minimum and default number of buffers */ |
68 | #define CX231XX_MIN_BUF 4 | 69 | #define CX231XX_MIN_BUF 4 |