blob: fe139619351f0f243a36bf0b5c3ff590a62d19e4 [file] [log] [blame]
Bryan Wu1394f032007-05-06 14:50:22 -07001/*
2 * File: arch/blackfin/kernel/bfin_gpio.h
3 * Based on:
4 * Author: Michael Hennerich (hennerich@blackfin.uclinux.org)
5 *
6 * Created:
7 * Description:
8 *
9 * Modified:
Michael Hennericha2c8cfe2008-01-22 17:20:10 +080010 * Copyright 2004-2008 Analog Devices Inc.
Bryan Wu1394f032007-05-06 14:50:22 -070011 *
12 * Bugs: Enter bugs at http://blackfin.uclinux.org/
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, see the file COPYING, or write
26 * to the Free Software Foundation, Inc.,
27 * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
28 */
29
Bryan Wu1394f032007-05-06 14:50:22 -070030#ifndef __ARCH_BLACKFIN_GPIO_H__
31#define __ARCH_BLACKFIN_GPIO_H__
32
Michael Hennericha4f0b32c2008-11-18 17:48:22 +080033#define gpio_bank(x) ((x) >> 4)
34#define gpio_bit(x) (1<<((x) & 0xF))
35#define gpio_sub_n(x) ((x) & 0xF)
Bryan Wu1394f032007-05-06 14:50:22 -070036
Bryan Wu2e8ca592008-11-18 17:48:22 +080037#define GPIO_BANKSIZE 16
38#define GPIO_BANK_NUM DIV_ROUND_UP(MAX_BLACKFIN_GPIOS, GPIO_BANKSIZE)
Bryan Wu1394f032007-05-06 14:50:22 -070039
Michael Hennerich983e1012009-01-07 23:14:39 +080040#include <mach/gpio.h>
41
Bryan Wu1394f032007-05-06 14:50:22 -070042#define GPIO_0 0
43#define GPIO_1 1
44#define GPIO_2 2
45#define GPIO_3 3
46#define GPIO_4 4
47#define GPIO_5 5
48#define GPIO_6 6
49#define GPIO_7 7
50#define GPIO_8 8
51#define GPIO_9 9
52#define GPIO_10 10
53#define GPIO_11 11
54#define GPIO_12 12
55#define GPIO_13 13
56#define GPIO_14 14
57#define GPIO_15 15
58#define GPIO_16 16
59#define GPIO_17 17
60#define GPIO_18 18
61#define GPIO_19 19
62#define GPIO_20 20
63#define GPIO_21 21
64#define GPIO_22 22
65#define GPIO_23 23
66#define GPIO_24 24
67#define GPIO_25 25
68#define GPIO_26 26
69#define GPIO_27 27
70#define GPIO_28 28
71#define GPIO_29 29
72#define GPIO_30 30
73#define GPIO_31 31
74#define GPIO_32 32
75#define GPIO_33 33
76#define GPIO_34 34
77#define GPIO_35 35
78#define GPIO_36 36
79#define GPIO_37 37
80#define GPIO_38 38
81#define GPIO_39 39
82#define GPIO_40 40
83#define GPIO_41 41
84#define GPIO_42 42
85#define GPIO_43 43
86#define GPIO_44 44
87#define GPIO_45 45
88#define GPIO_46 46
89#define GPIO_47 47
90
Bryan Wu1394f032007-05-06 14:50:22 -070091#define PERIPHERAL_USAGE 1
92#define GPIO_USAGE 0
93
Bryan Wu1394f032007-05-06 14:50:22 -070094#ifndef __ASSEMBLY__
95
96/***********************************************************
97*
98* FUNCTIONS: Blackfin General Purpose Ports Access Functions
99*
100* INPUTS/OUTPUTS:
101* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
102*
103*
104* DESCRIPTION: These functions abstract direct register access
105* to Blackfin processor General Purpose
106* Ports Regsiters
107*
108* CAUTION: These functions do not belong to the GPIO Driver API
109*************************************************************
110* MODIFICATION HISTORY :
111**************************************************************/
112
Mike Frysinger269647d2009-03-28 20:32:57 +0800113#ifndef CONFIG_BF54x
Michael Hennericha2c8cfe2008-01-22 17:20:10 +0800114void set_gpio_dir(unsigned, unsigned short);
115void set_gpio_inen(unsigned, unsigned short);
116void set_gpio_polar(unsigned, unsigned short);
117void set_gpio_edge(unsigned, unsigned short);
118void set_gpio_both(unsigned, unsigned short);
119void set_gpio_data(unsigned, unsigned short);
120void set_gpio_maska(unsigned, unsigned short);
121void set_gpio_maskb(unsigned, unsigned short);
122void set_gpio_toggle(unsigned);
123void set_gpiop_dir(unsigned, unsigned short);
124void set_gpiop_inen(unsigned, unsigned short);
125void set_gpiop_polar(unsigned, unsigned short);
126void set_gpiop_edge(unsigned, unsigned short);
127void set_gpiop_both(unsigned, unsigned short);
128void set_gpiop_data(unsigned, unsigned short);
129void set_gpiop_maska(unsigned, unsigned short);
130void set_gpiop_maskb(unsigned, unsigned short);
131unsigned short get_gpio_dir(unsigned);
132unsigned short get_gpio_inen(unsigned);
133unsigned short get_gpio_polar(unsigned);
134unsigned short get_gpio_edge(unsigned);
135unsigned short get_gpio_both(unsigned);
136unsigned short get_gpio_maska(unsigned);
137unsigned short get_gpio_maskb(unsigned);
138unsigned short get_gpio_data(unsigned);
139unsigned short get_gpiop_dir(unsigned);
140unsigned short get_gpiop_inen(unsigned);
141unsigned short get_gpiop_polar(unsigned);
142unsigned short get_gpiop_edge(unsigned);
143unsigned short get_gpiop_both(unsigned);
144unsigned short get_gpiop_maska(unsigned);
145unsigned short get_gpiop_maskb(unsigned);
146unsigned short get_gpiop_data(unsigned);
Bryan Wu1394f032007-05-06 14:50:22 -0700147
148struct gpio_port_t {
149 unsigned short data;
150 unsigned short dummy1;
151 unsigned short data_clear;
152 unsigned short dummy2;
153 unsigned short data_set;
154 unsigned short dummy3;
155 unsigned short toggle;
156 unsigned short dummy4;
157 unsigned short maska;
158 unsigned short dummy5;
159 unsigned short maska_clear;
160 unsigned short dummy6;
161 unsigned short maska_set;
162 unsigned short dummy7;
163 unsigned short maska_toggle;
164 unsigned short dummy8;
165 unsigned short maskb;
166 unsigned short dummy9;
167 unsigned short maskb_clear;
168 unsigned short dummy10;
169 unsigned short maskb_set;
170 unsigned short dummy11;
171 unsigned short maskb_toggle;
172 unsigned short dummy12;
173 unsigned short dir;
174 unsigned short dummy13;
175 unsigned short polar;
176 unsigned short dummy14;
177 unsigned short edge;
178 unsigned short dummy15;
179 unsigned short both;
180 unsigned short dummy16;
181 unsigned short inen;
182};
Roy Huang24a07a12007-07-12 22:41:45 +0800183#endif
Bryan Wu1394f032007-05-06 14:50:22 -0700184
185#ifdef CONFIG_PM
Michael Hennerich1efc80b2008-07-19 16:57:32 +0800186
187unsigned int bfin_pm_standby_setup(void);
188void bfin_pm_standby_restore(void);
189
190void bfin_gpio_pm_hibernate_restore(void);
191void bfin_gpio_pm_hibernate_suspend(void);
Michael Hennerichcfefe3c2008-02-09 04:12:37 +0800192
193#ifndef CONFIG_BF54x
Bryan Wu1394f032007-05-06 14:50:22 -0700194#define PM_WAKE_RISING 0x1
195#define PM_WAKE_FALLING 0x2
196#define PM_WAKE_HIGH 0x4
197#define PM_WAKE_LOW 0x8
198#define PM_WAKE_BOTH_EDGES (PM_WAKE_RISING | PM_WAKE_FALLING)
Michael Hennerichcfefe3c2008-02-09 04:12:37 +0800199#define PM_WAKE_IGNORE 0xF0
Bryan Wu1394f032007-05-06 14:50:22 -0700200
Michael Hennericha2c8cfe2008-01-22 17:20:10 +0800201int gpio_pm_wakeup_request(unsigned gpio, unsigned char type);
202void gpio_pm_wakeup_free(unsigned gpio);
Bryan Wu1394f032007-05-06 14:50:22 -0700203
204struct gpio_port_s {
205 unsigned short data;
Bryan Wu1394f032007-05-06 14:50:22 -0700206 unsigned short maska;
Bryan Wu1394f032007-05-06 14:50:22 -0700207 unsigned short maskb;
Bryan Wu1394f032007-05-06 14:50:22 -0700208 unsigned short dir;
209 unsigned short polar;
210 unsigned short edge;
211 unsigned short both;
212 unsigned short inen;
213
214 unsigned short fer;
Michael Hennerich581d62a2007-06-14 13:30:23 +0800215 unsigned short reserved;
Michael Hennerich1efc80b2008-07-19 16:57:32 +0800216 unsigned short mux;
Bryan Wu1394f032007-05-06 14:50:22 -0700217};
Michael Hennerichcfefe3c2008-02-09 04:12:37 +0800218#endif /*CONFIG_BF54x*/
Bryan Wu1394f032007-05-06 14:50:22 -0700219#endif /*CONFIG_PM*/
Bryan Wu1394f032007-05-06 14:50:22 -0700220/***********************************************************
221*
222* FUNCTIONS: Blackfin GPIO Driver
223*
224* INPUTS/OUTPUTS:
225* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
226*
227*
228* DESCRIPTION: Blackfin GPIO Driver API
229*
230* CAUTION:
231*************************************************************
232* MODIFICATION HISTORY :
233**************************************************************/
234
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800235int bfin_gpio_request(unsigned gpio, const char *label);
236void bfin_gpio_free(unsigned gpio);
Graf Yang9570ff42009-01-07 23:14:38 +0800237int bfin_gpio_irq_request(unsigned gpio, const char *label);
238void bfin_gpio_irq_free(unsigned gpio);
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800239int bfin_gpio_direction_input(unsigned gpio);
240int bfin_gpio_direction_output(unsigned gpio, int value);
241int bfin_gpio_get_value(unsigned gpio);
242void bfin_gpio_set_value(unsigned gpio, int value);
Bryan Wu1394f032007-05-06 14:50:22 -0700243
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800244#ifdef CONFIG_GPIOLIB
245#include <asm-generic/gpio.h> /* cansleep wrappers */
246
247static inline int gpio_get_value(unsigned int gpio)
248{
249 if (gpio < MAX_BLACKFIN_GPIOS)
250 return bfin_gpio_get_value(gpio);
251 else
252 return __gpio_get_value(gpio);
253}
254
255static inline void gpio_set_value(unsigned int gpio, int value)
256{
257 if (gpio < MAX_BLACKFIN_GPIOS)
258 bfin_gpio_set_value(gpio, value);
259 else
260 __gpio_set_value(gpio, value);
261}
262
263static inline int gpio_cansleep(unsigned int gpio)
264{
265 return __gpio_cansleep(gpio);
266}
267
268#else /* !CONFIG_GPIOLIB */
269
270static inline int gpio_request(unsigned gpio, const char *label)
271{
272 return bfin_gpio_request(gpio, label);
273}
274
275static inline void gpio_free(unsigned gpio)
276{
277 return bfin_gpio_free(gpio);
278}
279
280static inline int gpio_direction_input(unsigned gpio)
281{
282 return bfin_gpio_direction_input(gpio);
283}
284
285static inline int gpio_direction_output(unsigned gpio, int value)
286{
287 return bfin_gpio_direction_output(gpio, value);
288}
289
290static inline int gpio_get_value(unsigned gpio)
291{
292 return bfin_gpio_get_value(gpio);
293}
294
295static inline void gpio_set_value(unsigned gpio, int value)
296{
297 return bfin_gpio_set_value(gpio, value);
298}
Bryan Wu1394f032007-05-06 14:50:22 -0700299
Michael Hennerich301af292007-07-24 15:35:53 +0800300#include <asm-generic/gpio.h> /* cansleep wrappers */
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800301#endif /* !CONFIG_GPIOLIB */
Michael Hennerich301af292007-07-24 15:35:53 +0800302#include <asm/irq.h>
303
304static inline int gpio_to_irq(unsigned gpio)
305{
Michael Henneriche1312bf2009-03-28 21:18:45 +0800306 if (likely(gpio < MAX_BLACKFIN_GPIOS))
307 return gpio + GPIO_IRQ_BASE;
308
309 return -EINVAL;
Michael Hennerich301af292007-07-24 15:35:53 +0800310}
311
312static inline int irq_to_gpio(unsigned irq)
313{
314 return (irq - GPIO_IRQ_BASE);
315}
316
Bryan Wu1394f032007-05-06 14:50:22 -0700317#endif /* __ASSEMBLY__ */
318
319#endif /* __ARCH_BLACKFIN_GPIO_H__ */