summaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm/arch-u8500/gpio.h
blob: afa5942c99169e308a87ffa3d3d2c35a45f6be87 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
 * Copyright (C) ST-Ericsson SA 2009
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#ifndef _UX500_GPIO_h
#define _UX500_GPIO_h

#include <asm/types.h>
#include <asm/io.h>
#include <asm/errno.h>

#include <asm/arch/sys_proto.h>
#include <asm/arch/u8500.h>

#define GPIO_TOTAL_PINS                 268

#define GPIO_PINS_PER_BLOCK	32
#define GPIO_BLOCKS_COUNT       (GPIO_TOTAL_PINS/GPIO_PINS_PER_BLOCK + 1)
#define GPIO_BLOCK(pin)		(((pin + GPIO_PINS_PER_BLOCK) >> 5) - 1)


struct gpio_register {
	u32 gpio_dat;	/* data register : 0x000 */
	u32 gpio_dats;	/* data Set register : 0x004 */
	u32 gpio_datc;	/* data Clear register : 0x008 */
	u32 gpio_pdis;	/* Pull disable register : 0x00C */
	u32 gpio_dir;	/* data direction register : 0x010 */
	u32 gpio_dirs;	/* data dir Set register : 0x014 */
	u32 gpio_dirc;	/* data dir Clear register : 0x018 */
	u32 gpio_slpm;	/* Sleep mode register : 0x01C */
	u32 gpio_afsa;	/* AltFun A Select reg : 0x020 */
	u32 gpio_afsb;	/* AltFun B Select reg : 0x024 */
	u32 gpio_lowemi;/* low EMI Select reg : 0x028 */
	u32 reserved_1[(0x040 - 0x02C) >> 2];	/*0x028-0x3C Reserved*/
	u32 gpio_rimsc;	/* rising edge intr set/clear : 0x040 */
	u32 gpio_fimsc;	/* falling edge intr set/clear register : 0x044 */
	u32 gpio_mis;	/* masked interrupt status register : 0x048 */
	u32 gpio_ic;	/* Interrupt Clear register : 0x04C */
	u32 gpio_rwimsc;/* Rising-edge Wakeup IMSC register : 0x050 */
	u32 gpio_fwimsc;/* Falling-edge Wakeup IMSC register : 0x054 */
	u32 gpio_wks;	/* Wakeup Status register : 0x058 */
};

/* Error values returned by functions */
enum gpio_error {
	GPIO_OK = 0,
	GPIO_UNSUPPORTED_HW = -2,
	GPIO_UNSUPPORTED_FEATURE = -3,
	GPIO_INVALID_PARAMETER = -4,
	GPIO_REQUEST_NOT_APPLICABLE = -5,
	GPIO_REQUEST_PENDING = -6,
	GPIO_NOT_CONFIGURED = -7,
	GPIO_INTERNAL_ERROR = -8,
	GPIO_INTERNAL_EVENT = 1,
	GPIO_REMAINING_EVENT = 2,
	GPIO_NO_MORE_PENDING_EVENT = 3,
	GPIO_INVALID_CLIENT = -25,
	GPIO_INVALID_PIN = -26,
	GPIO_PIN_BUSY = -27,
	GPIO_PIN_NOT_ALLOCATED = -28,
	GPIO_WRONG_CLIENT = -29,
	GPIO_UNSUPPORTED_ALTFUNC = -30,
};

/*GPIO DEVICE ID */
enum gpio_device_id {
	GPIO_DEVICE_ID_0,
	GPIO_DEVICE_ID_1,
	GPIO_DEVICE_ID_2,
	GPIO_DEVICE_ID_3,
	GPIO_DEVICE_ID_INVALID
};

/*
 * Alternate Function:
 *  refered in altfun_table to pointout particular altfun to be enabled
 *  when using GPIO_ALT_FUNCTION A/B/C enable/disable operation
 */
enum gpio_alt_function {
	GPIO_ALT_UART_0_MODEM,
	GPIO_ALT_UART_0_NO_MODEM,
	GPIO_ALT_UART_1,
	GPIO_ALT_UART_2,
	GPIO_ALT_I2C_0,
	GPIO_ALT_I2C_1,
	GPIO_ALT_I2C_2,
	GPIO_ALT_I2C_3,
	GPIO_ALT_MSP_0,
	GPIO_ALT_MSP_1,
	GPIO_ALT_MSP_2,
	GPIO_ALT_MSP_3,
	GPIO_ALT_MSP_4,
	GPIO_ALT_MSP_5,
	GPIO_ALT_SSP_0,
	GPIO_ALT_SSP_1,
	GPIO_ALT_MM_CARD0,
	GPIO_ALT_SD_CARD0,
	GPIO_ALT_DMA_0,
	GPIO_ALT_DMA_1,
	GPIO_ALT_HSI0,
	GPIO_ALT_CCIR656_INPUT,
	GPIO_ALT_CCIR656_OUTPUT,
	GPIO_ALT_LCD_PANEL,
	GPIO_ALT_MDIF,
	GPIO_ALT_SDRAM,
	GPIO_ALT_HAMAC_AUDIO_DBG,
	GPIO_ALT_HAMAC_VIDEO_DBG,
	GPIO_ALT_CLOCK_RESET,
	GPIO_ALT_TSP,
	GPIO_ALT_IRDA,
	GPIO_ALT_USB_MINIMUM,
	GPIO_ALT_USB_I2C,
	GPIO_ALT_OWM,
	GPIO_ALT_PWL,
	GPIO_ALT_FSMC,
	GPIO_ALT_COMP_FLASH,
	GPIO_ALT_SRAM_NOR_FLASH,
	GPIO_ALT_FSMC_ADDLINE_0_TO_15,
	GPIO_ALT_SCROLL_KEY,
	GPIO_ALT_MSHC,
	GPIO_ALT_HPI,
	GPIO_ALT_USB_OTG,
	GPIO_ALT_SDIO,
	GPIO_ALT_HSMMC,
	GPIO_ALT_FSMC_ADD_DATA_0_TO_25,
	GPIO_ALT_HSI1,
	GPIO_ALT_NOR,
	GPIO_ALT_NAND,
	GPIO_ALT_KEYPAD,
	GPIO_ALT_VPIP,
	GPIO_ALT_CAM,
	GPIO_ALT_CCP1,
	GPIO_ALT_EMMC,
	GPIO_ALT_POP_EMMC,
	GPIO_ALT_FUNMAX		/* Add new alt func before this */
};

/* Defines pin assignment(Software mode or Alternate mode) */
enum gpio_mode {
	GPIO_MODE_LEAVE_UNCHANGED,	/* Parameter will be ignored */
	GPIO_MODE_SOFTWARE,	/* Pin connected to GPIO (SW controlled) */
	GPIO_ALTF_A,		/* Pin connected to altfunc 1 (HW periph 1) */
	GPIO_ALTF_B,		/* Pin connected to altfunc 2 (HW periph 2) */
	GPIO_ALTF_C,		/* Pin connected to altfunc 3 (HW periph 3) */
	GPIO_ALTF_FIND,		/* Pin connected to altfunc 3 (HW periph 3) */
	GPIO_ALTF_DISABLE	/* Pin connected to altfunc 3 (HW periph 3) */
};

/* Defines GPIO pin direction */
enum gpio_direction {
	GPIO_DIR_LEAVE_UNCHANGED,	/* Parameter will be ignored */
	GPIO_DIR_INPUT,		/* GPIO set as input */
	GPIO_DIR_OUTPUT		/* GPIO set as output */
};

/* Interrupt trigger mode */
enum gpio_trig {
	GPIO_TRIG_LEAVE_UNCHANGED,	/* Parameter will be ignored */
	GPIO_TRIG_DISABLE,	/* Trigger no IT */
	GPIO_TRIG_RISING_EDGE,	/* Trigger an IT on rising edge */
	GPIO_TRIG_FALLING_EDGE,	/* Trigger an IT on falling edge */
	GPIO_TRIG_BOTH_EDGES,	/* Trigger an IT on rising and falling edge */
	GPIO_TRIG_HIGH_LEVEL,	/* Trigger an IT on high level */
	GPIO_TRIG_LOW_LEVEL	/* Trigger an IT on low level */
};

/* Configuration parameters for one GPIO pin.*/
struct gpio_config {
	enum gpio_mode mode;
	enum gpio_direction direction;
	enum gpio_trig trig;
	char *dev_name;		/* Who owns the gpio pin */
};

/* GPIO pin data*/
enum gpio_data {
	GPIO_DATA_LOW,
	GPIO_DATA_HIGH
};

/* GPIO behaviour in sleep mode */
enum gpio_sleep_mode {
	GPIO_SLEEP_MODE_LEAVE_UNCHANGED,	/* Parameter will be ignored */
	GPIO_SLEEP_MODE_INPUT_DEFAULTVOLT,	/* GPIO is an input with pull
						   up/down enabled when in sleep
						   mode. */
	GPIO_SLEEP_MODE_CONTROLLED_BY_GPIO	/* GPIO pin is controlled by
						   GPIO IP. So mode, direction
						   and data values for GPIO pin
						   in sleep mode are determined
						   by configuration set to GPIO
						   pin before entering to sleep
						   mode. */
};

/* GPIO ability to wake the system up from sleep mode.*/
enum gpio_wake {
	GPIO_WAKE_LEAVE_UNCHANGED,	/* Parameter will be ignored */
	GPIO_WAKE_DISABLE,	/* No wake of system from sleep mode. */
	GPIO_WAKE_LOW_LEVEL,	/* Wake the system up on a LOW level. */
	GPIO_WAKE_HIGH_LEVEL,	/* Wake the system up on a HIGH level. */
	GPIO_WAKE_RISING_EDGE,	/* Wake the system up on a RISING edge. */
	GPIO_WAKE_FALLING_EDGE,	/* Wake the system up on a FALLING edge. */
	GPIO_WAKE_BOTH_EDGES	/* Wake the system up on both RISE and FALL. */
};

/* Configuration parameters for one GPIO pin in sleep mode.*/
struct gpio_sleep_config {
	enum gpio_sleep_mode sleep_mode;/* GPIO behaviour in sleep mode. */
	enum gpio_wake wake;		/* GPIO ability to wake up system. */
};

extern int gpio_setpinconfig(int pin_id, struct gpio_config *pin_config);
extern int gpio_resetpinconfig(int pin_id, char *dev_name);
extern int gpio_writepin(int pin_id, enum gpio_data value, char *dev_name);
extern int gpio_readpin(int pin_id, enum gpio_data *value);
extern int gpio_altfuncenable(enum gpio_alt_function altfunc,
				      char *dev_name);
extern int gpio_altfuncdisable(enum gpio_alt_function altfunc,
				       char *dev_name);

struct gpio_altfun_data {
	u16 altfun;
	u16 start;
	u16 end;
	u16 cont;
	u8 type;
};
#endif
OpenPOWER on IntegriCloud