| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 1 | /* | 
 | 2 |  * OF helpers for the GPIO API | 
 | 3 |  * | 
 | 4 |  * Copyright (c) 2007-2008  MontaVista Software, Inc. | 
 | 5 |  * | 
 | 6 |  * Author: Anton Vorontsov <avorontsov@ru.mvista.com> | 
 | 7 |  * | 
 | 8 |  * This program is free software; you can redistribute it and/or modify | 
 | 9 |  * it under the terms of the GNU General Public License as published by | 
 | 10 |  * the Free Software Foundation; either version 2 of the License, or | 
 | 11 |  * (at your option) any later version. | 
 | 12 |  */ | 
 | 13 |  | 
 | 14 | #ifndef __LINUX_OF_GPIO_H | 
 | 15 | #define __LINUX_OF_GPIO_H | 
 | 16 |  | 
| Anton Vorontsov | b908b53 | 2008-12-01 06:30:04 +0000 | [diff] [blame] | 17 | #include <linux/compiler.h> | 
 | 18 | #include <linux/kernel.h> | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 19 | #include <linux/errno.h> | 
| Wolfgang Grandegger | 18ad7a6 | 2008-05-30 22:51:33 +1000 | [diff] [blame] | 20 | #include <linux/gpio.h> | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 21 |  | 
| Anton Vorontsov | b908b53 | 2008-12-01 06:30:04 +0000 | [diff] [blame] | 22 | struct device_node; | 
 | 23 |  | 
 | 24 | /* | 
 | 25 |  * This is Linux-specific flags. By default controllers' and Linux' mapping | 
 | 26 |  * match, but GPIO controllers are free to translate their own flags to | 
 | 27 |  * Linux-specific in their .xlate callback. Though, 1:1 mapping is recommended. | 
 | 28 |  */ | 
 | 29 | enum of_gpio_flags { | 
 | 30 | 	OF_GPIO_ACTIVE_LOW = 0x1, | 
 | 31 | }; | 
 | 32 |  | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 33 | #ifdef CONFIG_OF_GPIO | 
 | 34 |  | 
 | 35 | /* | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 36 |  * OF GPIO chip for memory mapped banks | 
 | 37 |  */ | 
 | 38 | struct of_mm_gpio_chip { | 
| Anton Vorontsov | a19e3da | 2010-06-08 07:48:16 -0600 | [diff] [blame] | 39 | 	struct gpio_chip gc; | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 40 | 	void (*save_regs)(struct of_mm_gpio_chip *mm_gc); | 
 | 41 | 	void __iomem *regs; | 
 | 42 | }; | 
 | 43 |  | 
 | 44 | static inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc) | 
 | 45 | { | 
| Anton Vorontsov | a19e3da | 2010-06-08 07:48:16 -0600 | [diff] [blame] | 46 | 	return container_of(gc, struct of_mm_gpio_chip, gc); | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 47 | } | 
 | 48 |  | 
| Anton Vorontsov | b908b53 | 2008-12-01 06:30:04 +0000 | [diff] [blame] | 49 | extern int of_get_gpio_flags(struct device_node *np, int index, | 
 | 50 | 			     enum of_gpio_flags *flags); | 
| Anton Vorontsov | 7498209 | 2008-12-05 08:15:54 +0000 | [diff] [blame] | 51 | extern unsigned int of_gpio_count(struct device_node *np); | 
| Anton Vorontsov | b908b53 | 2008-12-01 06:30:04 +0000 | [diff] [blame] | 52 |  | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 53 | extern int of_mm_gpiochip_add(struct device_node *np, | 
 | 54 | 			      struct of_mm_gpio_chip *mm_gc); | 
| Grant Likely | 594fa26 | 2010-06-08 07:48:16 -0600 | [diff] [blame] | 55 |  | 
| Anton Vorontsov | 391c970 | 2010-06-08 07:48:17 -0600 | [diff] [blame] | 56 | extern void of_gpiochip_add(struct gpio_chip *gc); | 
 | 57 | extern void of_gpiochip_remove(struct gpio_chip *gc); | 
| Grant Likely | 594fa26 | 2010-06-08 07:48:16 -0600 | [diff] [blame] | 58 | extern struct gpio_chip *of_node_to_gpiochip(struct device_node *np); | 
 | 59 |  | 
| Anton Vorontsov | a19e3da | 2010-06-08 07:48:16 -0600 | [diff] [blame] | 60 | #else /* CONFIG_OF_GPIO */ | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 61 |  | 
 | 62 | /* Drivers may not strictly depend on the GPIO support, so let them link. */ | 
| Anton Vorontsov | b908b53 | 2008-12-01 06:30:04 +0000 | [diff] [blame] | 63 | static inline int of_get_gpio_flags(struct device_node *np, int index, | 
 | 64 | 				    enum of_gpio_flags *flags) | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 65 | { | 
 | 66 | 	return -ENOSYS; | 
 | 67 | } | 
 | 68 |  | 
| Anton Vorontsov | 7498209 | 2008-12-05 08:15:54 +0000 | [diff] [blame] | 69 | static inline unsigned int of_gpio_count(struct device_node *np) | 
 | 70 | { | 
 | 71 | 	return 0; | 
 | 72 | } | 
 | 73 |  | 
| Anton Vorontsov | 391c970 | 2010-06-08 07:48:17 -0600 | [diff] [blame] | 74 | static inline void of_gpiochip_add(struct gpio_chip *gc) { } | 
 | 75 | static inline void of_gpiochip_remove(struct gpio_chip *gc) { } | 
 | 76 |  | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 77 | #endif /* CONFIG_OF_GPIO */ | 
 | 78 |  | 
| Anton Vorontsov | b908b53 | 2008-12-01 06:30:04 +0000 | [diff] [blame] | 79 | /** | 
 | 80 |  * of_get_gpio - Get a GPIO number to use with GPIO API | 
 | 81 |  * @np:		device node to get GPIO from | 
 | 82 |  * @index:	index of the GPIO | 
 | 83 |  * | 
 | 84 |  * Returns GPIO number to use with Linux generic GPIO API, or one of the errno | 
 | 85 |  * value on the error condition. | 
 | 86 |  */ | 
 | 87 | static inline int of_get_gpio(struct device_node *np, int index) | 
 | 88 | { | 
 | 89 | 	return of_get_gpio_flags(np, index, NULL); | 
 | 90 | } | 
 | 91 |  | 
| Anton Vorontsov | 863fbf4 | 2008-04-11 23:06:45 +1000 | [diff] [blame] | 92 | #endif /* __LINUX_OF_GPIO_H */ |