i2c: rcar: use flags instead of atomic_xfer
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Fri, 20 May 2022 20:29:18 +0000 (22:29 +0200)
committerWolfram Sang <wsa@kernel.org>
Sat, 21 May 2022 10:55:32 +0000 (12:55 +0200)
i2c-rcar already has priv->flags. This patch adds a new persistent flag
ID_P_NOT_ATOMIC and uses it to save the extra variable. The negation of
the logic was done to make the code more readable.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
[wsa: negated the logic, rebased, updated the commit message]
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
drivers/i2c/busses/i2c-rcar.c

index 034d1ec64cf0a7b32f926a608a8b541693e286d0..6e7be9d9f5043c00f1c2deec0e7219a8d695888c 100644 (file)
 #define ID_NACK                        BIT(4)
 #define ID_EPROTO              BIT(5)
 /* persistent flags */
+#define ID_P_NOT_ATOMIC                BIT(28)
 #define ID_P_HOST_NOTIFY       BIT(29)
 #define ID_P_NO_RXDMA          BIT(30) /* HW forbids RXDMA sometimes */
 #define ID_P_PM_BLOCKED                BIT(31)
-#define ID_P_MASK              GENMASK(31, 29)
+#define ID_P_MASK              GENMASK(31, 28)
 
 enum rcar_i2c_type {
        I2C_RCAR_GEN1,
@@ -138,7 +139,6 @@ struct rcar_i2c_priv {
        enum dma_data_direction dma_direction;
 
        struct reset_control *rstc;
-       bool atomic_xfer;
        int irq;
 
        struct i2c_client *host_notify_client;
@@ -350,7 +350,7 @@ static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv)
                priv->flags |= ID_LAST_MSG;
 
        rcar_i2c_write(priv, ICMAR, i2c_8bit_addr_from_msg(priv->msg));
-       if (!priv->atomic_xfer)
+       if (priv->flags & ID_P_NOT_ATOMIC)
                rcar_i2c_write(priv, ICMIER, read ? RCAR_IRQ_RECV : RCAR_IRQ_SEND);
 
        if (rep_start)
@@ -420,7 +420,7 @@ static bool rcar_i2c_dma(struct rcar_i2c_priv *priv)
        int len;
 
        /* Do various checks to see if DMA is feasible at all */
-       if (priv->atomic_xfer || IS_ERR(chan) || msg->len < RCAR_MIN_DMA_LEN ||
+       if (!(priv->flags & ID_P_NOT_ATOMIC) || IS_ERR(chan) || msg->len < RCAR_MIN_DMA_LEN ||
            !(msg->flags & I2C_M_DMA_SAFE) || (read && priv->flags & ID_P_NO_RXDMA))
                return false;
 
@@ -670,7 +670,7 @@ static irqreturn_t rcar_i2c_irq(int irq, struct rcar_i2c_priv *priv, u32 msr)
        /* Nack */
        if (msr & MNR) {
                /* HW automatically sends STOP after received NACK */
-               if (!priv->atomic_xfer)
+               if (priv->flags & ID_P_NOT_ATOMIC)
                        rcar_i2c_write(priv, ICMIER, RCAR_IRQ_STOP);
                priv->flags |= ID_NACK;
                goto out;
@@ -692,7 +692,7 @@ out:
        if (priv->flags & ID_DONE) {
                rcar_i2c_write(priv, ICMIER, 0);
                rcar_i2c_write(priv, ICMSR, 0);
-               if (!priv->atomic_xfer)
+               if (priv->flags & ID_P_NOT_ATOMIC)
                        wake_up(&priv->wait);
        }
 
@@ -710,7 +710,7 @@ static irqreturn_t rcar_i2c_gen2_irq(int irq, void *ptr)
 
        /* Only handle interrupts that are currently enabled */
        msr = rcar_i2c_read(priv, ICMSR);
-       if (!priv->atomic_xfer)
+       if (priv->flags & ID_P_NOT_ATOMIC)
                msr &= rcar_i2c_read(priv, ICMIER);
 
        return rcar_i2c_irq(irq, priv, msr);
@@ -723,7 +723,7 @@ static irqreturn_t rcar_i2c_gen3_irq(int irq, void *ptr)
 
        /* Only handle interrupts that are currently enabled */
        msr = rcar_i2c_read(priv, ICMSR);
-       if (!priv->atomic_xfer)
+       if (priv->flags & ID_P_NOT_ATOMIC)
                msr &= rcar_i2c_read(priv, ICMIER);
 
        /*
@@ -832,7 +832,7 @@ static int rcar_i2c_master_xfer(struct i2c_adapter *adap,
        int i, ret;
        long time_left;
 
-       priv->atomic_xfer = false;
+       priv->flags |= ID_P_NOT_ATOMIC;
 
        pm_runtime_get_sync(dev);
 
@@ -896,7 +896,7 @@ static int rcar_i2c_master_xfer_atomic(struct i2c_adapter *adap,
        bool time_left;
        int ret;
 
-       priv->atomic_xfer = true;
+       priv->flags &= ~ID_P_NOT_ATOMIC;
 
        pm_runtime_get_sync(dev);