2 * Copyright (C) ST-Ericsson SA 2009
4 * SPDX-License-Identifier: GPL-2.0+
10 #include <asm/types.h>
12 #include <asm/errno.h>
14 #include <asm/arch/sys_proto.h>
15 #include <asm/arch/u8500.h>
17 #define GPIO_TOTAL_PINS 268
19 #define GPIO_PINS_PER_BLOCK 32
20 #define GPIO_BLOCKS_COUNT (GPIO_TOTAL_PINS/GPIO_PINS_PER_BLOCK + 1)
21 #define GPIO_BLOCK(pin) (((pin + GPIO_PINS_PER_BLOCK) >> 5) - 1)
24 struct gpio_register {
25 u32 gpio_dat; /* data register : 0x000 */
26 u32 gpio_dats; /* data Set register : 0x004 */
27 u32 gpio_datc; /* data Clear register : 0x008 */
28 u32 gpio_pdis; /* Pull disable register : 0x00C */
29 u32 gpio_dir; /* data direction register : 0x010 */
30 u32 gpio_dirs; /* data dir Set register : 0x014 */
31 u32 gpio_dirc; /* data dir Clear register : 0x018 */
32 u32 gpio_slpm; /* Sleep mode register : 0x01C */
33 u32 gpio_afsa; /* AltFun A Select reg : 0x020 */
34 u32 gpio_afsb; /* AltFun B Select reg : 0x024 */
35 u32 gpio_lowemi;/* low EMI Select reg : 0x028 */
36 u32 reserved_1[(0x040 - 0x02C) >> 2]; /*0x028-0x3C Reserved*/
37 u32 gpio_rimsc; /* rising edge intr set/clear : 0x040 */
38 u32 gpio_fimsc; /* falling edge intr set/clear register : 0x044 */
39 u32 gpio_mis; /* masked interrupt status register : 0x048 */
40 u32 gpio_ic; /* Interrupt Clear register : 0x04C */
41 u32 gpio_rwimsc;/* Rising-edge Wakeup IMSC register : 0x050 */
42 u32 gpio_fwimsc;/* Falling-edge Wakeup IMSC register : 0x054 */
43 u32 gpio_wks; /* Wakeup Status register : 0x058 */
46 /* Error values returned by functions */
49 GPIO_UNSUPPORTED_HW = -2,
50 GPIO_UNSUPPORTED_FEATURE = -3,
51 GPIO_INVALID_PARAMETER = -4,
52 GPIO_REQUEST_NOT_APPLICABLE = -5,
53 GPIO_REQUEST_PENDING = -6,
54 GPIO_NOT_CONFIGURED = -7,
55 GPIO_INTERNAL_ERROR = -8,
56 GPIO_INTERNAL_EVENT = 1,
57 GPIO_REMAINING_EVENT = 2,
58 GPIO_NO_MORE_PENDING_EVENT = 3,
59 GPIO_INVALID_CLIENT = -25,
60 GPIO_INVALID_PIN = -26,
62 GPIO_PIN_NOT_ALLOCATED = -28,
63 GPIO_WRONG_CLIENT = -29,
64 GPIO_UNSUPPORTED_ALTFUNC = -30,
73 GPIO_DEVICE_ID_INVALID
78 * refered in altfun_table to pointout particular altfun to be enabled
79 * when using GPIO_ALT_FUNCTION A/B/C enable/disable operation
81 enum gpio_alt_function {
82 GPIO_ALT_UART_0_MODEM,
83 GPIO_ALT_UART_0_NO_MODEM,
103 GPIO_ALT_CCIR656_INPUT,
104 GPIO_ALT_CCIR656_OUTPUT,
108 GPIO_ALT_HAMAC_AUDIO_DBG,
109 GPIO_ALT_HAMAC_VIDEO_DBG,
110 GPIO_ALT_CLOCK_RESET,
113 GPIO_ALT_USB_MINIMUM,
119 GPIO_ALT_SRAM_NOR_FLASH,
120 GPIO_ALT_FSMC_ADDLINE_0_TO_15,
127 GPIO_ALT_FSMC_ADD_DATA_0_TO_25,
137 GPIO_ALT_FUNMAX /* Add new alt func before this */
140 /* Defines pin assignment(Software mode or Alternate mode) */
142 GPIO_MODE_LEAVE_UNCHANGED, /* Parameter will be ignored */
143 GPIO_MODE_SOFTWARE, /* Pin connected to GPIO (SW controlled) */
144 GPIO_ALTF_A, /* Pin connected to altfunc 1 (HW periph 1) */
145 GPIO_ALTF_B, /* Pin connected to altfunc 2 (HW periph 2) */
146 GPIO_ALTF_C, /* Pin connected to altfunc 3 (HW periph 3) */
147 GPIO_ALTF_FIND, /* Pin connected to altfunc 3 (HW periph 3) */
148 GPIO_ALTF_DISABLE /* Pin connected to altfunc 3 (HW periph 3) */
151 /* Defines GPIO pin direction */
152 enum gpio_direction {
153 GPIO_DIR_LEAVE_UNCHANGED, /* Parameter will be ignored */
154 GPIO_DIR_INPUT, /* GPIO set as input */
155 GPIO_DIR_OUTPUT /* GPIO set as output */
158 /* Interrupt trigger mode */
160 GPIO_TRIG_LEAVE_UNCHANGED, /* Parameter will be ignored */
161 GPIO_TRIG_DISABLE, /* Trigger no IT */
162 GPIO_TRIG_RISING_EDGE, /* Trigger an IT on rising edge */
163 GPIO_TRIG_FALLING_EDGE, /* Trigger an IT on falling edge */
164 GPIO_TRIG_BOTH_EDGES, /* Trigger an IT on rising and falling edge */
165 GPIO_TRIG_HIGH_LEVEL, /* Trigger an IT on high level */
166 GPIO_TRIG_LOW_LEVEL /* Trigger an IT on low level */
169 /* Configuration parameters for one GPIO pin.*/
172 enum gpio_direction direction;
174 char *dev_name; /* Who owns the gpio pin */
183 /* GPIO behaviour in sleep mode */
184 enum gpio_sleep_mode {
185 GPIO_SLEEP_MODE_LEAVE_UNCHANGED, /* Parameter will be ignored */
186 GPIO_SLEEP_MODE_INPUT_DEFAULTVOLT, /* GPIO is an input with pull
187 up/down enabled when in sleep
189 GPIO_SLEEP_MODE_CONTROLLED_BY_GPIO /* GPIO pin is controlled by
190 GPIO IP. So mode, direction
191 and data values for GPIO pin
192 in sleep mode are determined
193 by configuration set to GPIO
194 pin before entering to sleep
198 /* GPIO ability to wake the system up from sleep mode.*/
200 GPIO_WAKE_LEAVE_UNCHANGED, /* Parameter will be ignored */
201 GPIO_WAKE_DISABLE, /* No wake of system from sleep mode. */
202 GPIO_WAKE_LOW_LEVEL, /* Wake the system up on a LOW level. */
203 GPIO_WAKE_HIGH_LEVEL, /* Wake the system up on a HIGH level. */
204 GPIO_WAKE_RISING_EDGE, /* Wake the system up on a RISING edge. */
205 GPIO_WAKE_FALLING_EDGE, /* Wake the system up on a FALLING edge. */
206 GPIO_WAKE_BOTH_EDGES /* Wake the system up on both RISE and FALL. */
209 /* Configuration parameters for one GPIO pin in sleep mode.*/
210 struct gpio_sleep_config {
211 enum gpio_sleep_mode sleep_mode;/* GPIO behaviour in sleep mode. */
212 enum gpio_wake wake; /* GPIO ability to wake up system. */
215 extern int gpio_setpinconfig(int pin_id, struct gpio_config *pin_config);
216 extern int gpio_resetpinconfig(int pin_id, char *dev_name);
217 extern int gpio_writepin(int pin_id, enum gpio_data value, char *dev_name);
218 extern int gpio_readpin(int pin_id, enum gpio_data *value);
219 extern int gpio_altfuncenable(enum gpio_alt_function altfunc,
221 extern int gpio_altfuncdisable(enum gpio_alt_function altfunc,
224 struct gpio_altfun_data {