Skip to content
Snippets Groups Projects
Commit f7c7ab63 authored by Paul Kocialkowski's avatar Paul Kocialkowski Committed by Hans de Goede
Browse files

power: axp221: Virtual VBUS detect and enable GPIOs to replace separate logic


This converts the VBUS detection and enable logic to GPIO instead of separate
axp functions and checks that have to be used aside usual GPIO functions.

Signed-off-by: default avatarPaul Kocialkowski <contact@paulk.fr>
Acked-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
parent 991963bc
Branches
Tags
No related merge requests found
...@@ -201,6 +201,10 @@ enum sunxi_gpio_number { ...@@ -201,6 +201,10 @@ enum sunxi_gpio_number {
#define SUNXI_GPIO_PULL_UP 1 #define SUNXI_GPIO_PULL_UP 1
#define SUNXI_GPIO_PULL_DOWN 2 #define SUNXI_GPIO_PULL_DOWN 2
/* Virtual AXP0 GPIOs */
#define SUNXI_GPIO_AXP0_VBUS_DETECT 8
#define SUNXI_GPIO_AXP0_VBUS_ENABLE 9
void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val); void sunxi_gpio_set_cfgbank(struct sunxi_gpio *pio, int bank_offset, u32 val);
void sunxi_gpio_set_cfgpin(u32 pin, u32 val); void sunxi_gpio_set_cfgpin(u32 pin, u32 val);
int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset); int sunxi_gpio_get_cfgbank(struct sunxi_gpio *pio, int bank_offset);
......
...@@ -21,6 +21,9 @@ ...@@ -21,6 +21,9 @@
#ifdef CONFIG_AXP209_POWER #ifdef CONFIG_AXP209_POWER
#include <axp209.h> #include <axp209.h>
#endif #endif
#ifdef CONFIG_AXP221_POWER
#include <axp221.h>
#endif
DECLARE_GLOBAL_DATA_PTR; DECLARE_GLOBAL_DATA_PTR;
...@@ -125,6 +128,12 @@ int sunxi_name_to_gpio(const char *name) ...@@ -125,6 +128,12 @@ int sunxi_name_to_gpio(const char *name)
#ifdef AXP_GPIO #ifdef AXP_GPIO
if (strncasecmp(name, "AXP0-", 5) == 0) { if (strncasecmp(name, "AXP0-", 5) == 0) {
name += 5; name += 5;
if (strcmp(name, "VBUS-DETECT") == 0)
return SUNXI_GPIO_AXP0_START +
SUNXI_GPIO_AXP0_VBUS_DETECT;
if (strcmp(name, "VBUS-ENABLE") == 0)
return SUNXI_GPIO_AXP0_START +
SUNXI_GPIO_AXP0_VBUS_ENABLE;
pin = simple_strtol(name, &eptr, 10); pin = simple_strtol(name, &eptr, 10);
if (!*name || *eptr) if (!*name || *eptr)
return -1; return -1;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <errno.h> #include <errno.h>
#include <asm/arch/p2wi.h> #include <asm/arch/p2wi.h>
#include <asm/arch/rsb.h> #include <asm/arch/rsb.h>
#include <asm/arch/gpio.h>
#include <axp221.h> #include <axp221.h>
/* /*
...@@ -385,54 +386,66 @@ int axp221_get_sid(unsigned int *sid) ...@@ -385,54 +386,66 @@ int axp221_get_sid(unsigned int *sid)
return 0; return 0;
} }
int axp_get_vbus(void) int axp_gpio_direction_input(unsigned int pin)
{ {
int ret; switch (pin) {
u8 val; case SUNXI_GPIO_AXP0_VBUS_DETECT:
return 0;
ret = axp221_init(); default:
if (ret) return -EINVAL;
return ret; }
ret = pmic_bus_read(AXP221_POWER_STATUS, &val);
if (ret)
return ret;
return (val & AXP221_POWER_STATUS_VBUS_USABLE) ? 1 : 0;
} }
static int axp_drivebus_setup(void) int axp_gpio_direction_output(unsigned int pin, unsigned int val)
{ {
int ret; int ret;
ret = axp221_init(); switch (pin) {
case SUNXI_GPIO_AXP0_VBUS_ENABLE:
ret = axp221_clrbits(AXP221_MISC_CTRL,
AXP221_MISC_CTRL_N_VBUSEN_FUNC);
if (ret) if (ret)
return ret; return ret;
/* Set N_VBUSEN pin to output / DRIVEBUS function */ return axp_gpio_set_value(pin, val);
return axp221_clrbits(AXP221_MISC_CTRL, AXP221_MISC_CTRL_N_VBUSEN_FUNC); default:
return -EINVAL;
}
} }
int axp_drivebus_enable(void) int axp_gpio_get_value(unsigned int pin)
{ {
int ret; int ret;
u8 val;
ret = axp_drivebus_setup(); switch (pin) {
case SUNXI_GPIO_AXP0_VBUS_DETECT:
ret = pmic_bus_read(AXP221_POWER_STATUS, &val);
if (ret) if (ret)
return ret; return ret;
/* Set DRIVEBUS high */ return !!(val & AXP221_POWER_STATUS_VBUS_USABLE);
return axp221_setbits(AXP221_VBUS_IPSOUT, AXP221_VBUS_IPSOUT_DRIVEBUS); default:
return -EINVAL;
}
} }
int axp_drivebus_disable(void) int axp_gpio_set_value(unsigned int pin, unsigned int val)
{ {
int ret; int ret;
ret = axp_drivebus_setup(); 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) if (ret)
return ret; return ret;
}
/* Set DRIVEBUS low */ return 0;
return axp221_clrbits(AXP221_VBUS_IPSOUT, AXP221_VBUS_IPSOUT_DRIVEBUS);
} }
...@@ -62,11 +62,7 @@ ...@@ -62,11 +62,7 @@
/* Page 1 addresses */ /* Page 1 addresses */
#define AXP221_SID 0x20 #define AXP221_SID 0x20
/* We support vbus detection */ #define AXP_GPIO
#define AXP_VBUS_DETECT
/* We support drivebus control */
#define AXP_DRIVEBUS
int axp221_set_dcdc1(unsigned int mvolt); int axp221_set_dcdc1(unsigned int mvolt);
int axp221_set_dcdc2(unsigned int mvolt); int axp221_set_dcdc2(unsigned int mvolt);
...@@ -83,6 +79,8 @@ int axp221_set_aldo3(unsigned int mvolt); ...@@ -83,6 +79,8 @@ int axp221_set_aldo3(unsigned int mvolt);
int axp221_set_eldo(int eldo_num, unsigned int mvolt); int axp221_set_eldo(int eldo_num, unsigned int mvolt);
int axp221_init(void); int axp221_init(void);
int axp221_get_sid(unsigned int *sid); int axp221_get_sid(unsigned int *sid);
int axp_get_vbus(void);
int axp_drivebus_enable(void); int axp_gpio_direction_input(unsigned int pin);
int axp_drivebus_disable(void); int axp_gpio_direction_output(unsigned int pin, unsigned int val);
int axp_gpio_get_value(unsigned int pin);
int axp_gpio_set_value(unsigned int pin, unsigned int val);
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment