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

Commit 8e417224 authored by Olli Salonen's avatar Olli Salonen Committed by Mauro Carvalho Chehab
Browse files

[media] si2168: avoid firmware loading if it has been loaded previously



Add a variable to keep track if firmware is loaded or not and skip parts of the
initialization if fw is already loaded. Resume from sleep with a different
command compared to initial power up and run command 85 after resume command.
This behaviour is observed when using manufacturer provided binary-only si2168
driver for TechnoTrend CT2-4400.

Signed-off-by: default avatarOlli Salonen <olli.salonen@iki.fi>
Signed-off-by: default avatarAntti Palosaari <crope@iki.fi>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@osg.samsung.com>
parent 4cbf6ed9
Loading
Loading
Loading
Loading
+28 −3
Original line number Diff line number Diff line
@@ -363,6 +363,7 @@ static int si2168_init(struct dvb_frontend *fe)

	dev_dbg(&s->client->dev, "\n");

	/* initialize */
	memcpy(cmd.args, "\xc0\x12\x00\x0c\x00\x0d\x16\x00\x00\x00\x00\x00\x00", 13);
	cmd.wlen = 13;
	cmd.rlen = 0;
@@ -370,6 +371,26 @@ static int si2168_init(struct dvb_frontend *fe)
	if (ret)
		goto err;

	if (s->fw_loaded) {
		/* resume */
		memcpy(cmd.args, "\xc0\x06\x08\x0f\x00\x20\x21\x01", 8);
		cmd.wlen = 8;
		cmd.rlen = 1;
		ret = si2168_cmd_execute(s, &cmd);
		if (ret)
			goto err;

		memcpy(cmd.args, "\x85", 1);
		cmd.wlen = 1;
		cmd.rlen = 1;
		ret = si2168_cmd_execute(s, &cmd);
		if (ret)
			goto err;

		goto warm;
	}

	/* power up */
	memcpy(cmd.args, "\xc0\x06\x01\x0f\x00\x20\x20\x01", 8);
	cmd.wlen = 8;
	cmd.rlen = 1;
@@ -466,9 +487,6 @@ static int si2168_init(struct dvb_frontend *fe)
	if (ret)
		goto err;

	dev_info(&s->client->dev, "found a '%s' in warm state\n",
			si2168_ops.info.name);

	/* set ts mode */
	memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6);
	cmd.args[4] |= s->ts_mode;
@@ -478,6 +496,12 @@ static int si2168_init(struct dvb_frontend *fe)
	if (ret)
		goto err;

	s->fw_loaded = true;

warm:
	dev_info(&s->client->dev, "found a '%s' in warm state\n",
			si2168_ops.info.name);

	s->active = true;

	return 0;
@@ -645,6 +669,7 @@ static int si2168_probe(struct i2c_client *client,
	*config->i2c_adapter = s->adapter;
	*config->fe = &s->fe;
	s->ts_mode = config->ts_mode;
	s->fw_loaded = false;

	i2c_set_clientdata(client, s);

+1 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ struct si2168 {
	fe_delivery_system_t delivery_system;
	fe_status_t fe_status;
	bool active;
	bool fw_loaded;
	u8 ts_mode;
};