diff options
Diffstat (limited to 'include/i2c/i2c.h')
-rw-r--r-- | include/i2c/i2c.h | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/include/i2c/i2c.h b/include/i2c/i2c.h index af6287602c..9094003b68 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; @@ -120,7 +121,8 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap); * */ struct i2c_adapter { - struct device_d dev; /* ptr to device */ + 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; @@ -133,7 +135,7 @@ struct i2c_adapter { #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev) struct i2c_client { - struct device_d dev; + struct device dev; struct i2c_adapter *adapter; unsigned short addr; void *driver_data; /* Driver data, set and get with @@ -295,9 +297,12 @@ static inline int i2c_register_board_info(int busnum, extern int i2c_add_numbered_adapter(struct i2c_adapter *adapter); struct i2c_adapter *i2c_get_adapter(int busnum); struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node); +int of_i2c_register_devices_by_node(struct device_node *node); struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); +int of_i2c_device_enable_and_register_by_alias(const char *alias); -void i2c_parse_fw_timings(struct device_d *dev, struct i2c_timings *t, bool use_defaults); +void i2c_parse_fw_timings(struct device *dev, struct i2c_timings *t, + bool use_defaults); extern struct list_head i2c_adapter_list; #define for_each_i2c_adapter(adap) \ @@ -315,10 +320,19 @@ 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); +static inline u8 i2c_8bit_addr_from_msg(const struct i2c_msg *msg) +{ + return (msg->addr << 1) | (msg->flags & I2C_M_RD ? 1 : 0); +} #define I2C_ADDR_16_BIT (1 << 31) @@ -327,15 +341,25 @@ extern int i2c_write_reg(struct i2c_client *client, u32 addr, const u8 *buf, u16 extern struct bus_type i2c_bus; -static inline int i2c_driver_register(struct driver_d *drv) +static inline bool dev_bus_is_i2c(struct device *dev) +{ + return IS_ENABLED(CONFIG_I2C) && dev->bus == &i2c_bus; +} + +static inline int i2c_driver_register(struct driver *drv) { drv->bus = &i2c_bus; return register_driver(drv); } +#ifdef CONFIG_I2C #define coredevice_i2c_driver(drv) \ register_driver_macro(coredevice, i2c, drv) #define device_i2c_driver(drv) \ register_driver_macro(device, i2c, drv) +#else +#define coredevice_i2c_driver(drv) +#define device_i2c_driver(drv) +#endif #endif /* I2C_I2C_H */ |