Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] soc-camera: Compile fixes for mx2-camera [media] SoC Camera: ov6650: minor cleanups [media] SOC Camera: OMAP1: typo fix [media] SoC Camera: OMAP1: update for recent videobuf changes [media] SoC Camera: OMAP1: update for recent framework changes [media] ARM mx3_camera: check for DMA engine type [media] tm6000: bugfix set tv standards [media] cafe_ccic: fix subdev configuration [media] saa7134: Fix autodetect for Behold A7 and H7 TV cards [media] v4l: kill the BKL [media] BZ#22292: dibx000_common: Restore i2c algo pointer
This commit is contained in:
commit
c22cff08db
|
@ -19,7 +19,6 @@ comment "Multimedia core support"
|
||||||
|
|
||||||
config VIDEO_DEV
|
config VIDEO_DEV
|
||||||
tristate "Video For Linux"
|
tristate "Video For Linux"
|
||||||
depends on BKL # used in many drivers for ioctl handling, need to kill
|
|
||||||
---help---
|
---help---
|
||||||
V4L core support for video capture and overlay devices, webcams and
|
V4L core support for video capture and overlay devices, webcams and
|
||||||
AM/FM radio cards.
|
AM/FM radio cards.
|
||||||
|
|
|
@ -130,6 +130,7 @@ static int i2c_adapter_init(struct i2c_adapter *i2c_adap,
|
||||||
struct dibx000_i2c_master *mst)
|
struct dibx000_i2c_master *mst)
|
||||||
{
|
{
|
||||||
strncpy(i2c_adap->name, name, sizeof(i2c_adap->name));
|
strncpy(i2c_adap->name, name, sizeof(i2c_adap->name));
|
||||||
|
i2c_adap->algo = algo;
|
||||||
i2c_adap->algo_data = NULL;
|
i2c_adap->algo_data = NULL;
|
||||||
i2c_set_adapdata(i2c_adap, mst);
|
i2c_set_adapdata(i2c_adap, mst);
|
||||||
if (i2c_add_adapter(i2c_adap) < 0)
|
if (i2c_add_adapter(i2c_adap) < 0)
|
||||||
|
|
|
@ -2065,8 +2065,9 @@ static int cafe_pci_probe(struct pci_dev *pdev,
|
||||||
sensor_cfg.clock_speed = 45;
|
sensor_cfg.clock_speed = 45;
|
||||||
|
|
||||||
cam->sensor_addr = 0x42;
|
cam->sensor_addr = 0x42;
|
||||||
cam->sensor = v4l2_i2c_new_subdev(&cam->v4l2_dev, &cam->i2c_adapter,
|
cam->sensor = v4l2_i2c_new_subdev_cfg(&cam->v4l2_dev, &cam->i2c_adapter,
|
||||||
NULL, "ov7670", cam->sensor_addr, NULL);
|
"ov7670", "ov7670", 0, &sensor_cfg, cam->sensor_addr,
|
||||||
|
NULL);
|
||||||
if (cam->sensor == NULL) {
|
if (cam->sensor == NULL) {
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
goto out_smbus;
|
goto out_smbus;
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <media/v4l2-common.h>
|
#include <media/v4l2-common.h>
|
||||||
#include <media/v4l2-ioctl.h>
|
#include <media/v4l2-ioctl.h>
|
||||||
|
@ -1927,10 +1926,9 @@ static int mpeg_open(struct file *file)
|
||||||
dev = h;
|
dev = h;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dev == NULL) {
|
if (dev == NULL)
|
||||||
unlock_kernel();
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
|
||||||
mutex_lock(&dev->lock);
|
mutex_lock(&dev->lock);
|
||||||
|
|
||||||
/* allocate + initialize per filehandle data */
|
/* allocate + initialize per filehandle data */
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <media/v4l2-common.h>
|
#include <media/v4l2-common.h>
|
||||||
#include <media/v4l2-ioctl.h>
|
#include <media/v4l2-ioctl.h>
|
||||||
|
@ -1576,12 +1575,8 @@ static int mpeg_open(struct file *file)
|
||||||
|
|
||||||
/* allocate + initialize per filehandle data */
|
/* allocate + initialize per filehandle data */
|
||||||
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
|
fh = kzalloc(sizeof(*fh), GFP_KERNEL);
|
||||||
if (NULL == fh) {
|
if (!fh)
|
||||||
unlock_kernel();
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
|
|
||||||
file->private_data = fh;
|
file->private_data = fh;
|
||||||
fh->dev = dev;
|
fh->dev = dev;
|
||||||
|
@ -1592,8 +1587,6 @@ static int mpeg_open(struct file *file)
|
||||||
V4L2_FIELD_INTERLACED,
|
V4L2_FIELD_INTERLACED,
|
||||||
sizeof(struct cx23885_buffer),
|
sizeof(struct cx23885_buffer),
|
||||||
fh, NULL);
|
fh, NULL);
|
||||||
unlock_kernel();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,6 @@
|
||||||
#include <linux/kmod.h>
|
#include <linux/kmod.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/kthread.h>
|
#include <linux/kthread.h>
|
||||||
|
@ -743,8 +742,6 @@ static int video_open(struct file *file)
|
||||||
if (NULL == fh)
|
if (NULL == fh)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
|
|
||||||
file->private_data = fh;
|
file->private_data = fh;
|
||||||
fh->dev = dev;
|
fh->dev = dev;
|
||||||
fh->radio = radio;
|
fh->radio = radio;
|
||||||
|
@ -762,8 +759,6 @@ static int video_open(struct file *file)
|
||||||
|
|
||||||
dprintk(1, "post videobuf_queue_init()\n");
|
dprintk(1, "post videobuf_queue_init()\n");
|
||||||
|
|
||||||
unlock_kernel();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
#include <media/v4l2-common.h>
|
#include <media/v4l2-common.h>
|
||||||
#include <media/v4l2-dev.h>
|
#include <media/v4l2-dev.h>
|
||||||
|
#include <media/videobuf-core.h>
|
||||||
#include <media/videobuf-dma-contig.h>
|
#include <media/videobuf-dma-contig.h>
|
||||||
#include <media/soc_camera.h>
|
#include <media/soc_camera.h>
|
||||||
#include <media/soc_mediabus.h>
|
#include <media/soc_mediabus.h>
|
||||||
|
@ -903,8 +904,6 @@ static int mx2_camera_set_crop(struct soc_camera_device *icd,
|
||||||
static int mx2_camera_set_fmt(struct soc_camera_device *icd,
|
static int mx2_camera_set_fmt(struct soc_camera_device *icd,
|
||||||
struct v4l2_format *f)
|
struct v4l2_format *f)
|
||||||
{
|
{
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
|
||||||
struct mx2_camera_dev *pcdev = ici->priv;
|
|
||||||
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
||||||
const struct soc_camera_format_xlate *xlate;
|
const struct soc_camera_format_xlate *xlate;
|
||||||
struct v4l2_pix_format *pix = &f->fmt.pix;
|
struct v4l2_pix_format *pix = &f->fmt.pix;
|
||||||
|
@ -943,8 +942,6 @@ static int mx2_camera_set_fmt(struct soc_camera_device *icd,
|
||||||
static int mx2_camera_try_fmt(struct soc_camera_device *icd,
|
static int mx2_camera_try_fmt(struct soc_camera_device *icd,
|
||||||
struct v4l2_format *f)
|
struct v4l2_format *f)
|
||||||
{
|
{
|
||||||
struct soc_camera_host *ici = to_soc_camera_host(icd->dev.parent);
|
|
||||||
struct mx2_camera_dev *pcdev = ici->priv;
|
|
||||||
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
struct v4l2_subdev *sd = soc_camera_to_subdev(icd);
|
||||||
const struct soc_camera_format_xlate *xlate;
|
const struct soc_camera_format_xlate *xlate;
|
||||||
struct v4l2_pix_format *pix = &f->fmt.pix;
|
struct v4l2_pix_format *pix = &f->fmt.pix;
|
||||||
|
@ -1024,13 +1021,13 @@ static int mx2_camera_querycap(struct soc_camera_host *ici,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mx2_camera_reqbufs(struct soc_camera_file *icf,
|
static int mx2_camera_reqbufs(struct soc_camera_device *icd,
|
||||||
struct v4l2_requestbuffers *p)
|
struct v4l2_requestbuffers *p)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < p->count; i++) {
|
for (i = 0; i < p->count; i++) {
|
||||||
struct mx2_buffer *buf = container_of(icf->vb_vidq.bufs[i],
|
struct mx2_buffer *buf = container_of(icd->vb_vidq.bufs[i],
|
||||||
struct mx2_buffer, vb);
|
struct mx2_buffer, vb);
|
||||||
INIT_LIST_HEAD(&buf->vb.queue);
|
INIT_LIST_HEAD(&buf->vb.queue);
|
||||||
}
|
}
|
||||||
|
@ -1151,9 +1148,9 @@ err_out:
|
||||||
|
|
||||||
static unsigned int mx2_camera_poll(struct file *file, poll_table *pt)
|
static unsigned int mx2_camera_poll(struct file *file, poll_table *pt)
|
||||||
{
|
{
|
||||||
struct soc_camera_file *icf = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
|
|
||||||
return videobuf_poll_stream(file, &icf->vb_vidq, pt);
|
return videobuf_poll_stream(file, &icd->vb_vidq, pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct soc_camera_host_ops mx2_soc_camera_host_ops = {
|
static struct soc_camera_host_ops mx2_soc_camera_host_ops = {
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
|
|
||||||
#include <mach/ipu.h>
|
#include <mach/ipu.h>
|
||||||
#include <mach/mx3_camera.h>
|
#include <mach/mx3_camera.h>
|
||||||
|
#include <mach/dma.h>
|
||||||
|
|
||||||
#define MX3_CAM_DRV_NAME "mx3-camera"
|
#define MX3_CAM_DRV_NAME "mx3-camera"
|
||||||
|
|
||||||
|
@ -638,6 +639,9 @@ static bool chan_filter(struct dma_chan *chan, void *arg)
|
||||||
struct dma_chan_request *rq = arg;
|
struct dma_chan_request *rq = arg;
|
||||||
struct mx3_camera_pdata *pdata;
|
struct mx3_camera_pdata *pdata;
|
||||||
|
|
||||||
|
if (!imx_dma_is_ipu(chan))
|
||||||
|
return false;
|
||||||
|
|
||||||
if (!rq)
|
if (!rq)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -235,7 +235,7 @@ static void free_buffer(struct videobuf_queue *vq, struct omap1_cam_buf *buf,
|
||||||
|
|
||||||
BUG_ON(in_interrupt());
|
BUG_ON(in_interrupt());
|
||||||
|
|
||||||
videobuf_waiton(vb, 0, 0);
|
videobuf_waiton(vq, vb, 0, 0);
|
||||||
|
|
||||||
if (vb_mode == OMAP1_CAM_DMA_CONTIG) {
|
if (vb_mode == OMAP1_CAM_DMA_CONTIG) {
|
||||||
videobuf_dma_contig_free(vq, vb);
|
videobuf_dma_contig_free(vq, vb);
|
||||||
|
@ -504,7 +504,7 @@ static void omap1_videobuf_queue(struct videobuf_queue *vq,
|
||||||
* empty. Since the transfer of the DMA programming register set
|
* empty. Since the transfer of the DMA programming register set
|
||||||
* content to the DMA working register set is done automatically
|
* content to the DMA working register set is done automatically
|
||||||
* by the DMA hardware, this can pretty well happen while we
|
* by the DMA hardware, this can pretty well happen while we
|
||||||
* are keeping the lock here. Levae fetching it from the queue
|
* are keeping the lock here. Leave fetching it from the queue
|
||||||
* to be done when a next DMA interrupt occures instead.
|
* to be done when a next DMA interrupt occures instead.
|
||||||
*/
|
*/
|
||||||
return;
|
return;
|
||||||
|
@ -1365,12 +1365,12 @@ static void omap1_cam_init_videobuf(struct videobuf_queue *q,
|
||||||
videobuf_queue_dma_contig_init(q, &omap1_videobuf_ops,
|
videobuf_queue_dma_contig_init(q, &omap1_videobuf_ops,
|
||||||
icd->dev.parent, &pcdev->lock,
|
icd->dev.parent, &pcdev->lock,
|
||||||
V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
|
V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
|
||||||
sizeof(struct omap1_cam_buf), icd);
|
sizeof(struct omap1_cam_buf), icd, NULL);
|
||||||
else
|
else
|
||||||
videobuf_queue_sg_init(q, &omap1_videobuf_ops,
|
videobuf_queue_sg_init(q, &omap1_videobuf_ops,
|
||||||
icd->dev.parent, &pcdev->lock,
|
icd->dev.parent, &pcdev->lock,
|
||||||
V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
|
V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE,
|
||||||
sizeof(struct omap1_cam_buf), icd);
|
sizeof(struct omap1_cam_buf), icd, NULL);
|
||||||
|
|
||||||
/* use videobuf mode (auto)selected with the module parameter */
|
/* use videobuf mode (auto)selected with the module parameter */
|
||||||
pcdev->vb_mode = sg_mode ? OMAP1_CAM_DMA_SG : OMAP1_CAM_DMA_CONTIG;
|
pcdev->vb_mode = sg_mode ? OMAP1_CAM_DMA_SG : OMAP1_CAM_DMA_CONTIG;
|
||||||
|
@ -1386,7 +1386,7 @@ static void omap1_cam_init_videobuf(struct videobuf_queue *q,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int omap1_cam_reqbufs(struct soc_camera_file *icf,
|
static int omap1_cam_reqbufs(struct soc_camera_device *icd,
|
||||||
struct v4l2_requestbuffers *p)
|
struct v4l2_requestbuffers *p)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -1398,7 +1398,7 @@ static int omap1_cam_reqbufs(struct soc_camera_file *icf,
|
||||||
* it hadn't triggered
|
* it hadn't triggered
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < p->count; i++) {
|
for (i = 0; i < p->count; i++) {
|
||||||
struct omap1_cam_buf *buf = container_of(icf->vb_vidq.bufs[i],
|
struct omap1_cam_buf *buf = container_of(icd->vb_vidq.bufs[i],
|
||||||
struct omap1_cam_buf, vb);
|
struct omap1_cam_buf, vb);
|
||||||
buf->inwork = 0;
|
buf->inwork = 0;
|
||||||
INIT_LIST_HEAD(&buf->vb.queue);
|
INIT_LIST_HEAD(&buf->vb.queue);
|
||||||
|
@ -1485,10 +1485,10 @@ static int omap1_cam_set_bus_param(struct soc_camera_device *icd,
|
||||||
|
|
||||||
static unsigned int omap1_cam_poll(struct file *file, poll_table *pt)
|
static unsigned int omap1_cam_poll(struct file *file, poll_table *pt)
|
||||||
{
|
{
|
||||||
struct soc_camera_file *icf = file->private_data;
|
struct soc_camera_device *icd = file->private_data;
|
||||||
struct omap1_cam_buf *buf;
|
struct omap1_cam_buf *buf;
|
||||||
|
|
||||||
buf = list_entry(icf->vb_vidq.stream.next, struct omap1_cam_buf,
|
buf = list_entry(icd->vb_vidq.stream.next, struct omap1_cam_buf,
|
||||||
vb.stream);
|
vb.stream);
|
||||||
|
|
||||||
poll_wait(file, &buf->vb.done, pt);
|
poll_wait(file, &buf->vb.done, pt);
|
||||||
|
|
|
@ -754,7 +754,7 @@ static int ov6650_g_fmt(struct v4l2_subdev *sd,
|
||||||
|
|
||||||
static bool is_unscaled_ok(int width, int height, struct v4l2_rect *rect)
|
static bool is_unscaled_ok(int width, int height, struct v4l2_rect *rect)
|
||||||
{
|
{
|
||||||
return (width > rect->width >> 1 || height > rect->height >> 1);
|
return width > rect->width >> 1 || height > rect->height >> 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 to_clkrc(struct v4l2_fract *timeperframe,
|
static u8 to_clkrc(struct v4l2_fract *timeperframe,
|
||||||
|
@ -840,8 +840,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||||
coma_mask |= COMA_BW | COMA_BYTE_SWAP | COMA_WORD_SWAP;
|
coma_mask |= COMA_BW | COMA_BYTE_SWAP | COMA_WORD_SWAP;
|
||||||
coma_set |= COMA_RAW_RGB | COMA_RGB;
|
coma_set |= COMA_RAW_RGB | COMA_RGB;
|
||||||
break;
|
break;
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
dev_err(&client->dev, "Pixel format not handled: 0x%x\n", code);
|
dev_err(&client->dev, "Pixel format not handled: 0x%x\n", code);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -6660,6 +6660,18 @@ struct pci_device_id saa7134_pci_tbl[] = {
|
||||||
.subvendor = 0x13c2,
|
.subvendor = 0x13c2,
|
||||||
.subdevice = 0x2804,
|
.subdevice = 0x2804,
|
||||||
.driver_data = SAA7134_BOARD_TECHNOTREND_BUDGET_T3000,
|
.driver_data = SAA7134_BOARD_TECHNOTREND_BUDGET_T3000,
|
||||||
|
}, {
|
||||||
|
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||||
|
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||||
|
.subvendor = 0x5ace, /* Beholder Intl. Ltd. */
|
||||||
|
.subdevice = 0x7190,
|
||||||
|
.driver_data = SAA7134_BOARD_BEHOLD_H7,
|
||||||
|
}, {
|
||||||
|
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||||
|
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
||||||
|
.subvendor = 0x5ace, /* Beholder Intl. Ltd. */
|
||||||
|
.subdevice = 0x7090,
|
||||||
|
.driver_data = SAA7134_BOARD_BEHOLD_A7,
|
||||||
}, {
|
}, {
|
||||||
/* --- boards without eeprom + subsystem ID --- */
|
/* --- boards without eeprom + subsystem ID --- */
|
||||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
.vendor = PCI_VENDOR_ID_PHILIPS,
|
||||||
|
@ -6698,18 +6710,6 @@ struct pci_device_id saa7134_pci_tbl[] = {
|
||||||
.subvendor = PCI_ANY_ID,
|
.subvendor = PCI_ANY_ID,
|
||||||
.subdevice = PCI_ANY_ID,
|
.subdevice = PCI_ANY_ID,
|
||||||
.driver_data = SAA7134_BOARD_UNKNOWN,
|
.driver_data = SAA7134_BOARD_UNKNOWN,
|
||||||
}, {
|
|
||||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
|
||||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
|
||||||
.subvendor = 0x5ace, /* Beholder Intl. Ltd. */
|
|
||||||
.subdevice = 0x7190,
|
|
||||||
.driver_data = SAA7134_BOARD_BEHOLD_H7,
|
|
||||||
}, {
|
|
||||||
.vendor = PCI_VENDOR_ID_PHILIPS,
|
|
||||||
.device = PCI_DEVICE_ID_PHILIPS_SAA7133,
|
|
||||||
.subvendor = 0x5ace, /* Beholder Intl. Ltd. */
|
|
||||||
.subdevice = 0x7090,
|
|
||||||
.driver_data = SAA7134_BOARD_BEHOLD_A7,
|
|
||||||
},{
|
},{
|
||||||
/* --- end of list --- */
|
/* --- end of list --- */
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,6 @@ static const char version[] = "0.24";
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/pagemap.h>
|
#include <linux/pagemap.h>
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include "se401.h"
|
#include "se401.h"
|
||||||
|
@ -951,9 +950,9 @@ static int se401_open(struct file *file)
|
||||||
struct usb_se401 *se401 = (struct usb_se401 *)dev;
|
struct usb_se401 *se401 = (struct usb_se401 *)dev;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
lock_kernel();
|
mutex_lock(&se401->lock);
|
||||||
if (se401->user) {
|
if (se401->user) {
|
||||||
unlock_kernel();
|
mutex_unlock(&se401->lock);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
se401->fbuf = rvmalloc(se401->maxframesize * SE401_NUMFRAMES);
|
se401->fbuf = rvmalloc(se401->maxframesize * SE401_NUMFRAMES);
|
||||||
|
@ -962,7 +961,7 @@ static int se401_open(struct file *file)
|
||||||
else
|
else
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
se401->user = !err;
|
se401->user = !err;
|
||||||
unlock_kernel();
|
mutex_unlock(&se401->lock);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
|
|
||||||
#include <linux/usb.h>
|
#include <linux/usb.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
|
@ -673,14 +672,11 @@ static int v4l_stk_open(struct file *fp)
|
||||||
vdev = video_devdata(fp);
|
vdev = video_devdata(fp);
|
||||||
dev = vdev_to_camera(vdev);
|
dev = vdev_to_camera(vdev);
|
||||||
|
|
||||||
lock_kernel();
|
|
||||||
if (dev == NULL || !is_present(dev)) {
|
if (dev == NULL || !is_present(dev)) {
|
||||||
unlock_kernel();
|
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
fp->private_data = dev;
|
fp->private_data = dev;
|
||||||
usb_autopm_get_interface(dev->interface);
|
usb_autopm_get_interface(dev->interface);
|
||||||
unlock_kernel();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
|
|
||||||
#include "vendorcmds.h"
|
#include "vendorcmds.h"
|
||||||
#include "pd-common.h"
|
#include "pd-common.h"
|
||||||
|
@ -485,15 +484,11 @@ static void poseidon_disconnect(struct usb_interface *interface)
|
||||||
/*unregister v4l2 device */
|
/*unregister v4l2 device */
|
||||||
v4l2_device_unregister(&pd->v4l2_dev);
|
v4l2_device_unregister(&pd->v4l2_dev);
|
||||||
|
|
||||||
lock_kernel();
|
pd_dvb_usb_device_exit(pd);
|
||||||
{
|
poseidon_fm_exit(pd);
|
||||||
pd_dvb_usb_device_exit(pd);
|
|
||||||
poseidon_fm_exit(pd);
|
|
||||||
|
|
||||||
poseidon_audio_free(pd);
|
poseidon_audio_free(pd);
|
||||||
pd_video_exit(pd);
|
pd_video_exit(pd);
|
||||||
}
|
|
||||||
unlock_kernel();
|
|
||||||
|
|
||||||
usb_set_intfdata(interface, NULL);
|
usb_set_intfdata(interface, NULL);
|
||||||
kref_put(&pd->kref, poseidon_delete);
|
kref_put(&pd->kref, poseidon_delete);
|
||||||
|
|
|
@ -43,7 +43,6 @@
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/firmware.h>
|
#include <linux/firmware.h>
|
||||||
#include <linux/ihex.h>
|
#include <linux/ihex.h>
|
||||||
|
@ -483,29 +482,28 @@ vicam_open(struct file *file)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the videodev_lock held above us protects us from
|
/* cam_lock/open_count protects us from simultaneous opens
|
||||||
* simultaneous opens...for now. we probably shouldn't
|
* ... for now. we probably shouldn't rely on this fact forever.
|
||||||
* rely on this fact forever.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
lock_kernel();
|
mutex_lock(&cam->cam_lock);
|
||||||
if (cam->open_count > 0) {
|
if (cam->open_count > 0) {
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
"vicam_open called on already opened camera");
|
"vicam_open called on already opened camera");
|
||||||
unlock_kernel();
|
mutex_unlock(&cam->cam_lock);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
cam->raw_image = kmalloc(VICAM_MAX_READ_SIZE, GFP_KERNEL);
|
cam->raw_image = kmalloc(VICAM_MAX_READ_SIZE, GFP_KERNEL);
|
||||||
if (!cam->raw_image) {
|
if (!cam->raw_image) {
|
||||||
unlock_kernel();
|
mutex_unlock(&cam->cam_lock);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
cam->framebuf = rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
|
cam->framebuf = rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
|
||||||
if (!cam->framebuf) {
|
if (!cam->framebuf) {
|
||||||
kfree(cam->raw_image);
|
kfree(cam->raw_image);
|
||||||
unlock_kernel();
|
mutex_unlock(&cam->cam_lock);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -513,10 +511,17 @@ vicam_open(struct file *file)
|
||||||
if (!cam->cntrlbuf) {
|
if (!cam->cntrlbuf) {
|
||||||
kfree(cam->raw_image);
|
kfree(cam->raw_image);
|
||||||
rvfree(cam->framebuf, VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
|
rvfree(cam->framebuf, VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
|
||||||
unlock_kernel();
|
mutex_unlock(&cam->cam_lock);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cam->needsDummyRead = 1;
|
||||||
|
cam->open_count++;
|
||||||
|
|
||||||
|
file->private_data = cam;
|
||||||
|
mutex_unlock(&cam->cam_lock);
|
||||||
|
|
||||||
|
|
||||||
// First upload firmware, then turn the camera on
|
// First upload firmware, then turn the camera on
|
||||||
|
|
||||||
if (!cam->is_initialized) {
|
if (!cam->is_initialized) {
|
||||||
|
@ -527,12 +532,6 @@ vicam_open(struct file *file)
|
||||||
|
|
||||||
set_camera_power(cam, 1);
|
set_camera_power(cam, 1);
|
||||||
|
|
||||||
cam->needsDummyRead = 1;
|
|
||||||
cam->open_count++;
|
|
||||||
|
|
||||||
file->private_data = cam;
|
|
||||||
unlock_kernel();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kmod.h>
|
#include <linux/kmod.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
|
@ -247,10 +246,12 @@ static long v4l2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||||
mutex_unlock(vdev->lock);
|
mutex_unlock(vdev->lock);
|
||||||
} else if (vdev->fops->ioctl) {
|
} else if (vdev->fops->ioctl) {
|
||||||
/* TODO: convert all drivers to unlocked_ioctl */
|
/* TODO: convert all drivers to unlocked_ioctl */
|
||||||
lock_kernel();
|
static DEFINE_MUTEX(v4l2_ioctl_mutex);
|
||||||
|
|
||||||
|
mutex_lock(&v4l2_ioctl_mutex);
|
||||||
if (video_is_registered(vdev))
|
if (video_is_registered(vdev))
|
||||||
ret = vdev->fops->ioctl(filp, cmd, arg);
|
ret = vdev->fops->ioctl(filp, cmd, arg);
|
||||||
unlock_kernel();
|
mutex_unlock(&v4l2_ioctl_mutex);
|
||||||
} else
|
} else
|
||||||
ret = -ENOTTY;
|
ret = -ENOTTY;
|
||||||
|
|
||||||
|
|
|
@ -388,6 +388,7 @@ struct zoran {
|
||||||
struct videocodec *vfe; /* video front end */
|
struct videocodec *vfe; /* video front end */
|
||||||
|
|
||||||
struct mutex resource_lock; /* prevent evil stuff */
|
struct mutex resource_lock; /* prevent evil stuff */
|
||||||
|
struct mutex other_lock; /* please merge with above */
|
||||||
|
|
||||||
u8 initialized; /* flag if zoran has been correctly initialized */
|
u8 initialized; /* flag if zoran has been correctly initialized */
|
||||||
int user; /* number of current users */
|
int user; /* number of current users */
|
||||||
|
|
|
@ -1227,6 +1227,7 @@ static int __devinit zoran_probe(struct pci_dev *pdev,
|
||||||
snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%u]", zr->id);
|
||||||
spin_lock_init(&zr->spinlock);
|
spin_lock_init(&zr->spinlock);
|
||||||
mutex_init(&zr->resource_lock);
|
mutex_init(&zr->resource_lock);
|
||||||
|
mutex_init(&zr->other_lock);
|
||||||
if (pci_enable_device(pdev))
|
if (pci_enable_device(pdev))
|
||||||
goto zr_unreg;
|
goto zr_unreg;
|
||||||
pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
|
pci_read_config_byte(zr->pci_dev, PCI_CLASS_REVISION, &zr->revision);
|
||||||
|
|
|
@ -49,7 +49,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/vmalloc.h>
|
#include <linux/vmalloc.h>
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
|
@ -913,7 +912,7 @@ static int zoran_open(struct file *file)
|
||||||
dprintk(2, KERN_INFO "%s: %s(%s, pid=[%d]), users(-)=%d\n",
|
dprintk(2, KERN_INFO "%s: %s(%s, pid=[%d]), users(-)=%d\n",
|
||||||
ZR_DEVNAME(zr), __func__, current->comm, task_pid_nr(current), zr->user + 1);
|
ZR_DEVNAME(zr), __func__, current->comm, task_pid_nr(current), zr->user + 1);
|
||||||
|
|
||||||
lock_kernel();
|
mutex_lock(&zr->other_lock);
|
||||||
|
|
||||||
if (zr->user >= 2048) {
|
if (zr->user >= 2048) {
|
||||||
dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
|
dprintk(1, KERN_ERR "%s: too many users (%d) on device\n",
|
||||||
|
@ -963,14 +962,14 @@ static int zoran_open(struct file *file)
|
||||||
file->private_data = fh;
|
file->private_data = fh;
|
||||||
fh->zr = zr;
|
fh->zr = zr;
|
||||||
zoran_open_init_session(fh);
|
zoran_open_init_session(fh);
|
||||||
unlock_kernel();
|
mutex_unlock(&zr->other_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail_fh:
|
fail_fh:
|
||||||
kfree(fh);
|
kfree(fh);
|
||||||
fail_unlock:
|
fail_unlock:
|
||||||
unlock_kernel();
|
mutex_unlock(&zr->other_lock);
|
||||||
|
|
||||||
dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n",
|
dprintk(2, KERN_INFO "%s: open failed (%d), users(-)=%d\n",
|
||||||
ZR_DEVNAME(zr), res, zr->user);
|
ZR_DEVNAME(zr), res, zr->user);
|
||||||
|
@ -989,7 +988,7 @@ zoran_close(struct file *file)
|
||||||
|
|
||||||
/* kernel locks (fs/device.c), so don't do that ourselves
|
/* kernel locks (fs/device.c), so don't do that ourselves
|
||||||
* (prevents deadlocks) */
|
* (prevents deadlocks) */
|
||||||
/*mutex_lock(&zr->resource_lock);*/
|
mutex_lock(&zr->other_lock);
|
||||||
|
|
||||||
zoran_close_end_session(fh);
|
zoran_close_end_session(fh);
|
||||||
|
|
||||||
|
@ -1023,6 +1022,7 @@ zoran_close(struct file *file)
|
||||||
encoder_call(zr, video, s_routing, 2, 0, 0);
|
encoder_call(zr, video, s_routing, 2, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mutex_unlock(&zr->other_lock);
|
||||||
|
|
||||||
file->private_data = NULL;
|
file->private_data = NULL;
|
||||||
kfree(fh->overlay_mask);
|
kfree(fh->overlay_mask);
|
||||||
|
@ -3370,11 +3370,26 @@ static const struct v4l2_ioctl_ops zoran_ioctl_ops = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* please use zr->resource_lock consistently and kill this wrapper */
|
||||||
|
static long zoran_ioctl(struct file *file, unsigned int cmd,
|
||||||
|
unsigned long arg)
|
||||||
|
{
|
||||||
|
struct zoran_fh *fh = file->private_data;
|
||||||
|
struct zoran *zr = fh->zr;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
mutex_lock(&zr->other_lock);
|
||||||
|
ret = video_ioctl2(file, cmd, arg);
|
||||||
|
mutex_unlock(&zr->other_lock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct v4l2_file_operations zoran_fops = {
|
static const struct v4l2_file_operations zoran_fops = {
|
||||||
.owner = THIS_MODULE,
|
.owner = THIS_MODULE,
|
||||||
.open = zoran_open,
|
.open = zoran_open,
|
||||||
.release = zoran_close,
|
.release = zoran_close,
|
||||||
.ioctl = video_ioctl2,
|
.unlocked_ioctl = zoran_ioctl,
|
||||||
.read = zoran_read,
|
.read = zoran_read,
|
||||||
.write = zoran_write,
|
.write = zoran_write,
|
||||||
.mmap = zoran_mmap,
|
.mmap = zoran_mmap,
|
||||||
|
|
|
@ -1032,6 +1032,7 @@ static int vidioc_s_std (struct file *file, void *priv, v4l2_std_id *norm)
|
||||||
struct tm6000_fh *fh=priv;
|
struct tm6000_fh *fh=priv;
|
||||||
struct tm6000_core *dev = fh->dev;
|
struct tm6000_core *dev = fh->dev;
|
||||||
|
|
||||||
|
dev->norm = *norm;
|
||||||
rc = tm6000_init_analog_mode(dev);
|
rc = tm6000_init_analog_mode(dev);
|
||||||
|
|
||||||
fh->width = dev->width;
|
fh->width = dev->width;
|
||||||
|
|
Loading…
Reference in New Issue