Commit 7444a72e authored by Michael Buesch's avatar Michael Buesch Committed by Linus Torvalds

gpiolib: allow user-selection

This patch adds functionality to the gpio-lib subsystem to make it
possible to enable the gpio-lib code even if the architecture code didn't
request to get it built in.

The archtitecture code does still need to implement the gpiolib accessor
functions in its asm/gpio.h file.  This patch adds the implementations for
x86 and PPC.

With these changes it is possible to run generic GPIO expansion cards on
every architecture that implements the trivial wrapper functions.  Support
for more architectures can easily be added.
Signed-off-by: default avatarMichael Buesch <mb@bu3sch.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: David Brownell <david-b@pacbell.net>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Haavard Skinnemoen <hskinnemoen@atmel.com>
Cc: Jesper Nilsson <jesper.nilsson@axis.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jean Delvare <khali@linux-fr.org>
Cc: Samuel Ortiz <sameo@openedhand.com>
Cc: Kumar Gala <galak@gate.crashing.org>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Adrian Bunk <bunk@stusta.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ff1d5c2f
...@@ -389,11 +389,21 @@ either NULL or the label associated with that GPIO when it was requested. ...@@ -389,11 +389,21 @@ either NULL or the label associated with that GPIO when it was requested.
Platform Support Platform Support
---------------- ----------------
To support this framework, a platform's Kconfig will "select HAVE_GPIO_LIB" To support this framework, a platform's Kconfig will "select" either
ARCH_REQUIRE_GPIOLIB or ARCH_WANT_OPTIONAL_GPIOLIB
and arrange that its <asm/gpio.h> includes <asm-generic/gpio.h> and defines and arrange that its <asm/gpio.h> includes <asm-generic/gpio.h> and defines
three functions: gpio_get_value(), gpio_set_value(), and gpio_cansleep(). three functions: gpio_get_value(), gpio_set_value(), and gpio_cansleep().
They may also want to provide a custom value for ARCH_NR_GPIOS. They may also want to provide a custom value for ARCH_NR_GPIOS.
ARCH_REQUIRE_GPIOLIB means that the gpio-lib code will always get compiled
into the kernel on that architecture.
ARCH_WANT_OPTIONAL_GPIOLIB means the gpio-lib code defaults to off and the user
can enable it and build it into the kernel optionally.
If neither of these options are selected, the platform does not support
GPIOs through GPIO-lib and the code cannot be enabled by the user.
Trivial implementations of those functions can directly use framework Trivial implementations of those functions can directly use framework
code, which always dispatches through the gpio_chip: code, which always dispatches through the gpio_chip:
......
...@@ -268,7 +268,7 @@ config ARCH_EP93XX ...@@ -268,7 +268,7 @@ config ARCH_EP93XX
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK select HAVE_CLK
select HAVE_CLK select HAVE_CLK
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
help help
This enables support for the Cirrus EP93xx series of CPUs. This enables support for the Cirrus EP93xx series of CPUs.
...@@ -447,7 +447,7 @@ config ARCH_PXA ...@@ -447,7 +447,7 @@ config ARCH_PXA
select ARCH_MTD_XIP select ARCH_MTD_XIP
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK select HAVE_CLK
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select TICK_ONESHOT select TICK_ONESHOT
...@@ -479,7 +479,7 @@ config ARCH_SA1100 ...@@ -479,7 +479,7 @@ config ARCH_SA1100
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select HAVE_CLK select HAVE_CLK
select TICK_ONESHOT select TICK_ONESHOT
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
help help
Support for StrongARM 11x0 based boards. Support for StrongARM 11x0 based boards.
...@@ -522,7 +522,7 @@ config ARCH_OMAP ...@@ -522,7 +522,7 @@ config ARCH_OMAP
bool "TI OMAP" bool "TI OMAP"
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK select HAVE_CLK
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
help help
......
...@@ -88,7 +88,7 @@ config PLATFORM_AT32AP ...@@ -88,7 +88,7 @@ config PLATFORM_AT32AP
select SUBARCH_AVR32B select SUBARCH_AVR32B
select MMU select MMU
select PERFORMANCE_COUNTERS select PERFORMANCE_COUNTERS
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
select GENERIC_ALLOCATOR select GENERIC_ALLOCATOR
# #
......
...@@ -713,7 +713,7 @@ config CSRC_SB1250 ...@@ -713,7 +713,7 @@ config CSRC_SB1250
config GPIO_TXX9 config GPIO_TXX9
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
bool bool
config CFE config CFE
......
...@@ -110,6 +110,7 @@ config PPC ...@@ -110,6 +110,7 @@ config PPC
default y default y
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
select HAVE_FTRACE select HAVE_FTRACE
select ARCH_WANT_OPTIONAL_GPIOLIB
select HAVE_IDE select HAVE_IDE
select HAVE_IOREMAP_PROT select HAVE_IOREMAP_PROT
select HAVE_EFFICIENT_UNALIGNED_ACCESS select HAVE_EFFICIENT_UNALIGNED_ACCESS
......
...@@ -48,6 +48,6 @@ config PPC_MPC5200_BUGFIX ...@@ -48,6 +48,6 @@ config PPC_MPC5200_BUGFIX
config PPC_MPC5200_GPIO config PPC_MPC5200_GPIO
bool "MPC5200 GPIO support" bool "MPC5200 GPIO support"
depends on PPC_MPC52xx depends on PPC_MPC52xx
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
help help
Enable gpiolib support for mpc5200 based boards Enable gpiolib support for mpc5200 based boards
...@@ -29,7 +29,7 @@ config QE_GPIO ...@@ -29,7 +29,7 @@ config QE_GPIO
bool "QE GPIO support" bool "QE GPIO support"
depends on QUICC_ENGINE depends on QUICC_ENGINE
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_GPIO_LIB select ARCH_REQUIRE_GPIOLIB
help help
Say Y here if you're going to use hardware that connects to the Say Y here if you're going to use hardware that connects to the
QE GPIOs. QE GPIOs.
...@@ -23,6 +23,7 @@ config X86 ...@@ -23,6 +23,7 @@ config X86
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_IOREMAP_PROT select HAVE_IOREMAP_PROT
select HAVE_KPROBES select HAVE_KPROBES
select ARCH_WANT_OPTIONAL_GPIOLIB if !X86_RDC321X
select HAVE_KRETPROBES select HAVE_KRETPROBES
select HAVE_DYNAMIC_FTRACE select HAVE_DYNAMIC_FTRACE
select HAVE_FTRACE select HAVE_FTRACE
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
# Rewritten to use lists instead of if-statements. # Rewritten to use lists instead of if-statements.
# #
obj-$(CONFIG_HAVE_GPIO_LIB) += gpio/ obj-y += gpio/
obj-$(CONFIG_PCI) += pci/ obj-$(CONFIG_PCI) += pci/
obj-$(CONFIG_PARISC) += parisc/ obj-$(CONFIG_PARISC) += parisc/
obj-$(CONFIG_RAPIDIO) += rapidio/ obj-$(CONFIG_RAPIDIO) += rapidio/
......
...@@ -2,15 +2,40 @@ ...@@ -2,15 +2,40 @@
# GPIO infrastructure and expanders # GPIO infrastructure and expanders
# #
config HAVE_GPIO_LIB config ARCH_WANT_OPTIONAL_GPIOLIB
bool bool
help
Select this config option from the architecture Kconfig, if
it is possible to use gpiolib on the architecture, but let the
user decide whether to actually build it or not.
Select this instead of ARCH_REQUIRE_GPIOLIB, if your architecture does
not depend on GPIOs being available, but rather let the user
decide whether he needs it or not.
config ARCH_REQUIRE_GPIOLIB
bool
select GPIOLIB
help help
Platforms select gpiolib if they use this infrastructure Platforms select gpiolib if they use this infrastructure
for all their GPIOs, usually starting with ones integrated for all their GPIOs, usually starting with ones integrated
into SOC processors. into SOC processors.
Selecting this from the architecture code will cause the gpiolib
code to always get built in.
menuconfig GPIOLIB
bool "GPIO Support"
depends on ARCH_WANT_OPTIONAL_GPIOLIB || ARCH_REQUIRE_GPIOLIB
select GENERIC_GPIO
help
This enables GPIO support through the generic GPIO library.
You only need to enable this, if you also want to enable
one or more of the GPIO expansion card drivers below.
If unsure, say N.
menu "GPIO Support" if GPIOLIB
depends on HAVE_GPIO_LIB
config DEBUG_GPIO config DEBUG_GPIO
bool "Debug GPIO calls" bool "Debug GPIO calls"
...@@ -116,4 +141,4 @@ config GPIO_MCP23S08 ...@@ -116,4 +141,4 @@ config GPIO_MCP23S08
SPI driver for Microchip MCP23S08 I/O expander. This provides SPI driver for Microchip MCP23S08 I/O expander. This provides
a GPIO interface supporting inputs and outputs. a GPIO interface supporting inputs and outputs.
endmenu endif
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG
obj-$(CONFIG_HAVE_GPIO_LIB) += gpiolib.o obj-$(CONFIG_GPIOLIB) += gpiolib.o
obj-$(CONFIG_GPIO_MAX7301) += max7301.o obj-$(CONFIG_GPIO_MAX7301) += max7301.o
obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o
......
...@@ -126,7 +126,7 @@ config ISP1301_OMAP ...@@ -126,7 +126,7 @@ config ISP1301_OMAP
config TPS65010 config TPS65010
tristate "TPS6501x Power Management chips" tristate "TPS6501x Power Management chips"
depends on HAVE_GPIO_LIB depends on GPIOLIB
default y if MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_OSK default y if MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_OSK
help help
If you say yes here you get support for the TPS6501x series of If you say yes here you get support for the TPS6501x series of
......
...@@ -36,7 +36,7 @@ config MFD_ASIC3 ...@@ -36,7 +36,7 @@ config MFD_ASIC3
config HTC_EGPIO config HTC_EGPIO
bool "HTC EGPIO support" bool "HTC EGPIO support"
depends on GENERIC_HARDIRQS && HAVE_GPIO_LIB && ARM depends on GENERIC_HARDIRQS && GPIOLIB && ARM
help help
This driver supports the CPLD egpio chip present on This driver supports the CPLD egpio chip present on
several HTC phones. It provides basic support for input several HTC phones. It provides basic support for input
...@@ -52,7 +52,7 @@ config HTC_PASIC3 ...@@ -52,7 +52,7 @@ config HTC_PASIC3
config MFD_TC6393XB config MFD_TC6393XB
bool "Support Toshiba TC6393XB" bool "Support Toshiba TC6393XB"
depends on HAVE_GPIO_LIB depends on GPIOLIB
select MFD_CORE select MFD_CORE
help help
Support for Toshiba Mobile IO Controller TC6393XB Support for Toshiba Mobile IO Controller TC6393XB
......
...@@ -4,7 +4,7 @@ config OF_DEVICE ...@@ -4,7 +4,7 @@ config OF_DEVICE
config OF_GPIO config OF_GPIO
def_bool y def_bool y
depends on OF && PPC_OF && HAVE_GPIO_LIB depends on OF && PPC_OF && GPIOLIB
help help
OpenFirmware GPIO accessors OpenFirmware GPIO accessors
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <linux/types.h> #include <linux/types.h>
#ifdef CONFIG_HAVE_GPIO_LIB #ifdef CONFIG_GPIOLIB
#include <linux/compiler.h> #include <linux/compiler.h>
......
#ifndef __ASM_MACH_GENERIC_GPIO_H #ifndef __ASM_MACH_GENERIC_GPIO_H
#define __ASM_MACH_GENERIC_GPIO_H #define __ASM_MACH_GENERIC_GPIO_H
#ifdef CONFIG_HAVE_GPIO_LIB #ifdef CONFIG_GPIOLIB
#define gpio_get_value __gpio_get_value #define gpio_get_value __gpio_get_value
#define gpio_set_value __gpio_set_value #define gpio_set_value __gpio_set_value
#define gpio_cansleep __gpio_cansleep #define gpio_cansleep __gpio_cansleep
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <asm-generic/gpio.h> #include <asm-generic/gpio.h>
#ifdef CONFIG_HAVE_GPIO_LIB #ifdef CONFIG_GPIOLIB
/* /*
* We don't (yet) implement inlined/rapid versions for on-chip gpios. * We don't (yet) implement inlined/rapid versions for on-chip gpios.
...@@ -51,6 +51,6 @@ static inline int irq_to_gpio(unsigned int irq) ...@@ -51,6 +51,6 @@ static inline int irq_to_gpio(unsigned int irq)
return -EINVAL; return -EINVAL;
} }
#endif /* CONFIG_HAVE_GPIO_LIB */ #endif /* CONFIG_GPIOLIB */
#endif /* __ASM_POWERPC_GPIO_H */ #endif /* __ASM_POWERPC_GPIO_H */
/*
* Generic GPIO API implementation for x86.
*
* Derived from the generic GPIO API for powerpc:
*
* Copyright (c) 2007-2008 MontaVista Software, Inc.
*
* Author: Anton Vorontsov <avorontsov@ru.mvista.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#ifndef _ASM_I386_GPIO_H #ifndef _ASM_I386_GPIO_H
#define _ASM_I386_GPIO_H #define _ASM_I386_GPIO_H
#ifdef CONFIG_X86_RDC321X
#include <gpio.h> #include <gpio.h>
#else /* CONFIG_X86_RDC321X */
#include <asm-generic/gpio.h>
#ifdef CONFIG_GPIOLIB
/*
* Just call gpiolib.
*/
static inline int gpio_get_value(unsigned int gpio)
{
return __gpio_get_value(gpio);
}
static inline void gpio_set_value(unsigned int gpio, int value)
{
__gpio_set_value(gpio, value);
}
static inline int gpio_cansleep(unsigned int gpio)
{
return __gpio_cansleep(gpio);
}
/*
* Not implemented, yet.
*/
static inline int gpio_to_irq(unsigned int gpio)
{
return -ENOSYS;
}
static inline int irq_to_gpio(unsigned int irq)
{
return -EINVAL;
}
#endif /* CONFIG_GPIOLIB */
#endif /* CONFIG_X86_RDC321X */
#endif /* _ASM_I386_GPIO_H */ #endif /* _ASM_I386_GPIO_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment