diff options
Diffstat (limited to 'include/linux/i2c.h')
| -rw-r--r-- | include/linux/i2c.h | 59 | 
1 files changed, 51 insertions, 8 deletions
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index f17da50402a4..e83a738a3b87 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -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,  }; @@ -278,7 +278,7 @@ static inline int i2c_slave_event(struct i2c_client *client,   * @platform_data: stored in i2c_client.dev.platform_data   * @archdata: copied into i2c_client.dev.archdata   * @of_node: pointer to OpenFirmware device node - * @acpi_node: ACPI device node + * @fwnode: device node supplied by the platform firmware   * @irq: stored in i2c_client.irq   *   * I2C doesn't actually support hardware probing, although controllers and @@ -299,7 +299,7 @@ struct i2c_board_info {  	void		*platform_data;  	struct dev_archdata	*archdata;  	struct device_node *of_node; -	struct acpi_dev_node acpi_node; +	struct fwnode_handle *fwnode;  	int		irq;  }; @@ -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)  |