Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -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;
+1 −0
Original line number Diff line number Diff line
@@ -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);

+1 −0
Original line number Diff line number Diff line
@@ -325,6 +325,7 @@ struct cx23885_dev {

	int                        nr;
	struct mutex               lock;
	struct mutex               gpio_lock;

	/* board details */
	unsigned int               board;