2 * (C) Copyright 2015 Hans de Goede <hdegoede@redhat.com>
4 * X-Powers AXP Power Management ICs gpio driver
6 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/arch/gpio.h>
11 #include <asm/arch/pmic_bus.h>
14 #ifdef CONFIG_AXP152_POWER
16 #elif defined CONFIG_AXP209_POWER
18 #elif defined CONFIG_AXP221_POWER
21 #error Unknown AXP model
24 static u8 axp_get_gpio_ctrl_reg(unsigned pin)
27 case 0: return AXP_GPIO0_CTRL;
28 case 1: return AXP_GPIO1_CTRL;
30 case 2: return AXP_GPIO2_CTRL;
33 case 3: return AXP_GPIO3_CTRL;
39 int axp_gpio_direction_input(struct udevice *dev, unsigned pin)
44 #ifndef CONFIG_AXP152_POWER /* NA on axp152 */
45 case SUNXI_GPIO_AXP0_VBUS_DETECT:
49 reg = axp_get_gpio_ctrl_reg(pin);
53 return pmic_bus_write(reg, AXP_GPIO_CTRL_INPUT);
57 int axp_gpio_direction_output(struct udevice *dev, unsigned pin, int val)
59 __maybe_unused int ret;
63 #ifdef CONFIG_AXP221_POWER /* Only available on axp221/axp223 */
64 case SUNXI_GPIO_AXP0_VBUS_ENABLE:
65 ret = pmic_bus_clrbits(AXP221_MISC_CTRL,
66 AXP221_MISC_CTRL_N_VBUSEN_FUNC);
70 return axp_gpio_set_value(dev, pin, val);
73 reg = axp_get_gpio_ctrl_reg(pin);
77 return pmic_bus_write(reg, val ? AXP_GPIO_CTRL_OUTPUT_HIGH :
78 AXP_GPIO_CTRL_OUTPUT_LOW);
82 int axp_gpio_get_value(struct udevice *dev, unsigned pin)
88 #ifndef CONFIG_AXP152_POWER /* NA on axp152 */
89 case SUNXI_GPIO_AXP0_VBUS_DETECT:
90 ret = pmic_bus_read(AXP_POWER_STATUS, &val);
91 mask = AXP_POWER_STATUS_VBUS_PRESENT;
94 #ifdef CONFIG_AXP221_POWER /* Only available on axp221/axp223 */
95 case SUNXI_GPIO_AXP0_VBUS_ENABLE:
96 ret = pmic_bus_read(AXP221_VBUS_IPSOUT, &val);
97 mask = AXP221_VBUS_IPSOUT_DRIVEBUS;
101 reg = axp_get_gpio_ctrl_reg(pin);
105 ret = pmic_bus_read(AXP_GPIO_STATE, &val);
106 mask = 1 << (pin + AXP_GPIO_STATE_OFFSET);
111 return (val & mask) ? 1 : 0;
114 int axp_gpio_set_value(struct udevice *dev, unsigned pin, int val)
119 #ifdef CONFIG_AXP221_POWER /* Only available on axp221/axp223 */
120 case SUNXI_GPIO_AXP0_VBUS_ENABLE:
122 return pmic_bus_setbits(AXP221_VBUS_IPSOUT,
123 AXP221_VBUS_IPSOUT_DRIVEBUS);
125 return pmic_bus_clrbits(AXP221_VBUS_IPSOUT,
126 AXP221_VBUS_IPSOUT_DRIVEBUS);
129 reg = axp_get_gpio_ctrl_reg(pin);
133 return pmic_bus_write(reg, val ? AXP_GPIO_CTRL_OUTPUT_HIGH :
134 AXP_GPIO_CTRL_OUTPUT_LOW);
138 int axp_gpio_init(void)
142 ret = pmic_bus_init();