提交 fd9a40da 编写于 作者: M Mauro Carvalho Chehab

V4L/DVB (12859): go7007: semaphore -> mutex conversion

Signed-off-by: NHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 028d4c98
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/semaphore.h> #include <linux/mutex.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
...@@ -140,9 +140,9 @@ int go7007_boot_encoder(struct go7007 *go, int init_i2c) ...@@ -140,9 +140,9 @@ int go7007_boot_encoder(struct go7007 *go, int init_i2c)
{ {
int ret; int ret;
down(&go->hw_lock); mutex_lock(&go->hw_lock);
ret = go7007_load_encoder(go); ret = go7007_load_encoder(go);
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
if (ret < 0) if (ret < 0)
return -1; return -1;
if (!init_i2c) if (!init_i2c)
...@@ -257,9 +257,9 @@ int go7007_register_encoder(struct go7007 *go) ...@@ -257,9 +257,9 @@ int go7007_register_encoder(struct go7007 *go)
printk(KERN_INFO "go7007: registering new %s\n", go->name); printk(KERN_INFO "go7007: registering new %s\n", go->name);
down(&go->hw_lock); mutex_lock(&go->hw_lock);
ret = go7007_init_encoder(go); ret = go7007_init_encoder(go);
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
if (ret < 0) if (ret < 0)
return -1; return -1;
...@@ -604,7 +604,7 @@ struct go7007 *go7007_alloc(struct go7007_board_info *board, struct device *dev) ...@@ -604,7 +604,7 @@ struct go7007 *go7007_alloc(struct go7007_board_info *board, struct device *dev)
go->tuner_type = -1; go->tuner_type = -1;
go->channel_number = 0; go->channel_number = 0;
go->name[0] = 0; go->name[0] = 0;
init_MUTEX(&go->hw_lock); mutex_init(&go->hw_lock);
init_waitqueue_head(&go->frame_waitq); init_waitqueue_head(&go->frame_waitq);
spin_lock_init(&go->spinlock); spin_lock_init(&go->spinlock);
go->video_dev = NULL; go->video_dev = NULL;
......
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
#include <linux/time.h> #include <linux/time.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/semaphore.h> #include <linux/mutex.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
/* There is only one I2C port on the TW2804 that feeds all four GO7007 VIPs /* There is only one I2C port on the TW2804 that feeds all four GO7007 VIPs
* on the Adlink PCI-MPG24, so access is shared between all of them. */ * on the Adlink PCI-MPG24, so access is shared between all of them. */
static DECLARE_MUTEX(adlink_mpg24_i2c_lock); static DEFINE_MUTEX(adlink_mpg24_i2c_lock);
static int go7007_i2c_xfer(struct go7007 *go, u16 addr, int read, static int go7007_i2c_xfer(struct go7007 *go, u16 addr, int read,
u16 command, int flags, u8 *data) u16 command, int flags, u8 *data)
...@@ -69,11 +69,11 @@ static int go7007_i2c_xfer(struct go7007 *go, u16 addr, int read, ...@@ -69,11 +69,11 @@ static int go7007_i2c_xfer(struct go7007 *go, u16 addr, int read,
*data, command, addr); *data, command, addr);
#endif #endif
down(&go->hw_lock); mutex_lock(&go->hw_lock);
if (go->board_id == GO7007_BOARDID_ADLINK_MPG24) { if (go->board_id == GO7007_BOARDID_ADLINK_MPG24) {
/* Bridge the I2C port on this GO7007 to the shared bus */ /* Bridge the I2C port on this GO7007 to the shared bus */
down(&adlink_mpg24_i2c_lock); mutex_lock(&adlink_mpg24_i2c_lock);
go7007_write_addr(go, 0x3c82, 0x0020); go7007_write_addr(go, 0x3c82, 0x0020);
} }
...@@ -134,9 +134,9 @@ static int go7007_i2c_xfer(struct go7007 *go, u16 addr, int read, ...@@ -134,9 +134,9 @@ static int go7007_i2c_xfer(struct go7007 *go, u16 addr, int read,
if (go->board_id == GO7007_BOARDID_ADLINK_MPG24) { if (go->board_id == GO7007_BOARDID_ADLINK_MPG24) {
/* Isolate the I2C port on this GO7007 from the shared bus */ /* Isolate the I2C port on this GO7007 from the shared bus */
go7007_write_addr(go, 0x3c82, 0x0000); go7007_write_addr(go, 0x3c82, 0x0000);
up(&adlink_mpg24_i2c_lock); mutex_unlock(&adlink_mpg24_i2c_lock);
} }
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
return ret; return ret;
} }
......
...@@ -132,7 +132,7 @@ struct go7007_buffer { ...@@ -132,7 +132,7 @@ struct go7007_buffer {
struct go7007_file { struct go7007_file {
struct go7007 *go; struct go7007 *go;
struct semaphore lock; struct mutex lock;
int buf_count; int buf_count;
struct go7007_buffer *bufs; struct go7007_buffer *bufs;
}; };
...@@ -170,7 +170,7 @@ struct go7007 { ...@@ -170,7 +170,7 @@ struct go7007 {
int ref_count; int ref_count;
enum { STATUS_INIT, STATUS_ONLINE, STATUS_SHUTDOWN } status; enum { STATUS_INIT, STATUS_ONLINE, STATUS_SHUTDOWN } status;
spinlock_t spinlock; spinlock_t spinlock;
struct semaphore hw_lock; struct mutex hw_lock;
int streaming; int streaming;
int in_use; int in_use;
int audio_enabled; int audio_enabled;
...@@ -240,7 +240,7 @@ struct go7007 { ...@@ -240,7 +240,7 @@ struct go7007 {
unsigned short interrupt_data; unsigned short interrupt_data;
}; };
/* All of these must be called with the hpi_lock semaphore held! */ /* All of these must be called with the hpi_lock mutex held! */
#define go7007_interface_reset(go) \ #define go7007_interface_reset(go) \
((go)->hpi_ops->interface_reset(go)) ((go)->hpi_ops->interface_reset(go))
#define go7007_write_interrupt(go, x, y) \ #define go7007_write_interrupt(go, x, y) \
......
...@@ -62,7 +62,7 @@ struct go7007_usb_board { ...@@ -62,7 +62,7 @@ struct go7007_usb_board {
struct go7007_usb { struct go7007_usb {
struct go7007_usb_board *board; struct go7007_usb_board *board;
struct semaphore i2c_lock; struct mutex i2c_lock;
struct usb_device *usbdev; struct usb_device *usbdev;
struct urb *video_urbs[8]; struct urb *video_urbs[8];
struct urb *audio_urbs[8]; struct urb *audio_urbs[8];
...@@ -734,7 +734,7 @@ static int go7007_usb_read_interrupt(struct go7007 *go) ...@@ -734,7 +734,7 @@ static int go7007_usb_read_interrupt(struct go7007 *go)
static void go7007_usb_read_video_pipe_complete(struct urb *urb) static void go7007_usb_read_video_pipe_complete(struct urb *urb)
{ {
struct go7007 *go = (struct go7007 *)urb->context; struct go7007 *go = (struct go7007 *)urb->context;
int r, status = urb-> status; int r, status = urb->status;
if (!go->streaming) { if (!go->streaming) {
wake_up_interruptible(&go->frame_waitq); wake_up_interruptible(&go->frame_waitq);
...@@ -877,7 +877,7 @@ static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter, ...@@ -877,7 +877,7 @@ static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,
if (go->status == STATUS_SHUTDOWN) if (go->status == STATUS_SHUTDOWN)
return -1; return -1;
down(&usb->i2c_lock); mutex_lock(&usb->i2c_lock);
for (i = 0; i < num; ++i) { for (i = 0; i < num; ++i) {
/* The hardware command is "write some bytes then read some /* The hardware command is "write some bytes then read some
...@@ -935,7 +935,7 @@ static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter, ...@@ -935,7 +935,7 @@ static int go7007_usb_i2c_master_xfer(struct i2c_adapter *adapter,
ret = 0; ret = 0;
i2c_done: i2c_done:
up(&usb->i2c_lock); mutex_unlock(&usb->i2c_lock);
return ret; return ret;
} }
...@@ -1065,7 +1065,7 @@ static int go7007_usb_probe(struct usb_interface *intf, ...@@ -1065,7 +1065,7 @@ static int go7007_usb_probe(struct usb_interface *intf,
if (board->flags & GO7007_USB_EZUSB_I2C) { if (board->flags & GO7007_USB_EZUSB_I2C) {
memcpy(&go->i2c_adapter, &go7007_usb_adap_templ, memcpy(&go->i2c_adapter, &go7007_usb_adap_templ,
sizeof(go7007_usb_adap_templ)); sizeof(go7007_usb_adap_templ));
init_MUTEX(&usb->i2c_lock); mutex_init(&usb->i2c_lock);
go->i2c_adapter.dev.parent = go->dev; go->i2c_adapter.dev.parent = go->dev;
i2c_set_adapdata(&go->i2c_adapter, go); i2c_set_adapdata(&go->i2c_adapter, go);
if (i2c_add_adapter(&go->i2c_adapter) < 0) { if (i2c_add_adapter(&go->i2c_adapter) < 0) {
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include <media/v4l2-ioctl.h> #include <media/v4l2-ioctl.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/semaphore.h> #include <linux/mutex.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -75,7 +75,7 @@ static int go7007_streamoff(struct go7007 *go) ...@@ -75,7 +75,7 @@ static int go7007_streamoff(struct go7007 *go)
int retval = -EINVAL; int retval = -EINVAL;
unsigned long flags; unsigned long flags;
down(&go->hw_lock); mutex_lock(&go->hw_lock);
if (go->streaming) { if (go->streaming) {
go->streaming = 0; go->streaming = 0;
go7007_stream_stop(go); go7007_stream_stop(go);
...@@ -85,7 +85,7 @@ static int go7007_streamoff(struct go7007 *go) ...@@ -85,7 +85,7 @@ static int go7007_streamoff(struct go7007 *go)
go7007_reset_encoder(go); go7007_reset_encoder(go);
retval = 0; retval = 0;
} }
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
return 0; return 0;
} }
...@@ -101,7 +101,7 @@ static int go7007_open(struct file *file) ...@@ -101,7 +101,7 @@ static int go7007_open(struct file *file)
return -ENOMEM; return -ENOMEM;
++go->ref_count; ++go->ref_count;
gofh->go = go; gofh->go = go;
init_MUTEX(&gofh->lock); mutex_init(&gofh->lock);
gofh->buf_count = 0; gofh->buf_count = 0;
file->private_data = gofh; file->private_data = gofh;
return 0; return 0;
...@@ -705,14 +705,14 @@ static int vidioc_reqbufs(struct file *file, void *priv, ...@@ -705,14 +705,14 @@ static int vidioc_reqbufs(struct file *file, void *priv,
req->memory != V4L2_MEMORY_MMAP) req->memory != V4L2_MEMORY_MMAP)
return -EINVAL; return -EINVAL;
down(&gofh->lock); mutex_lock(&gofh->lock);
for (i = 0; i < gofh->buf_count; ++i) for (i = 0; i < gofh->buf_count; ++i)
if (gofh->bufs[i].mapped > 0) if (gofh->bufs[i].mapped > 0)
goto unlock_and_return; goto unlock_and_return;
down(&go->hw_lock); mutex_lock(&go->hw_lock);
if (go->in_use > 0 && gofh->buf_count == 0) { if (go->in_use > 0 && gofh->buf_count == 0) {
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
goto unlock_and_return; goto unlock_and_return;
} }
...@@ -731,7 +731,7 @@ static int vidioc_reqbufs(struct file *file, void *priv, ...@@ -731,7 +731,7 @@ static int vidioc_reqbufs(struct file *file, void *priv,
GFP_KERNEL); GFP_KERNEL);
if (!gofh->bufs) { if (!gofh->bufs) {
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
goto unlock_and_return; goto unlock_and_return;
} }
...@@ -750,8 +750,8 @@ static int vidioc_reqbufs(struct file *file, void *priv, ...@@ -750,8 +750,8 @@ static int vidioc_reqbufs(struct file *file, void *priv,
} }
gofh->buf_count = count; gofh->buf_count = count;
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
up(&gofh->lock); mutex_unlock(&gofh->lock);
memset(req, 0, sizeof(*req)); memset(req, 0, sizeof(*req));
...@@ -762,7 +762,7 @@ static int vidioc_reqbufs(struct file *file, void *priv, ...@@ -762,7 +762,7 @@ static int vidioc_reqbufs(struct file *file, void *priv,
return 0; return 0;
unlock_and_return: unlock_and_return:
up(&gofh->lock); mutex_unlock(&gofh->lock);
return retval; return retval;
} }
...@@ -778,7 +778,7 @@ static int vidioc_querybuf(struct file *file, void *priv, ...@@ -778,7 +778,7 @@ static int vidioc_querybuf(struct file *file, void *priv,
index = buf->index; index = buf->index;
down(&gofh->lock); mutex_lock(&gofh->lock);
if (index >= gofh->buf_count) if (index >= gofh->buf_count)
goto unlock_and_return; goto unlock_and_return;
...@@ -802,12 +802,12 @@ static int vidioc_querybuf(struct file *file, void *priv, ...@@ -802,12 +802,12 @@ static int vidioc_querybuf(struct file *file, void *priv,
buf->memory = V4L2_MEMORY_MMAP; buf->memory = V4L2_MEMORY_MMAP;
buf->m.offset = index * GO7007_BUF_SIZE; buf->m.offset = index * GO7007_BUF_SIZE;
buf->length = GO7007_BUF_SIZE; buf->length = GO7007_BUF_SIZE;
up(&gofh->lock); mutex_unlock(&gofh->lock);
return 0; return 0;
unlock_and_return: unlock_and_return:
up(&gofh->lock); mutex_unlock(&gofh->lock);
return retval; return retval;
} }
...@@ -824,7 +824,7 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) ...@@ -824,7 +824,7 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
buf->memory != V4L2_MEMORY_MMAP) buf->memory != V4L2_MEMORY_MMAP)
return retval; return retval;
down(&gofh->lock); mutex_lock(&gofh->lock);
if (buf->index < 0 || buf->index >= gofh->buf_count) if (buf->index < 0 || buf->index >= gofh->buf_count)
goto unlock_and_return; goto unlock_and_return;
...@@ -865,12 +865,12 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf) ...@@ -865,12 +865,12 @@ static int vidioc_qbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
spin_lock_irqsave(&go->spinlock, flags); spin_lock_irqsave(&go->spinlock, flags);
list_add_tail(&gobuf->stream, &go->stream); list_add_tail(&gobuf->stream, &go->stream);
spin_unlock_irqrestore(&go->spinlock, flags); spin_unlock_irqrestore(&go->spinlock, flags);
up(&gofh->lock); mutex_unlock(&gofh->lock);
return 0; return 0;
unlock_and_return: unlock_and_return:
up(&gofh->lock); mutex_unlock(&gofh->lock);
return retval; return retval;
} }
...@@ -890,7 +890,7 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) ...@@ -890,7 +890,7 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
if (buf->memory != V4L2_MEMORY_MMAP) if (buf->memory != V4L2_MEMORY_MMAP)
return retval; return retval;
down(&gofh->lock); mutex_lock(&gofh->lock);
if (list_empty(&go->stream)) if (list_empty(&go->stream))
goto unlock_and_return; goto unlock_and_return;
gobuf = list_entry(go->stream.next, gobuf = list_entry(go->stream.next,
...@@ -934,11 +934,11 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf) ...@@ -934,11 +934,11 @@ static int vidioc_dqbuf(struct file *file, void *priv, struct v4l2_buffer *buf)
buf->length = GO7007_BUF_SIZE; buf->length = GO7007_BUF_SIZE;
buf->reserved = gobuf->modet_active; buf->reserved = gobuf->modet_active;
up(&gofh->lock); mutex_unlock(&gofh->lock);
return 0; return 0;
unlock_and_return: unlock_and_return:
up(&gofh->lock); mutex_unlock(&gofh->lock);
return retval; return retval;
} }
...@@ -952,8 +952,8 @@ static int vidioc_streamon(struct file *file, void *priv, ...@@ -952,8 +952,8 @@ static int vidioc_streamon(struct file *file, void *priv,
if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE) if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL; return -EINVAL;
down(&gofh->lock); mutex_lock(&gofh->lock);
down(&go->hw_lock); mutex_lock(&go->hw_lock);
if (!go->streaming) { if (!go->streaming) {
go->streaming = 1; go->streaming = 1;
...@@ -964,8 +964,8 @@ static int vidioc_streamon(struct file *file, void *priv, ...@@ -964,8 +964,8 @@ static int vidioc_streamon(struct file *file, void *priv,
else else
retval = 0; retval = 0;
} }
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
up(&gofh->lock); mutex_unlock(&gofh->lock);
return retval; return retval;
} }
...@@ -978,9 +978,9 @@ static int vidioc_streamoff(struct file *file, void *priv, ...@@ -978,9 +978,9 @@ static int vidioc_streamoff(struct file *file, void *priv,
if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE) if (type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
return -EINVAL; return -EINVAL;
down(&gofh->lock); mutex_lock(&gofh->lock);
go7007_streamoff(go); go7007_streamoff(go);
up(&gofh->lock); mutex_unlock(&gofh->lock);
return 0; return 0;
} }
...@@ -1734,18 +1734,18 @@ static int go7007_mmap(struct file *file, struct vm_area_struct *vma) ...@@ -1734,18 +1734,18 @@ static int go7007_mmap(struct file *file, struct vm_area_struct *vma)
return -EINVAL; /* only support VM_SHARED mapping */ return -EINVAL; /* only support VM_SHARED mapping */
if (vma->vm_end - vma->vm_start != GO7007_BUF_SIZE) if (vma->vm_end - vma->vm_start != GO7007_BUF_SIZE)
return -EINVAL; /* must map exactly one full buffer */ return -EINVAL; /* must map exactly one full buffer */
down(&gofh->lock); mutex_lock(&gofh->lock);
index = vma->vm_pgoff / GO7007_BUF_PAGES; index = vma->vm_pgoff / GO7007_BUF_PAGES;
if (index >= gofh->buf_count) { if (index >= gofh->buf_count) {
up(&gofh->lock); mutex_unlock(&gofh->lock);
return -EINVAL; /* trying to map beyond requested buffers */ return -EINVAL; /* trying to map beyond requested buffers */
} }
if (index * GO7007_BUF_PAGES != vma->vm_pgoff) { if (index * GO7007_BUF_PAGES != vma->vm_pgoff) {
up(&gofh->lock); mutex_unlock(&gofh->lock);
return -EINVAL; /* offset is not aligned on buffer boundary */ return -EINVAL; /* offset is not aligned on buffer boundary */
} }
if (gofh->bufs[index].mapped > 0) { if (gofh->bufs[index].mapped > 0) {
up(&gofh->lock); mutex_unlock(&gofh->lock);
return -EBUSY; return -EBUSY;
} }
gofh->bufs[index].mapped = 1; gofh->bufs[index].mapped = 1;
...@@ -1754,7 +1754,7 @@ static int go7007_mmap(struct file *file, struct vm_area_struct *vma) ...@@ -1754,7 +1754,7 @@ static int go7007_mmap(struct file *file, struct vm_area_struct *vma)
vma->vm_flags |= VM_DONTEXPAND; vma->vm_flags |= VM_DONTEXPAND;
vma->vm_flags &= ~VM_IO; vma->vm_flags &= ~VM_IO;
vma->vm_private_data = &gofh->bufs[index]; vma->vm_private_data = &gofh->bufs[index];
up(&gofh->lock); mutex_unlock(&gofh->lock);
return 0; return 0;
} }
...@@ -1862,7 +1862,7 @@ void go7007_v4l2_remove(struct go7007 *go) ...@@ -1862,7 +1862,7 @@ void go7007_v4l2_remove(struct go7007 *go)
{ {
unsigned long flags; unsigned long flags;
down(&go->hw_lock); mutex_lock(&go->hw_lock);
if (go->streaming) { if (go->streaming) {
go->streaming = 0; go->streaming = 0;
go7007_stream_stop(go); go7007_stream_stop(go);
...@@ -1870,7 +1870,7 @@ void go7007_v4l2_remove(struct go7007 *go) ...@@ -1870,7 +1870,7 @@ void go7007_v4l2_remove(struct go7007 *go)
abort_queued(go); abort_queued(go);
spin_unlock_irqrestore(&go->spinlock, flags); spin_unlock_irqrestore(&go->spinlock, flags);
} }
up(&go->hw_lock); mutex_unlock(&go->hw_lock);
if (go->video_dev) if (go->video_dev)
video_unregister_device(go->video_dev); video_unregister_device(go->video_dev);
} }
...@@ -2,7 +2,7 @@ This is a driver for the WIS GO7007SB multi-format video encoder. ...@@ -2,7 +2,7 @@ This is a driver for the WIS GO7007SB multi-format video encoder.
Pete Eberlein <pete@sensoray.com> Pete Eberlein <pete@sensoray.com>
The driver was originally released under the GPL and is currently hosted at: The driver was orignally released under the GPL and is currently hosted at:
http://nikosapi.org/wiki/index.php/WIS_Go7007_Linux_driver http://nikosapi.org/wiki/index.php/WIS_Go7007_Linux_driver
The go7007 firmware can be acquired from the package on the site above. The go7007 firmware can be acquired from the package on the site above.
...@@ -24,7 +24,7 @@ These should be used instead of the non-standard GO7007 ioctls described ...@@ -24,7 +24,7 @@ These should be used instead of the non-standard GO7007 ioctls described
below. below.
The README files from the original package appears below: The README files from the orignal package appear below:
--------------------------------------------------------------------------- ---------------------------------------------------------------------------
WIS GO7007SB Public Linux Driver WIS GO7007SB Public Linux Driver
......
...@@ -21,12 +21,10 @@ ...@@ -21,12 +21,10 @@
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#include <media/v4l2-common.h> #include <media/v4l2-common.h>
#include "s2250-loader.h"
#include "go7007-priv.h" #include "go7007-priv.h"
#include "wis-i2c.h" #include "wis-i2c.h"
extern int s2250loader_init(void);
extern void s2250loader_cleanup(void);
#define TLV320_ADDRESS 0x34 #define TLV320_ADDRESS 0x34
#define VPX322_ADDR_ANALOGCONTROL1 0x02 #define VPX322_ADDR_ANALOGCONTROL1 0x02
#define VPX322_ADDR_BRIGHTNESS0 0x0127 #define VPX322_ADDR_BRIGHTNESS0 0x0127
...@@ -43,7 +41,7 @@ struct go7007_usb_board { ...@@ -43,7 +41,7 @@ struct go7007_usb_board {
struct go7007_usb { struct go7007_usb {
struct go7007_usb_board *board; struct go7007_usb_board *board;
struct semaphore i2c_lock; struct mutex i2c_lock;
struct usb_device *usbdev; struct usb_device *usbdev;
struct urb *video_urbs[8]; struct urb *video_urbs[8];
struct urb *audio_urbs[8]; struct urb *audio_urbs[8];
...@@ -165,7 +163,7 @@ static int write_reg(struct i2c_client *client, u8 reg, u8 value) ...@@ -165,7 +163,7 @@ static int write_reg(struct i2c_client *client, u8 reg, u8 value)
return -ENOMEM; return -ENOMEM;
usb = go->hpi_context; usb = go->hpi_context;
if (down_interruptible(&usb->i2c_lock) != 0) { if (mutex_lock_interruptible(&usb->i2c_lock) != 0) {
printk(KERN_INFO "i2c lock failed\n"); printk(KERN_INFO "i2c lock failed\n");
kfree(buf); kfree(buf);
return -EINTR; return -EINTR;
...@@ -175,7 +173,7 @@ static int write_reg(struct i2c_client *client, u8 reg, u8 value) ...@@ -175,7 +173,7 @@ static int write_reg(struct i2c_client *client, u8 reg, u8 value)
buf, buf,
16, 1); 16, 1);
up(&usb->i2c_lock); mutex_unlock(&usb->i2c_lock);
kfree(buf); kfree(buf);
return rc; return rc;
} }
...@@ -203,14 +201,14 @@ static int write_reg_fp(struct i2c_client *client, u16 addr, u16 val) ...@@ -203,14 +201,14 @@ static int write_reg_fp(struct i2c_client *client, u16 addr, u16 val)
memset(buf, 0xcd, 6); memset(buf, 0xcd, 6);
usb = go->hpi_context; usb = go->hpi_context;
if (down_interruptible(&usb->i2c_lock) != 0) { if (mutex_lock_interruptible(&usb->i2c_lock) != 0) {
printk(KERN_INFO "i2c lock failed\n"); printk(KERN_INFO "i2c lock failed\n");
return -EINTR; return -EINTR;
} }
if (go7007_usb_vendor_request(go, 0x57, addr, val, buf, 16, 1) < 0) if (go7007_usb_vendor_request(go, 0x57, addr, val, buf, 16, 1) < 0)
return -EFAULT; return -EFAULT;
up(&usb->i2c_lock); mutex_unlock(&usb->i2c_lock);
if (buf[0] == 0) { if (buf[0] == 0) {
unsigned int subaddr, val_read; unsigned int subaddr, val_read;
...@@ -541,7 +539,7 @@ static int s2250_probe(struct i2c_client *client, ...@@ -541,7 +539,7 @@ static int s2250_probe(struct i2c_client *client,
dec->audio_input = 0; dec->audio_input = 0;
write_reg(client, 0x08, 0x02); /* Line In */ write_reg(client, 0x08, 0x02); /* Line In */
if (down_interruptible(&usb->i2c_lock) == 0) { if (mutex_lock_interruptible(&usb->i2c_lock) == 0) {
data = kzalloc(16, GFP_KERNEL); data = kzalloc(16, GFP_KERNEL);
if (data != NULL) { if (data != NULL) {
int rc; int rc;
...@@ -560,7 +558,7 @@ static int s2250_probe(struct i2c_client *client, ...@@ -560,7 +558,7 @@ static int s2250_probe(struct i2c_client *client,
} }
kfree(data); kfree(data);
} }
up(&usb->i2c_lock); mutex_unlock(&usb->i2c_lock);
} }
printk("s2250: initialized successfully\n"); printk("s2250: initialized successfully\n");
......
...@@ -35,7 +35,7 @@ typedef struct device_extension_s { ...@@ -35,7 +35,7 @@ typedef struct device_extension_s {
#define MAX_DEVICES 256 #define MAX_DEVICES 256
static pdevice_extension_t s2250_dev_table[MAX_DEVICES]; static pdevice_extension_t s2250_dev_table[MAX_DEVICES];
static DECLARE_MUTEX(s2250_dev_table_mutex); static DEFINE_MUTEX(s2250_dev_table_mutex);
#define to_s2250loader_dev_common(d) container_of(d, device_extension_t, kref) #define to_s2250loader_dev_common(d) container_of(d, device_extension_t, kref)
static void s2250loader_delete(struct kref *kref) static void s2250loader_delete(struct kref *kref)
...@@ -67,7 +67,7 @@ static int s2250loader_probe(struct usb_interface *interface, ...@@ -67,7 +67,7 @@ static int s2250loader_probe(struct usb_interface *interface,
printk(KERN_ERR "can't handle multiple config\n"); printk(KERN_ERR "can't handle multiple config\n");
return -1; return -1;
} }
down(&s2250_dev_table_mutex); mutex_lock(&s2250_dev_table_mutex);
for (minor = 0; minor < MAX_DEVICES; minor++) { for (minor = 0; minor < MAX_DEVICES; minor++) {
if (s2250_dev_table[minor] == NULL) if (s2250_dev_table[minor] == NULL)
...@@ -96,7 +96,7 @@ static int s2250loader_probe(struct usb_interface *interface, ...@@ -96,7 +96,7 @@ static int s2250loader_probe(struct usb_interface *interface,
kref_init(&(s->kref)); kref_init(&(s->kref));
up(&s2250_dev_table_mutex); mutex_unlock(&s2250_dev_table_mutex);
if (request_firmware(&fw, S2250_LOADER_FIRMWARE, &usbdev->dev)) { if (request_firmware(&fw, S2250_LOADER_FIRMWARE, &usbdev->dev)) {
printk(KERN_ERR printk(KERN_ERR
...@@ -128,7 +128,7 @@ static int s2250loader_probe(struct usb_interface *interface, ...@@ -128,7 +128,7 @@ static int s2250loader_probe(struct usb_interface *interface,
return 0; return 0;
failed: failed:
up(&s2250_dev_table_mutex); mutex_unlock(&s2250_dev_table_mutex);
failed2: failed2:
if (s) if (s)
kref_put(&(s->kref), s2250loader_delete); kref_put(&(s->kref), s2250loader_delete);
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#include <linux/time.h> #include <linux/time.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/semaphore.h> #include <linux/mutex.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <asm/system.h> #include <asm/system.h>
#include <sound/core.h> #include <sound/core.h>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册