Moro, I'll test it once more when testing the "si2157 sleep hack" you posted. Though I remember that the command 85 seemed to be the magic trick that finally made it work - I agree it sounds a bit strange considering it's run later on anyway. The proprietary driver seems to do a command 85 after wake up, but of course that's not a guarantee of anything. My sniff using the proprietary driver is here: http://trsqr.net/olli/ct2-4400/ct2-4400-wakeup-tune-sleep.txt Cheers, -olli On 5 September 2014 11:36, Antti Palosaari <crope@xxxxxx> wrote: > Moikka > Did you really need command 85 here? It will be given later in any case. For > my Si2168 B40 there was no need for it. > > regards > Antti > > On 08/25/2014 09:07 PM, Olli Salonen wrote: >> >> 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: Olli Salonen <olli.salonen@xxxxxx> >> --- >> drivers/media/dvb-frontends/si2168.c | 31 >> ++++++++++++++++++++++++++++--- >> drivers/media/dvb-frontends/si2168_priv.h | 1 + >> 2 files changed, 29 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/media/dvb-frontends/si2168.c >> b/drivers/media/dvb-frontends/si2168.c >> index 55a4212..a0797fd 100644 >> --- a/drivers/media/dvb-frontends/si2168.c >> +++ b/drivers/media/dvb-frontends/si2168.c >> @@ -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); >> >> diff --git a/drivers/media/dvb-frontends/si2168_priv.h >> b/drivers/media/dvb-frontends/si2168_priv.h >> index 0f83284..e13983e 100644 >> --- a/drivers/media/dvb-frontends/si2168_priv.h >> +++ b/drivers/media/dvb-frontends/si2168_priv.h >> @@ -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; >> }; >> >> > > -- > http://palosaari.fi/ -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html