V4L/DVB (13712): [Mantis] Add locking for concurrent access
authorManu Abraham <abraham.manu@gmail.com>
Thu, 3 Dec 2009 08:42:10 +0000 (05:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sun, 17 Jan 2010 13:55:29 +0000 (11:55 -0200)
Signed-off-by: Manu Abraham <manu@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/mantis/mantis_common.h
drivers/media/dvb/mantis/mantis_i2c.c

index 197393e700f7a3d110a41642416a8ac777deac63..e354e7678a57b652e613be8d1a726236a3ade3b4 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/moduleparam.h>
 #include <linux/kernel.h>
 #include <linux/pci.h>
+#include <linux/mutex.h>
 
 #include "dvbdev.h"
 #include "dvb_demux.h"
@@ -109,6 +110,7 @@ struct mantis_pci {
        struct i2c_adapter      adapter;
        int                     i2c_rc;
        wait_queue_head_t       i2c_wq;
+       struct mutex            i2c_lock;
 
        /*      DVB stuff               */
        struct dvb_adapter      dvb_adapter;
index 53c5f88227be56a5cbfffb86af93a3175898a4f0..39fabe572c2e21d25562fc7ba5a6155643c9f6f1 100644 (file)
@@ -125,6 +125,7 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
        struct mantis_pci *mantis;
 
        mantis = i2c_get_adapdata(adapter);
+       mutex_lock(&mantis->i2c_lock);
        for (i = 0; i < num; i++) {
                if (msgs[i].flags & I2C_M_RD)
                        ret = mantis_i2c_read(mantis, &msgs[i]);
@@ -134,6 +135,7 @@ static int mantis_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, in
                if (ret < 0)
                        return ret;
        }
+       mutex_unlock(&mantis->i2c_lock);
 
        return num;
 }
@@ -160,6 +162,7 @@ int __devinit mantis_i2c_init(struct mantis_pci *mantis)
 {
        u32 intstat, intmask;
 
+       mutex_init(&mantis->i2c_lock);
        memcpy(&mantis->adapter, &mantis_i2c_adapter, sizeof (mantis_i2c_adapter));
        i2c_set_adapdata(&mantis->adapter, mantis);
        mantis->i2c_rc = i2c_add_adapter(&mantis->adapter);