diff options
Diffstat (limited to 'include/linux/i2c.h')
| -rw-r--r-- | include/linux/i2c.h | 112 | 
1 files changed, 88 insertions, 24 deletions
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 0f774406fad0..419a38e7c315 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h @@ -55,7 +55,7 @@ typedef int (*i2c_slave_cb_t)(struct i2c_client *, enum i2c_slave_event, u8 *);  struct module;  struct property_entry; -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +#if IS_ENABLED(CONFIG_I2C)  /*   * The master routines are the ones normally used to transmit data to devices   * on a bus (or read from them). Apart from two basic transfer functions to @@ -63,10 +63,68 @@ struct property_entry;   * transmit an arbitrary number of messages without interruption.   * @count must be be less than 64k since msg.len is u16.   */ -extern int i2c_master_send(const struct i2c_client *client, const char *buf, -			   int count); -extern int i2c_master_recv(const struct i2c_client *client, char *buf, -			   int count); +extern int i2c_transfer_buffer_flags(const struct i2c_client *client, +				     char *buf, int count, u16 flags); + +/** + * i2c_master_recv - issue a single I2C message in master receive mode + * @client: Handle to slave device + * @buf: Where to store data read from slave + * @count: How many bytes to read, must be less than 64k since msg.len is u16 + * + * Returns negative errno, or else the number of bytes read. + */ +static inline int i2c_master_recv(const struct i2c_client *client, +				  char *buf, int count) +{ +	return i2c_transfer_buffer_flags(client, buf, count, I2C_M_RD); +}; + +/** + * i2c_master_recv_dmasafe - issue a single I2C message in master receive mode + *			     using a DMA safe buffer + * @client: Handle to slave device + * @buf: Where to store data read from slave, must be safe to use with DMA + * @count: How many bytes to read, must be less than 64k since msg.len is u16 + * + * Returns negative errno, or else the number of bytes read. + */ +static inline int i2c_master_recv_dmasafe(const struct i2c_client *client, +					  char *buf, int count) +{ +	return i2c_transfer_buffer_flags(client, buf, count, +					 I2C_M_RD | I2C_M_DMA_SAFE); +}; + +/** + * i2c_master_send - issue a single I2C message in master transmit mode + * @client: Handle to slave device + * @buf: Data that will be written to the slave + * @count: How many bytes to write, must be less than 64k since msg.len is u16 + * + * Returns negative errno, or else the number of bytes written. + */ +static inline int i2c_master_send(const struct i2c_client *client, +				  const char *buf, int count) +{ +	return i2c_transfer_buffer_flags(client, (char *)buf, count, 0); +}; + +/** + * i2c_master_send_dmasafe - issue a single I2C message in master transmit mode + *			     using a DMA safe buffer + * @client: Handle to slave device + * @buf: Data that will be written to the slave, must be safe to use with DMA + * @count: How many bytes to write, must be less than 64k since msg.len is u16 + * + * Returns negative errno, or else the number of bytes written. + */ +static inline int i2c_master_send_dmasafe(const struct i2c_client *client, +					  const char *buf, int count) +{ +	return i2c_transfer_buffer_flags(client, (char *)buf, count, +					 I2C_M_DMA_SAFE); +};  /* Transfer num messages.   */ @@ -354,7 +412,7 @@ struct i2c_board_info {  	.type = dev_type, .addr = (dev_addr) -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +#if IS_ENABLED(CONFIG_I2C)  /* Add-on boards should register/unregister their devices; e.g. a board   * with integrated I2C, a config eeprom, sensors, and a codec that's   * used in conjunction with the primary hardware. @@ -485,40 +543,43 @@ struct i2c_timings {  /**   * struct i2c_bus_recovery_info - I2C bus recovery information   * @recover_bus: Recover routine. Either pass driver's recover_bus() routine, or - *	i2c_generic_scl_recovery() or i2c_generic_gpio_recovery(). + *	i2c_generic_scl_recovery().   * @get_scl: This gets current value of SCL line. Mandatory for generic SCL - *      recovery. Used internally for generic GPIO recovery. - * @set_scl: This sets/clears SCL line. Mandatory for generic SCL recovery. Used - *      internally for generic GPIO recovery. + *      recovery. Populated internally for generic GPIO recovery. + * @set_scl: This sets/clears the SCL line. Mandatory for generic SCL recovery. + *      Populated internally for generic GPIO recovery.   * @get_sda: This gets current value of SDA line. Optional for generic SCL - *      recovery. Used internally, if sda_gpio is a valid GPIO, for generic GPIO - *      recovery. + *      recovery. Populated internally, if sda_gpio is a valid GPIO, for generic + *      GPIO recovery. + * @set_sda: This sets/clears the SDA line. Optional for generic SCL recovery. + *	Populated internally, if sda_gpio is a valid GPIO, for generic GPIO + *	recovery.   * @prepare_recovery: This will be called before starting recovery. Platform may   *	configure padmux here for SDA/SCL line or something else they want.   * @unprepare_recovery: This will be called after completing recovery. Platform   *	may configure padmux here for SDA/SCL line or something else they want. - * @scl_gpio: gpio number of the SCL line. Only required for GPIO recovery. - * @sda_gpio: gpio number of the SDA line. Only required for GPIO recovery. + * @scl_gpiod: gpiod of the SCL line. Only required for GPIO recovery. + * @sda_gpiod: gpiod of the SDA line. Only required for GPIO recovery.   */  struct i2c_bus_recovery_info { -	int (*recover_bus)(struct i2c_adapter *); +	int (*recover_bus)(struct i2c_adapter *adap); -	int (*get_scl)(struct i2c_adapter *); -	void (*set_scl)(struct i2c_adapter *, int val); -	int (*get_sda)(struct i2c_adapter *); +	int (*get_scl)(struct i2c_adapter *adap); +	void (*set_scl)(struct i2c_adapter *adap, int val); +	int (*get_sda)(struct i2c_adapter *adap); +	void (*set_sda)(struct i2c_adapter *adap, int val); -	void (*prepare_recovery)(struct i2c_adapter *); -	void (*unprepare_recovery)(struct i2c_adapter *); +	void (*prepare_recovery)(struct i2c_adapter *adap); +	void (*unprepare_recovery)(struct i2c_adapter *adap);  	/* gpio recovery */ -	int scl_gpio; -	int sda_gpio; +	struct gpio_desc *scl_gpiod; +	struct gpio_desc *sda_gpiod;  };  int i2c_recover_bus(struct i2c_adapter *adap);  /* Generic recovery routines */ -int i2c_generic_gpio_recovery(struct i2c_adapter *adap);  int i2c_generic_scl_recovery(struct i2c_adapter *adap);  /** @@ -706,7 +767,7 @@ i2c_unlock_adapter(struct i2c_adapter *adapter)  /* administration...   */ -#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) +#if IS_ENABLED(CONFIG_I2C)  extern int i2c_add_adapter(struct i2c_adapter *);  extern void i2c_del_adapter(struct i2c_adapter *);  extern int i2c_add_numbered_adapter(struct i2c_adapter *); @@ -769,6 +830,9 @@ static inline u8 i2c_8bit_addr_from_msg(const struct i2c_msg *msg)  	return (msg->addr << 1) | (msg->flags & I2C_M_RD ? 1 : 0);  } +u8 *i2c_get_dma_safe_msg_buf(struct i2c_msg *msg, unsigned int threshold); +void i2c_release_dma_safe_msg_buf(struct i2c_msg *msg, u8 *buf); +  int i2c_handle_smbus_host_notify(struct i2c_adapter *adap, unsigned short addr);  /**   * module_i2c_driver() - Helper macro for registering a modular I2C driver  |