i2c: i801: Add helper i801_check_and_clear_pec_error
authorHeiner Kallweit <hkallweit1@gmail.com>
Fri, 2 Feb 2024 07:02:19 +0000 (08:02 +0100)
committerAndi Shyti <andi.shyti@kernel.org>
Thu, 8 Feb 2024 17:06:45 +0000 (18:06 +0100)
Avoid code duplication and factor out checking and clearing PEC error
bit to new helper i801_check_and_clear_pec_error().

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
Signed-off-by: Andi Shyti <andi.shyti@kernel.org>
drivers/i2c/busses/i2c-i801.c

index 44ae6326d88c223ac5698dceb540fff33a4d2462..156bace92ad3ba3d0d2cb76fbe56b69bf404fe97 100644 (file)
@@ -328,11 +328,27 @@ MODULE_PARM_DESC(disable_features, "Disable selected driver features:\n"
        "\t\t  0x10  don't use interrupts\n"
        "\t\t  0x20  disable SMBus Host Notify ");
 
+static int i801_check_and_clear_pec_error(struct i801_priv *priv)
+{
+       u8 status;
+
+       if (!(priv->features & FEATURE_SMBUS_PEC))
+               return 0;
+
+       status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE;
+       if (status) {
+               outb_p(status, SMBAUXSTS(priv));
+               return -EBADMSG;
+       }
+
+       return 0;
+}
+
 /* Make sure the SMBus host is ready to start transmitting.
    Return 0 if it is, -EBUSY if it is not. */
 static int i801_check_pre(struct i801_priv *priv)
 {
-       int status;
+       int status, result;
 
        status = inb_p(SMBHSTSTS(priv));
        if (status & SMBHSTSTS_HOST_BUSY) {
@@ -353,13 +369,9 @@ static int i801_check_pre(struct i801_priv *priv)
         * the hardware was already in this state when the driver
         * started.
         */
-       if (priv->features & FEATURE_SMBUS_PEC) {
-               status = inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE;
-               if (status) {
-                       pci_dbg(priv->pci_dev, "Clearing aux status flags (%02x)\n", status);
-                       outb_p(status, SMBAUXSTS(priv));
-               }
-       }
+       result = i801_check_and_clear_pec_error(priv);
+       if (result)
+               pci_dbg(priv->pci_dev, "Clearing aux status flag CRCE\n");
 
        return 0;
 }
@@ -408,14 +420,12 @@ static int i801_check_post(struct i801_priv *priv, int status)
                 * bit is harmless as long as it's cleared before
                 * the next operation.
                 */
-               if ((priv->features & FEATURE_SMBUS_PEC) &&
-                   (inb_p(SMBAUXSTS(priv)) & SMBAUXSTS_CRCE)) {
-                       outb_p(SMBAUXSTS_CRCE, SMBAUXSTS(priv));
-                       result = -EBADMSG;
-                       dev_dbg(&priv->pci_dev->dev, "PEC error\n");
+               result = i801_check_and_clear_pec_error(priv);
+               if (result) {
+                       pci_dbg(priv->pci_dev, "PEC error\n");
                } else {
                        result = -ENXIO;
-                       dev_dbg(&priv->pci_dev->dev, "No response\n");
+                       pci_dbg(priv->pci_dev, "No response\n");
                }
        }
        if (status & SMBHSTSTS_BUS_ERR) {