aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2014-12-05 15:08:22 -0500
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>2015-01-29 15:44:00 -0500
commit68c16a76c64e2cd9c0dd4bda6400a3f28e82488e (patch)
treebae0d38e3074406fa8665a751e3cd76d08938c67
parent1ee5e7dd5eced2ec13d3810c55b4ecd73cb5c92f (diff)
[media] si2168: enhance firmware download routine
All known old firmware firmware formats are downloaded using 8 byte chunks. Reject firmware if it could not be divided to 8 byte chunks and because of that we could simplify some calculations. Now both supported firmware download routines are rather similar. Cc: Olli Salonen <olli.salonen@iki.fi> Signed-off-by: Antti Palosaari <crope@iki.fi> Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
-rw-r--r--drivers/media/dvb-frontends/si2168.c34
1 files changed, 15 insertions, 19 deletions
diff --git a/drivers/media/dvb-frontends/si2168.c b/drivers/media/dvb-frontends/si2168.c
index 06e54d10cc4f..66b9c9ca28f4 100644
--- a/drivers/media/dvb-frontends/si2168.c
+++ b/drivers/media/dvb-frontends/si2168.c
@@ -348,7 +348,6 @@ static int si2168_init(struct dvb_frontend *fe)
348 int ret, len, remaining; 348 int ret, len, remaining;
349 const struct firmware *fw = NULL; 349 const struct firmware *fw = NULL;
350 u8 *fw_file; 350 u8 *fw_file;
351 const unsigned int i2c_wr_max = 8;
352 struct si2168_cmd cmd; 351 struct si2168_cmd cmd;
353 unsigned int chip_id; 352 unsigned int chip_id;
354 353
@@ -459,31 +458,28 @@ static int si2168_init(struct dvb_frontend *fe)
459 cmd.wlen = len; 458 cmd.wlen = len;
460 cmd.rlen = 1; 459 cmd.rlen = 1;
461 ret = si2168_cmd_execute(client, &cmd); 460 ret = si2168_cmd_execute(client, &cmd);
462 if (ret) { 461 if (ret)
463 dev_err(&client->dev, 462 break;
464 "firmware download failed=%d\n",
465 ret);
466 goto err_release_firmware;
467 }
468 } 463 }
469 } else { 464 } else if (fw->size % 8 == 0) {
470 /* firmware is in the old format */ 465 /* firmware is in the old format */
471 for (remaining = fw->size; remaining > 0; remaining -= i2c_wr_max) { 466 for (remaining = fw->size; remaining > 0; remaining -= 8) {
472 len = remaining; 467 len = 8;
473 if (len > i2c_wr_max)
474 len = i2c_wr_max;
475
476 memcpy(cmd.args, &fw->data[fw->size - remaining], len); 468 memcpy(cmd.args, &fw->data[fw->size - remaining], len);
477 cmd.wlen = len; 469 cmd.wlen = len;
478 cmd.rlen = 1; 470 cmd.rlen = 1;
479 ret = si2168_cmd_execute(client, &cmd); 471 ret = si2168_cmd_execute(client, &cmd);
480 if (ret) { 472 if (ret)
481 dev_err(&client->dev, 473 break;
482 "firmware download failed=%d\n",
483 ret);
484 goto err_release_firmware;
485 }
486 } 474 }
475 } else {
476 /* bad or unknown firmware format */
477 ret = -EINVAL;
478 }
479
480 if (ret) {
481 dev_err(&client->dev, "firmware download failed %d\n", ret);
482 goto err_release_firmware;
487 } 483 }
488 484
489 release_firmware(fw); 485 release_firmware(fw);