i2c: i801: Don't clear status flags twice in interrupt mode
authorHeiner Kallweit <hkallweit1@gmail.com>
Sat, 4 Dec 2021 20:04:40 +0000 (21:04 +0100)
committerWolfram Sang <wsa@kernel.org>
Thu, 9 Dec 2021 14:52:10 +0000 (15:52 +0100)
In interrupt mode we clear the status flags twice, in the interrupt
handler and in i801_check_post(). Remove clearing the status flags
from i801_check_post() and handle polling mode by using the
SMBus unlocking write to also clear the status flags if still set.
To be precise: One could still argue that the status flags are
cleared twice in interrupt mode, but it comes for free.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Jean Delvare <jdelvare@suse.de>
Tested-by: Jean Delvare <jdelvare@suse.de>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-i801.c

index b452f36..7428cc6 100644 (file)
@@ -356,11 +356,6 @@ static int i801_check_pre(struct i801_priv *priv)
        return 0;
 }
 
-/*
- * Convert the status register to an error code, and clear it.
- * Note that status only contains the bits we want to clear, not the
- * actual register value.
- */
 static int i801_check_post(struct i801_priv *priv, int status)
 {
        int result = 0;
@@ -385,7 +380,6 @@ static int i801_check_post(struct i801_priv *priv, int status)
                    !(status & SMBHSTSTS_FAILED))
                        dev_err(&priv->pci_dev->dev,
                                "Failed terminating the transaction\n");
-               outb_p(STATUS_FLAGS, SMBHSTSTS(priv));
                return -ETIMEDOUT;
        }
 
@@ -424,9 +418,6 @@ static int i801_check_post(struct i801_priv *priv, int status)
                dev_dbg(&priv->pci_dev->dev, "Lost arbitration\n");
        }
 
-       /* Clear status flags except BYTE_DONE, to be cleared by caller */
-       outb_p(status, SMBHSTSTS(priv));
-
        return result;
 }
 
@@ -923,8 +914,11 @@ static s32 i801_access(struct i2c_adapter *adap, u16 addr,
        }
 
 out:
-       /* Unlock the SMBus device for use by BIOS/ACPI */
-       outb_p(SMBHSTSTS_INUSE_STS, SMBHSTSTS(priv));
+       /*
+        * Unlock the SMBus device for use by BIOS/ACPI,
+        * and clear status flags if not done already.
+        */
+       outb_p(SMBHSTSTS_INUSE_STS | STATUS_FLAGS, SMBHSTSTS(priv));
 
        pm_runtime_mark_last_busy(&priv->pci_dev->dev);
        pm_runtime_put_autosuspend(&priv->pci_dev->dev);