of_gpio.h revision b908b53d580c3e9aba81ebe3339c5b7b4fa8031d
1863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov/*
2863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * OF helpers for the GPIO API
3863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov *
4863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * Copyright (c) 2007-2008  MontaVista Software, Inc.
5863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov *
6863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * Author: Anton Vorontsov <avorontsov@ru.mvista.com>
7863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov *
8863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * This program is free software; you can redistribute it and/or modify
9863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * it under the terms of the GNU General Public License as published by
10863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * the Free Software Foundation; either version 2 of the License, or
11863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * (at your option) any later version.
12863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov */
13863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
14863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov#ifndef __LINUX_OF_GPIO_H
15863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov#define __LINUX_OF_GPIO_H
16863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
17b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov#include <linux/compiler.h>
18b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov#include <linux/kernel.h>
19863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov#include <linux/errno.h>
2018ad7a61e1b700dfe177fabf1c350b4f5d4da8acWolfgang Grandegger#include <linux/gpio.h>
21863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
22b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsovstruct device_node;
23b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov
24b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov/*
25b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * This is Linux-specific flags. By default controllers' and Linux' mapping
26b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * match, but GPIO controllers are free to translate their own flags to
27b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * Linux-specific in their .xlate callback. Though, 1:1 mapping is recommended.
28b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov */
29b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsovenum of_gpio_flags {
30b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov	OF_GPIO_ACTIVE_LOW = 0x1,
31b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov};
32b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov
33863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov#ifdef CONFIG_OF_GPIO
34863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
35863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov/*
36863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * Generic OF GPIO chip
37863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov */
38863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsovstruct of_gpio_chip {
39863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	struct gpio_chip gc;
40863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	int gpio_cells;
41863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	int (*xlate)(struct of_gpio_chip *of_gc, struct device_node *np,
42b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov		     const void *gpio_spec, enum of_gpio_flags *flags);
43863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov};
44863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
45863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsovstatic inline struct of_gpio_chip *to_of_gpio_chip(struct gpio_chip *gc)
46863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov{
47863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	return container_of(gc, struct of_gpio_chip, gc);
48863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov}
49863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
50863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov/*
51863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov * OF GPIO chip for memory mapped banks
52863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov */
53863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsovstruct of_mm_gpio_chip {
54863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	struct of_gpio_chip of_gc;
55863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	void (*save_regs)(struct of_mm_gpio_chip *mm_gc);
56863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	void __iomem *regs;
57863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov};
58863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
59863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsovstatic inline struct of_mm_gpio_chip *to_of_mm_gpio_chip(struct gpio_chip *gc)
60863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov{
61863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	struct of_gpio_chip *of_gc = to_of_gpio_chip(gc);
62863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
63863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	return container_of(of_gc, struct of_mm_gpio_chip, of_gc);
64863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov}
65863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
66b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsovextern int of_get_gpio_flags(struct device_node *np, int index,
67b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov			     enum of_gpio_flags *flags);
68b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov
69863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsovextern int of_mm_gpiochip_add(struct device_node *np,
70863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov			      struct of_mm_gpio_chip *mm_gc);
71863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsovextern int of_gpio_simple_xlate(struct of_gpio_chip *of_gc,
72863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov				struct device_node *np,
73b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov				const void *gpio_spec,
74b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov				enum of_gpio_flags *flags);
75863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov#else
76863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
77863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov/* Drivers may not strictly depend on the GPIO support, so let them link. */
78b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsovstatic inline int of_get_gpio_flags(struct device_node *np, int index,
79b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov				    enum of_gpio_flags *flags)
80863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov{
81863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov	return -ENOSYS;
82863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov}
83863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
84863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov#endif /* CONFIG_OF_GPIO */
85863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov
86b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov/**
87b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * of_get_gpio - Get a GPIO number to use with GPIO API
88b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * @np:		device node to get GPIO from
89b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * @index:	index of the GPIO
90b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov *
91b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * Returns GPIO number to use with Linux generic GPIO API, or one of the errno
92b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov * value on the error condition.
93b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov */
94b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsovstatic inline int of_get_gpio(struct device_node *np, int index)
95b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov{
96b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov	return of_get_gpio_flags(np, index, NULL);
97b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov}
98b908b53d580c3e9aba81ebe3339c5b7b4fa8031dAnton Vorontsov
99863fbf4966a7ac301a4077e4a04d73e8abfdd7b2Anton Vorontsov#endif /* __LINUX_OF_GPIO_H */
100