Re: [PATCH] si2157: Add support for Logilink VG0022A.

Mauro Carvalho Chehab
2019-10-03T11:17:50Z

Em Thu, 3 Oct 2019 12:57:50 +0200
Gonsolo <gonsolo@gmail.com> escreveu:

> Hi!
>
> Boot time:
>
> > [ 5.380991] si2168 1-0067: firmware version: B 4.0.2
>
> When starting VLC:
>
> > [ 457.677363] si2168 1-0067: downloading firmware from file
> > 'dvb-demod-si2168-b40-01.fw'
> > [ 458.631034] si2168 1-0067: firmware version: B 4.0.11
> > [ 458.650309] si2157 2-0063: unknown chip version Si21255-\xff\xff\xff
>
> There are two different firmware versions, 4.0.2 and 4.0.11. Is that expected?

It means that there's a firmware stored at the device's eeprom
(version 4.0.2). When the driver starts, it downloads a newer firmware
from the file dvb-demod-si2168-b40-01.fw.

Btw, could you please try the enclosed hack and post the results?

Thanks,
Mauro

diff --git a/drivers/media/tuners/si2157.c b/drivers/media/tuners/si2157.c
index e87040d6eca7..3ccfd602934b 100644
--- a/drivers/media/tuners/si2157.c
+++ b/drivers/media/tuners/si2157.c
@@ -76,6 +76,7 @@ static int si2157_init(struct dvb_frontend *fe)
const struct firmware *fw;
const char *fw_name;
unsigned int uitmp, chip_id;
+ int i;

dev_dbg(&client->dev, "\n");

@@ -118,16 +119,32 @@ static int si2157_init(struct dvb_frontend *fe)
goto err;
}

- /* query chip revision */
- memcpy(cmd.args, "\x02", 1);
- cmd.wlen = 1;
- cmd.rlen = 13;
- ret = si2157_cmd_execute(client, &cmd);
- if (ret)
- goto err;
+ for (i = 0; i < 10; i++) {
+ /* query chip revision */
+ memcpy(cmd.args, "\x02", 1);
+ cmd.wlen = 1;
+ cmd.rlen = 13;
+ ret = si2157_cmd_execute(client, &cmd);
+ if (ret)
+ goto err;
+
+ chip_id = cmd.args[1] << 24 | cmd.args[2] << 16 | cmd.args[3] << 8 |
+ cmd.args[4] << 0;

- chip_id = cmd.args[1] << 24 | cmd.args[2] << 16 | cmd.args[3] << 8 |
- cmd.args[4] << 0;
+ if (chip_id != 0xffffffff)
+ break;
+
+ msleep(10);
+ }
+
+ if (i)
+ dev_info(&client->dev, "Needed to wait %i ms to get chip version", i * 10);
+
+ if (chip_id == 0xffffffff) {
+ dev_err(&client->dev, "Unable to retrieve chip version\n");
+ ret = -EINVAL;
+ goto err;
+ }

#define SI2177_A30 ('A' << 24 | 77 << 16 | '3' << 8 | '0' << 0)
#define SI2158_A20 ('A' << 24 | 58 << 16 | '2' << 8 | '0' << 0)