Skip to content

Commit

Permalink
media: si2168: Add ts bus coontrol, turn off bus on sleep
Browse files Browse the repository at this point in the history
commit 4458777 upstream

Includes a function to set TS MODE property os si2168. The function
either disables the TS output bus, or sets mode to config option.

When going to sleep the TS bus is turned off, this makes the driver
compatible with multiple frontend usage.

Signed-off-by: Brad Love <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
b-rad-NDi authored and 6by9 committed Mar 26, 2018
1 parent d3016c1 commit 2f2244c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 8 deletions.
38 changes: 30 additions & 8 deletions drivers/media/dvb-frontends/si2168.c
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,30 @@ static int si2168_set_frontend(struct dvb_frontend *fe)
return ret;
}

static int si2168_ts_bus_ctrl(struct dvb_frontend *fe, int acquire)
{
struct i2c_client *client = fe->demodulator_priv;
struct si2168_dev *dev = i2c_get_clientdata(client);
struct si2168_cmd cmd;
int ret = 0;

dev_dbg(&client->dev, "%s acquire: %d\n", __func__, acquire);

/* set TS_MODE property */
memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6);
if (acquire)
cmd.args[4] |= dev->ts_mode;
else
cmd.args[4] |= SI2168_TS_TRISTATE;
if (dev->ts_clock_gapped)
cmd.args[4] |= 0x40;
cmd.wlen = 6;
cmd.rlen = 4;
ret = si2168_cmd_execute(client, &cmd);

return ret;
}

static int si2168_init(struct dvb_frontend *fe)
{
struct i2c_client *client = fe->demodulator_priv;
Expand Down Expand Up @@ -537,14 +561,7 @@ static int si2168_init(struct dvb_frontend *fe)
dev->version >> 24 & 0xff, dev->version >> 16 & 0xff,
dev->version >> 8 & 0xff, dev->version >> 0 & 0xff);

/* set ts mode */
memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6);
cmd.args[4] |= dev->ts_mode;
if (dev->ts_clock_gapped)
cmd.args[4] |= 0x40;
cmd.wlen = 6;
cmd.rlen = 4;
ret = si2168_cmd_execute(client, &cmd);
ret = si2168_ts_bus_ctrl(fe, 1);
if (ret)
goto err;

Expand Down Expand Up @@ -581,6 +598,9 @@ static int si2168_sleep(struct dvb_frontend *fe)

dev->active = false;

/* tri-state data bus */
si2168_ts_bus_ctrl(fe, 0);

/* Firmware B 4.0-11 or later loses warm state during sleep */
if (dev->version > ('B' << 24 | 4 << 16 | 0 << 8 | 11 << 0))
dev->warm = false;
Expand Down Expand Up @@ -678,6 +698,8 @@ static const struct dvb_frontend_ops si2168_ops = {
.init = si2168_init,
.sleep = si2168_sleep,

.ts_bus_ctrl = si2168_ts_bus_ctrl,

.set_frontend = si2168_set_frontend,

.read_status = si2168_read_status,
Expand Down
1 change: 1 addition & 0 deletions drivers/media/dvb-frontends/si2168.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ struct si2168_config {
/* TS mode */
#define SI2168_TS_PARALLEL 0x06
#define SI2168_TS_SERIAL 0x03
#define SI2168_TS_TRISTATE 0x00
u8 ts_mode;

/* TS clock inverted */
Expand Down

0 comments on commit 2f2244c

Please sign in to comment.