i2c: rzv2m: Disable the operation of unit in case of error
authorBiju Das <biju.das.jz@bp.renesas.com>
Fri, 26 May 2023 13:57:38 +0000 (14:57 +0100)
committerWolfram Sang <wsa@kernel.org>
Mon, 5 Jun 2023 10:03:35 +0000 (12:03 +0200)
The remove and suspend callbacks disable the operation of the unit.
Do the same in probe() in case of error.

While at it, introduce a helper function rzv2m_i2c_disable() for
disabling the operation of the unit and this function is shared
between probe error path, remove and suspend callbacks.

Reported-by: Pavel Machek <pavel@denx.de>
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-rzv2m.c

index f4b805e..b0bfc96 100644 (file)
@@ -389,6 +389,20 @@ static u32 rzv2m_i2c_func(struct i2c_adapter *adap)
               I2C_FUNC_10BIT_ADDR;
 }
 
+static int rzv2m_i2c_disable(struct device *dev, struct rzv2m_i2c_priv *priv)
+{
+       int ret;
+
+       ret = pm_runtime_resume_and_get(dev);
+       if (ret < 0)
+               return ret;
+
+       bit_clrl(priv->base + IICB0CTL0, IICB0IICE);
+       pm_runtime_put(dev);
+
+       return 0;
+}
+
 static const struct i2c_adapter_quirks rzv2m_i2c_quirks = {
        .flags = I2C_AQ_NO_ZERO_LEN,
 };
@@ -461,8 +475,10 @@ static int rzv2m_i2c_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, priv);
 
        ret = i2c_add_numbered_adapter(adap);
-       if (ret < 0)
+       if (ret < 0) {
+               rzv2m_i2c_disable(dev, priv);
                pm_runtime_disable(dev);
+       }
 
        return ret;
 }
@@ -473,23 +489,15 @@ static void rzv2m_i2c_remove(struct platform_device *pdev)
        struct device *dev = priv->adap.dev.parent;
 
        i2c_del_adapter(&priv->adap);
-       bit_clrl(priv->base + IICB0CTL0, IICB0IICE);
+       rzv2m_i2c_disable(dev, priv);
        pm_runtime_disable(dev);
 }
 
 static int rzv2m_i2c_suspend(struct device *dev)
 {
        struct rzv2m_i2c_priv *priv = dev_get_drvdata(dev);
-       int ret;
-
-       ret = pm_runtime_resume_and_get(dev);
-       if (ret < 0)
-               return ret;
-
-       bit_clrl(priv->base + IICB0CTL0, IICB0IICE);
-       pm_runtime_put(dev);
 
-       return 0;
+       return rzv2m_i2c_disable(dev, priv);
 }
 
 static int rzv2m_i2c_resume(struct device *dev)