Commit 4f443a8a authored by Wolfram Sang's avatar Wolfram Sang Committed by Wolfram Sang

i2c: rcar: refactor bus state machine

Remove the seperate functions and use designated constants. As readable
but less overhead.
Signed-off-by: default avatarWolfram Sang <wsa+renesas@sang-engineering.com>
Acked-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Acked-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: default avatarWolfram Sang <wsa@the-dreams.de>
parent 93e953d3
...@@ -79,11 +79,9 @@ ...@@ -79,11 +79,9 @@
#define MATE (1 << 0) /* address sent irq en */ #define MATE (1 << 0) /* address sent irq en */
enum { #define RCAR_BUS_PHASE_START (MDBS | MIE | ESG)
RCAR_BUS_PHASE_ADDR, #define RCAR_BUS_PHASE_DATA (MDBS | MIE)
RCAR_BUS_PHASE_DATA, #define RCAR_BUS_PHASE_STOP (MDBS | MIE | FSB)
RCAR_BUS_PHASE_STOP,
};
enum { enum {
RCAR_IRQ_CLOSE, RCAR_IRQ_CLOSE,
...@@ -204,21 +202,6 @@ static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv) ...@@ -204,21 +202,6 @@ static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv)
return -EBUSY; return -EBUSY;
} }
static void rcar_i2c_bus_phase(struct rcar_i2c_priv *priv, int phase)
{
switch (phase) {
case RCAR_BUS_PHASE_ADDR:
rcar_i2c_write(priv, ICMCR, MDBS | MIE | ESG);
break;
case RCAR_BUS_PHASE_DATA:
rcar_i2c_write(priv, ICMCR, MDBS | MIE);
break;
case RCAR_BUS_PHASE_STOP:
rcar_i2c_write(priv, ICMCR, MDBS | MIE | FSB);
break;
}
}
/* /*
* clock function * clock function
*/ */
...@@ -328,7 +311,7 @@ static int rcar_i2c_recv(struct rcar_i2c_priv *priv) ...@@ -328,7 +311,7 @@ static int rcar_i2c_recv(struct rcar_i2c_priv *priv)
{ {
rcar_i2c_set_addr(priv, 1); rcar_i2c_set_addr(priv, 1);
rcar_i2c_status_clear(priv); rcar_i2c_status_clear(priv);
rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_ADDR); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_RECV); rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_RECV);
return 0; return 0;
...@@ -347,7 +330,7 @@ static int rcar_i2c_send(struct rcar_i2c_priv *priv) ...@@ -347,7 +330,7 @@ static int rcar_i2c_send(struct rcar_i2c_priv *priv)
rcar_i2c_set_addr(priv, 0); rcar_i2c_set_addr(priv, 0);
rcar_i2c_status_clear(priv); rcar_i2c_status_clear(priv);
rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_ADDR); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_START);
rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_SEND); rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_SEND);
return 0; return 0;
...@@ -376,7 +359,7 @@ static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr) ...@@ -376,7 +359,7 @@ static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr)
* goto data phase. * goto data phase.
*/ */
if (msr & MAT) if (msr & MAT)
rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_DATA); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA);
if (priv->pos < msg->len) { if (priv->pos < msg->len) {
/* /*
...@@ -404,7 +387,7 @@ static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr) ...@@ -404,7 +387,7 @@ static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr)
* prepare stop condition here. * prepare stop condition here.
* ID_DONE will be set on STOP irq. * ID_DONE will be set on STOP irq.
*/ */
rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_STOP); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP);
else else
/* /*
* If current msg is _NOT_ last msg, * If current msg is _NOT_ last msg,
...@@ -452,9 +435,9 @@ static int rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr) ...@@ -452,9 +435,9 @@ static int rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr)
* otherwise, go to DATA phase. * otherwise, go to DATA phase.
*/ */
if (priv->pos + 1 >= msg->len) if (priv->pos + 1 >= msg->len)
rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_STOP); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP);
else else
rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_DATA); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA);
rcar_i2c_recv_restart(priv); rcar_i2c_recv_restart(priv);
...@@ -502,7 +485,7 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr) ...@@ -502,7 +485,7 @@ static irqreturn_t rcar_i2c_irq(int irq, void *ptr)
dev_dbg(dev, "Nack\n"); dev_dbg(dev, "Nack\n");
/* go to stop phase */ /* go to stop phase */
rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_STOP); rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_STOP);
rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_STOP); rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_STOP);
rcar_i2c_flags_set(priv, ID_NACK); rcar_i2c_flags_set(priv, ID_NACK);
goto out; goto out;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment