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