OSDN Git Service

V4L/DVB (12956): Fix gpio mutex in NetUP Dual DVB-S2 CI card.
authorAbylay Ospan <aospan@netup.ru>
Wed, 16 Sep 2009 16:08:06 +0000 (13:08 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Sat, 19 Sep 2009 03:15:48 +0000 (00:15 -0300)
The card uses the same cx23885 gpio lines for two adapters.
In case of there is several cards in system we must implement
gpio mutex per cx23885 chip.

Signed-off-by: Abylay Ospan <aospan@netup.ru>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/cx23885/cimax2.c
drivers/media/video/cx23885/cx23885-core.c
drivers/media/video/cx23885/cx23885.h

index 0316257..c04222f 100644 (file)
@@ -75,7 +75,6 @@ struct netup_ci_state {
        void *priv;
 };
 
-struct mutex gpio_mutex;/* Two CiMax's uses same GPIO lines */
 
 int netup_read_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg,
                                                u8 *buf, int len)
@@ -183,10 +182,11 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot,
        if (ret != 0)
                return ret;
 
-       mutex_lock(&gpio_mutex);
+       mutex_lock(&dev->gpio_lock);
 
        /* write addr */
        cx_write(MC417_OEN, NETUP_EN_ALL);
+       msleep(2);
        cx_write(MC417_RWD, NETUP_CTRL_OFF |
                                NETUP_ADLO | (0xff & addr));
        cx_clear(MC417_RWD, NETUP_ADLO);
@@ -194,9 +194,10 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot,
                                NETUP_ADHI | (0xff & (addr >> 8)));
        cx_clear(MC417_RWD, NETUP_ADHI);
 
-       if (read) /* data in */
+       if (read) /* data in */
                cx_write(MC417_OEN, NETUP_EN_ALL | NETUP_DATA);
-       else /* data out */
+               msleep(2);
+       } else /* data out */
                cx_write(MC417_RWD, NETUP_CTRL_OFF | data);
 
        /* choose chip */
@@ -206,7 +207,7 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot,
        cx_clear(MC417_RWD, (read) ? NETUP_RD : NETUP_WR);
        mem = netup_ci_get_mem(dev);
 
-       mutex_unlock(&gpio_mutex);
+       mutex_unlock(&dev->gpio_lock);
 
        if (!read)
                if (mem < 0)
@@ -403,7 +404,6 @@ int netup_ci_init(struct cx23885_tsport *port)
        switch (port->nr) {
        case 1:
                state->ci_i2c_addr = 0x40;
-               mutex_init(&gpio_mutex);
                break;
        case 2:
                state->ci_i2c_addr = 0x41;
index 40d438d..c31284b 100644 (file)
@@ -758,6 +758,7 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
        int i;
 
        mutex_init(&dev->lock);
+       mutex_init(&dev->gpio_lock);
 
        atomic_inc(&dev->refcount);
 
index 86f2694..bee6891 100644 (file)
@@ -325,6 +325,7 @@ struct cx23885_dev {
 
        int                        nr;
        struct mutex               lock;
+       struct mutex               gpio_lock;
 
        /* board details */
        unsigned int               board;