Merge tag 'pm+acpi-4.1-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[deliverable/linux.git] / include / linux / i2c.h
index 6d89575361a8f3c9cbc1e8d44af400ff1e7e669e..e83a738a3b8741c9fe6401d6d89d8d2e02900f52 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,
 };
 
@@ -435,8 +435,8 @@ struct i2c_bus_recovery_info {
        void (*set_scl)(struct i2c_adapter *, int val);
        int (*get_sda)(struct i2c_adapter *);
 
-       void (*prepare_recovery)(struct i2c_bus_recovery_info *bri);
-       void (*unprepare_recovery)(struct i2c_bus_recovery_info *bri);
+       void (*prepare_recovery)(struct i2c_adapter *);
+       void (*unprepare_recovery)(struct i2c_adapter *);
 
        /* gpio recovery */
        int scl_gpio;
@@ -449,6 +449,48 @@ int i2c_recover_bus(struct i2c_adapter *adap);
 int i2c_generic_gpio_recovery(struct i2c_adapter *adap);
 int i2c_generic_scl_recovery(struct i2c_adapter *adap);
 
+/**
+ * struct i2c_adapter_quirks - describe flaws of an i2c adapter
+ * @flags: see I2C_AQ_* for possible flags and read below
+ * @max_num_msgs: maximum number of messages per transfer
+ * @max_write_len: maximum length of a write message
+ * @max_read_len: maximum length of a read message
+ * @max_comb_1st_msg_len: maximum length of the first msg in a combined message
+ * @max_comb_2nd_msg_len: maximum length of the second msg in a combined message
+ *
+ * Note about combined messages: Some I2C controllers can only send one message
+ * per transfer, plus something called combined message or write-then-read.
+ * This is (usually) a small write message followed by a read message and
+ * barely enough to access register based devices like EEPROMs. There is a flag
+ * to support this mode. It implies max_num_msg = 2 and does the length checks
+ * with max_comb_*_len because combined message mode usually has its own
+ * limitations. Because of HW implementations, some controllers can actually do
+ * write-then-anything or other variants. To support that, write-then-read has
+ * been broken out into smaller bits like write-first and read-second which can
+ * be combined as needed.
+ */
+
+struct i2c_adapter_quirks {
+       u64 flags;
+       int max_num_msgs;
+       u16 max_write_len;
+       u16 max_read_len;
+       u16 max_comb_1st_msg_len;
+       u16 max_comb_2nd_msg_len;
+};
+
+/* enforce max_num_msgs = 2 and use max_comb_*_len for length checks */
+#define I2C_AQ_COMB                    BIT(0)
+/* first combined message must be write */
+#define I2C_AQ_COMB_WRITE_FIRST                BIT(1)
+/* second combined message must be read */
+#define I2C_AQ_COMB_READ_SECOND                BIT(2)
+/* both combined messages must have the same target address */
+#define I2C_AQ_COMB_SAME_ADDR          BIT(3)
+/* convenience macro for typical write-then read case */
+#define I2C_AQ_COMB_WRITE_THEN_READ    (I2C_AQ_COMB | I2C_AQ_COMB_WRITE_FIRST | \
+                                        I2C_AQ_COMB_READ_SECOND | I2C_AQ_COMB_SAME_ADDR)
+
 /*
  * i2c_adapter is the structure used to identify a physical i2c bus along
  * with the access algorithms necessary to access it.
@@ -474,6 +516,7 @@ struct i2c_adapter {
        struct list_head userspace_clients;
 
        struct i2c_bus_recovery_info *bus_recovery_info;
+       const struct i2c_adapter_quirks *quirks;
 };
 #define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
 
This page took 0.026936 seconds and 5 git commands to generate.