diff options
Diffstat (limited to 'include/linux/regmap.h')
| -rw-r--r-- | include/linux/regmap.h | 73 | 
1 files changed, 34 insertions, 39 deletions
| diff --git a/include/linux/regmap.h b/include/linux/regmap.h index ddf0baff195d..cb666b9c6b6a 100644 --- a/include/linux/regmap.h +++ b/include/linux/regmap.h @@ -17,10 +17,12 @@  #include <linux/err.h>  #include <linux/bug.h>  #include <linux/lockdep.h> +#include <linux/iopoll.h>  struct module;  struct clk;  struct device; +struct device_node;  struct i2c_client;  struct i3c_device;  struct irq_domain; @@ -71,6 +73,13 @@ struct reg_sequence {  	unsigned int delay_us;  }; +#define REG_SEQ(_reg, _def, _delay_us) {		\ +				.reg = _reg,		\ +				.def = _def,		\ +				.delay_us = _delay_us,	\ +				} +#define REG_SEQ0(_reg, _def)	REG_SEQ(_reg, _def, 0) +  #define	regmap_update_bits(map, reg, mask, val) \  	regmap_update_bits_base(map, reg, mask, val, NULL, false, false)  #define	regmap_update_bits_async(map, reg, mask, val)\ @@ -122,26 +131,10 @@ struct reg_sequence {   */  #define regmap_read_poll_timeout(map, addr, val, cond, sleep_us, timeout_us) \  ({ \ -	u64 __timeout_us = (timeout_us); \ -	unsigned long __sleep_us = (sleep_us); \ -	ktime_t __timeout = ktime_add_us(ktime_get(), __timeout_us); \ -	int __ret; \ -	might_sleep_if(__sleep_us); \ -	for (;;) { \ -		__ret = regmap_read((map), (addr), &(val)); \ -		if (__ret) \ -			break; \ -		if (cond) \ -			break; \ -		if ((__timeout_us) && \ -		    ktime_compare(ktime_get(), __timeout) > 0) { \ -			__ret = regmap_read((map), (addr), &(val)); \ -			break; \ -		} \ -		if (__sleep_us) \ -			usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ -	} \ -	__ret ?: ((cond) ? 0 : -ETIMEDOUT); \ +	int __ret, __tmp; \ +	__tmp = read_poll_timeout(regmap_read, __ret, __ret || (cond), \ +			sleep_us, timeout_us, false, (map), (addr), &(val)); \ +	__ret ?: __tmp; \  })  /** @@ -209,25 +202,10 @@ struct reg_sequence {   */  #define regmap_field_read_poll_timeout(field, val, cond, sleep_us, timeout_us) \  ({ \ -	u64 __timeout_us = (timeout_us); \ -	unsigned long __sleep_us = (sleep_us); \ -	ktime_t timeout = ktime_add_us(ktime_get(), __timeout_us); \ -	int pollret; \ -	might_sleep_if(__sleep_us); \ -	for (;;) { \ -		pollret = regmap_field_read((field), &(val)); \ -		if (pollret) \ -			break; \ -		if (cond) \ -			break; \ -		if (__timeout_us && ktime_compare(ktime_get(), timeout) > 0) { \ -			pollret = regmap_field_read((field), &(val)); \ -			break; \ -		} \ -		if (__sleep_us) \ -			usleep_range((__sleep_us >> 2) + 1, __sleep_us); \ -	} \ -	pollret ?: ((cond) ? 0 : -ETIMEDOUT); \ +	int __ret, __tmp; \ +	__tmp = read_poll_timeout(regmap_field_read, __ret, __ret || (cond), \ +			sleep_us, timeout_us, false, (field), &(val)); \ +	__ret ?: __tmp; \  })  #ifdef CONFIG_REGMAP @@ -1149,6 +1127,14 @@ struct reg_field {  				.msb = _msb,	\  				} +#define REG_FIELD_ID(_reg, _lsb, _msb, _size, _offset) {	\ +				.reg = _reg,			\ +				.lsb = _lsb,			\ +				.msb = _msb,			\ +				.id_size = _size,		\ +				.id_offset = _offset,		\ +				} +  struct regmap_field *regmap_field_alloc(struct regmap *regmap,  		struct reg_field reg_field);  void regmap_field_free(struct regmap_field *field); @@ -1325,12 +1311,21 @@ struct regmap_irq_chip_data;  int regmap_add_irq_chip(struct regmap *map, int irq, int irq_flags,  			int irq_base, const struct regmap_irq_chip *chip,  			struct regmap_irq_chip_data **data); +int regmap_add_irq_chip_np(struct device_node *np, struct regmap *map, int irq, +			   int irq_flags, int irq_base, +			   const struct regmap_irq_chip *chip, +			   struct regmap_irq_chip_data **data);  void regmap_del_irq_chip(int irq, struct regmap_irq_chip_data *data);  int devm_regmap_add_irq_chip(struct device *dev, struct regmap *map, int irq,  			     int irq_flags, int irq_base,  			     const struct regmap_irq_chip *chip,  			     struct regmap_irq_chip_data **data); +int devm_regmap_add_irq_chip_np(struct device *dev, struct device_node *np, +				struct regmap *map, int irq, int irq_flags, +				int irq_base, +				const struct regmap_irq_chip *chip, +				struct regmap_irq_chip_data **data);  void devm_regmap_del_irq_chip(struct device *dev, int irq,  			      struct regmap_irq_chip_data *data); | 
