diff options
author | Olli Salonen <olli.salonen@iki.fi> | 2014-08-25 14:07:04 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@osg.samsung.com> | 2014-09-21 15:42:39 -0400 |
commit | 8e417224dfb397633601a04214841df12cd470b0 (patch) | |
tree | 02b242ed48aaea26bf100fa4766368439d856c9e /drivers/media/dvb-frontends/si2168.c | |
parent | 4cbf6ed910c88d7f6c15304f9a5a3ed86290dc06 (diff) |
[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: Olli Salonen <olli.salonen@iki.fi>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
Diffstat (limited to 'drivers/media/dvb-frontends/si2168.c')
-rw-r--r-- | drivers/media/dvb-frontends/si2168.c | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c index 55a4212aea75..a0797fd95129 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) | |||
363 | 363 | ||
364 | dev_dbg(&s->client->dev, "\n"); | 364 | dev_dbg(&s->client->dev, "\n"); |
365 | 365 | ||
366 | /* initialize */ | ||
366 | memcpy(cmd.args, "\xc0\x12\x00\x0c\x00\x0d\x16\x00\x00\x00\x00\x00\x00", 13); | 367 | memcpy(cmd.args, "\xc0\x12\x00\x0c\x00\x0d\x16\x00\x00\x00\x00\x00\x00", 13); |
367 | cmd.wlen = 13; | 368 | cmd.wlen = 13; |
368 | cmd.rlen = 0; | 369 | cmd.rlen = 0; |
@@ -370,6 +371,26 @@ static int si2168_init(struct dvb_frontend *fe) | |||
370 | if (ret) | 371 | if (ret) |
371 | goto err; | 372 | goto err; |
372 | 373 | ||
374 | if (s->fw_loaded) { | ||
375 | /* resume */ | ||
376 | memcpy(cmd.args, "\xc0\x06\x08\x0f\x00\x20\x21\x01", 8); | ||
377 | cmd.wlen = 8; | ||
378 | cmd.rlen = 1; | ||
379 | ret = si2168_cmd_execute(s, &cmd); | ||
380 | if (ret) | ||
381 | goto err; | ||
382 | |||
383 | memcpy(cmd.args, "\x85", 1); | ||
384 | cmd.wlen = 1; | ||
385 | cmd.rlen = 1; | ||
386 | ret = si2168_cmd_execute(s, &cmd); | ||
387 | if (ret) | ||
388 | goto err; | ||
389 | |||
390 | goto warm; | ||
391 | } | ||
392 | |||
393 | /* power up */ | ||
373 | memcpy(cmd.args, "\xc0\x06\x01\x0f\x00\x20\x20\x01", 8); | 394 | memcpy(cmd.args, "\xc0\x06\x01\x0f\x00\x20\x20\x01", 8); |
374 | cmd.wlen = 8; | 395 | cmd.wlen = 8; |
375 | cmd.rlen = 1; | 396 | cmd.rlen = 1; |
@@ -466,9 +487,6 @@ static int si2168_init(struct dvb_frontend *fe) | |||
466 | if (ret) | 487 | if (ret) |
467 | goto err; | 488 | goto err; |
468 | 489 | ||
469 | dev_info(&s->client->dev, "found a '%s' in warm state\n", | ||
470 | si2168_ops.info.name); | ||
471 | |||
472 | /* set ts mode */ | 490 | /* set ts mode */ |
473 | memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6); | 491 | memcpy(cmd.args, "\x14\x00\x01\x10\x10\x00", 6); |
474 | cmd.args[4] |= s->ts_mode; | 492 | cmd.args[4] |= s->ts_mode; |
@@ -478,6 +496,12 @@ static int si2168_init(struct dvb_frontend *fe) | |||
478 | if (ret) | 496 | if (ret) |
479 | goto err; | 497 | goto err; |
480 | 498 | ||
499 | s->fw_loaded = true; | ||
500 | |||
501 | warm: | ||
502 | dev_info(&s->client->dev, "found a '%s' in warm state\n", | ||
503 | si2168_ops.info.name); | ||
504 | |||
481 | s->active = true; | 505 | s->active = true; |
482 | 506 | ||
483 | return 0; | 507 | return 0; |
@@ -645,6 +669,7 @@ static int si2168_probe(struct i2c_client *client, | |||
645 | *config->i2c_adapter = s->adapter; | 669 | *config->i2c_adapter = s->adapter; |
646 | *config->fe = &s->fe; | 670 | *config->fe = &s->fe; |
647 | s->ts_mode = config->ts_mode; | 671 | s->ts_mode = config->ts_mode; |
672 | s->fw_loaded = false; | ||
648 | 673 | ||
649 | i2c_set_clientdata(client, s); | 674 | i2c_set_clientdata(client, s); |
650 | 675 | ||