diff options
| author | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <[email protected]> | 2023-08-30 16:06:38 -0700 | 
| commit | 1ac731c529cd4d6adbce134754b51ff7d822b145 (patch) | |
| tree | 143ab3f35ca5f3b69f583c84e6964b17139c2ec1 /drivers/iio/adc/axp20x_adc.c | |
| parent | 07b4c950f27bef0362dc6ad7ee713aab61d58149 (diff) | |
| parent | 54116d442e001e1b6bd482122043b1870998a1f3 (diff) | |
Merge branch 'next' into for-linus
Prepare input updates for 6.6 merge window.
Diffstat (limited to 'drivers/iio/adc/axp20x_adc.c')
| -rw-r--r-- | drivers/iio/adc/axp20x_adc.c | 77 | 
1 files changed, 39 insertions, 38 deletions
diff --git a/drivers/iio/adc/axp20x_adc.c b/drivers/iio/adc/axp20x_adc.c index 53bf7d4899d2..75bda94dbce1 100644 --- a/drivers/iio/adc/axp20x_adc.c +++ b/drivers/iio/adc/axp20x_adc.c @@ -5,6 +5,7 @@   *	Quentin Schulz <[email protected]>   */ +#include <linux/bitfield.h>  #include <linux/completion.h>  #include <linux/interrupt.h>  #include <linux/io.h> @@ -22,20 +23,20 @@  #include <linux/mfd/axp20x.h>  #define AXP20X_ADC_EN1_MASK			GENMASK(7, 0) -  #define AXP20X_ADC_EN2_MASK			(GENMASK(3, 2) | BIT(7)) +  #define AXP22X_ADC_EN1_MASK			(GENMASK(7, 5) | BIT(0))  #define AXP20X_GPIO10_IN_RANGE_GPIO0		BIT(0)  #define AXP20X_GPIO10_IN_RANGE_GPIO1		BIT(1) -#define AXP20X_GPIO10_IN_RANGE_GPIO0_VAL(x)	((x) & BIT(0)) -#define AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(x)	(((x) & BIT(0)) << 1)  #define AXP20X_ADC_RATE_MASK			GENMASK(7, 6) -#define AXP813_V_I_ADC_RATE_MASK		GENMASK(5, 4) -#define AXP813_ADC_RATE_MASK			(AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)  #define AXP20X_ADC_RATE_HZ(x)			((ilog2((x) / 25) << 6) & AXP20X_ADC_RATE_MASK) +  #define AXP22X_ADC_RATE_HZ(x)			((ilog2((x) / 100) << 6) & AXP20X_ADC_RATE_MASK) + +#define AXP813_V_I_ADC_RATE_MASK		GENMASK(5, 4) +#define AXP813_ADC_RATE_MASK			(AXP20X_ADC_RATE_MASK | AXP813_V_I_ADC_RATE_MASK)  #define AXP813_TS_GPIO0_ADC_RATE_HZ(x)		AXP20X_ADC_RATE_HZ(x)  #define AXP813_V_I_ADC_RATE_HZ(x)		((ilog2((x) / 100) << 4) & AXP813_V_I_ADC_RATE_MASK)  #define AXP813_ADC_RATE_HZ(x)			(AXP20X_ADC_RATE_HZ(x) | AXP813_V_I_ADC_RATE_HZ(x)) @@ -234,7 +235,7 @@ static int axp20x_adc_raw(struct iio_dev *indio_dev,  			  struct iio_chan_spec const *chan, int *val)  {  	struct axp20x_adc_iio *info = iio_priv(indio_dev); -	int size = 12; +	int ret, size;  	/*  	 * N.B.:  Unlike the Chinese datasheets tell, the charging current is @@ -246,10 +247,11 @@ static int axp20x_adc_raw(struct iio_dev *indio_dev,  	else  		size = 12; -	*val = axp20x_read_variable_width(info->regmap, chan->address, size); -	if (*val < 0) -		return *val; +	ret = axp20x_read_variable_width(info->regmap, chan->address, size); +	if (ret < 0) +		return ret; +	*val = ret;  	return IIO_VAL_INT;  } @@ -257,11 +259,13 @@ static int axp22x_adc_raw(struct iio_dev *indio_dev,  			  struct iio_chan_spec const *chan, int *val)  {  	struct axp20x_adc_iio *info = iio_priv(indio_dev); +	int ret; -	*val = axp20x_read_variable_width(info->regmap, chan->address, 12); -	if (*val < 0) -		return *val; +	ret = axp20x_read_variable_width(info->regmap, chan->address, 12); +	if (ret < 0) +		return ret; +	*val = ret;  	return IIO_VAL_INT;  } @@ -269,11 +273,13 @@ static int axp813_adc_raw(struct iio_dev *indio_dev,  			  struct iio_chan_spec const *chan, int *val)  {  	struct axp20x_adc_iio *info = iio_priv(indio_dev); +	int ret; -	*val = axp20x_read_variable_width(info->regmap, chan->address, 12); -	if (*val < 0) -		return *val; +	ret = axp20x_read_variable_width(info->regmap, chan->address, 12); +	if (ret < 0) +		return ret; +	*val = ret;  	return IIO_VAL_INT;  } @@ -443,27 +449,27 @@ static int axp20x_adc_offset_voltage(struct iio_dev *indio_dev, int channel,  				     int *val)  {  	struct axp20x_adc_iio *info = iio_priv(indio_dev); +	unsigned int regval;  	int ret; -	ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, val); +	ret = regmap_read(info->regmap, AXP20X_GPIO10_IN_RANGE, ®val);  	if (ret < 0)  		return ret;  	switch (channel) {  	case AXP20X_GPIO0_V: -		*val &= AXP20X_GPIO10_IN_RANGE_GPIO0; +		regval = FIELD_GET(AXP20X_GPIO10_IN_RANGE_GPIO0, regval);  		break;  	case AXP20X_GPIO1_V: -		*val &= AXP20X_GPIO10_IN_RANGE_GPIO1; +		regval = FIELD_GET(AXP20X_GPIO10_IN_RANGE_GPIO1, regval);  		break;  	default:  		return -EINVAL;  	} -	*val = *val ? 700000 : 0; - +	*val = regval ? 700000 : 0;  	return IIO_VAL_INT;  } @@ -548,7 +554,7 @@ static int axp20x_write_raw(struct iio_dev *indio_dev,  			    long mask)  {  	struct axp20x_adc_iio *info = iio_priv(indio_dev); -	unsigned int reg, regval; +	unsigned int regmask, regval;  	/*  	 * The AXP20X PMIC allows the user to choose between 0V and 0.7V offsets @@ -560,25 +566,22 @@ static int axp20x_write_raw(struct iio_dev *indio_dev,  	if (val != 0 && val != 700000)  		return -EINVAL; -	val = val ? 1 : 0; -  	switch (chan->channel) {  	case AXP20X_GPIO0_V: -		reg = AXP20X_GPIO10_IN_RANGE_GPIO0; -		regval = AXP20X_GPIO10_IN_RANGE_GPIO0_VAL(val); +		regmask = AXP20X_GPIO10_IN_RANGE_GPIO0; +		regval = FIELD_PREP(AXP20X_GPIO10_IN_RANGE_GPIO0, !!val);  		break;  	case AXP20X_GPIO1_V: -		reg = AXP20X_GPIO10_IN_RANGE_GPIO1; -		regval = AXP20X_GPIO10_IN_RANGE_GPIO1_VAL(val); +		regmask = AXP20X_GPIO10_IN_RANGE_GPIO1; +		regval = FIELD_PREP(AXP20X_GPIO10_IN_RANGE_GPIO1, !!val);  		break;  	default:  		return -EINVAL;  	} -	return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, reg, -				  regval); +	return regmap_update_bits(info->regmap, AXP20X_GPIO10_IN_RANGE, regmask, regval);  }  static const struct iio_info axp20x_adc_iio_info = { @@ -620,9 +623,9 @@ struct axp_data {  	int				num_channels;  	struct iio_chan_spec const	*channels;  	unsigned long			adc_en1_mask; +	unsigned long			adc_en2_mask;  	int				(*adc_rate)(struct axp20x_adc_iio *info,  						    int rate); -	bool				adc_en2;  	struct iio_map			*maps;  }; @@ -631,8 +634,8 @@ static const struct axp_data axp20x_data = {  	.num_channels = ARRAY_SIZE(axp20x_adc_channels),  	.channels = axp20x_adc_channels,  	.adc_en1_mask = AXP20X_ADC_EN1_MASK, +	.adc_en2_mask = AXP20X_ADC_EN2_MASK,  	.adc_rate = axp20x_adc_rate, -	.adc_en2 = true,  	.maps = axp20x_maps,  }; @@ -642,7 +645,6 @@ static const struct axp_data axp22x_data = {  	.channels = axp22x_adc_channels,  	.adc_en1_mask = AXP22X_ADC_EN1_MASK,  	.adc_rate = axp22x_adc_rate, -	.adc_en2 = false,  	.maps = axp22x_maps,  }; @@ -652,7 +654,6 @@ static const struct axp_data axp813_data = {  	.channels = axp813_adc_channels,  	.adc_en1_mask = AXP22X_ADC_EN1_MASK,  	.adc_rate = axp813_adc_rate, -	.adc_en2 = false,  	.maps = axp22x_maps,  }; @@ -710,10 +711,10 @@ static int axp20x_probe(struct platform_device *pdev)  	/* Enable the ADCs on IP */  	regmap_write(info->regmap, AXP20X_ADC_EN1, info->data->adc_en1_mask); -	if (info->data->adc_en2) -		/* Enable GPIO0/1 and internal temperature ADCs */ +	if (info->data->adc_en2_mask)  		regmap_update_bits(info->regmap, AXP20X_ADC_EN2, -				   AXP20X_ADC_EN2_MASK, AXP20X_ADC_EN2_MASK); +				   info->data->adc_en2_mask, +				   info->data->adc_en2_mask);  	/* Configure ADCs rate */  	info->data->adc_rate(info, 100); @@ -738,7 +739,7 @@ fail_register:  fail_map:  	regmap_write(info->regmap, AXP20X_ADC_EN1, 0); -	if (info->data->adc_en2) +	if (info->data->adc_en2_mask)  		regmap_write(info->regmap, AXP20X_ADC_EN2, 0);  	return ret; @@ -754,7 +755,7 @@ static int axp20x_remove(struct platform_device *pdev)  	regmap_write(info->regmap, AXP20X_ADC_EN1, 0); -	if (info->data->adc_en2) +	if (info->data->adc_en2_mask)  		regmap_write(info->regmap, AXP20X_ADC_EN2, 0);  	return 0;  |