Commit af469b37 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'media/v3.19-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media

Pull media fixes from Mauro Carvalho Chehab:
  - fix some race conditions caused by a regression on videobuf2
  - fix a interrupt release bug on cx23885
  - fix support for Mygica T230 and HVR4400
  - fix compilation breakage when USB is not selected on tlg2300
  - fix capabilities report on ompa3isp, soc-camera, rcar_vin and
    pvrusb2

* tag 'media/v3.19-4' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-media:
  [media] omap3isp: Correctly set QUERYCAP capabilities
  [media] cx23885: fix free interrupt bug
  [media] pvrusb2: fix missing device_caps in querycap
  [media] vb2: fix vb2_thread_stop race conditions
  [media] rcar_vin: Update device_caps and capabilities in querycap
  [media] soc-camera: fix device capabilities in multiple camera host drivers
  [media] Fix Mygica T230 support
  [media] cx23885: Split Hauppauge WinTV Starburst from HVR4400 card entry
  [media] tlg2300: Fix media dependencies
parents c4e00f1d 2c0108e1
...@@ -614,7 +614,7 @@ struct cx23885_board cx23885_boards[] = { ...@@ -614,7 +614,7 @@ struct cx23885_board cx23885_boards[] = {
.portb = CX23885_MPEG_DVB, .portb = CX23885_MPEG_DVB,
}, },
[CX23885_BOARD_HAUPPAUGE_HVR4400] = { [CX23885_BOARD_HAUPPAUGE_HVR4400] = {
.name = "Hauppauge WinTV-HVR4400", .name = "Hauppauge WinTV-HVR4400/HVR5500",
.porta = CX23885_ANALOG_VIDEO, .porta = CX23885_ANALOG_VIDEO,
.portb = CX23885_MPEG_DVB, .portb = CX23885_MPEG_DVB,
.portc = CX23885_MPEG_DVB, .portc = CX23885_MPEG_DVB,
...@@ -622,6 +622,10 @@ struct cx23885_board cx23885_boards[] = { ...@@ -622,6 +622,10 @@ struct cx23885_board cx23885_boards[] = {
.tuner_addr = 0x60, /* 0xc0 >> 1 */ .tuner_addr = 0x60, /* 0xc0 >> 1 */
.tuner_bus = 1, .tuner_bus = 1,
}, },
[CX23885_BOARD_HAUPPAUGE_STARBURST] = {
.name = "Hauppauge WinTV Starburst",
.portb = CX23885_MPEG_DVB,
},
[CX23885_BOARD_AVERMEDIA_HC81R] = { [CX23885_BOARD_AVERMEDIA_HC81R] = {
.name = "AVerTV Hybrid Express Slim HC81R", .name = "AVerTV Hybrid Express Slim HC81R",
.tuner_type = TUNER_XC2028, .tuner_type = TUNER_XC2028,
...@@ -936,19 +940,19 @@ struct cx23885_subid cx23885_subids[] = { ...@@ -936,19 +940,19 @@ struct cx23885_subid cx23885_subids[] = {
}, { }, {
.subvendor = 0x0070, .subvendor = 0x0070,
.subdevice = 0xc108, .subdevice = 0xc108,
.card = CX23885_BOARD_HAUPPAUGE_HVR4400, .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-4400 (Model 121xxx, Hybrid DVB-T/S2, IR) */
}, { }, {
.subvendor = 0x0070, .subvendor = 0x0070,
.subdevice = 0xc138, .subdevice = 0xc138,
.card = CX23885_BOARD_HAUPPAUGE_HVR4400, .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
}, { }, {
.subvendor = 0x0070, .subvendor = 0x0070,
.subdevice = 0xc12a, .subdevice = 0xc12a,
.card = CX23885_BOARD_HAUPPAUGE_HVR4400, .card = CX23885_BOARD_HAUPPAUGE_STARBURST, /* Hauppauge WinTV Starburst (Model 121x00, DVB-S2, IR) */
}, { }, {
.subvendor = 0x0070, .subvendor = 0x0070,
.subdevice = 0xc1f8, .subdevice = 0xc1f8,
.card = CX23885_BOARD_HAUPPAUGE_HVR4400, .card = CX23885_BOARD_HAUPPAUGE_HVR4400, /* Hauppauge WinTV HVR-5500 (Model 121xxx, Hybrid DVB-T/C/S2, IR) */
}, { }, {
.subvendor = 0x1461, .subvendor = 0x1461,
.subdevice = 0xd939, .subdevice = 0xd939,
...@@ -1545,8 +1549,9 @@ void cx23885_gpio_setup(struct cx23885_dev *dev) ...@@ -1545,8 +1549,9 @@ void cx23885_gpio_setup(struct cx23885_dev *dev)
cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/ cx_write(GPIO_ISM, 0x00000000);/* INTERRUPTS active low*/
break; break;
case CX23885_BOARD_HAUPPAUGE_HVR4400: case CX23885_BOARD_HAUPPAUGE_HVR4400:
case CX23885_BOARD_HAUPPAUGE_STARBURST:
/* GPIO-8 tda10071 demod reset */ /* GPIO-8 tda10071 demod reset */
/* GPIO-9 si2165 demod reset */ /* GPIO-9 si2165 demod reset (only HVR4400/HVR5500)*/
/* Put the parts into reset and back */ /* Put the parts into reset and back */
cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1); cx23885_gpio_enable(dev, GPIO_8 | GPIO_9, 1);
...@@ -1872,6 +1877,7 @@ void cx23885_card_setup(struct cx23885_dev *dev) ...@@ -1872,6 +1877,7 @@ void cx23885_card_setup(struct cx23885_dev *dev)
case CX23885_BOARD_HAUPPAUGE_HVR1850: case CX23885_BOARD_HAUPPAUGE_HVR1850:
case CX23885_BOARD_HAUPPAUGE_HVR1290: case CX23885_BOARD_HAUPPAUGE_HVR1290:
case CX23885_BOARD_HAUPPAUGE_HVR4400: case CX23885_BOARD_HAUPPAUGE_HVR4400:
case CX23885_BOARD_HAUPPAUGE_STARBURST:
case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE: case CX23885_BOARD_HAUPPAUGE_IMPACTVCBE:
if (dev->i2c_bus[0].i2c_rc == 0) if (dev->i2c_bus[0].i2c_rc == 0)
hauppauge_eeprom(dev, eeprom+0xc0); hauppauge_eeprom(dev, eeprom+0xc0);
...@@ -1980,6 +1986,11 @@ void cx23885_card_setup(struct cx23885_dev *dev) ...@@ -1980,6 +1986,11 @@ void cx23885_card_setup(struct cx23885_dev *dev)
ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */ ts2->ts_clk_en_val = 0x1; /* Enable TS_CLK */
ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO; ts2->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
break; break;
case CX23885_BOARD_HAUPPAUGE_STARBURST:
ts1->gen_ctrl_val = 0xc; /* Serial bus + punctured clock */
ts1->ts_clk_en_val = 0x1; /* Enable TS_CLK */
ts1->src_sel_val = CX23885_SRC_SEL_PARALLEL_MPEG_VIDEO;
break;
case CX23885_BOARD_DVBSKY_T9580: case CX23885_BOARD_DVBSKY_T9580:
case CX23885_BOARD_DVBSKY_T982: case CX23885_BOARD_DVBSKY_T982:
ts1->gen_ctrl_val = 0x5; /* Parallel */ ts1->gen_ctrl_val = 0x5; /* Parallel */
......
...@@ -2049,11 +2049,11 @@ static void cx23885_finidev(struct pci_dev *pci_dev) ...@@ -2049,11 +2049,11 @@ static void cx23885_finidev(struct pci_dev *pci_dev)
cx23885_shutdown(dev); cx23885_shutdown(dev);
pci_disable_device(pci_dev);
/* unregister stuff */ /* unregister stuff */
free_irq(pci_dev->irq, dev); free_irq(pci_dev->irq, dev);
pci_disable_device(pci_dev);
cx23885_dev_unregister(dev); cx23885_dev_unregister(dev);
vb2_dma_sg_cleanup_ctx(dev->alloc_ctx); vb2_dma_sg_cleanup_ctx(dev->alloc_ctx);
v4l2_ctrl_handler_free(&dev->ctrl_handler); v4l2_ctrl_handler_free(&dev->ctrl_handler);
......
...@@ -1710,6 +1710,17 @@ static int dvb_register(struct cx23885_tsport *port) ...@@ -1710,6 +1710,17 @@ static int dvb_register(struct cx23885_tsport *port)
break; break;
} }
break; break;
case CX23885_BOARD_HAUPPAUGE_STARBURST:
i2c_bus = &dev->i2c_bus[0];
fe0->dvb.frontend = dvb_attach(tda10071_attach,
&hauppauge_tda10071_config,
&i2c_bus->i2c_adap);
if (fe0->dvb.frontend != NULL) {
dvb_attach(a8293_attach, fe0->dvb.frontend,
&i2c_bus->i2c_adap,
&hauppauge_a8293_config);
}
break;
case CX23885_BOARD_DVBSKY_T9580: case CX23885_BOARD_DVBSKY_T9580:
case CX23885_BOARD_DVBSKY_S950: case CX23885_BOARD_DVBSKY_S950:
i2c_bus = &dev->i2c_bus[0]; i2c_bus = &dev->i2c_bus[0];
......
...@@ -99,6 +99,7 @@ ...@@ -99,6 +99,7 @@
#define CX23885_BOARD_DVBSKY_S950 49 #define CX23885_BOARD_DVBSKY_S950 49
#define CX23885_BOARD_DVBSKY_S952 50 #define CX23885_BOARD_DVBSKY_S952 50
#define CX23885_BOARD_DVBSKY_T982 51 #define CX23885_BOARD_DVBSKY_T982 51
#define CX23885_BOARD_HAUPPAUGE_STARBURST 52
#define GPIO_0 0x00000001 #define GPIO_0 0x00000001
#define GPIO_1 0x00000002 #define GPIO_1 0x00000002
......
...@@ -602,10 +602,13 @@ isp_video_querycap(struct file *file, void *fh, struct v4l2_capability *cap) ...@@ -602,10 +602,13 @@ isp_video_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
strlcpy(cap->card, video->video.name, sizeof(cap->card)); strlcpy(cap->card, video->video.name, sizeof(cap->card));
strlcpy(cap->bus_info, "media", sizeof(cap->bus_info)); strlcpy(cap->bus_info, "media", sizeof(cap->bus_info));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_OUTPUT
| V4L2_CAP_STREAMING | V4L2_CAP_DEVICE_CAPS;
if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
else else
cap->capabilities = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_STREAMING;
return 0; return 0;
} }
......
...@@ -760,8 +760,9 @@ static int isi_camera_querycap(struct soc_camera_host *ici, ...@@ -760,8 +760,9 @@ static int isi_camera_querycap(struct soc_camera_host *ici,
{ {
strcpy(cap->driver, "atmel-isi"); strcpy(cap->driver, "atmel-isi");
strcpy(cap->card, "Atmel Image Sensor Interface"); strcpy(cap->card, "Atmel Image Sensor Interface");
cap->capabilities = (V4L2_CAP_VIDEO_CAPTURE | cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
V4L2_CAP_STREAMING); cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
......
...@@ -1256,7 +1256,8 @@ static int mx2_camera_querycap(struct soc_camera_host *ici, ...@@ -1256,7 +1256,8 @@ static int mx2_camera_querycap(struct soc_camera_host *ici,
{ {
/* cap->name is set by the friendly caller:-> */ /* cap->name is set by the friendly caller:-> */
strlcpy(cap->card, MX2_CAM_DRIVER_DESCRIPTION, sizeof(cap->card)); strlcpy(cap->card, MX2_CAM_DRIVER_DESCRIPTION, sizeof(cap->card));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
......
...@@ -967,7 +967,8 @@ static int mx3_camera_querycap(struct soc_camera_host *ici, ...@@ -967,7 +967,8 @@ static int mx3_camera_querycap(struct soc_camera_host *ici,
{ {
/* cap->name is set by the firendly caller:-> */ /* cap->name is set by the firendly caller:-> */
strlcpy(cap->card, "i.MX3x Camera", sizeof(cap->card)); strlcpy(cap->card, "i.MX3x Camera", sizeof(cap->card));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
......
...@@ -1427,7 +1427,8 @@ static int omap1_cam_querycap(struct soc_camera_host *ici, ...@@ -1427,7 +1427,8 @@ static int omap1_cam_querycap(struct soc_camera_host *ici,
{ {
/* cap->name is set by the friendly caller:-> */ /* cap->name is set by the friendly caller:-> */
strlcpy(cap->card, "OMAP1 Camera", sizeof(cap->card)); strlcpy(cap->card, "OMAP1 Camera", sizeof(cap->card));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
......
...@@ -1576,7 +1576,8 @@ static int pxa_camera_querycap(struct soc_camera_host *ici, ...@@ -1576,7 +1576,8 @@ static int pxa_camera_querycap(struct soc_camera_host *ici,
{ {
/* cap->name is set by the firendly caller:-> */ /* cap->name is set by the firendly caller:-> */
strlcpy(cap->card, pxa_cam_driver_description, sizeof(cap->card)); strlcpy(cap->card, pxa_cam_driver_description, sizeof(cap->card));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
......
...@@ -1799,7 +1799,9 @@ static int rcar_vin_querycap(struct soc_camera_host *ici, ...@@ -1799,7 +1799,9 @@ static int rcar_vin_querycap(struct soc_camera_host *ici,
struct v4l2_capability *cap) struct v4l2_capability *cap)
{ {
strlcpy(cap->card, "R_Car_VIN", sizeof(cap->card)); strlcpy(cap->card, "R_Car_VIN", sizeof(cap->card));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
......
...@@ -1652,7 +1652,9 @@ static int sh_mobile_ceu_querycap(struct soc_camera_host *ici, ...@@ -1652,7 +1652,9 @@ static int sh_mobile_ceu_querycap(struct soc_camera_host *ici,
struct v4l2_capability *cap) struct v4l2_capability *cap)
{ {
strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card)); strlcpy(cap->card, "SuperH_Mobile_CEU", sizeof(cap->card));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING; cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_STREAMING;
cap->capabilities = cap->device_caps | V4L2_CAP_DEVICE_CAPS;
return 0; return 0;
} }
......
...@@ -2232,7 +2232,7 @@ static struct dvb_usb_device_properties cxusb_mygica_t230_properties = { ...@@ -2232,7 +2232,7 @@ static struct dvb_usb_device_properties cxusb_mygica_t230_properties = {
{ {
"Mygica T230 DVB-T/T2/C", "Mygica T230 DVB-T/T2/C",
{ NULL }, { NULL },
{ &cxusb_table[22], NULL }, { &cxusb_table[20], NULL },
}, },
} }
}; };
......
...@@ -89,16 +89,6 @@ static int vbi_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1}; ...@@ -89,16 +89,6 @@ static int vbi_nr[PVR_NUM] = {[0 ... PVR_NUM-1] = -1};
module_param_array(vbi_nr, int, NULL, 0444); module_param_array(vbi_nr, int, NULL, 0444);
MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor"); MODULE_PARM_DESC(vbi_nr, "Offset for device's vbi dev minor");
static struct v4l2_capability pvr_capability ={
.driver = "pvrusb2",
.card = "Hauppauge WinTV pvr-usb2",
.bus_info = "usb",
.version = LINUX_VERSION_CODE,
.capabilities = (V4L2_CAP_VIDEO_CAPTURE |
V4L2_CAP_TUNER | V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
V4L2_CAP_READWRITE),
};
static struct v4l2_fmtdesc pvr_fmtdesc [] = { static struct v4l2_fmtdesc pvr_fmtdesc [] = {
{ {
.index = 0, .index = 0,
...@@ -160,10 +150,22 @@ static int pvr2_querycap(struct file *file, void *priv, struct v4l2_capability * ...@@ -160,10 +150,22 @@ static int pvr2_querycap(struct file *file, void *priv, struct v4l2_capability *
struct pvr2_v4l2_fh *fh = file->private_data; struct pvr2_v4l2_fh *fh = file->private_data;
struct pvr2_hdw *hdw = fh->channel.mc_head->hdw; struct pvr2_hdw *hdw = fh->channel.mc_head->hdw;
memcpy(cap, &pvr_capability, sizeof(struct v4l2_capability)); strlcpy(cap->driver, "pvrusb2", sizeof(cap->driver));
strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw), strlcpy(cap->bus_info, pvr2_hdw_get_bus_info(hdw),
sizeof(cap->bus_info)); sizeof(cap->bus_info));
strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card)); strlcpy(cap->card, pvr2_hdw_get_desc(hdw), sizeof(cap->card));
cap->capabilities = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_TUNER |
V4L2_CAP_AUDIO | V4L2_CAP_RADIO |
V4L2_CAP_READWRITE | V4L2_CAP_DEVICE_CAPS;
switch (fh->pdi->devbase.vfl_type) {
case VFL_TYPE_GRABBER:
cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_AUDIO;
break;
case VFL_TYPE_RADIO:
cap->device_caps = V4L2_CAP_RADIO;
break;
}
cap->device_caps |= V4L2_CAP_TUNER | V4L2_CAP_READWRITE;
return 0; return 0;
} }
......
...@@ -3146,27 +3146,26 @@ static int vb2_thread(void *data) ...@@ -3146,27 +3146,26 @@ static int vb2_thread(void *data)
prequeue--; prequeue--;
} else { } else {
call_void_qop(q, wait_finish, q); call_void_qop(q, wait_finish, q);
ret = vb2_internal_dqbuf(q, &fileio->b, 0); if (!threadio->stop)
ret = vb2_internal_dqbuf(q, &fileio->b, 0);
call_void_qop(q, wait_prepare, q); call_void_qop(q, wait_prepare, q);
dprintk(5, "file io: vb2_dqbuf result: %d\n", ret); dprintk(5, "file io: vb2_dqbuf result: %d\n", ret);
} }
if (threadio->stop) if (ret || threadio->stop)
break;
if (ret)
break; break;
try_to_freeze(); try_to_freeze();
vb = q->bufs[fileio->b.index]; vb = q->bufs[fileio->b.index];
if (!(fileio->b.flags & V4L2_BUF_FLAG_ERROR)) if (!(fileio->b.flags & V4L2_BUF_FLAG_ERROR))
ret = threadio->fnc(vb, threadio->priv); if (threadio->fnc(vb, threadio->priv))
if (ret) break;
break;
call_void_qop(q, wait_finish, q); call_void_qop(q, wait_finish, q);
if (set_timestamp) if (set_timestamp)
v4l2_get_timestamp(&fileio->b.timestamp); v4l2_get_timestamp(&fileio->b.timestamp);
ret = vb2_internal_qbuf(q, &fileio->b); if (!threadio->stop)
ret = vb2_internal_qbuf(q, &fileio->b);
call_void_qop(q, wait_prepare, q); call_void_qop(q, wait_prepare, q);
if (ret) if (ret || threadio->stop)
break; break;
} }
...@@ -3235,11 +3234,11 @@ int vb2_thread_stop(struct vb2_queue *q) ...@@ -3235,11 +3234,11 @@ int vb2_thread_stop(struct vb2_queue *q)
threadio->stop = true; threadio->stop = true;
vb2_internal_streamoff(q, q->type); vb2_internal_streamoff(q, q->type);
call_void_qop(q, wait_prepare, q); call_void_qop(q, wait_prepare, q);
err = kthread_stop(threadio->thread);
q->fileio = NULL; q->fileio = NULL;
fileio->req.count = 0; fileio->req.count = 0;
vb2_reqbufs(q, &fileio->req); vb2_reqbufs(q, &fileio->req);
kfree(fileio); kfree(fileio);
err = kthread_stop(threadio->thread);
threadio->thread = NULL; threadio->thread = NULL;
kfree(threadio); kfree(threadio);
q->fileio = NULL; q->fileio = NULL;
......
config VIDEO_TLG2300 config VIDEO_TLG2300
tristate "Telegent TLG2300 USB video capture support (Deprecated)" tristate "Telegent TLG2300 USB video capture support (Deprecated)"
depends on VIDEO_DEV && I2C && SND && DVB_CORE depends on VIDEO_DEV && I2C && SND && DVB_CORE
depends on MEDIA_USB_SUPPORT
select VIDEO_TUNER select VIDEO_TUNER
select VIDEO_TVEEPROM select VIDEO_TVEEPROM
depends on RC_CORE depends on RC_CORE
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment