2 * Ralink SoC specific GPIO support
4 * Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
11 #include <linux/init.h>
13 #include <linux/spinlock.h>
14 #include <linux/gpio.h>
16 #include <ralink_soc.h>
18 #define GPIO0_REG_INT 0x00
19 #define GPIO0_REG_EDGE 0x04
20 #define GPIO0_REG_RENA 0x08
21 #define GPIO0_REG_FENA 0x0c
22 #define GPIO0_REG_DATA 0x20
23 #define GPIO0_REG_DIR 0x24
24 #define GPIO0_REG_POL 0x28
25 #define GPIO0_REG_SET 0x2c
26 #define GPIO0_REG_RESET 0x30
27 #define GPIO0_REG_TOGGLE 0x34
29 #define GPIO1_REG_INT 0x38
30 #define GPIO1_REG_EDGE 0x3c
31 #define GPIO1_REG_RENA 0x40
32 #define GPIO1_REG_FENA 0x44
33 #define GPIO1_REG_DATA 0x48
34 #define GPIO1_REG_DIR 0x4c
35 #define GPIO1_REG_POL 0x50
36 #define GPIO1_REG_SET 0x54
37 #define GPIO1_REG_RESET 0x58
38 #define GPIO1_REG_TOGGLE 0x5c
40 #define GPIO2_REG_INT 0x60
41 #define GPIO2_REG_EDGE 0x64
42 #define GPIO2_REG_RENA 0x68
43 #define GPIO2_REG_FENA 0x6c
44 #define GPIO2_REG_DATA 0x70
45 #define GPIO2_REG_DIR 0x74
46 #define GPIO2_REG_POL 0x78
47 #define GPIO2_REG_SET 0x7c
48 #define GPIO2_REG_RESET 0x80
49 #define GPIO2_REG_TOGGLE 0x84
52 RAMIPS_GPIO_REG_INT
, /* Interrupt status */
57 RAMIPS_GPIO_REG_DIR
, /* Direction, 0:in, 1: out */
58 RAMIPS_GPIO_REG_POL
, /* Polarity, 0: normal, 1: invert */
60 RAMIPS_GPIO_REG_RESET
,
61 RAMIPS_GPIO_REG_TOGGLE
,
65 struct ramips_gpio_chip
{
66 struct gpio_chip chip
;
67 u8 regs
[RAMIPS_GPIO_REG_MAX
];
68 unsigned long map_base
;
69 unsigned long map_size
;
72 void __iomem
*regs_base
;
75 static inline struct ramips_gpio_chip
*to_ramips_gpio(struct gpio_chip
*chip
)
77 struct ramips_gpio_chip
*rg
;
79 rg
= container_of(chip
, struct ramips_gpio_chip
, chip
);
83 static inline void ramips_gpio_wr(struct ramips_gpio_chip
*rg
, u8 reg
, u32 val
)
85 __raw_writel(val
, rg
->regs_base
+ rg
->regs
[reg
]);
88 static inline u32
ramips_gpio_rr(struct ramips_gpio_chip
*rg
, u8 reg
)
90 return __raw_readl(rg
->regs_base
+ rg
->regs
[reg
]);
93 static int ramips_gpio_direction_input(struct gpio_chip
*chip
, unsigned offset
)
95 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
99 spin_lock_irqsave(&rg
->lock
, flags
);
100 t
= ramips_gpio_rr(rg
, RAMIPS_GPIO_REG_DIR
);
102 ramips_gpio_wr(rg
, RAMIPS_GPIO_REG_DIR
, t
);
103 spin_unlock_irqrestore(&rg
->lock
, flags
);
108 static int ramips_gpio_direction_output(struct gpio_chip
*chip
,
109 unsigned offset
, int value
)
111 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
116 reg
= (value
) ? RAMIPS_GPIO_REG_SET
: RAMIPS_GPIO_REG_RESET
;
118 spin_lock_irqsave(&rg
->lock
, flags
);
119 ramips_gpio_wr(rg
, reg
, 1 << offset
);
121 t
= ramips_gpio_rr(rg
, RAMIPS_GPIO_REG_DIR
);
123 ramips_gpio_wr(rg
, RAMIPS_GPIO_REG_DIR
, t
);
124 spin_unlock_irqrestore(&rg
->lock
, flags
);
129 static void ramips_gpio_set(struct gpio_chip
*chip
, unsigned offset
, int value
)
131 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
134 reg
= (value
) ? RAMIPS_GPIO_REG_SET
: RAMIPS_GPIO_REG_RESET
;
135 ramips_gpio_wr(rg
, reg
, 1 << offset
);
138 static int ramips_gpio_get(struct gpio_chip
*chip
, unsigned offset
)
140 struct ramips_gpio_chip
*rg
= to_ramips_gpio(chip
);
143 t
= ramips_gpio_rr(rg
, RAMIPS_GPIO_REG_DATA
);
144 return !!(t
& (1 << offset
));
147 static struct ramips_gpio_chip ramips_gpio_chip0
= {
149 .label
= "ramips-gpio0",
150 .direction_input
= ramips_gpio_direction_input
,
151 .direction_output
= ramips_gpio_direction_output
,
152 .get
= ramips_gpio_get
,
153 .set
= ramips_gpio_set
,
155 .ngpio
= RALINK_SOC_GPIO0_COUNT
,
158 [RAMIPS_GPIO_REG_INT
] = GPIO0_REG_INT
,
159 [RAMIPS_GPIO_REG_EDGE
] = GPIO0_REG_EDGE
,
160 [RAMIPS_GPIO_REG_RENA
] = GPIO0_REG_RENA
,
161 [RAMIPS_GPIO_REG_FENA
] = GPIO0_REG_FENA
,
162 [RAMIPS_GPIO_REG_DATA
] = GPIO0_REG_DATA
,
163 [RAMIPS_GPIO_REG_DIR
] = GPIO0_REG_DIR
,
164 [RAMIPS_GPIO_REG_POL
] = GPIO0_REG_POL
,
165 [RAMIPS_GPIO_REG_SET
] = GPIO0_REG_SET
,
166 [RAMIPS_GPIO_REG_RESET
] = GPIO0_REG_RESET
,
167 [RAMIPS_GPIO_REG_TOGGLE
] = GPIO0_REG_TOGGLE
,
169 .map_base
= RALINK_SOC_GPIO_BASE
,
170 .map_size
= PAGE_SIZE
,
173 static struct ramips_gpio_chip ramips_gpio_chip1
= {
175 .label
= "ramips-gpio1",
176 .direction_input
= ramips_gpio_direction_input
,
177 .direction_output
= ramips_gpio_direction_output
,
178 .get
= ramips_gpio_get
,
179 .set
= ramips_gpio_set
,
181 .ngpio
= RALINK_SOC_GPIO1_COUNT
,
184 [RAMIPS_GPIO_REG_INT
] = GPIO1_REG_INT
,
185 [RAMIPS_GPIO_REG_EDGE
] = GPIO1_REG_EDGE
,
186 [RAMIPS_GPIO_REG_RENA
] = GPIO1_REG_RENA
,
187 [RAMIPS_GPIO_REG_FENA
] = GPIO1_REG_FENA
,
188 [RAMIPS_GPIO_REG_DATA
] = GPIO1_REG_DATA
,
189 [RAMIPS_GPIO_REG_DIR
] = GPIO1_REG_DIR
,
190 [RAMIPS_GPIO_REG_POL
] = GPIO1_REG_POL
,
191 [RAMIPS_GPIO_REG_SET
] = GPIO1_REG_SET
,
192 [RAMIPS_GPIO_REG_RESET
] = GPIO1_REG_RESET
,
193 [RAMIPS_GPIO_REG_TOGGLE
] = GPIO1_REG_TOGGLE
,
195 .map_base
= RALINK_SOC_GPIO_BASE
,
196 .map_size
= PAGE_SIZE
,
199 static struct ramips_gpio_chip ramips_gpio_chip2
= {
201 .label
= "ramips-gpio2",
202 .direction_input
= ramips_gpio_direction_input
,
203 .direction_output
= ramips_gpio_direction_output
,
204 .get
= ramips_gpio_get
,
205 .set
= ramips_gpio_set
,
207 .ngpio
= RALINK_SOC_GPIO2_COUNT
,
210 [RAMIPS_GPIO_REG_INT
] = GPIO2_REG_INT
,
211 [RAMIPS_GPIO_REG_EDGE
] = GPIO2_REG_EDGE
,
212 [RAMIPS_GPIO_REG_RENA
] = GPIO2_REG_RENA
,
213 [RAMIPS_GPIO_REG_FENA
] = GPIO2_REG_FENA
,
214 [RAMIPS_GPIO_REG_DATA
] = GPIO2_REG_DATA
,
215 [RAMIPS_GPIO_REG_DIR
] = GPIO2_REG_DIR
,
216 [RAMIPS_GPIO_REG_POL
] = GPIO2_REG_POL
,
217 [RAMIPS_GPIO_REG_SET
] = GPIO2_REG_SET
,
218 [RAMIPS_GPIO_REG_RESET
] = GPIO2_REG_RESET
,
219 [RAMIPS_GPIO_REG_TOGGLE
] = GPIO2_REG_TOGGLE
,
221 .map_base
= RALINK_SOC_GPIO_BASE
,
222 .map_size
= PAGE_SIZE
,
225 static __init
void ramips_gpio_chip_add(struct ramips_gpio_chip
*rg
)
227 spin_lock_init(&rg
->lock
);
229 rg
->regs_base
= ioremap(rg
->map_base
, rg
->map_size
);
231 /* set polarity to low for all lines */
232 ramips_gpio_wr(rg
, RAMIPS_GPIO_REG_POL
, 0);
234 gpiochip_add(&rg
->chip
);
237 __init
int ramips_gpio_init(void)
239 ramips_gpio_chip_add(&ramips_gpio_chip0
);
240 ramips_gpio_chip_add(&ramips_gpio_chip1
);
241 ramips_gpio_chip_add(&ramips_gpio_chip2
);