aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends/si2168.c
diff options
context:
space:
mode:
authorOlli Salonen <olli.salonen@iki.fi>2014-08-25 14:07:04 -0400
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2014-09-21 15:42:39 -0400
commit8e417224dfb397633601a04214841df12cd470b0 (patch)
tree02b242ed48aaea26bf100fa4766368439d856c9e /drivers/media/dvb-frontends/si2168.c
parent4cbf6ed910c88d7f6c15304f9a5a3ed86290dc06 (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.c31
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
501warm:
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