diff options
Diffstat (limited to 'drivers/media/usb/em28xx')
-rw-r--r-- | drivers/media/usb/em28xx/Kconfig | 2 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-camera.c | 2 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-cards.c | 13 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-dvb.c | 14 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx-video.c | 119 | ||||
-rw-r--r-- | drivers/media/usb/em28xx/em28xx.h | 7 |
6 files changed, 76 insertions, 81 deletions
diff --git a/drivers/media/usb/em28xx/Kconfig b/drivers/media/usb/em28xx/Kconfig index f5d7198753c7..e382210c4ada 100644 --- a/drivers/media/usb/em28xx/Kconfig +++ b/drivers/media/usb/em28xx/Kconfig @@ -55,7 +55,7 @@ config VIDEO_EM28XX_DVB select MEDIA_TUNER_TDA18271 if MEDIA_SUBDRV_AUTOSELECT select MEDIA_TUNER_TDA18212 if MEDIA_SUBDRV_AUTOSELECT select DVB_M88DS3103 if MEDIA_SUBDRV_AUTOSELECT - select MEDIA_TUNER_M88TS2022 if MEDIA_SUBDRV_AUTOSELECT + select DVB_TS2020 if MEDIA_SUBDRV_AUTOSELECT select DVB_DRX39XYJ if MEDIA_SUBDRV_AUTOSELECT select DVB_SI2168 if MEDIA_SUBDRV_AUTOSELECT select MEDIA_TUNER_SI2157 if MEDIA_SUBDRV_AUTOSELECT diff --git a/drivers/media/usb/em28xx/em28xx-camera.c b/drivers/media/usb/em28xx/em28xx-camera.c index 7be661f73930..a4b22c2c3ba7 100644 --- a/drivers/media/usb/em28xx/em28xx-camera.c +++ b/drivers/media/usb/em28xx/em28xx-camera.c @@ -330,7 +330,7 @@ int em28xx_init_camera(struct em28xx *dev) v4l2_clk_name_i2c(clk_name, sizeof(clk_name), i2c_adapter_id(adap), client->addr); - v4l2->clk = v4l2_clk_register_fixed(clk_name, "mclk", -EINVAL); + v4l2->clk = v4l2_clk_register_fixed(clk_name, -EINVAL); if (IS_ERR(v4l2->clk)) return PTR_ERR(v4l2->clk); diff --git a/drivers/media/usb/em28xx/em28xx-cards.c b/drivers/media/usb/em28xx/em28xx-cards.c index d9704e66b8c9..394004607059 100644 --- a/drivers/media/usb/em28xx/em28xx-cards.c +++ b/drivers/media/usb/em28xx/em28xx-cards.c @@ -1157,6 +1157,15 @@ struct em28xx_board em28xx_boards[] = { .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | EM28XX_I2C_FREQ_400_KHZ, }, + [EM2884_BOARD_ELGATO_EYETV_HYBRID_2008] = { + .name = "Elgato EyeTV Hybrid 2008 INT", + .has_dvb = 1, + .ir_codes = RC_MAP_NEC_TERRATEC_CINERGY_XS, + .tuner_type = TUNER_ABSENT, + .def_i2c_bus = 1, + .i2c_speed = EM28XX_I2C_CLK_WAIT_ENABLE | + EM28XX_I2C_FREQ_400_KHZ, + }, [EM2880_BOARD_HAUPPAUGE_WINTV_HVR_900] = { .name = "Hauppauge WinTV HVR 900", .tda9887_conf = TDA9887_PRESENT, @@ -2378,8 +2387,10 @@ struct usb_device_id em28xx_id_table[] = { .driver_info = EM2860_BOARD_TERRATEC_GRABBY }, { USB_DEVICE(0x0ccd, 0x00b2), .driver_info = EM2884_BOARD_CINERGY_HTC_STICK }, + { USB_DEVICE(0x0fd9, 0x0018), + .driver_info = EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 }, { USB_DEVICE(0x0fd9, 0x0033), - .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE}, + .driver_info = EM2860_BOARD_ELGATO_VIDEO_CAPTURE }, { USB_DEVICE(0x185b, 0x2870), .driver_info = EM2870_BOARD_COMPRO_VIDEOMATE }, { USB_DEVICE(0x185b, 0x2041), diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c index aee70d483264..a5b22c5a240c 100644 --- a/drivers/media/usb/em28xx/em28xx-dvb.c +++ b/drivers/media/usb/em28xx/em28xx-dvb.c @@ -54,7 +54,7 @@ #include "qt1010.h" #include "mb86a20s.h" #include "m88ds3103.h" -#include "m88ts2022.h" +#include "ts2020.h" #include "si2168.h" #include "si2157.h" @@ -1380,6 +1380,7 @@ static int em28xx_dvb_init(struct em28xx *dev) } } break; + case EM2884_BOARD_ELGATO_EYETV_HYBRID_2008: case EM2884_BOARD_CINERGY_HTC_STICK: terratec_htc_stick_init(dev); @@ -1491,8 +1492,7 @@ static int em28xx_dvb_init(struct em28xx *dev) struct i2c_adapter *i2c_adapter; struct i2c_client *client; struct i2c_board_info info; - struct m88ts2022_config m88ts2022_config = { - .clock = 27000000, + struct ts2020_config ts2020_config = { }; memset(&info, 0, sizeof(struct i2c_board_info)); @@ -1507,11 +1507,11 @@ static int em28xx_dvb_init(struct em28xx *dev) } /* attach tuner */ - m88ts2022_config.fe = dvb->fe[0]; - strlcpy(info.type, "m88ts2022", I2C_NAME_SIZE); + ts2020_config.fe = dvb->fe[0]; + strlcpy(info.type, "ts2022", I2C_NAME_SIZE); info.addr = 0x60; - info.platform_data = &m88ts2022_config; - request_module("m88ts2022"); + info.platform_data = &ts2020_config; + request_module("ts2020"); client = i2c_new_device(i2c_adapter, &info); if (client == NULL || client->dev.driver == NULL) { dvb_frontend_detach(dvb->fe[0]); diff --git a/drivers/media/usb/em28xx/em28xx-video.c b/drivers/media/usb/em28xx/em28xx-video.c index 9ecf65629b3d..14eba9c65de3 100644 --- a/drivers/media/usb/em28xx/em28xx-video.c +++ b/drivers/media/usb/em28xx/em28xx-video.c @@ -1472,7 +1472,7 @@ static int vidioc_enum_input(struct file *file, void *priv, (EM28XX_VMUX_CABLE == INPUT(n)->type)) i->type = V4L2_INPUT_TYPE_TUNER; - i->std = dev->v4l2->vdev->tvnorms; + i->std = dev->v4l2->vdev.tvnorms; /* webcams do not have the STD API */ if (dev->board.is_webcam) i->capabilities = 0; @@ -1730,9 +1730,9 @@ static int vidioc_querycap(struct file *file, void *priv, cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS | V4L2_CAP_READWRITE | V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; - if (v4l2->vbi_dev) + if (video_is_registered(&v4l2->vbi_dev)) cap->capabilities |= V4L2_CAP_VBI_CAPTURE; - if (v4l2->radio_dev) + if (video_is_registered(&v4l2->radio_dev)) cap->capabilities |= V4L2_CAP_RADIO; return 0; } @@ -1966,20 +1966,20 @@ static int em28xx_v4l2_fini(struct em28xx *dev) em28xx_uninit_usb_xfer(dev, EM28XX_ANALOG_MODE); - if (v4l2->radio_dev) { + if (video_is_registered(&v4l2->radio_dev)) { em28xx_info("V4L2 device %s deregistered\n", - video_device_node_name(v4l2->radio_dev)); - video_unregister_device(v4l2->radio_dev); + video_device_node_name(&v4l2->radio_dev)); + video_unregister_device(&v4l2->radio_dev); } - if (v4l2->vbi_dev) { + if (video_is_registered(&v4l2->vbi_dev)) { em28xx_info("V4L2 device %s deregistered\n", - video_device_node_name(v4l2->vbi_dev)); - video_unregister_device(v4l2->vbi_dev); + video_device_node_name(&v4l2->vbi_dev)); + video_unregister_device(&v4l2->vbi_dev); } - if (v4l2->vdev) { + if (video_is_registered(&v4l2->vdev)) { em28xx_info("V4L2 device %s deregistered\n", - video_device_node_name(v4l2->vdev)); - video_unregister_device(v4l2->vdev); + video_device_node_name(&v4l2->vdev)); + video_unregister_device(&v4l2->vdev); } v4l2_ctrl_handler_free(&v4l2->ctrl_handler); @@ -2127,7 +2127,7 @@ static const struct v4l2_ioctl_ops video_ioctl_ops = { static const struct video_device em28xx_video_template = { .fops = &em28xx_v4l_fops, .ioctl_ops = &video_ioctl_ops, - .release = video_device_release, + .release = video_device_release_empty, .tvnorms = V4L2_STD_ALL, }; @@ -2156,7 +2156,7 @@ static const struct v4l2_ioctl_ops radio_ioctl_ops = { static struct video_device em28xx_radio_template = { .fops = &radio_fops, .ioctl_ops = &radio_ioctl_ops, - .release = video_device_release, + .release = video_device_release_empty, }; /* I2C possible address to saa7115, tvp5150, msp3400, tvaudio */ @@ -2179,17 +2179,11 @@ static unsigned short msp3400_addrs[] = { /******************************** usb interface ******************************/ -static struct video_device -*em28xx_vdev_init(struct em28xx *dev, - const struct video_device *template, - const char *type_name) +static void em28xx_vdev_init(struct em28xx *dev, + struct video_device *vfd, + const struct video_device *template, + const char *type_name) { - struct video_device *vfd; - - vfd = video_device_alloc(); - if (NULL == vfd) - return NULL; - *vfd = *template; vfd->v4l2_dev = &dev->v4l2->v4l2_dev; vfd->lock = &dev->lock; @@ -2200,7 +2194,6 @@ static struct video_device dev->name, type_name); video_set_drvdata(vfd, dev); - return vfd; } static void em28xx_tuner_setup(struct em28xx *dev, unsigned short tuner_addr) @@ -2491,38 +2484,33 @@ static int em28xx_v4l2_init(struct em28xx *dev) goto unregister_dev; /* allocate and fill video video_device struct */ - v4l2->vdev = em28xx_vdev_init(dev, &em28xx_video_template, "video"); - if (!v4l2->vdev) { - em28xx_errdev("cannot allocate video_device.\n"); - ret = -ENODEV; - goto unregister_dev; - } + em28xx_vdev_init(dev, &v4l2->vdev, &em28xx_video_template, "video"); mutex_init(&v4l2->vb_queue_lock); mutex_init(&v4l2->vb_vbi_queue_lock); - v4l2->vdev->queue = &v4l2->vb_vidq; - v4l2->vdev->queue->lock = &v4l2->vb_queue_lock; + v4l2->vdev.queue = &v4l2->vb_vidq; + v4l2->vdev.queue->lock = &v4l2->vb_queue_lock; /* disable inapplicable ioctls */ if (dev->board.is_webcam) { - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_QUERYSTD); - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_STD); - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_STD); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_QUERYSTD); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_STD); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_STD); } else { - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_PARM); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_PARM); } if (dev->tuner_type == TUNER_ABSENT) { - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_TUNER); - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_TUNER); - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_FREQUENCY); - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_FREQUENCY); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_TUNER); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_TUNER); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_FREQUENCY); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_FREQUENCY); } if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) { - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_G_AUDIO); - v4l2_disable_ioctl(v4l2->vdev, VIDIOC_S_AUDIO); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_G_AUDIO); + v4l2_disable_ioctl(&v4l2->vdev, VIDIOC_S_AUDIO); } /* register v4l2 video video_device */ - ret = video_register_device(v4l2->vdev, VFL_TYPE_GRABBER, + ret = video_register_device(&v4l2->vdev, VFL_TYPE_GRABBER, video_nr[dev->devno]); if (ret) { em28xx_errdev("unable to register video device (error=%i).\n", @@ -2532,27 +2520,27 @@ static int em28xx_v4l2_init(struct em28xx *dev) /* Allocate and fill vbi video_device struct */ if (em28xx_vbi_supported(dev) == 1) { - v4l2->vbi_dev = em28xx_vdev_init(dev, &em28xx_video_template, - "vbi"); + em28xx_vdev_init(dev, &v4l2->vbi_dev, &em28xx_video_template, + "vbi"); - v4l2->vbi_dev->queue = &v4l2->vb_vbiq; - v4l2->vbi_dev->queue->lock = &v4l2->vb_vbi_queue_lock; + v4l2->vbi_dev.queue = &v4l2->vb_vbiq; + v4l2->vbi_dev.queue->lock = &v4l2->vb_vbi_queue_lock; /* disable inapplicable ioctls */ - v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_PARM); + v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_PARM); if (dev->tuner_type == TUNER_ABSENT) { - v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_TUNER); - v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_TUNER); - v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_FREQUENCY); - v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_FREQUENCY); + v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_G_TUNER); + v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_TUNER); + v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_G_FREQUENCY); + v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_FREQUENCY); } if (dev->int_audio_type == EM28XX_INT_AUDIO_NONE) { - v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_G_AUDIO); - v4l2_disable_ioctl(v4l2->vbi_dev, VIDIOC_S_AUDIO); + v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_G_AUDIO); + v4l2_disable_ioctl(&v4l2->vbi_dev, VIDIOC_S_AUDIO); } /* register v4l2 vbi video_device */ - ret = video_register_device(v4l2->vbi_dev, VFL_TYPE_VBI, + ret = video_register_device(&v4l2->vbi_dev, VFL_TYPE_VBI, vbi_nr[dev->devno]); if (ret < 0) { em28xx_errdev("unable to register vbi device\n"); @@ -2561,29 +2549,24 @@ static int em28xx_v4l2_init(struct em28xx *dev) } if (em28xx_boards[dev->model].radio.type == EM28XX_RADIO) { - v4l2->radio_dev = em28xx_vdev_init(dev, &em28xx_radio_template, - "radio"); - if (!v4l2->radio_dev) { - em28xx_errdev("cannot allocate video_device.\n"); - ret = -ENODEV; - goto unregister_dev; - } - ret = video_register_device(v4l2->radio_dev, VFL_TYPE_RADIO, + em28xx_vdev_init(dev, &v4l2->radio_dev, &em28xx_radio_template, + "radio"); + ret = video_register_device(&v4l2->radio_dev, VFL_TYPE_RADIO, radio_nr[dev->devno]); if (ret < 0) { em28xx_errdev("can't register radio device\n"); goto unregister_dev; } em28xx_info("Registered radio device as %s\n", - video_device_node_name(v4l2->radio_dev)); + video_device_node_name(&v4l2->radio_dev)); } em28xx_info("V4L2 video device registered as %s\n", - video_device_node_name(v4l2->vdev)); + video_device_node_name(&v4l2->vdev)); - if (v4l2->vbi_dev) + if (video_is_registered(&v4l2->vbi_dev)) em28xx_info("V4L2 VBI device registered as %s\n", - video_device_node_name(v4l2->vbi_dev)); + video_device_node_name(&v4l2->vbi_dev)); /* Save some power by putting tuner to sleep */ v4l2_device_call_all(&v4l2->v4l2_dev, 0, core, s_power, 0); diff --git a/drivers/media/usb/em28xx/em28xx.h b/drivers/media/usb/em28xx/em28xx.h index 9c7075344109..e6559c6f143c 100644 --- a/drivers/media/usb/em28xx/em28xx.h +++ b/drivers/media/usb/em28xx/em28xx.h @@ -143,6 +143,7 @@ #define EM28178_BOARD_PCTV_292E 94 #define EM2861_BOARD_LEADTEK_VC100 95 #define EM28178_BOARD_TERRATEC_T2_STICK_HD 96 +#define EM2884_BOARD_ELGATO_EYETV_HYBRID_2008 97 /* Limits minimum and default number of buffers */ #define EM28XX_MIN_BUF 4 @@ -512,9 +513,9 @@ struct em28xx_v4l2 { struct v4l2_ctrl_handler ctrl_handler; struct v4l2_clk *clk; - struct video_device *vdev; - struct video_device *vbi_dev; - struct video_device *radio_dev; + struct video_device vdev; + struct video_device vbi_dev; + struct video_device radio_dev; /* Videobuf2 */ struct vb2_queue vb_vidq; |