Add a slice for I2C adapters so that devices using I2C in the background
can check if a I2C bus is busy.

Signed-off-by: Sascha Hauer <[email protected]>
---
 drivers/i2c/i2c.c | 5 +++++
 include/i2c/i2c.h | 7 +++++++
 2 files changed, 12 insertions(+)

diff --git a/drivers/i2c/i2c.c b/drivers/i2c/i2c.c
index 300365bd1f..4d4a9a3948 100644
--- a/drivers/i2c/i2c.c
+++ b/drivers/i2c/i2c.c
@@ -23,6 +23,7 @@
 #include <init.h>
 #include <of.h>
 #include <gpio.h>
+#include <slice.h>
 
 #include <i2c/i2c.h>
 
@@ -62,6 +63,8 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg 
*msgs, int num)
        uint64_t start;
        int ret, try;
 
+       slice_acquire(&adap->slice);
+
        /*
         * REVISIT the fault reporting model here is weak:
         *
@@ -96,6 +99,8 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg 
*msgs, int num)
                        break;
        }
 
+       slice_release(&adap->slice);
+
        return ret;
 }
 EXPORT_SYMBOL(i2c_transfer);
diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h
index b1ab72850c..4fc278f800 100644
--- a/include/i2c/i2c.h
+++ b/include/i2c/i2c.h
@@ -18,6 +18,7 @@
 
 #include <driver.h>
 #include <init.h>
+#include <slice.h>
 #include <linux/types.h>
 
 struct i2c_adapter;
@@ -121,6 +122,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap);
  */
 struct i2c_adapter {
        struct device           dev;    /* ptr to device */
+       struct slice            slice;
        int                     nr;     /* bus number */
        int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int 
num);
        struct list_head        list;
@@ -318,6 +320,11 @@ static inline int i2c_adapter_id(struct i2c_adapter *adap)
        return adap->nr;
 }
 
+static inline struct slice *i2c_client_slice(struct i2c_client *client)
+{
+       return &client->adapter->slice;
+}
+
 extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int 
num);
 extern int i2c_master_send(struct i2c_client *client, const char *buf, int 
count);
 extern int i2c_master_recv(struct i2c_client *client, char *buf, int count);
-- 
2.39.2


Reply via email to