2 * Copyright (C) ST-Ericsson SA 2009
4 * SPDX-License-Identifier: GPL-2.0+
8 #include <asm/arch/gpio.h>
10 static struct gpio_register *addr_gpio_register[] = {
11 (void *)U8500_GPIO_0_BASE,
12 (void *)U8500_GPIO_1_BASE,
13 (void *)U8500_GPIO_2_BASE,
14 (void *)U8500_GPIO_3_BASE,
15 (void *)U8500_GPIO_4_BASE,
16 (void *)U8500_GPIO_5_BASE,
17 (void *)U8500_GPIO_6_BASE,
18 (void *)U8500_GPIO_7_BASE,
19 (void *)U8500_GPIO_8_BASE,
22 struct gpio_altfun_data altfun_table[] = {
24 .altfun = GPIO_ALT_I2C_0,
31 .altfun = GPIO_ALT_I2C_1,
38 .altfun = GPIO_ALT_I2C_2,
45 .altfun = GPIO_ALT_I2C_3,
52 .altfun = GPIO_ALT_UART_0_MODEM,
59 .altfun = GPIO_ALT_UART_0_MODEM,
66 .altfun = GPIO_ALT_UART_1,
74 .altfun = GPIO_ALT_UART_2,
81 .altfun = GPIO_ALT_UART_2,
88 .altfun = GPIO_ALT_MSP_0,
95 .altfun = GPIO_ALT_MSP_0,
102 .altfun = GPIO_ALT_MSP_1,
109 .altfun = GPIO_ALT_MSP_2,
116 .altfun = GPIO_ALT_LCD_PANEL,
123 .altfun = GPIO_ALT_LCD_PANEL,
130 .altfun = GPIO_ALT_SD_CARD0,
137 .altfun = GPIO_ALT_MM_CARD0,
144 .altfun = GPIO_ALT_USB_OTG,
151 .altfun = GPIO_ALT_EMMC,
158 .altfun = GPIO_ALT_POP_EMMC,
167 * Static Function declarations
169 enum gpio_error gpio_setpinconfig(int pin_id, struct gpio_config *config)
171 struct gpio_register *p_gpio_register =
172 addr_gpio_register[GPIO_BLOCK(pin_id)];
173 u32 mask = 1UL << (pin_id % GPIO_PINS_PER_BLOCK);
174 enum gpio_error error = GPIO_OK;
177 switch (config->mode) {
179 temp_reg = readl(&p_gpio_register->gpio_afsa);
181 writel(temp_reg, &p_gpio_register->gpio_afsa);
182 temp_reg = readl(&p_gpio_register->gpio_afsb);
184 writel(temp_reg, &p_gpio_register->gpio_afsb);
187 temp_reg = readl(&p_gpio_register->gpio_afsa);
189 writel(temp_reg, &p_gpio_register->gpio_afsa);
190 temp_reg = readl(&p_gpio_register->gpio_afsb);
192 writel(temp_reg, &p_gpio_register->gpio_afsb);
195 temp_reg = readl(&p_gpio_register->gpio_afsa);
197 writel(temp_reg, &p_gpio_register->gpio_afsa);
198 temp_reg = readl(&p_gpio_register->gpio_afsb);
200 writel(temp_reg, &p_gpio_register->gpio_afsb);
202 case GPIO_MODE_SOFTWARE:
203 temp_reg = readl(&p_gpio_register->gpio_afsa);
205 writel(temp_reg, &p_gpio_register->gpio_afsa);
206 temp_reg = readl(&p_gpio_register->gpio_afsb);
208 writel(temp_reg, &p_gpio_register->gpio_afsb);
210 switch (config->direction) {
212 writel(mask, &p_gpio_register->gpio_dirc);
214 case GPIO_DIR_OUTPUT:
215 writel(mask, &p_gpio_register->gpio_dirs);
217 case GPIO_DIR_LEAVE_UNCHANGED:
220 return GPIO_INVALID_PARAMETER;
224 case GPIO_MODE_LEAVE_UNCHANGED:
227 return GPIO_INVALID_PARAMETER;
232 enum gpio_error gpio_resetgpiopin(int pin_id, char *dev_name)
234 struct gpio_register *p_gpio_register =
235 addr_gpio_register[GPIO_BLOCK(pin_id)];
236 u32 mask = 1UL << (pin_id % GPIO_PINS_PER_BLOCK);
237 enum gpio_error error = GPIO_OK;
240 temp_reg = readl(&p_gpio_register->gpio_afsa);
242 writel(temp_reg, &p_gpio_register->gpio_afsa);
243 temp_reg = readl(&p_gpio_register->gpio_afsb);
245 writel(temp_reg, &p_gpio_register->gpio_afsb);
246 writel(mask, &p_gpio_register->gpio_dirc);
251 struct gpio_config altfun_pinconfig;
252 enum gpio_error gpio_altfunction(enum gpio_alt_function alt_func,
253 int which_altfunc, char *dev_name)
255 int i, j, start, end;
256 enum gpio_error error = -1;
258 for (i = 0; i < ARRAY_SIZE(altfun_table); i++) {
259 if (altfun_table[i].altfun != alt_func)
262 start = altfun_table[i].start;
263 end = altfun_table[i].end;
264 for (j = start; j <= end; j++) {
265 if (which_altfunc == GPIO_ALTF_FIND)
266 altfun_pinconfig.mode = altfun_table[i].type;
268 altfun_pinconfig.mode = which_altfunc;
269 altfun_pinconfig.direction = GPIO_DIR_OUTPUT;
270 altfun_pinconfig.dev_name = dev_name;
272 if (which_altfunc != GPIO_ALTF_DISABLE)
273 error = gpio_setpinconfig(j, &altfun_pinconfig);
275 error = gpio_resetgpiopin(j, dev_name);
278 printf("GPIO %d configuration failure (nmdk_error:%d)",
280 error = GPIO_INVALID_PARAMETER;
284 if (!altfun_table[i].cont)
290 int gpio_writepin(int pin_id, enum gpio_data value, char *dev_name)
292 struct gpio_register *p_gpio_register =
293 addr_gpio_register[GPIO_BLOCK(pin_id)];
294 u32 mask = 1UL << (pin_id % GPIO_PINS_PER_BLOCK);
298 writel(mask, &p_gpio_register->gpio_dats);
301 writel(mask, &p_gpio_register->gpio_datc);
304 printf("Invalid value passed in %s", __FUNCTION__);
305 return GPIO_INVALID_PARAMETER;
310 int gpio_readpin(int pin_id, enum gpio_data *rv)
312 struct gpio_register *p_gpio_register =
313 addr_gpio_register[GPIO_BLOCK(pin_id)];
314 u32 mask = 1UL << (pin_id % GPIO_PINS_PER_BLOCK);
316 if ((readl(&p_gpio_register->gpio_dat) & mask) != 0)
317 *rv = GPIO_DATA_HIGH;
323 int gpio_altfuncenable(enum gpio_alt_function altfunc, char *dev_name)
325 return (int)gpio_altfunction(altfunc, GPIO_ALTF_FIND, dev_name);
328 int gpio_altfuncdisable(enum gpio_alt_function altfunc, char *dev_name)
330 return (int)gpio_altfunction(altfunc, GPIO_ALTF_DISABLE, dev_name);