diff options
Diffstat (limited to 'drivers/power/axp221.c')
| -rw-r--r-- | drivers/power/axp221.c | 236 | 
1 files changed, 53 insertions, 183 deletions
| diff --git a/drivers/power/axp221.c b/drivers/power/axp221.c index dc3a7f19bd9..7bbaec87e45 100644 --- a/drivers/power/axp221.c +++ b/drivers/power/axp221.c @@ -12,50 +12,10 @@  #include <common.h>  #include <errno.h> -#include <asm/arch/p2wi.h> -#include <asm/arch/rsb.h>  #include <asm/arch/gpio.h> +#include <asm/arch/pmic_bus.h>  #include <axp221.h> -/* - * The axp221 uses the p2wi bus, the axp223 is identical (for all registers - * used sofar) but uses the rsb bus. These functions abstract this. - */ -static int pmic_bus_init(void) -{ -#ifdef CONFIG_MACH_SUN6I -	p2wi_init(); -	return p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, AXP221_CTRL_ADDR, -					AXP221_INIT_DATA); -#else -	int ret; - -	ret = rsb_init(); -	if (ret) -		return ret; - -	return rsb_set_device_address(AXP223_DEVICE_ADDR, AXP223_RUNTIME_ADDR); -#endif -} - -static int pmic_bus_read(const u8 addr, u8 *data) -{ -#ifdef CONFIG_MACH_SUN6I -	return p2wi_read(addr, data); -#else -	return rsb_read(AXP223_RUNTIME_ADDR, addr, data); -#endif -} - -static int pmic_bus_write(const u8 addr, u8 data) -{ -#ifdef CONFIG_MACH_SUN6I -	return p2wi_write(addr, data); -#else -	return rsb_write(AXP223_RUNTIME_ADDR, addr, data); -#endif -} -  static u8 axp221_mvolt_to_cfg(int mvolt, int min, int max, int div)  {  	if (mvolt < min) @@ -66,52 +26,26 @@ static u8 axp221_mvolt_to_cfg(int mvolt, int min, int max, int div)  	return (mvolt - min) / div;  } -static int axp221_setbits(u8 reg, u8 bits) -{ -	int ret; -	u8 val; - -	ret = pmic_bus_read(reg, &val); -	if (ret) -		return ret; - -	val |= bits; -	return pmic_bus_write(reg, val); -} - -static int axp221_clrbits(u8 reg, u8 bits) -{ -	int ret; -	u8 val; - -	ret = pmic_bus_read(reg, &val); -	if (ret) -		return ret; - -	val &= ~bits; -	return pmic_bus_write(reg, val); -} -  int axp221_set_dcdc1(unsigned int mvolt)  {  	int ret;  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 1600, 3400, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL1, -				      AXP221_OUTPUT_CTRL1_DCDC1_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1, +					AXP221_OUTPUT_CTRL1_DCDC1_EN);  	ret = pmic_bus_write(AXP221_DCDC1_CTRL, cfg);  	if (ret)  		return ret; -	ret = axp221_setbits(AXP221_OUTPUT_CTRL2, -			     AXP221_OUTPUT_CTRL2_DCDC1SW_EN); +	ret = pmic_bus_setbits(AXP221_OUTPUT_CTRL2, +			       AXP221_OUTPUT_CTRL2_DCDC1SW_EN);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL1, -			      AXP221_OUTPUT_CTRL1_DCDC1_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL1, +				AXP221_OUTPUT_CTRL1_DCDC1_EN);  }  int axp221_set_dcdc2(unsigned int mvolt) @@ -120,15 +54,15 @@ int axp221_set_dcdc2(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1540, 20);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL1, -				      AXP221_OUTPUT_CTRL1_DCDC2_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1, +					AXP221_OUTPUT_CTRL1_DCDC2_EN);  	ret = pmic_bus_write(AXP221_DCDC2_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL1, -			      AXP221_OUTPUT_CTRL1_DCDC2_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL1, +				AXP221_OUTPUT_CTRL1_DCDC2_EN);  }  int axp221_set_dcdc3(unsigned int mvolt) @@ -137,15 +71,15 @@ int axp221_set_dcdc3(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1860, 20);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL1, -				      AXP221_OUTPUT_CTRL1_DCDC3_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1, +					AXP221_OUTPUT_CTRL1_DCDC3_EN);  	ret = pmic_bus_write(AXP221_DCDC3_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL1, -			      AXP221_OUTPUT_CTRL1_DCDC3_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL1, +				AXP221_OUTPUT_CTRL1_DCDC3_EN);  }  int axp221_set_dcdc4(unsigned int mvolt) @@ -154,15 +88,15 @@ int axp221_set_dcdc4(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 600, 1540, 20);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL1, -				      AXP221_OUTPUT_CTRL1_DCDC4_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1, +					AXP221_OUTPUT_CTRL1_DCDC4_EN);  	ret = pmic_bus_write(AXP221_DCDC4_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL1, -			      AXP221_OUTPUT_CTRL1_DCDC4_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL1, +				AXP221_OUTPUT_CTRL1_DCDC4_EN);  }  int axp221_set_dcdc5(unsigned int mvolt) @@ -171,15 +105,15 @@ int axp221_set_dcdc5(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 1000, 2550, 50);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL1, -				      AXP221_OUTPUT_CTRL1_DCDC5_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1, +					AXP221_OUTPUT_CTRL1_DCDC5_EN);  	ret = pmic_bus_write(AXP221_DCDC5_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL1, -			      AXP221_OUTPUT_CTRL1_DCDC5_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL1, +				AXP221_OUTPUT_CTRL1_DCDC5_EN);  }  int axp221_set_dldo1(unsigned int mvolt) @@ -188,15 +122,15 @@ int axp221_set_dldo1(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL2, -				      AXP221_OUTPUT_CTRL2_DLDO1_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2, +					AXP221_OUTPUT_CTRL2_DLDO1_EN);  	ret = pmic_bus_write(AXP221_DLDO1_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL2, -			      AXP221_OUTPUT_CTRL2_DLDO1_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL2, +				AXP221_OUTPUT_CTRL2_DLDO1_EN);  }  int axp221_set_dldo2(unsigned int mvolt) @@ -205,15 +139,15 @@ int axp221_set_dldo2(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL2, -				      AXP221_OUTPUT_CTRL2_DLDO2_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2, +					AXP221_OUTPUT_CTRL2_DLDO2_EN);  	ret = pmic_bus_write(AXP221_DLDO2_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL2, -			      AXP221_OUTPUT_CTRL2_DLDO2_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL2, +				AXP221_OUTPUT_CTRL2_DLDO2_EN);  }  int axp221_set_dldo3(unsigned int mvolt) @@ -222,15 +156,15 @@ int axp221_set_dldo3(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL2, -				      AXP221_OUTPUT_CTRL2_DLDO3_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2, +					AXP221_OUTPUT_CTRL2_DLDO3_EN);  	ret = pmic_bus_write(AXP221_DLDO3_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL2, -			      AXP221_OUTPUT_CTRL2_DLDO3_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL2, +				AXP221_OUTPUT_CTRL2_DLDO3_EN);  }  int axp221_set_dldo4(unsigned int mvolt) @@ -239,15 +173,15 @@ int axp221_set_dldo4(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL2, -				      AXP221_OUTPUT_CTRL2_DLDO4_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2, +					AXP221_OUTPUT_CTRL2_DLDO4_EN);  	ret = pmic_bus_write(AXP221_DLDO4_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL2, -			      AXP221_OUTPUT_CTRL2_DLDO4_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL2, +				AXP221_OUTPUT_CTRL2_DLDO4_EN);  }  int axp221_set_aldo1(unsigned int mvolt) @@ -256,15 +190,15 @@ int axp221_set_aldo1(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL1, -				      AXP221_OUTPUT_CTRL1_ALDO1_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1, +					AXP221_OUTPUT_CTRL1_ALDO1_EN);  	ret = pmic_bus_write(AXP221_ALDO1_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL1, -			      AXP221_OUTPUT_CTRL1_ALDO1_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL1, +				AXP221_OUTPUT_CTRL1_ALDO1_EN);  }  int axp221_set_aldo2(unsigned int mvolt) @@ -273,15 +207,15 @@ int axp221_set_aldo2(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL1, -				      AXP221_OUTPUT_CTRL1_ALDO2_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL1, +					AXP221_OUTPUT_CTRL1_ALDO2_EN);  	ret = pmic_bus_write(AXP221_ALDO2_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL1, -			      AXP221_OUTPUT_CTRL1_ALDO2_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL1, +				AXP221_OUTPUT_CTRL1_ALDO2_EN);  }  int axp221_set_aldo3(unsigned int mvolt) @@ -290,15 +224,15 @@ int axp221_set_aldo3(unsigned int mvolt)  	u8 cfg = axp221_mvolt_to_cfg(mvolt, 700, 3300, 100);  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL3, -				      AXP221_OUTPUT_CTRL3_ALDO3_EN); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL3, +					AXP221_OUTPUT_CTRL3_ALDO3_EN);  	ret = pmic_bus_write(AXP221_ALDO3_CTRL, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL3, -			      AXP221_OUTPUT_CTRL3_ALDO3_EN); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL3, +				AXP221_OUTPUT_CTRL3_ALDO3_EN);  }  int axp221_set_eldo(int eldo_num, unsigned int mvolt) @@ -325,13 +259,13 @@ int axp221_set_eldo(int eldo_num, unsigned int mvolt)  	}  	if (mvolt == 0) -		return axp221_clrbits(AXP221_OUTPUT_CTRL2, bits); +		return pmic_bus_clrbits(AXP221_OUTPUT_CTRL2, bits);  	ret = pmic_bus_write(addr, cfg);  	if (ret)  		return ret; -	return axp221_setbits(AXP221_OUTPUT_CTRL2, bits); +	return pmic_bus_setbits(AXP221_OUTPUT_CTRL2, bits);  }  int axp221_init(void) @@ -385,67 +319,3 @@ int axp221_get_sid(unsigned int *sid)  	return 0;  } - -int axp_gpio_direction_input(unsigned int pin) -{ -	switch (pin) { -	case SUNXI_GPIO_AXP0_VBUS_DETECT: -		return 0; -	default: -		return -EINVAL; -	} -} - -int axp_gpio_direction_output(unsigned int pin, unsigned int val) -{ -	int ret; - -	switch (pin) { -	case SUNXI_GPIO_AXP0_VBUS_ENABLE: -		ret = axp221_clrbits(AXP221_MISC_CTRL, -				     AXP221_MISC_CTRL_N_VBUSEN_FUNC); -		if (ret) -			return ret; - -		return axp_gpio_set_value(pin, val); -	default: -		return -EINVAL; -	} -} - -int axp_gpio_get_value(unsigned int pin) -{ -	int ret; -	u8 val; - -	switch (pin) { -	case SUNXI_GPIO_AXP0_VBUS_DETECT: -		ret = pmic_bus_read(AXP221_POWER_STATUS, &val); -		if (ret) -			return ret; - -		return !!(val & AXP221_POWER_STATUS_VBUS_AVAIL); -	default: -		return -EINVAL; -	} -} - -int axp_gpio_set_value(unsigned int pin, unsigned int val) -{ -	int ret; - -	switch (pin) { -	case SUNXI_GPIO_AXP0_VBUS_ENABLE: -		if (val) -			ret = axp221_setbits(AXP221_VBUS_IPSOUT, -					     AXP221_VBUS_IPSOUT_DRIVEBUS); -		else -			ret = axp221_clrbits(AXP221_VBUS_IPSOUT, -					     AXP221_VBUS_IPSOUT_DRIVEBUS); - -		if (ret) -			return ret; -	} - -	return 0; -} | 
