blob: 9477d82fcad2b2451dd2948d6cfa01ba1aff06bd [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
30/*
31* Number BF537/6/4 BF561 BF533/2/1
Michael Hennerich59003142007-10-21 16:54:27 +080032* BF527/5/2
Bryan Wu1394f032007-05-06 14:50:22 -070033*
34* GPIO_0 PF0 PF0 PF0
35* GPIO_1 PF1 PF1 PF1
36* GPIO_2 PF2 PF2 PF2
37* GPIO_3 PF3 PF3 PF3
38* GPIO_4 PF4 PF4 PF4
39* GPIO_5 PF5 PF5 PF5
40* GPIO_6 PF6 PF6 PF6
41* GPIO_7 PF7 PF7 PF7
42* GPIO_8 PF8 PF8 PF8
43* GPIO_9 PF9 PF9 PF9
44* GPIO_10 PF10 PF10 PF10
45* GPIO_11 PF11 PF11 PF11
46* GPIO_12 PF12 PF12 PF12
47* GPIO_13 PF13 PF13 PF13
48* GPIO_14 PF14 PF14 PF14
49* GPIO_15 PF15 PF15 PF15
50* GPIO_16 PG0 PF16
51* GPIO_17 PG1 PF17
52* GPIO_18 PG2 PF18
53* GPIO_19 PG3 PF19
54* GPIO_20 PG4 PF20
55* GPIO_21 PG5 PF21
56* GPIO_22 PG6 PF22
57* GPIO_23 PG7 PF23
58* GPIO_24 PG8 PF24
59* GPIO_25 PG9 PF25
60* GPIO_26 PG10 PF26
61* GPIO_27 PG11 PF27
62* GPIO_28 PG12 PF28
63* GPIO_29 PG13 PF29
64* GPIO_30 PG14 PF30
65* GPIO_31 PG15 PF31
66* GPIO_32 PH0 PF32
67* GPIO_33 PH1 PF33
68* GPIO_34 PH2 PF34
69* GPIO_35 PH3 PF35
70* GPIO_36 PH4 PF36
71* GPIO_37 PH5 PF37
72* GPIO_38 PH6 PF38
73* GPIO_39 PH7 PF39
74* GPIO_40 PH8 PF40
75* GPIO_41 PH9 PF41
76* GPIO_42 PH10 PF42
77* GPIO_43 PH11 PF43
78* GPIO_44 PH12 PF44
79* GPIO_45 PH13 PF45
80* GPIO_46 PH14 PF46
81* GPIO_47 PH15 PF47
82*/
83
84#ifndef __ARCH_BLACKFIN_GPIO_H__
85#define __ARCH_BLACKFIN_GPIO_H__
86
Michael Hennericha4f0b32c2008-11-18 17:48:22 +080087#define gpio_bank(x) ((x) >> 4)
88#define gpio_bit(x) (1<<((x) & 0xF))
89#define gpio_sub_n(x) ((x) & 0xF)
Bryan Wu1394f032007-05-06 14:50:22 -070090
Bryan Wu2e8ca592008-11-18 17:48:22 +080091#define GPIO_BANKSIZE 16
92#define GPIO_BANK_NUM DIV_ROUND_UP(MAX_BLACKFIN_GPIOS, GPIO_BANKSIZE)
Bryan Wu1394f032007-05-06 14:50:22 -070093
Michael Hennerich983e1012009-01-07 23:14:39 +080094#include <mach/gpio.h>
95
Bryan Wu1394f032007-05-06 14:50:22 -070096#define GPIO_0 0
97#define GPIO_1 1
98#define GPIO_2 2
99#define GPIO_3 3
100#define GPIO_4 4
101#define GPIO_5 5
102#define GPIO_6 6
103#define GPIO_7 7
104#define GPIO_8 8
105#define GPIO_9 9
106#define GPIO_10 10
107#define GPIO_11 11
108#define GPIO_12 12
109#define GPIO_13 13
110#define GPIO_14 14
111#define GPIO_15 15
112#define GPIO_16 16
113#define GPIO_17 17
114#define GPIO_18 18
115#define GPIO_19 19
116#define GPIO_20 20
117#define GPIO_21 21
118#define GPIO_22 22
119#define GPIO_23 23
120#define GPIO_24 24
121#define GPIO_25 25
122#define GPIO_26 26
123#define GPIO_27 27
124#define GPIO_28 28
125#define GPIO_29 29
126#define GPIO_30 30
127#define GPIO_31 31
128#define GPIO_32 32
129#define GPIO_33 33
130#define GPIO_34 34
131#define GPIO_35 35
132#define GPIO_36 36
133#define GPIO_37 37
134#define GPIO_38 38
135#define GPIO_39 39
136#define GPIO_40 40
137#define GPIO_41 41
138#define GPIO_42 42
139#define GPIO_43 43
140#define GPIO_44 44
141#define GPIO_45 45
142#define GPIO_46 46
143#define GPIO_47 47
144
Bryan Wu1394f032007-05-06 14:50:22 -0700145#define PERIPHERAL_USAGE 1
146#define GPIO_USAGE 0
147
Bryan Wu1394f032007-05-06 14:50:22 -0700148#ifndef __ASSEMBLY__
149
150/***********************************************************
151*
152* FUNCTIONS: Blackfin General Purpose Ports Access Functions
153*
154* INPUTS/OUTPUTS:
155* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
156*
157*
158* DESCRIPTION: These functions abstract direct register access
159* to Blackfin processor General Purpose
160* Ports Regsiters
161*
162* CAUTION: These functions do not belong to the GPIO Driver API
163*************************************************************
164* MODIFICATION HISTORY :
165**************************************************************/
166
Michael Hennerichcefe6582007-07-02 11:45:50 +0800167#ifndef BF548_FAMILY
Michael Hennericha2c8cfe2008-01-22 17:20:10 +0800168void set_gpio_dir(unsigned, unsigned short);
169void set_gpio_inen(unsigned, unsigned short);
170void set_gpio_polar(unsigned, unsigned short);
171void set_gpio_edge(unsigned, unsigned short);
172void set_gpio_both(unsigned, unsigned short);
173void set_gpio_data(unsigned, unsigned short);
174void set_gpio_maska(unsigned, unsigned short);
175void set_gpio_maskb(unsigned, unsigned short);
176void set_gpio_toggle(unsigned);
177void set_gpiop_dir(unsigned, unsigned short);
178void set_gpiop_inen(unsigned, unsigned short);
179void set_gpiop_polar(unsigned, unsigned short);
180void set_gpiop_edge(unsigned, unsigned short);
181void set_gpiop_both(unsigned, unsigned short);
182void set_gpiop_data(unsigned, unsigned short);
183void set_gpiop_maska(unsigned, unsigned short);
184void set_gpiop_maskb(unsigned, unsigned short);
185unsigned short get_gpio_dir(unsigned);
186unsigned short get_gpio_inen(unsigned);
187unsigned short get_gpio_polar(unsigned);
188unsigned short get_gpio_edge(unsigned);
189unsigned short get_gpio_both(unsigned);
190unsigned short get_gpio_maska(unsigned);
191unsigned short get_gpio_maskb(unsigned);
192unsigned short get_gpio_data(unsigned);
193unsigned short get_gpiop_dir(unsigned);
194unsigned short get_gpiop_inen(unsigned);
195unsigned short get_gpiop_polar(unsigned);
196unsigned short get_gpiop_edge(unsigned);
197unsigned short get_gpiop_both(unsigned);
198unsigned short get_gpiop_maska(unsigned);
199unsigned short get_gpiop_maskb(unsigned);
200unsigned short get_gpiop_data(unsigned);
Bryan Wu1394f032007-05-06 14:50:22 -0700201
202struct gpio_port_t {
203 unsigned short data;
204 unsigned short dummy1;
205 unsigned short data_clear;
206 unsigned short dummy2;
207 unsigned short data_set;
208 unsigned short dummy3;
209 unsigned short toggle;
210 unsigned short dummy4;
211 unsigned short maska;
212 unsigned short dummy5;
213 unsigned short maska_clear;
214 unsigned short dummy6;
215 unsigned short maska_set;
216 unsigned short dummy7;
217 unsigned short maska_toggle;
218 unsigned short dummy8;
219 unsigned short maskb;
220 unsigned short dummy9;
221 unsigned short maskb_clear;
222 unsigned short dummy10;
223 unsigned short maskb_set;
224 unsigned short dummy11;
225 unsigned short maskb_toggle;
226 unsigned short dummy12;
227 unsigned short dir;
228 unsigned short dummy13;
229 unsigned short polar;
230 unsigned short dummy14;
231 unsigned short edge;
232 unsigned short dummy15;
233 unsigned short both;
234 unsigned short dummy16;
235 unsigned short inen;
236};
Roy Huang24a07a12007-07-12 22:41:45 +0800237#endif
Bryan Wu1394f032007-05-06 14:50:22 -0700238
239#ifdef CONFIG_PM
Michael Hennerich1efc80b2008-07-19 16:57:32 +0800240
241unsigned int bfin_pm_standby_setup(void);
242void bfin_pm_standby_restore(void);
243
244void bfin_gpio_pm_hibernate_restore(void);
245void bfin_gpio_pm_hibernate_suspend(void);
Michael Hennerichcfefe3c2008-02-09 04:12:37 +0800246
247#ifndef CONFIG_BF54x
Bryan Wu1394f032007-05-06 14:50:22 -0700248#define PM_WAKE_RISING 0x1
249#define PM_WAKE_FALLING 0x2
250#define PM_WAKE_HIGH 0x4
251#define PM_WAKE_LOW 0x8
252#define PM_WAKE_BOTH_EDGES (PM_WAKE_RISING | PM_WAKE_FALLING)
Michael Hennerichcfefe3c2008-02-09 04:12:37 +0800253#define PM_WAKE_IGNORE 0xF0
Bryan Wu1394f032007-05-06 14:50:22 -0700254
Michael Hennericha2c8cfe2008-01-22 17:20:10 +0800255int gpio_pm_wakeup_request(unsigned gpio, unsigned char type);
256void gpio_pm_wakeup_free(unsigned gpio);
Bryan Wu1394f032007-05-06 14:50:22 -0700257
258struct gpio_port_s {
259 unsigned short data;
Bryan Wu1394f032007-05-06 14:50:22 -0700260 unsigned short maska;
Bryan Wu1394f032007-05-06 14:50:22 -0700261 unsigned short maskb;
Bryan Wu1394f032007-05-06 14:50:22 -0700262 unsigned short dir;
263 unsigned short polar;
264 unsigned short edge;
265 unsigned short both;
266 unsigned short inen;
267
268 unsigned short fer;
Michael Hennerich581d62a2007-06-14 13:30:23 +0800269 unsigned short reserved;
Michael Hennerich1efc80b2008-07-19 16:57:32 +0800270 unsigned short mux;
Bryan Wu1394f032007-05-06 14:50:22 -0700271};
Michael Hennerichcfefe3c2008-02-09 04:12:37 +0800272#endif /*CONFIG_BF54x*/
Bryan Wu1394f032007-05-06 14:50:22 -0700273#endif /*CONFIG_PM*/
Bryan Wu1394f032007-05-06 14:50:22 -0700274/***********************************************************
275*
276* FUNCTIONS: Blackfin GPIO Driver
277*
278* INPUTS/OUTPUTS:
279* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
280*
281*
282* DESCRIPTION: Blackfin GPIO Driver API
283*
284* CAUTION:
285*************************************************************
286* MODIFICATION HISTORY :
287**************************************************************/
288
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800289int bfin_gpio_request(unsigned gpio, const char *label);
290void bfin_gpio_free(unsigned gpio);
Graf Yang9570ff42009-01-07 23:14:38 +0800291int bfin_gpio_irq_request(unsigned gpio, const char *label);
292void bfin_gpio_irq_free(unsigned gpio);
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800293int bfin_gpio_direction_input(unsigned gpio);
294int bfin_gpio_direction_output(unsigned gpio, int value);
295int bfin_gpio_get_value(unsigned gpio);
296void bfin_gpio_set_value(unsigned gpio, int value);
Bryan Wu1394f032007-05-06 14:50:22 -0700297
Michael Hennerichcefe6582007-07-02 11:45:50 +0800298#ifndef BF548_FAMILY
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800299#define bfin_gpio_set_value(gpio, value) set_gpio_data(gpio, value)
Michael Hennerichcefe6582007-07-02 11:45:50 +0800300#endif
Bryan Wu1394f032007-05-06 14:50:22 -0700301
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800302#ifdef CONFIG_GPIOLIB
303#include <asm-generic/gpio.h> /* cansleep wrappers */
304
305static inline int gpio_get_value(unsigned int gpio)
306{
307 if (gpio < MAX_BLACKFIN_GPIOS)
308 return bfin_gpio_get_value(gpio);
309 else
310 return __gpio_get_value(gpio);
311}
312
313static inline void gpio_set_value(unsigned int gpio, int value)
314{
315 if (gpio < MAX_BLACKFIN_GPIOS)
316 bfin_gpio_set_value(gpio, value);
317 else
318 __gpio_set_value(gpio, value);
319}
320
321static inline int gpio_cansleep(unsigned int gpio)
322{
323 return __gpio_cansleep(gpio);
324}
325
326#else /* !CONFIG_GPIOLIB */
327
328static inline int gpio_request(unsigned gpio, const char *label)
329{
330 return bfin_gpio_request(gpio, label);
331}
332
333static inline void gpio_free(unsigned gpio)
334{
335 return bfin_gpio_free(gpio);
336}
337
338static inline int gpio_direction_input(unsigned gpio)
339{
340 return bfin_gpio_direction_input(gpio);
341}
342
343static inline int gpio_direction_output(unsigned gpio, int value)
344{
345 return bfin_gpio_direction_output(gpio, value);
346}
347
348static inline int gpio_get_value(unsigned gpio)
349{
350 return bfin_gpio_get_value(gpio);
351}
352
353static inline void gpio_set_value(unsigned gpio, int value)
354{
355 return bfin_gpio_set_value(gpio, value);
356}
Bryan Wu1394f032007-05-06 14:50:22 -0700357
Michael Hennerich301af292007-07-24 15:35:53 +0800358#include <asm-generic/gpio.h> /* cansleep wrappers */
Michael Hennericha4f0b32c2008-11-18 17:48:22 +0800359#endif /* !CONFIG_GPIOLIB */
Michael Hennerich301af292007-07-24 15:35:53 +0800360#include <asm/irq.h>
361
362static inline int gpio_to_irq(unsigned gpio)
363{
364 return (gpio + GPIO_IRQ_BASE);
365}
366
367static inline int irq_to_gpio(unsigned irq)
368{
369 return (irq - GPIO_IRQ_BASE);
370}
371
Bryan Wu1394f032007-05-06 14:50:22 -0700372#endif /* __ASSEMBLY__ */
373
374#endif /* __ARCH_BLACKFIN_GPIO_H__ */