Linux-libre 2.6.32.42-gnu1
[librecmc/linux-libre.git] / arch / sh / include / asm / gpio.h
1 /*
2  *  include/asm-sh/gpio.h
3  *
4  * Generic GPIO API and pinmux table support for SuperH.
5  *
6  * Copyright (c) 2008 Magnus Damm
7  *
8  * This file is subject to the terms and conditions of the GNU General Public
9  * License.  See the file "COPYING" in the main directory of this archive
10  * for more details.
11  */
12 #ifndef __ASM_SH_GPIO_H
13 #define __ASM_SH_GPIO_H
14
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
17
18 #if defined(CONFIG_CPU_SH3)
19 #include <cpu/gpio.h>
20 #endif
21
22 #define ARCH_NR_GPIOS 512
23 #include <asm-generic/gpio.h>
24
25 #ifdef CONFIG_GPIOLIB
26
27 static inline int gpio_get_value(unsigned gpio)
28 {
29         return __gpio_get_value(gpio);
30 }
31
32 static inline void gpio_set_value(unsigned gpio, int value)
33 {
34         __gpio_set_value(gpio, value);
35 }
36
37 static inline int gpio_cansleep(unsigned gpio)
38 {
39         return __gpio_cansleep(gpio);
40 }
41
42 static inline int gpio_to_irq(unsigned gpio)
43 {
44         WARN_ON(1);
45         return -ENOSYS;
46 }
47
48 static inline int irq_to_gpio(unsigned int irq)
49 {
50         WARN_ON(1);
51         return -EINVAL;
52 }
53
54 #endif /* CONFIG_GPIOLIB */
55
56 typedef unsigned short pinmux_enum_t;
57 typedef unsigned short pinmux_flag_t;
58
59 #define PINMUX_TYPE_NONE            0
60 #define PINMUX_TYPE_FUNCTION        1
61 #define PINMUX_TYPE_GPIO            2
62 #define PINMUX_TYPE_OUTPUT          3
63 #define PINMUX_TYPE_INPUT           4
64 #define PINMUX_TYPE_INPUT_PULLUP    5
65 #define PINMUX_TYPE_INPUT_PULLDOWN  6
66
67 #define PINMUX_FLAG_TYPE            (0x7)
68 #define PINMUX_FLAG_WANT_PULLUP     (1 << 3)
69 #define PINMUX_FLAG_WANT_PULLDOWN   (1 << 4)
70
71 #define PINMUX_FLAG_DBIT_SHIFT      5
72 #define PINMUX_FLAG_DBIT            (0x1f << PINMUX_FLAG_DBIT_SHIFT)
73 #define PINMUX_FLAG_DREG_SHIFT      10
74 #define PINMUX_FLAG_DREG            (0x3f << PINMUX_FLAG_DREG_SHIFT)
75
76 struct pinmux_gpio {
77         pinmux_enum_t enum_id;
78         pinmux_flag_t flags;
79 };
80
81 #define PINMUX_GPIO(gpio, data_or_mark) [gpio] = { data_or_mark }
82 #define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0
83
84 struct pinmux_cfg_reg {
85         unsigned long reg, reg_width, field_width;
86         unsigned long *cnt;
87         pinmux_enum_t *enum_ids;
88 };
89
90 #define PINMUX_CFG_REG(name, r, r_width, f_width) \
91         .reg = r, .reg_width = r_width, .field_width = f_width,         \
92         .cnt = (unsigned long [r_width / f_width]) {}, \
93         .enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)]) \
94
95 struct pinmux_data_reg {
96         unsigned long reg, reg_width, reg_shadow;
97         pinmux_enum_t *enum_ids;
98 };
99
100 #define PINMUX_DATA_REG(name, r, r_width) \
101         .reg = r, .reg_width = r_width, \
102         .enum_ids = (pinmux_enum_t [r_width]) \
103
104 struct pinmux_range {
105         pinmux_enum_t begin;
106         pinmux_enum_t end;
107         pinmux_enum_t force;
108 };
109
110 struct pinmux_info {
111         char *name;
112         pinmux_enum_t reserved_id;
113         struct pinmux_range data;
114         struct pinmux_range input;
115         struct pinmux_range input_pd;
116         struct pinmux_range input_pu;
117         struct pinmux_range output;
118         struct pinmux_range mark;
119         struct pinmux_range function;
120
121         unsigned first_gpio, last_gpio;
122
123         struct pinmux_gpio *gpios;
124         struct pinmux_cfg_reg *cfg_regs;
125         struct pinmux_data_reg *data_regs;
126
127         pinmux_enum_t *gpio_data;
128         unsigned int gpio_data_size;
129
130         unsigned long *gpio_in_use;
131         struct gpio_chip chip;
132 };
133
134 int register_pinmux(struct pinmux_info *pip);
135
136 #endif /* __ASM_SH_GPIO_H */