summaryrefslogtreecommitdiffstats
path: root/include/i2c/i2c.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/i2c/i2c.h')
-rw-r--r--include/i2c/i2c.h32
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 */