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
);