diff options
Diffstat (limited to 'arch/arm/mach-ks8695/gpio.c')
-rw-r--r-- | arch/arm/mach-ks8695/gpio.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/arch/arm/mach-ks8695/gpio.c b/arch/arm/mach-ks8695/gpio.c index b1aa3cb3d4a3..5e46191c0af9 100644 --- a/arch/arm/mach-ks8695/gpio.c +++ b/arch/arm/mach-ks8695/gpio.c | |||
@@ -20,6 +20,8 @@ | |||
20 | #include <linux/kernel.h> | 20 | #include <linux/kernel.h> |
21 | #include <linux/mm.h> | 21 | #include <linux/mm.h> |
22 | #include <linux/init.h> | 22 | #include <linux/init.h> |
23 | #include <linux/debugfs.h> | ||
24 | #include <linux/seq_file.h> | ||
23 | #include <linux/module.h> | 25 | #include <linux/module.h> |
24 | 26 | ||
25 | #include <asm/io.h> | 27 | #include <asm/io.h> |
@@ -216,3 +218,84 @@ int irq_to_gpio(unsigned int irq) | |||
216 | return (irq - KS8695_IRQ_EXTERN0); | 218 | return (irq - KS8695_IRQ_EXTERN0); |
217 | } | 219 | } |
218 | EXPORT_SYMBOL(irq_to_gpio); | 220 | EXPORT_SYMBOL(irq_to_gpio); |
221 | |||
222 | |||
223 | /* .... Debug interface ..................................................... */ | ||
224 | |||
225 | #ifdef CONFIG_DEBUG_FS | ||
226 | |||
227 | static int ks8695_gpio_show(struct seq_file *s, void *unused) | ||
228 | { | ||
229 | unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN }; | ||
230 | unsigned int intmask[] = { IOPC_IOEINT0TM, IOPC_IOEINT1TM, IOPC_IOEINT2TM, IOPC_IOEINT3TM }; | ||
231 | unsigned long mode, ctrl, data; | ||
232 | int i; | ||
233 | |||
234 | mode = __raw_readl(KS8695_GPIO_VA + KS8695_IOPM); | ||
235 | ctrl = __raw_readl(KS8695_GPIO_VA + KS8695_IOPC); | ||
236 | data = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD); | ||
237 | |||
238 | seq_printf(s, "Pin\tI/O\tFunction\tState\n\n"); | ||
239 | |||
240 | for (i = KS8695_GPIO_0; i <= KS8695_GPIO_15 ; i++) { | ||
241 | seq_printf(s, "%i:\t", i); | ||
242 | |||
243 | seq_printf(s, "%s\t", (mode & IOPM_(i)) ? "Output" : "Input"); | ||
244 | |||
245 | if (i <= KS8695_GPIO_3) { | ||
246 | if (ctrl & enable[i]) { | ||
247 | seq_printf(s, "EXT%i ", i); | ||
248 | |||
249 | switch ((ctrl & intmask[i]) >> (4 * i)) { | ||
250 | case IOPC_TM_LOW: | ||
251 | seq_printf(s, "(Low)"); break; | ||
252 | case IOPC_TM_HIGH: | ||
253 | seq_printf(s, "(High)"); break; | ||
254 | case IOPC_TM_RISING: | ||
255 | seq_printf(s, "(Rising)"); break; | ||
256 | case IOPC_TM_FALLING: | ||
257 | seq_printf(s, "(Falling)"); break; | ||
258 | case IOPC_TM_EDGE: | ||
259 | seq_printf(s, "(Edges)"); break; | ||
260 | } | ||
261 | } | ||
262 | else | ||
263 | seq_printf(s, "GPIO\t"); | ||
264 | } | ||
265 | else if (i <= KS8695_GPIO_5) { | ||
266 | if (ctrl & enable[i]) | ||
267 | seq_printf(s, "TOUT%i\t", i - KS8695_GPIO_4); | ||
268 | else | ||
269 | seq_printf(s, "GPIO\t"); | ||
270 | } | ||
271 | else | ||
272 | seq_printf(s, "GPIO\t"); | ||
273 | |||
274 | seq_printf(s, "\t"); | ||
275 | |||
276 | seq_printf(s, "%i\n", (data & IOPD_(i)) ? 1 : 0); | ||
277 | } | ||
278 | return 0; | ||
279 | } | ||
280 | |||
281 | static int ks8695_gpio_open(struct inode *inode, struct file *file) | ||
282 | { | ||
283 | return single_open(file, ks8695_gpio_show, NULL); | ||
284 | } | ||
285 | |||
286 | static const struct file_operations ks8695_gpio_operations = { | ||
287 | .open = ks8695_gpio_open, | ||
288 | .read = seq_read, | ||
289 | .llseek = seq_lseek, | ||
290 | .release = single_release, | ||
291 | }; | ||
292 | |||
293 | static int __init ks8695_gpio_debugfs_init(void) | ||
294 | { | ||
295 | /* /sys/kernel/debug/ks8695_gpio */ | ||
296 | (void) debugfs_create_file("ks8695_gpio", S_IFREG | S_IRUGO, NULL, NULL, &ks8695_gpio_operations); | ||
297 | return 0; | ||
298 | } | ||
299 | postcore_initcall(ks8695_gpio_debugfs_init); | ||
300 | |||
301 | #endif | ||