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

Commit e14432a5 authored by Antti Palosaari's avatar Antti Palosaari Committed by Mauro Carvalho Chehab
Browse files

[media] tda10071: protect firmware command exec with mutex



There should be clearly some lock in order to make sure firmware
command in execution is not disturbed by another command. It has
worked as callbacks are serialized somehow pretty well and command
execution happens usually without any delays.

Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 54ab48ed
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -61,25 +61,28 @@ static int tda10071_cmd_execute(struct tda10071_dev *dev,
		goto error;
	}

	mutex_lock(&dev->cmd_execute_mutex);

	/* write cmd and args for firmware */
	ret = regmap_bulk_write(dev->regmap, 0x00, cmd->args, cmd->len);
	if (ret)
		goto error;
		goto error_mutex_unlock;

	/* start cmd execution */
	ret = regmap_write(dev->regmap, 0x1f, 1);
	if (ret)
		goto error;
		goto error_mutex_unlock;

	/* wait cmd execution terminate */
	for (i = 1000, uitmp = 1; i && uitmp; i--) {
		ret = regmap_read(dev->regmap, 0x1f, &uitmp);
		if (ret)
			goto error;
			goto error_mutex_unlock;

		usleep_range(200, 5000);
	}

	mutex_unlock(&dev->cmd_execute_mutex);
	dev_dbg(&client->dev, "loop=%d\n", i);

	if (i == 0) {
@@ -88,6 +91,8 @@ static int tda10071_cmd_execute(struct tda10071_dev *dev,
	}

	return ret;
error_mutex_unlock:
	mutex_unlock(&dev->cmd_execute_mutex);
error:
	dev_dbg(&client->dev, "failed=%d\n", ret);
	return ret;
@@ -1167,6 +1172,7 @@ static int tda10071_probe(struct i2c_client *client,
	}

	dev->client = client;
	mutex_init(&dev->cmd_execute_mutex);
	dev->clk = pdata->clk;
	dev->i2c_wr_max = pdata->i2c_wr_max;
	dev->ts_mode = pdata->ts_mode;
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ struct tda10071_dev {
	struct dvb_frontend fe;
	struct i2c_client *client;
	struct regmap *regmap;
	struct mutex cmd_execute_mutex;
	u32 clk;
	u16 i2c_wr_max;
	u8 ts_mode;