i2c: slave: rework the slave API
authorWolfram Sang <wsa+renesas@sang-engineering.com>
Mon, 23 Mar 2015 08:26:36 +0000 (09:26 +0100)
committerWolfram Sang <wsa@the-dreams.de>
Fri, 27 Mar 2015 15:53:38 +0000 (16:53 +0100)
After more discussion, brave users, and additional datasheet evaluation,
some API updates for the new I2C slave framework became imminent. The
slave events now get some easier to understand naming. Also, the event
handling has been simplified to only need a single call to the slave
callback when an action by the backend is required.

Reported-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
Acked-by: Geert Uytterhoeven <geert+renesas@glider.be>
Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
drivers/i2c/busses/i2c-rcar.c
drivers/i2c/i2c-slave-eeprom.c
include/linux/i2c.h

index 71a6e07eb7ab7c725655063515d801cec4617361..5a84bea5b84514389ae6c01c2b2b2a8eadc85346 100644 (file)
@@ -382,11 +382,11 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)
        if (ssr_filtered & SAR) {
                /* read or write request */
                if (ssr_raw & STM) {
-                       i2c_slave_event(priv->slave, I2C_SLAVE_REQ_READ_START, &value);
+                       i2c_slave_event(priv->slave, I2C_SLAVE_READ_REQUESTED, &value);
                        rcar_i2c_write(priv, ICRXTX, value);
                        rcar_i2c_write(priv, ICSIER, SDE | SSR | SAR);
                } else {
-                       i2c_slave_event(priv->slave, I2C_SLAVE_REQ_WRITE_START, &value);
+                       i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_REQUESTED, &value);
                        rcar_i2c_read(priv, ICRXTX);    /* dummy read */
                        rcar_i2c_write(priv, ICSIER, SDR | SSR | SAR);
                }
@@ -406,17 +406,15 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv)
                int ret;
 
                value = rcar_i2c_read(priv, ICRXTX);
-               ret = i2c_slave_event(priv->slave, I2C_SLAVE_REQ_WRITE_END, &value);
+               ret = i2c_slave_event(priv->slave, I2C_SLAVE_WRITE_RECEIVED, &value);
                /* Send NACK in case of error */
                rcar_i2c_write(priv, ICSCR, SIE | SDBS | (ret < 0 ? FNA : 0));
-               i2c_slave_event(priv->slave, I2C_SLAVE_REQ_WRITE_START, &value);
                rcar_i2c_write(priv, ICSSR, ~SDR & 0xff);
        }
 
        /* master wants to read from us */
        if (ssr_filtered & SDE) {
-               i2c_slave_event(priv->slave, I2C_SLAVE_REQ_READ_END, &value);
-               i2c_slave_event(priv->slave, I2C_SLAVE_REQ_READ_START, &value);
+               i2c_slave_event(priv->slave, I2C_SLAVE_READ_PROCESSED, &value);
                rcar_i2c_write(priv, ICRXTX, value);
                rcar_i2c_write(priv, ICSSR, ~SDE & 0xff);
        }
index cf9b09db092f4e9969666565ba1562220d6b2a46..3fb45d894d80721aaa3ced67d8e6adda6b888814 100644 (file)
@@ -36,7 +36,7 @@ static int i2c_slave_eeprom_slave_cb(struct i2c_client *client,
        struct eeprom_data *eeprom = i2c_get_clientdata(client);
 
        switch (event) {
-       case I2C_SLAVE_REQ_WRITE_END:
+       case I2C_SLAVE_WRITE_RECEIVED:
                if (eeprom->first_write) {
                        eeprom->buffer_idx = *val;
                        eeprom->first_write = false;
@@ -47,17 +47,17 @@ static int i2c_slave_eeprom_slave_cb(struct i2c_client *client,
                }
                break;
 
-       case I2C_SLAVE_REQ_READ_START:
+       case I2C_SLAVE_READ_PROCESSED:
+               eeprom->buffer_idx++;
+               /* fallthrough */
+       case I2C_SLAVE_READ_REQUESTED:
                spin_lock(&eeprom->buffer_lock);
                *val = eeprom->buffer[eeprom->buffer_idx];
                spin_unlock(&eeprom->buffer_lock);
                break;
 
-       case I2C_SLAVE_REQ_READ_END:
-               eeprom->buffer_idx++;
-               break;
-
        case I2C_SLAVE_STOP:
+       case I2C_SLAVE_WRITE_REQUESTED:
                eeprom->first_write = true;
                break;
 
index 243d1a1d78b2489066594ddf6959b9b6f643102a..c5e4bb2c57597cb16983cc2f884e2b8e4aeb6e5c 100644 (file)
@@ -253,10 +253,10 @@ static inline void i2c_set_clientdata(struct i2c_client *dev, void *data)
 
 #if IS_ENABLED(CONFIG_I2C_SLAVE)
 enum i2c_slave_event {
-       I2C_SLAVE_REQ_READ_START,
-       I2C_SLAVE_REQ_READ_END,
-       I2C_SLAVE_REQ_WRITE_START,
-       I2C_SLAVE_REQ_WRITE_END,
+       I2C_SLAVE_READ_REQUESTED,
+       I2C_SLAVE_WRITE_REQUESTED,
+       I2C_SLAVE_READ_PROCESSED,
+       I2C_SLAVE_WRITE_RECEIVED,
        I2C_SLAVE_STOP,
 };