|
@@ -14,6 +14,7 @@
|
|
|
#include <errno.h>
|
|
|
#include <asm/arch/p2wi.h>
|
|
|
#include <asm/arch/rsb.h>
|
|
|
+#include <asm/arch/gpio.h>
|
|
|
#include <axp221.h>
|
|
|
|
|
|
/*
|
|
@@ -385,54 +386,66 @@ int axp221_get_sid(unsigned int *sid)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int axp_get_vbus(void)
|
|
|
+int axp_gpio_direction_input(unsigned int pin)
|
|
|
{
|
|
|
- int ret;
|
|
|
- u8 val;
|
|
|
-
|
|
|
- ret = axp221_init();
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
-
|
|
|
- ret = pmic_bus_read(AXP221_POWER_STATUS, &val);
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
-
|
|
|
- return (val & AXP221_POWER_STATUS_VBUS_USABLE) ? 1 : 0;
|
|
|
+ switch (pin) {
|
|
|
+ case SUNXI_GPIO_AXP0_VBUS_DETECT:
|
|
|
+ return 0;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-static int axp_drivebus_setup(void)
|
|
|
+int axp_gpio_direction_output(unsigned int pin, unsigned int val)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- ret = axp221_init();
|
|
|
- if (ret)
|
|
|
- return 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;
|
|
|
|
|
|
- /* Set N_VBUSEN pin to output / DRIVEBUS function */
|
|
|
- return axp221_clrbits(AXP221_MISC_CTRL, AXP221_MISC_CTRL_N_VBUSEN_FUNC);
|
|
|
+ return axp_gpio_set_value(pin, val);
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-int axp_drivebus_enable(void)
|
|
|
+int axp_gpio_get_value(unsigned int pin)
|
|
|
{
|
|
|
int ret;
|
|
|
+ u8 val;
|
|
|
|
|
|
- ret = axp_drivebus_setup();
|
|
|
- if (ret)
|
|
|
- return ret;
|
|
|
+ switch (pin) {
|
|
|
+ case SUNXI_GPIO_AXP0_VBUS_DETECT:
|
|
|
+ ret = pmic_bus_read(AXP221_POWER_STATUS, &val);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
|
|
|
- /* Set DRIVEBUS high */
|
|
|
- return axp221_setbits(AXP221_VBUS_IPSOUT, AXP221_VBUS_IPSOUT_DRIVEBUS);
|
|
|
+ return !!(val & AXP221_POWER_STATUS_VBUS_USABLE);
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-int axp_drivebus_disable(void)
|
|
|
+int axp_gpio_set_value(unsigned int pin, unsigned int val)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- ret = axp_drivebus_setup();
|
|
|
- if (ret)
|
|
|
- return 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);
|
|
|
|
|
|
- /* Set DRIVEBUS low */
|
|
|
- return axp221_clrbits(AXP221_VBUS_IPSOUT, AXP221_VBUS_IPSOUT_DRIVEBUS);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|