i2c: rcar: REP_AFTER_RD is not a persistent flag

Previous refactoring makes it easy now to convert the above flag to a
non-persistent one. This is more appropriate and easier to maintain.

Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
Wolfram Sang 2022-05-20 22:29:17 +02:00 committed by Wolfram Sang
parent 4c278db7be
commit f0f0e07685

View File

@ -98,16 +98,16 @@
#define RCAR_IRQ_STOP (MST) #define RCAR_IRQ_STOP (MST)
#define ID_LAST_MSG BIT(0) #define ID_LAST_MSG BIT(0)
#define ID_REP_AFTER_RD BIT(1)
#define ID_DONE BIT(2) #define ID_DONE BIT(2)
#define ID_ARBLOST BIT(3) #define ID_ARBLOST BIT(3)
#define ID_NACK BIT(4) #define ID_NACK BIT(4)
#define ID_EPROTO BIT(5) #define ID_EPROTO BIT(5)
/* persistent flags */ /* persistent flags */
#define ID_P_HOST_NOTIFY BIT(28) #define ID_P_HOST_NOTIFY BIT(29)
#define ID_P_REP_AFTER_RD BIT(29)
#define ID_P_NO_RXDMA BIT(30) /* HW forbids RXDMA sometimes */ #define ID_P_NO_RXDMA BIT(30) /* HW forbids RXDMA sometimes */
#define ID_P_PM_BLOCKED BIT(31) #define ID_P_PM_BLOCKED BIT(31)
#define ID_P_MASK GENMASK(31, 28) #define ID_P_MASK GENMASK(31, 29)
enum rcar_i2c_type { enum rcar_i2c_type {
I2C_RCAR_GEN1, I2C_RCAR_GEN1,
@ -341,6 +341,7 @@ scgd_find:
static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv) static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv)
{ {
int read = !!rcar_i2c_is_recv(priv); int read = !!rcar_i2c_is_recv(priv);
bool rep_start = !(priv->flags & ID_REP_AFTER_RD);
priv->pos = 0; priv->pos = 0;
priv->flags &= ID_P_MASK; priv->flags &= ID_P_MASK;
@ -352,9 +353,7 @@ static void rcar_i2c_prepare_msg(struct rcar_i2c_priv *priv)
if (!priv->atomic_xfer) if (!priv->atomic_xfer)
rcar_i2c_write(priv, ICMIER, read ? RCAR_IRQ_RECV : RCAR_IRQ_SEND); rcar_i2c_write(priv, ICMIER, read ? RCAR_IRQ_RECV : RCAR_IRQ_SEND);
if (priv->flags & ID_P_REP_AFTER_RD) if (rep_start)
priv->flags &= ~ID_P_REP_AFTER_RD;
else
rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
} }
@ -575,7 +574,7 @@ static void rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr)
rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP);
} else { } else {
rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
priv->flags |= ID_P_REP_AFTER_RD; priv->flags |= ID_REP_AFTER_RD;
} }
} }
@ -706,7 +705,7 @@ static irqreturn_t rcar_i2c_gen2_irq(int irq, void *ptr)
u32 msr; u32 msr;
/* Clear START or STOP immediately, except for REPSTART after read */ /* Clear START or STOP immediately, except for REPSTART after read */
if (likely(!(priv->flags & ID_P_REP_AFTER_RD))) if (likely(!(priv->flags & ID_REP_AFTER_RD)))
rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA);
/* Only handle interrupts that are currently enabled */ /* Only handle interrupts that are currently enabled */
@ -731,7 +730,7 @@ static irqreturn_t rcar_i2c_gen3_irq(int irq, void *ptr)
* Clear START or STOP immediately, except for REPSTART after read or * Clear START or STOP immediately, except for REPSTART after read or
* if a spurious interrupt was detected. * if a spurious interrupt was detected.
*/ */
if (likely(!(priv->flags & ID_P_REP_AFTER_RD) && msr)) if (likely(!(priv->flags & ID_REP_AFTER_RD) && msr))
rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA);
return rcar_i2c_irq(irq, priv, msr); return rcar_i2c_irq(irq, priv, msr);