]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - arch/arm/include/asm/arch-u8500/gpio.h
Minor coding style cleanup
[karo-tx-uboot.git] / arch / arm / include / asm / arch-u8500 / gpio.h
1 /*
2  * Copyright (C) ST-Ericsson SA 2009
3  *
4  * See file CREDITS for list of people who contributed to this
5  * project.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License as
9  * published by the Free Software Foundation; either version 2 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
20  * MA 02111-1307 USA
21  */
22
23 #ifndef _UX500_GPIO_h
24 #define _UX500_GPIO_h
25
26 #include <asm/types.h>
27 #include <asm/io.h>
28 #include <asm/errno.h>
29
30 #include <asm/arch/sys_proto.h>
31 #include <asm/arch/u8500.h>
32
33 #define GPIO_TOTAL_PINS                 268
34
35 #define GPIO_PINS_PER_BLOCK     32
36 #define GPIO_BLOCKS_COUNT       (GPIO_TOTAL_PINS/GPIO_PINS_PER_BLOCK + 1)
37 #define GPIO_BLOCK(pin)         (((pin + GPIO_PINS_PER_BLOCK) >> 5) - 1)
38
39
40 struct gpio_register {
41         u32 gpio_dat;   /* data register : 0x000 */
42         u32 gpio_dats;  /* data Set register : 0x004 */
43         u32 gpio_datc;  /* data Clear register : 0x008 */
44         u32 gpio_pdis;  /* Pull disable register : 0x00C */
45         u32 gpio_dir;   /* data direction register : 0x010 */
46         u32 gpio_dirs;  /* data dir Set register : 0x014 */
47         u32 gpio_dirc;  /* data dir Clear register : 0x018 */
48         u32 gpio_slpm;  /* Sleep mode register : 0x01C */
49         u32 gpio_afsa;  /* AltFun A Select reg : 0x020 */
50         u32 gpio_afsb;  /* AltFun B Select reg : 0x024 */
51         u32 gpio_lowemi;/* low EMI Select reg : 0x028 */
52         u32 reserved_1[(0x040 - 0x02C) >> 2];   /*0x028-0x3C Reserved*/
53         u32 gpio_rimsc; /* rising edge intr set/clear : 0x040 */
54         u32 gpio_fimsc; /* falling edge intr set/clear register : 0x044 */
55         u32 gpio_mis;   /* masked interrupt status register : 0x048 */
56         u32 gpio_ic;    /* Interrupt Clear register : 0x04C */
57         u32 gpio_rwimsc;/* Rising-edge Wakeup IMSC register : 0x050 */
58         u32 gpio_fwimsc;/* Falling-edge Wakeup IMSC register : 0x054 */
59         u32 gpio_wks;   /* Wakeup Status register : 0x058 */
60 };
61
62 /* Error values returned by functions */
63 enum gpio_error {
64         GPIO_OK = 0,
65         GPIO_UNSUPPORTED_HW = -2,
66         GPIO_UNSUPPORTED_FEATURE = -3,
67         GPIO_INVALID_PARAMETER = -4,
68         GPIO_REQUEST_NOT_APPLICABLE = -5,
69         GPIO_REQUEST_PENDING = -6,
70         GPIO_NOT_CONFIGURED = -7,
71         GPIO_INTERNAL_ERROR = -8,
72         GPIO_INTERNAL_EVENT = 1,
73         GPIO_REMAINING_EVENT = 2,
74         GPIO_NO_MORE_PENDING_EVENT = 3,
75         GPIO_INVALID_CLIENT = -25,
76         GPIO_INVALID_PIN = -26,
77         GPIO_PIN_BUSY = -27,
78         GPIO_PIN_NOT_ALLOCATED = -28,
79         GPIO_WRONG_CLIENT = -29,
80         GPIO_UNSUPPORTED_ALTFUNC = -30,
81 };
82
83 /*GPIO DEVICE ID */
84 enum gpio_device_id {
85         GPIO_DEVICE_ID_0,
86         GPIO_DEVICE_ID_1,
87         GPIO_DEVICE_ID_2,
88         GPIO_DEVICE_ID_3,
89         GPIO_DEVICE_ID_INVALID
90 };
91
92 /*
93  * Alternate Function:
94  *  refered in altfun_table to pointout particular altfun to be enabled
95  *  when using GPIO_ALT_FUNCTION A/B/C enable/disable operation
96  */
97 enum gpio_alt_function {
98         GPIO_ALT_UART_0_MODEM,
99         GPIO_ALT_UART_0_NO_MODEM,
100         GPIO_ALT_UART_1,
101         GPIO_ALT_UART_2,
102         GPIO_ALT_I2C_0,
103         GPIO_ALT_I2C_1,
104         GPIO_ALT_I2C_2,
105         GPIO_ALT_I2C_3,
106         GPIO_ALT_MSP_0,
107         GPIO_ALT_MSP_1,
108         GPIO_ALT_MSP_2,
109         GPIO_ALT_MSP_3,
110         GPIO_ALT_MSP_4,
111         GPIO_ALT_MSP_5,
112         GPIO_ALT_SSP_0,
113         GPIO_ALT_SSP_1,
114         GPIO_ALT_MM_CARD0,
115         GPIO_ALT_SD_CARD0,
116         GPIO_ALT_DMA_0,
117         GPIO_ALT_DMA_1,
118         GPIO_ALT_HSI0,
119         GPIO_ALT_CCIR656_INPUT,
120         GPIO_ALT_CCIR656_OUTPUT,
121         GPIO_ALT_LCD_PANEL,
122         GPIO_ALT_MDIF,
123         GPIO_ALT_SDRAM,
124         GPIO_ALT_HAMAC_AUDIO_DBG,
125         GPIO_ALT_HAMAC_VIDEO_DBG,
126         GPIO_ALT_CLOCK_RESET,
127         GPIO_ALT_TSP,
128         GPIO_ALT_IRDA,
129         GPIO_ALT_USB_MINIMUM,
130         GPIO_ALT_USB_I2C,
131         GPIO_ALT_OWM,
132         GPIO_ALT_PWL,
133         GPIO_ALT_FSMC,
134         GPIO_ALT_COMP_FLASH,
135         GPIO_ALT_SRAM_NOR_FLASH,
136         GPIO_ALT_FSMC_ADDLINE_0_TO_15,
137         GPIO_ALT_SCROLL_KEY,
138         GPIO_ALT_MSHC,
139         GPIO_ALT_HPI,
140         GPIO_ALT_USB_OTG,
141         GPIO_ALT_SDIO,
142         GPIO_ALT_HSMMC,
143         GPIO_ALT_FSMC_ADD_DATA_0_TO_25,
144         GPIO_ALT_HSI1,
145         GPIO_ALT_NOR,
146         GPIO_ALT_NAND,
147         GPIO_ALT_KEYPAD,
148         GPIO_ALT_VPIP,
149         GPIO_ALT_CAM,
150         GPIO_ALT_CCP1,
151         GPIO_ALT_EMMC,
152         GPIO_ALT_POP_EMMC,
153         GPIO_ALT_FUNMAX         /* Add new alt func before this */
154 };
155
156 /* Defines pin assignment(Software mode or Alternate mode) */
157 enum gpio_mode {
158         GPIO_MODE_LEAVE_UNCHANGED,      /* Parameter will be ignored */
159         GPIO_MODE_SOFTWARE,     /* Pin connected to GPIO (SW controlled) */
160         GPIO_ALTF_A,            /* Pin connected to altfunc 1 (HW periph 1) */
161         GPIO_ALTF_B,            /* Pin connected to altfunc 2 (HW periph 2) */
162         GPIO_ALTF_C,            /* Pin connected to altfunc 3 (HW periph 3) */
163         GPIO_ALTF_FIND,         /* Pin connected to altfunc 3 (HW periph 3) */
164         GPIO_ALTF_DISABLE       /* Pin connected to altfunc 3 (HW periph 3) */
165 };
166
167 /* Defines GPIO pin direction */
168 enum gpio_direction {
169         GPIO_DIR_LEAVE_UNCHANGED,       /* Parameter will be ignored */
170         GPIO_DIR_INPUT,         /* GPIO set as input */
171         GPIO_DIR_OUTPUT         /* GPIO set as output */
172 };
173
174 /* Interrupt trigger mode */
175 enum gpio_trig {
176         GPIO_TRIG_LEAVE_UNCHANGED,      /* Parameter will be ignored */
177         GPIO_TRIG_DISABLE,      /* Trigger no IT */
178         GPIO_TRIG_RISING_EDGE,  /* Trigger an IT on rising edge */
179         GPIO_TRIG_FALLING_EDGE, /* Trigger an IT on falling edge */
180         GPIO_TRIG_BOTH_EDGES,   /* Trigger an IT on rising and falling edge */
181         GPIO_TRIG_HIGH_LEVEL,   /* Trigger an IT on high level */
182         GPIO_TRIG_LOW_LEVEL     /* Trigger an IT on low level */
183 };
184
185 /* Configuration parameters for one GPIO pin.*/
186 struct gpio_config {
187         enum gpio_mode mode;
188         enum gpio_direction direction;
189         enum gpio_trig trig;
190         char *dev_name;         /* Who owns the gpio pin */
191 };
192
193 /* GPIO pin data*/
194 enum gpio_data {
195         GPIO_DATA_LOW,
196         GPIO_DATA_HIGH
197 };
198
199 /* GPIO behaviour in sleep mode */
200 enum gpio_sleep_mode {
201         GPIO_SLEEP_MODE_LEAVE_UNCHANGED,        /* Parameter will be ignored */
202         GPIO_SLEEP_MODE_INPUT_DEFAULTVOLT,      /* GPIO is an input with pull
203                                                    up/down enabled when in sleep
204                                                    mode. */
205         GPIO_SLEEP_MODE_CONTROLLED_BY_GPIO      /* GPIO pin is controlled by
206                                                    GPIO IP. So mode, direction
207                                                    and data values for GPIO pin
208                                                    in sleep mode are determined
209                                                    by configuration set to GPIO
210                                                    pin before entering to sleep
211                                                    mode. */
212 };
213
214 /* GPIO ability to wake the system up from sleep mode.*/
215 enum gpio_wake {
216         GPIO_WAKE_LEAVE_UNCHANGED,      /* Parameter will be ignored */
217         GPIO_WAKE_DISABLE,      /* No wake of system from sleep mode. */
218         GPIO_WAKE_LOW_LEVEL,    /* Wake the system up on a LOW level. */
219         GPIO_WAKE_HIGH_LEVEL,   /* Wake the system up on a HIGH level. */
220         GPIO_WAKE_RISING_EDGE,  /* Wake the system up on a RISING edge. */
221         GPIO_WAKE_FALLING_EDGE, /* Wake the system up on a FALLING edge. */
222         GPIO_WAKE_BOTH_EDGES    /* Wake the system up on both RISE and FALL. */
223 };
224
225 /* Configuration parameters for one GPIO pin in sleep mode.*/
226 struct gpio_sleep_config {
227         enum gpio_sleep_mode sleep_mode;/* GPIO behaviour in sleep mode. */
228         enum gpio_wake wake;            /* GPIO ability to wake up system. */
229 };
230
231 extern int gpio_setpinconfig(int pin_id, struct gpio_config *pin_config);
232 extern int gpio_resetpinconfig(int pin_id, char *dev_name);
233 extern int gpio_writepin(int pin_id, enum gpio_data value, char *dev_name);
234 extern int gpio_readpin(int pin_id, enum gpio_data *value);
235 extern int gpio_altfuncenable(enum gpio_alt_function altfunc,
236                                       char *dev_name);
237 extern int gpio_altfuncdisable(enum gpio_alt_function altfunc,
238                                        char *dev_name);
239
240 struct gpio_altfun_data {
241         u16 altfun;
242         u16 start;
243         u16 end;
244         u16 cont;
245         u8 type;
246 };
247 #endif