summaryrefslogtreecommitdiff
path: root/linux/drivers/media/video/saa5249.c
diff options
context:
space:
mode:
authorJean-Francois Moine <moinejf@free.fr>2008-08-31 08:23:58 +0200
committerJean-Francois Moine <moinejf@free.fr>2008-08-31 08:23:58 +0200
commit83027ea1202394a80ca58ed8da84e207d855521e (patch)
treee785ac503165d57d3a5cfb88f20eff034d12199f /linux/drivers/media/video/saa5249.c
parentf1a52a2e70204db19b6c81bb59de2c759cefaaa6 (diff)
parent7804585be37d9aa982df2d476a795cbe459dae4a (diff)
downloadmediapointer-dvb-s2-83027ea1202394a80ca58ed8da84e207d855521e.tar.gz
mediapointer-dvb-s2-83027ea1202394a80ca58ed8da84e207d855521e.tar.bz2
merge: v4l-dvb
Diffstat (limited to 'linux/drivers/media/video/saa5249.c')
-rw-r--r--linux/drivers/media/video/saa5249.c62
1 files changed, 24 insertions, 38 deletions
diff --git a/linux/drivers/media/video/saa5249.c b/linux/drivers/media/video/saa5249.c
index 81d341a80..398089510 100644
--- a/linux/drivers/media/video/saa5249.c
+++ b/linux/drivers/media/video/saa5249.c
@@ -111,6 +111,7 @@ struct saa5249_device
int disp_mode;
int virtual_mode;
struct i2c_client *client;
+ unsigned long in_use;
struct mutex lock;
};
@@ -186,7 +187,7 @@ static int saa5249_attach(struct i2c_adapter *adap, int addr, int kind)
t->vdau[pgbuf].stopped = true;
t->is_searching[pgbuf] = false;
}
- vd->priv=t;
+ video_set_drvdata(vd, t);
/*
@@ -221,7 +222,7 @@ static int saa5249_detach(struct i2c_client *client)
struct video_device *vd = i2c_get_clientdata(client);
i2c_detach_client(client);
video_unregister_device(vd);
- kfree(vd->priv);
+ kfree(video_get_drvdata(vd));
kfree(vd);
kfree(client);
return 0;
@@ -319,8 +320,7 @@ static int do_saa5249_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, void *arg)
{
static int virtual_mode = false;
- struct video_device *vd = video_devdata(file);
- struct saa5249_device *t=vd->priv;
+ struct saa5249_device *t = video_drvdata(file);
switch(cmd)
{
@@ -618,8 +618,7 @@ static inline unsigned int vtx_fix_command(unsigned int cmd)
static int saa5249_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
- struct video_device *vd = video_devdata(file);
- struct saa5249_device *t=vd->priv;
+ struct saa5249_device *t = video_drvdata(file);
int err;
cmd = vtx_fix_command(cmd);
@@ -631,35 +630,27 @@ static int saa5249_ioctl(struct inode *inode, struct file *file,
static int saa5249_open(struct inode *inode, struct file *file)
{
- struct video_device *vd = video_devdata(file);
- struct saa5249_device *t=vd->priv;
- int err,pgbuf;
-
- lock_kernel();
- err = video_exclusive_open(inode,file);
- if (err < 0) {
- unlock_kernel();
- return err;
- }
+ struct saa5249_device *t = video_drvdata(file);
+ int pgbuf;
- if (t->client==NULL) {
- err = -ENODEV;
- goto fail;
- }
+ if (t->client == NULL)
+ return -ENODEV;
- if (i2c_senddata(t, 0, 0, -1) || /* Select R11 */
- /* Turn off parity checks (we do this ourselves) */
- i2c_senddata(t, 1, disp_modes[t->disp_mode][0], 0, -1) ||
- /* Display TV-picture, no virtual rows */
- i2c_senddata(t, 4, NUM_DAUS, disp_modes[t->disp_mode][1], disp_modes[t->disp_mode][2], 7, -1)) /* Set display to page 4 */
+ if (test_and_set_bit(0, &t->in_use))
+ return -EBUSY;
+ if (i2c_senddata(t, 0, 0, -1) || /* Select R11 */
+ /* Turn off parity checks (we do this ourselves) */
+ i2c_senddata(t, 1, disp_modes[t->disp_mode][0], 0, -1) ||
+ /* Display TV-picture, no virtual rows */
+ i2c_senddata(t, 4, NUM_DAUS, disp_modes[t->disp_mode][1], disp_modes[t->disp_mode][2], 7, -1))
+ /* Set display to page 4 */
{
- err = -EIO;
- goto fail;
+ clear_bit(0, &t->in_use);
+ return -EIO;
}
- for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++)
- {
+ for (pgbuf = 0; pgbuf < NUM_DAUS; pgbuf++) {
memset(t->vdau[pgbuf].pgbuf, ' ', sizeof(t->vdau[0].pgbuf));
memset(t->vdau[pgbuf].sregs, 0, sizeof(t->vdau[0].sregs));
memset(t->vdau[pgbuf].laststat, 0, sizeof(t->vdau[0].laststat));
@@ -669,24 +660,18 @@ static int saa5249_open(struct inode *inode, struct file *file)
t->is_searching[pgbuf] = false;
}
t->virtual_mode = false;
- unlock_kernel();
return 0;
-
- fail:
- video_exclusive_release(inode,file);
- unlock_kernel();
- return err;
}
static int saa5249_release(struct inode *inode, struct file *file)
{
- struct video_device *vd = video_devdata(file);
- struct saa5249_device *t=vd->priv;
+ struct saa5249_device *t = video_drvdata(file);
+
i2c_senddata(t, 1, 0x20, -1); /* Turn off CCT */
i2c_senddata(t, 5, 3, 3, -1); /* Turn off TV-display */
- video_exclusive_release(inode,file);
+ clear_bit(0, &t->in_use);
return 0;
}
@@ -720,6 +705,7 @@ static struct video_device saa_template =
{
.name = IF_NAME,
.fops = &saa_fops,
+ .release = video_device_release,
};
MODULE_LICENSE("GPL");