media: si2157: Check error status bit on cmd execute
authorBrad Love <brad@nextdimension.cc>
Thu, 14 Nov 2019 20:03:56 +0000 (21:03 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Tue, 21 Apr 2020 14:44:58 +0000 (16:44 +0200)
Check error status bit on command execute, if error bit is
set return -EAGAIN. Ignore -EAGAIN in probe during device check.

Signed-off-by: Brad Love <brad@nextdimension.cc>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/tuners/si2157.c

index 12f88304ac0fd9af5e10d9de004a16c1b5612ea3..69c625eaee25b96065681c9c24fd88c0847d7eaa 100644 (file)
@@ -47,14 +47,20 @@ static int si2157_cmd_execute(struct i2c_client *client, struct si2157_cmd *cmd)
                                break;
                }
 
-               dev_dbg(&client->dev, "cmd execution took %d ms\n",
-                               jiffies_to_msecs(jiffies) -
-                               (jiffies_to_msecs(timeout) - TIMEOUT));
+               dev_dbg(&client->dev, "cmd execution took %d ms, status=%x\n",
+                       jiffies_to_msecs(jiffies) -
+                       (jiffies_to_msecs(timeout) - TIMEOUT),
+                       cmd->args[0]);
 
                if (!((cmd->args[0] >> 7) & 0x01)) {
                        ret = -ETIMEDOUT;
                        goto err_mutex_unlock;
                }
+               /* check error status bit */
+               if (cmd->args[0] & 0x40) {
+                       ret = -EAGAIN;
+                       goto err_mutex_unlock;
+               }
        }
 
        mutex_unlock(&dev->i2c_mutex);
@@ -106,7 +112,7 @@ static int si2157_init(struct dvb_frontend *fe)
        }
        cmd.rlen = 1;
        ret = si2157_cmd_execute(client, &cmd);
-       if (ret)
+       if (ret && (dev->chiptype != SI2157_CHIPTYPE_SI2141 || ret != -EAGAIN))
                goto err;
 
        /* Si2141 needs a second command before it answers the revision query */
@@ -478,7 +484,7 @@ static int si2157_probe(struct i2c_client *client,
        cmd.wlen = 0;
        cmd.rlen = 1;
        ret = si2157_cmd_execute(client, &cmd);
-       if (ret)
+       if (ret && ret != -EAGAIN)
                goto err_kfree;
 
        memcpy(&fe->ops.tuner_ops, &si2157_ops, sizeof(struct dvb_tuner_ops));