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 <s.hauer@xxxxxxxxxxxxxx> --- Notes: Changes since v1: - Add forgotten slice_init() drivers/i2c/i2c.c | 7 +++++++ include/i2c/i2c.h | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/drivers/i2c/i2c.c b/drivers/i2c/i2c.c index 300365bd1f..70d1b810c1 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); @@ -721,6 +726,8 @@ int i2c_add_numbered_adapter(struct i2c_adapter *adapter) list_add_tail(&adapter->list, &i2c_adapter_list); + slice_init(&adapter->slice, dev_name(&adapter->dev)); + /* populate children from any i2c device tables */ scan_boardinfo(adapter); 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