Commit 8386c27f authored by Abylay Ospan's avatar Abylay Ospan Committed by Mauro Carvalho Chehab

V4L/DVB (12956): Fix gpio mutex in NetUP Dual DVB-S2 CI card.

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: default avatarAbylay Ospan <aospan@netup.ru>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 4f7cb883
...@@ -75,7 +75,6 @@ struct netup_ci_state { ...@@ -75,7 +75,6 @@ struct netup_ci_state {
void *priv; 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, int netup_read_i2c(struct i2c_adapter *i2c_adap, u8 addr, u8 reg,
u8 *buf, int len) u8 *buf, int len)
...@@ -183,10 +182,11 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, ...@@ -183,10 +182,11 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot,
if (ret != 0) if (ret != 0)
return ret; return ret;
mutex_lock(&gpio_mutex); mutex_lock(&dev->gpio_lock);
/* write addr */ /* write addr */
cx_write(MC417_OEN, NETUP_EN_ALL); cx_write(MC417_OEN, NETUP_EN_ALL);
msleep(2);
cx_write(MC417_RWD, NETUP_CTRL_OFF | cx_write(MC417_RWD, NETUP_CTRL_OFF |
NETUP_ADLO | (0xff & addr)); NETUP_ADLO | (0xff & addr));
cx_clear(MC417_RWD, NETUP_ADLO); cx_clear(MC417_RWD, NETUP_ADLO);
...@@ -194,9 +194,10 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, ...@@ -194,9 +194,10 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot,
NETUP_ADHI | (0xff & (addr >> 8))); NETUP_ADHI | (0xff & (addr >> 8)));
cx_clear(MC417_RWD, NETUP_ADHI); cx_clear(MC417_RWD, NETUP_ADHI);
if (read) /* data in */ if (read) { /* data in */
cx_write(MC417_OEN, NETUP_EN_ALL | NETUP_DATA); 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); cx_write(MC417_RWD, NETUP_CTRL_OFF | data);
/* choose chip */ /* choose chip */
...@@ -206,7 +207,7 @@ int netup_ci_op_cam(struct dvb_ca_en50221 *en50221, int slot, ...@@ -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); cx_clear(MC417_RWD, (read) ? NETUP_RD : NETUP_WR);
mem = netup_ci_get_mem(dev); mem = netup_ci_get_mem(dev);
mutex_unlock(&gpio_mutex); mutex_unlock(&dev->gpio_lock);
if (!read) if (!read)
if (mem < 0) if (mem < 0)
...@@ -403,7 +404,6 @@ int netup_ci_init(struct cx23885_tsport *port) ...@@ -403,7 +404,6 @@ int netup_ci_init(struct cx23885_tsport *port)
switch (port->nr) { switch (port->nr) {
case 1: case 1:
state->ci_i2c_addr = 0x40; state->ci_i2c_addr = 0x40;
mutex_init(&gpio_mutex);
break; break;
case 2: case 2:
state->ci_i2c_addr = 0x41; state->ci_i2c_addr = 0x41;
......
...@@ -758,6 +758,7 @@ static int cx23885_dev_setup(struct cx23885_dev *dev) ...@@ -758,6 +758,7 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
int i; int i;
mutex_init(&dev->lock); mutex_init(&dev->lock);
mutex_init(&dev->gpio_lock);
atomic_inc(&dev->refcount); atomic_inc(&dev->refcount);
......
...@@ -325,6 +325,7 @@ struct cx23885_dev { ...@@ -325,6 +325,7 @@ struct cx23885_dev {
int nr; int nr;
struct mutex lock; struct mutex lock;
struct mutex gpio_lock;
/* board details */ /* board details */
unsigned int board; unsigned int board;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment