]>
Commit | Line | Data |
---|---|---|
be72e0c8 JR |
1 | /* |
2 | * Copyright (C) ST-Ericsson SA 2009 | |
3 | * | |
1a459660 | 4 | * SPDX-License-Identifier: GPL-2.0+ |
be72e0c8 JR |
5 | */ |
6 | ||
7 | #ifndef _UX500_GPIO_h | |
8 | #define _UX500_GPIO_h | |
9 | ||
10 | #include <asm/types.h> | |
11 | #include <asm/io.h> | |
12 | #include <asm/errno.h> | |
13 | ||
14 | #include <asm/arch/sys_proto.h> | |
15 | #include <asm/arch/u8500.h> | |
16 | ||
17 | #define GPIO_TOTAL_PINS 268 | |
18 | ||
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) | |
22 | ||
23 | ||
24 | struct gpio_register { | |
4c964086 WD |
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 */ | |
be72e0c8 | 36 | u32 reserved_1[(0x040 - 0x02C) >> 2]; /*0x028-0x3C Reserved*/ |
4c964086 WD |
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 */ | |
be72e0c8 JR |
44 | }; |
45 | ||
46 | /* Error values returned by functions */ | |
47 | enum gpio_error { | |
48 | GPIO_OK = 0, | |
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, | |
61 | GPIO_PIN_BUSY = -27, | |
62 | GPIO_PIN_NOT_ALLOCATED = -28, | |
63 | GPIO_WRONG_CLIENT = -29, | |
64 | GPIO_UNSUPPORTED_ALTFUNC = -30, | |
65 | }; | |
66 | ||
67 | /*GPIO DEVICE ID */ | |
68 | enum gpio_device_id { | |
69 | GPIO_DEVICE_ID_0, | |
70 | GPIO_DEVICE_ID_1, | |
71 | GPIO_DEVICE_ID_2, | |
72 | GPIO_DEVICE_ID_3, | |
73 | GPIO_DEVICE_ID_INVALID | |
74 | }; | |
75 | ||
76 | /* | |
77 | * Alternate Function: | |
78 | * refered in altfun_table to pointout particular altfun to be enabled | |
79 | * when using GPIO_ALT_FUNCTION A/B/C enable/disable operation | |
80 | */ | |
81 | enum gpio_alt_function { | |
82 | GPIO_ALT_UART_0_MODEM, | |
83 | GPIO_ALT_UART_0_NO_MODEM, | |
84 | GPIO_ALT_UART_1, | |
85 | GPIO_ALT_UART_2, | |
86 | GPIO_ALT_I2C_0, | |
87 | GPIO_ALT_I2C_1, | |
88 | GPIO_ALT_I2C_2, | |
89 | GPIO_ALT_I2C_3, | |
90 | GPIO_ALT_MSP_0, | |
91 | GPIO_ALT_MSP_1, | |
92 | GPIO_ALT_MSP_2, | |
93 | GPIO_ALT_MSP_3, | |
94 | GPIO_ALT_MSP_4, | |
95 | GPIO_ALT_MSP_5, | |
96 | GPIO_ALT_SSP_0, | |
97 | GPIO_ALT_SSP_1, | |
98 | GPIO_ALT_MM_CARD0, | |
99 | GPIO_ALT_SD_CARD0, | |
100 | GPIO_ALT_DMA_0, | |
101 | GPIO_ALT_DMA_1, | |
102 | GPIO_ALT_HSI0, | |
103 | GPIO_ALT_CCIR656_INPUT, | |
104 | GPIO_ALT_CCIR656_OUTPUT, | |
105 | GPIO_ALT_LCD_PANEL, | |
106 | GPIO_ALT_MDIF, | |
107 | GPIO_ALT_SDRAM, | |
108 | GPIO_ALT_HAMAC_AUDIO_DBG, | |
109 | GPIO_ALT_HAMAC_VIDEO_DBG, | |
110 | GPIO_ALT_CLOCK_RESET, | |
111 | GPIO_ALT_TSP, | |
112 | GPIO_ALT_IRDA, | |
113 | GPIO_ALT_USB_MINIMUM, | |
114 | GPIO_ALT_USB_I2C, | |
115 | GPIO_ALT_OWM, | |
116 | GPIO_ALT_PWL, | |
117 | GPIO_ALT_FSMC, | |
118 | GPIO_ALT_COMP_FLASH, | |
119 | GPIO_ALT_SRAM_NOR_FLASH, | |
120 | GPIO_ALT_FSMC_ADDLINE_0_TO_15, | |
121 | GPIO_ALT_SCROLL_KEY, | |
122 | GPIO_ALT_MSHC, | |
123 | GPIO_ALT_HPI, | |
124 | GPIO_ALT_USB_OTG, | |
125 | GPIO_ALT_SDIO, | |
126 | GPIO_ALT_HSMMC, | |
127 | GPIO_ALT_FSMC_ADD_DATA_0_TO_25, | |
128 | GPIO_ALT_HSI1, | |
129 | GPIO_ALT_NOR, | |
130 | GPIO_ALT_NAND, | |
131 | GPIO_ALT_KEYPAD, | |
132 | GPIO_ALT_VPIP, | |
133 | GPIO_ALT_CAM, | |
134 | GPIO_ALT_CCP1, | |
135 | GPIO_ALT_EMMC, | |
136 | GPIO_ALT_POP_EMMC, | |
137 | GPIO_ALT_FUNMAX /* Add new alt func before this */ | |
138 | }; | |
139 | ||
140 | /* Defines pin assignment(Software mode or Alternate mode) */ | |
141 | enum gpio_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) */ | |
149 | }; | |
150 | ||
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 */ | |
156 | }; | |
157 | ||
158 | /* Interrupt trigger mode */ | |
159 | enum gpio_trig { | |
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 */ | |
167 | }; | |
168 | ||
169 | /* Configuration parameters for one GPIO pin.*/ | |
170 | struct gpio_config { | |
171 | enum gpio_mode mode; | |
172 | enum gpio_direction direction; | |
173 | enum gpio_trig trig; | |
174 | char *dev_name; /* Who owns the gpio pin */ | |
175 | }; | |
176 | ||
177 | /* GPIO pin data*/ | |
178 | enum gpio_data { | |
179 | GPIO_DATA_LOW, | |
180 | GPIO_DATA_HIGH | |
181 | }; | |
182 | ||
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 | |
188 | mode. */ | |
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 | |
195 | mode. */ | |
196 | }; | |
197 | ||
198 | /* GPIO ability to wake the system up from sleep mode.*/ | |
199 | enum gpio_wake { | |
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. */ | |
207 | }; | |
208 | ||
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. */ | |
213 | }; | |
214 | ||
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, | |
220 | char *dev_name); | |
221 | extern int gpio_altfuncdisable(enum gpio_alt_function altfunc, | |
222 | char *dev_name); | |
223 | ||
224 | struct gpio_altfun_data { | |
225 | u16 altfun; | |
226 | u16 start; | |
227 | u16 end; | |
228 | u16 cont; | |
229 | u8 type; | |
230 | }; | |
231 | #endif |