diff options
303 files changed, 2987 insertions, 2048 deletions
diff --git a/Documentation/devicetree/bindings/arm/calxeda.txt b/Documentation/devicetree/bindings/arm/calxeda.txt new file mode 100644 index 00000000000..4755caaccba --- /dev/null +++ b/Documentation/devicetree/bindings/arm/calxeda.txt @@ -0,0 +1,8 @@ +Calxeda Highbank Platforms Device Tree Bindings +----------------------------------------------- + +Boards with Calxeda Cortex-A9 based Highbank SOC shall have the following +properties. + +Required root node properties: +    - compatible = "calxeda,highbank"; diff --git a/Documentation/devicetree/bindings/arm/l2cc.txt b/Documentation/devicetree/bindings/arm/l2cc.txt new file mode 100644 index 00000000000..7ca52161e7a --- /dev/null +++ b/Documentation/devicetree/bindings/arm/l2cc.txt @@ -0,0 +1,44 @@ +* ARM L2 Cache Controller + +ARM cores often have a separate level 2 cache controller. There are various +implementations of the L2 cache controller with compatible programming models. +The ARM L2 cache representation in the device tree should be done as follows: + +Required properties: + +- compatible : should be one of: +	"arm,pl310-cache" +	"arm,l220-cache" +	"arm,l210-cache" +- cache-unified : Specifies the cache is a unified cache. +- cache-level : Should be set to 2 for a level 2 cache. +- reg : Physical base address and size of cache controller's memory mapped +  registers. + +Optional properties: + +- arm,data-latency : Cycles of latency for Data RAM accesses. Specifies 3 cells of +  read, write and setup latencies. Minimum valid values are 1. Controllers +  without setup latency control should use a value of 0. +- arm,tag-latency : Cycles of latency for Tag RAM accesses. Specifies 3 cells of +  read, write and setup latencies. Controllers without setup latency control +  should use 0. Controllers without separate read and write Tag RAM latency +  values should only use the first cell. +- arm,dirty-latency : Cycles of latency for Dirty RAMs. This is a single cell. +- arm,filter-ranges : <start length> Starting address and length of window to +  filter. Addresses in the filter window are directed to the M1 port. Other +  addresses will go to the M0 port. +- interrupts : 1 combined interrupt. + +Example: + +L2: cache-controller { +        compatible = "arm,pl310-cache"; +        reg = <0xfff12000 0x1000>; +        arm,data-latency = <1 1 1>; +        arm,tag-latency = <2 2 2>; +        arm,filter-latency = <0x80000000 0x8000000>; +        cache-unified; +        cache-level = <2>; +	interrupts = <45>; +}; diff --git a/MAINTAINERS b/MAINTAINERS index 6185d051358..5066335b97d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -688,6 +688,12 @@ F:	drivers/mtd/nand/bcm_umi_nand.c  F:	drivers/mtd/nand/bcm_umi_bch.c  F:	drivers/mtd/nand/nand_bcm_umi.h +ARM/CALXEDA HIGHBANK ARCHITECTURE +M:	Rob Herring <rob.herring@calxeda.com> +L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) +S:	Maintained +F:	arch/arm/mach-highbank/ +  ARM/CAVIUM NETWORKS CNS3XXX MACHINE SUPPORT  M:	Anton Vorontsov <avorontsov@mvista.com>  S:	Maintained diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index a94a09ba356..6147d30a832 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -330,6 +330,20 @@ config ARCH_BCMRING  	help  	  Support for Broadcom's BCMRing platform. +config ARCH_HIGHBANK +	bool "Calxeda Highbank-based" +	select ARCH_WANT_OPTIONAL_GPIOLIB +	select ARM_AMBA +	select ARM_GIC +	select ARM_TIMER_SP804 +	select CLKDEV_LOOKUP +	select CPU_V7 +	select GENERIC_CLOCKEVENTS +	select HAVE_ARM_SCU +	select USE_OF +	help +	  Support for the Calxeda Highbank SoC based boards. +  config ARCH_CLPS711X  	bool "Cirrus Logic CLPS711x/EP721x-based"  	select CPU_ARM720T @@ -862,6 +876,7 @@ config ARCH_U300  	select CLKDEV_LOOKUP  	select HAVE_MACH_CLKDEV  	select GENERIC_GPIO +	select ARCH_REQUIRE_GPIOLIB  	select NEED_MACH_MEMORY_H  	help  	  Support for ST-Ericsson U300 series mobile platforms. @@ -1402,7 +1417,7 @@ config SMP  	depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \  		 MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \  		 ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \ -		 ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE +		 ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE || ARCH_HIGHBANK  	select USE_GENERIC_SMP_HELPERS  	select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP  	help diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug index be3a0f78d91..4bb7eb90f07 100644 --- a/arch/arm/Kconfig.debug +++ b/arch/arm/Kconfig.debug @@ -65,13 +65,78 @@ config DEBUG_USER  # These options are only for real kernel hackers who want to get their hands dirty.  config DEBUG_LL -	bool "Kernel low-level debugging functions" +	bool "Kernel low-level debugging functions (read help!)"  	depends on DEBUG_KERNEL  	help  	  Say Y here to include definitions of printascii, printch, printhex  	  in the kernel.  This is helpful if you are debugging code that  	  executes before the console is initialized. +	  Note that selecting this option will limit the kernel to a single +	  UART definition, as specified below. Attempting to boot the kernel +	  image on a different platform *will not work*, so this option should +	  not be enabled for kernels that are intended to be portable. + +choice +	prompt "Kernel low-level debugging port" +	depends on DEBUG_LL + +	config DEBUG_LL_UART_NONE +		bool "No low-level debugging UART" +		help +		  Say Y here if your platform doesn't provide a UART option +		  below. This relies on your platform choosing the right UART +		  definition internally in order for low-level debugging to +		  work. + +	config DEBUG_ICEDCC +		bool "Kernel low-level debugging via EmbeddedICE DCC channel" +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the EmbeddedICE macrocell's DCC channel using +		  co-processor 14. This is known to work on the ARM9 style ICE +		  channel and on the XScale with the PEEDI. + +		  Note that the system will appear to hang during boot if there +		  is nothing connected to read from the DCC. + +	config DEBUG_FOOTBRIDGE_COM1 +		bool "Kernel low-level debugging messages via footbridge 8250 at PCI COM1" +		depends on FOOTBRIDGE +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the 8250 at PCI COM1. + +	config DEBUG_DC21285_PORT +		bool "Kernel low-level debugging messages via footbridge serial port" +		depends on FOOTBRIDGE +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the serial port in the DC21285 (Footbridge). + +	config DEBUG_CLPS711X_UART1 +		bool "Kernel low-level debugging messages via UART1" +		depends on ARCH_CLPS711X +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the first serial port on these devices. + +	config DEBUG_CLPS711X_UART2 +		bool "Kernel low-level debugging messages via UART2" +		depends on ARCH_CLPS711X +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the second serial port on these devices. + +	config DEBUG_HIGHBANK_UART +		bool "Kernel low-level debugging messages via Highbank UART" +		depends on ARCH_HIGHBANK +		help +		  Say Y here if you want the debug print routines to direct +		  their output to the UART on Highbank based devices. + +endchoice +  config EARLY_PRINTK  	bool "Early printk"  	depends on DEBUG_LL @@ -80,18 +145,6 @@ config EARLY_PRINTK  	  kernel low-level debugging functions. Add earlyprintk to your  	  kernel parameters to enable this console. -config DEBUG_ICEDCC -	bool "Kernel low-level debugging via EmbeddedICE DCC channel" -	depends on DEBUG_LL -	help -	  Say Y here if you want the debug print routines to direct their -	  output to the EmbeddedICE macrocell's DCC channel using -	  co-processor 14. This is known to work on the ARM9 style ICE -	  channel and on the XScale with the PEEDI. - -	  It does include a timeout to ensure that the system does not -	  totally freeze when there is nothing connected to read. -  config OC_ETM  	bool "On-chip ETM and ETB"  	select ARM_AMBA @@ -100,23 +153,6 @@ config OC_ETM  	  buffer driver that will allow you to collect traces of the  	  kernel code. -config DEBUG_DC21285_PORT -	bool "Kernel low-level debugging messages via footbridge serial port" -	depends on DEBUG_LL && FOOTBRIDGE -	help -	  Say Y here if you want the debug print routines to direct their -	  output to the serial port in the DC21285 (Footbridge). Saying N -	  will cause the debug messages to appear on the first 16550 -	  serial port. - -config DEBUG_CLPS711X_UART2 -	bool "Kernel low-level debugging messages via UART2" -	depends on DEBUG_LL && ARCH_CLPS711X -	help -	  Say Y here if you want the debug print routines to direct their -	  output to the second serial port on these devices.  Saying N will -	  cause the debug messages to appear on the first serial port. -  config DEBUG_S3C_UART  	depends on PLAT_SAMSUNG  	int "S3C UART to use for low-level debug" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index 8904caa736c..e8688114ca9 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -144,6 +144,7 @@ machine-$(CONFIG_ARCH_EBSA110)		:= ebsa110  machine-$(CONFIG_ARCH_EP93XX)		:= ep93xx  machine-$(CONFIG_ARCH_GEMINI)		:= gemini  machine-$(CONFIG_ARCH_H720X)		:= h720x +machine-$(CONFIG_ARCH_HIGHBANK)		:= highbank  machine-$(CONFIG_ARCH_INTEGRATOR)	:= integrator  machine-$(CONFIG_ARCH_IOP13XX)		:= iop13xx  machine-$(CONFIG_ARCH_IOP32X)		:= iop32x diff --git a/arch/arm/boot/dts/highbank.dts b/arch/arm/boot/dts/highbank.dts new file mode 100644 index 00000000000..aeb1a7578fa --- /dev/null +++ b/arch/arm/boot/dts/highbank.dts @@ -0,0 +1,198 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +/dts-v1/; + +/* First 4KB has pen for secondary cores. */ +/memreserve/ 0x00000000 0x0001000; + +/ { +	model = "Calxeda Highbank"; +	compatible = "calxeda,highbank"; +	#address-cells = <1>; +	#size-cells = <1>; + +	cpus { +		#address-cells = <1>; +		#size-cells = <0>; + +		cpu@0 { +			compatible = "arm,cortex-a9"; +			reg = <0>; +			next-level-cache = <&L2>; +		}; + +		cpu@1 { +			compatible = "arm,cortex-a9"; +			reg = <1>; +			next-level-cache = <&L2>; +		}; + +		cpu@2 { +			compatible = "arm,cortex-a9"; +			reg = <2>; +			next-level-cache = <&L2>; +		}; + +		cpu@3 { +			compatible = "arm,cortex-a9"; +			reg = <3>; +			next-level-cache = <&L2>; +		}; +	}; + +	memory { +		name = "memory"; +		device_type = "memory"; +		reg = <0x00000000 0xff900000>; +	}; + +	chosen { +		bootargs = "console=ttyAMA0"; +	}; + +	soc { +		#address-cells = <1>; +		#size-cells = <1>; +		compatible = "simple-bus"; +		interrupt-parent = <&intc>; +		ranges; + +		timer@fff10600 { +			compatible = "arm,smp-twd"; +			reg = <0xfff10600 0x20>; +			interrupts = <1 13 0xf04>; +		}; + +		watchdog@fff10620 { +			compatible = "arm,cortex-a9-wdt"; +			reg = <0xfff10620 0x20>; +			interrupts = <1 14 0xf04>; +		}; + +		intc: interrupt-controller@fff11000 { +			compatible = "arm,cortex-a9-gic"; +			#interrupt-cells = <3>; +			#size-cells = <0>; +			#address-cells = <1>; +			interrupt-controller; +			interrupt-parent; +			reg = <0xfff11000 0x1000>, +			      <0xfff10100 0x100>; +		}; + +		L2: l2-cache { +			compatible = "arm,pl310-cache"; +			reg = <0xfff12000 0x1000>; +			interrupts = <0 70 4>; +			cache-unified; +			cache-level = <2>; +		}; + +		pmu { +			compatible = "arm,cortex-a9-pmu"; +			interrupts = <0 76 4  0 75 4  0 74 4  0 73 4>; +		}; + +		sata@ffe08000 { +			compatible = "calxeda,hb-ahci"; +			reg = <0xffe08000 0x10000>; +			interrupts = <0 83 4>; +		}; + +		sdhci@ffe0e000 { +			compatible = "calxeda,hb-sdhci"; +			reg = <0xffe0e000 0x1000>; +			interrupts = <0 90 4>; +		}; + +		ipc@fff20000 { +			compatible = "arm,pl320", "arm,primecell"; +			reg = <0xfff20000 0x1000>; +			interrupts = <0 7 4>; +		}; + +		gpioe: gpio@fff30000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff30000 0x1000>; +			interrupts = <0 14 4>; +		}; + +		gpiof: gpio@fff31000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff31000 0x1000>; +			interrupts = <0 15 4>; +		}; + +		gpiog: gpio@fff32000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff32000 0x1000>; +			interrupts = <0 16 4>; +		}; + +		gpioh: gpio@fff33000 { +			#gpio-cells = <2>; +			compatible = "arm,pl061", "arm,primecell"; +			gpio-controller; +			reg = <0xfff33000 0x1000>; +			interrupts = <0 17 4>; +		}; + +		timer { +			compatible = "arm,sp804", "arm,primecell"; +			reg = <0xfff34000 0x1000>; +			interrupts = <0 18 4>; +		}; + +		rtc@fff35000 { +			compatible = "arm,pl031", "arm,primecell"; +			reg = <0xfff35000 0x1000>; +			interrupts = <0 19 4>; +		}; + +		serial@fff36000 { +			compatible = "arm,pl011", "arm,primecell"; +			reg = <0xfff36000 0x1000>; +			interrupts = <0 20 4>; +		}; + +		smic@fff3a000 { +			compatible = "ipmi-smic"; +			device_type = "ipmi"; +			reg = <0xfff3a000 0x1000>; +			interrupts = <0 24 4>; +			reg-size = <4>; +			reg-spacing = <4>; +		}; + +		sregs@fff3c000 { +			compatible = "calxeda,hb-sregs"; +			reg = <0xfff3c000 0x1000>; +		}; + +		dma@fff3d000 { +			compatible = "arm,pl330", "arm,primecell"; +			reg = <0xfff3d000 0x1000>; +			interrupts = <0 92 4>; +		}; +	}; +}; diff --git a/arch/arm/common/scoop.c b/arch/arm/common/scoop.c index a07b0e763a8..1cde34a080d 100644 --- a/arch/arm/common/scoop.c +++ b/arch/arm/common/scoop.c @@ -12,11 +12,11 @@   */  #include <linux/device.h> +#include <linux/gpio.h>  #include <linux/string.h>  #include <linux/slab.h>  #include <linux/platform_device.h>  #include <linux/io.h> -#include <asm/gpio.h>  #include <asm/hardware/scoop.h>  /* PCMCIA to Scoop linkage diff --git a/arch/arm/include/asm/ecard.h b/arch/arm/include/asm/ecard.h index 29f2610efc7..eaea14676d5 100644 --- a/arch/arm/include/asm/ecard.h +++ b/arch/arm/include/asm/ecard.h @@ -161,7 +161,6 @@ struct expansion_card {  	/* Private internal data */  	const char		*card_desc;	/* Card description		*/ -	CONST unsigned int	podaddr;	/* Base Linux address for card	*/  	CONST loader_t		loader;		/* loader program */  	u64			dma_mask;  }; diff --git a/arch/arm/include/asm/gpio.h b/arch/arm/include/asm/gpio.h index 166a7a3e284..11ad0bfbb0a 100644 --- a/arch/arm/include/asm/gpio.h +++ b/arch/arm/include/asm/gpio.h @@ -4,4 +4,23 @@  /* not all ARM platforms necessarily support this API ... */  #include <mach/gpio.h> +#ifndef __ARM_GPIOLIB_COMPLEX +/* Note: this may rely upon the value of ARCH_NR_GPIOS set in mach/gpio.h */ +#include <asm-generic/gpio.h> + +/* The trivial gpiolib dispatchers */ +#define gpio_get_value  __gpio_get_value +#define gpio_set_value  __gpio_set_value +#define gpio_cansleep   __gpio_cansleep +#endif + +/* + * Provide a default gpio_to_irq() which should satisfy every case. + * However, some platforms want to do this differently, so allow them + * to override it. + */ +#ifndef gpio_to_irq +#define gpio_to_irq	__gpio_to_irq +#endif +  #endif /* _ARCH_ARM_GPIO_H */ diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h index 99a6ed7e1bf..1db1143a948 100644 --- a/arch/arm/include/asm/hardware/cache-l2x0.h +++ b/arch/arm/include/asm/hardware/cache-l2x0.h @@ -52,6 +52,8 @@  #define L2X0_LOCKDOWN_WAY_D_BASE	0x900  #define L2X0_LOCKDOWN_WAY_I_BASE	0x904  #define L2X0_LOCKDOWN_STRIDE		0x08 +#define L2X0_ADDR_FILTER_START		0xC00 +#define L2X0_ADDR_FILTER_END		0xC04  #define L2X0_TEST_OPERATION		0xF00  #define L2X0_LINE_DATA			0xF10  #define L2X0_LINE_TAG			0xF30 @@ -65,8 +67,23 @@  #define L2X0_CACHE_ID_PART_MASK		(0xf << 6)  #define L2X0_CACHE_ID_PART_L210		(1 << 6)  #define L2X0_CACHE_ID_PART_L310		(3 << 6) +#define L2X0_CACHE_ID_RTL_MASK          0x3f +#define L2X0_CACHE_ID_RTL_R0P0          0x0 +#define L2X0_CACHE_ID_RTL_R1P0          0x2 +#define L2X0_CACHE_ID_RTL_R2P0          0x4 +#define L2X0_CACHE_ID_RTL_R3P0          0x5 +#define L2X0_CACHE_ID_RTL_R3P1          0x6 +#define L2X0_CACHE_ID_RTL_R3P2          0x8  #define L2X0_AUX_CTRL_MASK			0xc0000fff +#define L2X0_AUX_CTRL_DATA_RD_LATENCY_SHIFT	0 +#define L2X0_AUX_CTRL_DATA_RD_LATENCY_MASK	0x7 +#define L2X0_AUX_CTRL_DATA_WR_LATENCY_SHIFT	3 +#define L2X0_AUX_CTRL_DATA_WR_LATENCY_MASK	(0x7 << 3) +#define L2X0_AUX_CTRL_TAG_LATENCY_SHIFT		6 +#define L2X0_AUX_CTRL_TAG_LATENCY_MASK		(0x7 << 6) +#define L2X0_AUX_CTRL_DIRTY_LATENCY_SHIFT	9 +#define L2X0_AUX_CTRL_DIRTY_LATENCY_MASK	(0x7 << 9)  #define L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT	16  #define L2X0_AUX_CTRL_WAY_SIZE_SHIFT		17  #define L2X0_AUX_CTRL_WAY_SIZE_MASK		(0x7 << 17) @@ -77,8 +94,40 @@  #define L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT	29  #define L2X0_AUX_CTRL_EARLY_BRESP_SHIFT		30 +#define L2X0_LATENCY_CTRL_SETUP_SHIFT	0 +#define L2X0_LATENCY_CTRL_RD_SHIFT	4 +#define L2X0_LATENCY_CTRL_WR_SHIFT	8 + +#define L2X0_ADDR_FILTER_EN		1 +  #ifndef __ASSEMBLY__  extern void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask); +#if defined(CONFIG_CACHE_L2X0) && defined(CONFIG_OF) +extern int l2x0_of_init(__u32 aux_val, __u32 aux_mask); +#else +static inline int l2x0_of_init(__u32 aux_val, __u32 aux_mask) +{ +	return -ENODEV; +}  #endif +struct l2x0_regs { +	unsigned long phy_base; +	unsigned long aux_ctrl; +	/* +	 * Whether the following registers need to be saved/restored +	 * depends on platform +	 */ +	unsigned long tag_latency; +	unsigned long data_latency; +	unsigned long filter_start; +	unsigned long filter_end; +	unsigned long prefetch_ctrl; +	unsigned long pwr_ctrl; +}; + +extern struct l2x0_regs l2x0_saved_regs; + +#endif /* __ASSEMBLY__ */ +  #endif diff --git a/arch/arm/include/asm/hardware/iop3xx-gpio.h b/arch/arm/include/asm/hardware/iop3xx-gpio.h index b69d972b1f7..9eda7dc92ad 100644 --- a/arch/arm/include/asm/hardware/iop3xx-gpio.h +++ b/arch/arm/include/asm/hardware/iop3xx-gpio.h @@ -28,6 +28,8 @@  #include <mach/hardware.h>  #include <asm-generic/gpio.h> +#define __ARM_GPIOLIB_COMPLEX +  #define IOP3XX_N_GPIOS	8  static inline int gpio_get_value(unsigned gpio) diff --git a/arch/arm/include/asm/io.h b/arch/arm/include/asm/io.h index d66605dea55..ffb089d46a1 100644 --- a/arch/arm/include/asm/io.h +++ b/arch/arm/include/asm/io.h @@ -110,6 +110,27 @@ static inline void __iomem *__typesafe_io(unsigned long addr)  #include <mach/io.h>  /* + * This is the limit of PC card/PCI/ISA IO space, which is by default + * 64K if we have PC card, PCI or ISA support.  Otherwise, default to + * zero to prevent ISA/PCI drivers claiming IO space (and potentially + * oopsing.) + * + * Only set this larger if you really need inb() et.al. to operate over + * a larger address space.  Note that SOC_COMMON ioremaps each sockets + * IO space area, and so inb() et.al. must be defined to operate as per + * readb() et.al. on such platforms. + */ +#ifndef IO_SPACE_LIMIT +#if defined(CONFIG_PCMCIA_SOC_COMMON) || defined(CONFIG_PCMCIA_SOC_COMMON_MODULE) +#define IO_SPACE_LIMIT ((resource_size_t)0xffffffff) +#elif defined(CONFIG_PCI) || defined(CONFIG_ISA) || defined(CONFIG_PCCARD) +#define IO_SPACE_LIMIT ((resource_size_t)0xffff) +#else +#define IO_SPACE_LIMIT ((resource_size_t)0) +#endif +#endif + +/*   *  IO port access primitives   *  -------------------------   * diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h index d8387437ec5..53426c66352 100644 --- a/arch/arm/include/asm/outercache.h +++ b/arch/arm/include/asm/outercache.h @@ -34,6 +34,7 @@ struct outer_cache_fns {  	void (*sync)(void);  #endif  	void (*set_debug)(unsigned long); +	void (*resume)(void);  };  #ifdef CONFIG_OUTER_CACHE @@ -74,6 +75,12 @@ static inline void outer_disable(void)  		outer_cache.disable();  } +static inline void outer_resume(void) +{ +	if (outer_cache.resume) +		outer_cache.resume(); +} +  #else  static inline void outer_inv_range(phys_addr_t start, phys_addr_t end) diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 16baba2e436..1429d8989fb 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -20,6 +20,7 @@  #include <asm/thread_info.h>  #include <asm/memory.h>  #include <asm/procinfo.h> +#include <asm/hardware/cache-l2x0.h>  #include <linux/kbuild.h>  /* @@ -92,6 +93,17 @@ int main(void)    DEFINE(S_OLD_R0,		offsetof(struct pt_regs, ARM_ORIG_r0));    DEFINE(S_FRAME_SIZE,		sizeof(struct pt_regs));    BLANK(); +#ifdef CONFIG_CACHE_L2X0 +  DEFINE(L2X0_R_PHY_BASE,	offsetof(struct l2x0_regs, phy_base)); +  DEFINE(L2X0_R_AUX_CTRL,	offsetof(struct l2x0_regs, aux_ctrl)); +  DEFINE(L2X0_R_TAG_LATENCY,	offsetof(struct l2x0_regs, tag_latency)); +  DEFINE(L2X0_R_DATA_LATENCY,	offsetof(struct l2x0_regs, data_latency)); +  DEFINE(L2X0_R_FILTER_START,	offsetof(struct l2x0_regs, filter_start)); +  DEFINE(L2X0_R_FILTER_END,	offsetof(struct l2x0_regs, filter_end)); +  DEFINE(L2X0_R_PREFETCH_CTRL,	offsetof(struct l2x0_regs, prefetch_ctrl)); +  DEFINE(L2X0_R_PWR_CTRL,	offsetof(struct l2x0_regs, pwr_ctrl)); +  BLANK(); +#endif  #ifdef CONFIG_CPU_HAS_ASID    DEFINE(MM_CONTEXT_ID,		offsetof(struct mm_struct, context.id));    BLANK(); diff --git a/arch/arm/kernel/ecard.c b/arch/arm/kernel/ecard.c index d16500110ee..4dd0edab6a6 100644 --- a/arch/arm/kernel/ecard.c +++ b/arch/arm/kernel/ecard.c @@ -237,7 +237,7 @@ static void ecard_init_pgtables(struct mm_struct *mm)  	memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (IO_SIZE / PGDIR_SIZE)); -	src_pgd = pgd_offset(mm, EASI_BASE); +	src_pgd = pgd_offset(mm, (unsigned long)EASI_BASE);  	dst_pgd = pgd_offset(mm, EASI_START);  	memcpy(dst_pgd, src_pgd, sizeof(pgd_t) * (EASI_SIZE / PGDIR_SIZE)); @@ -674,44 +674,37 @@ static int __init ecard_probeirqhw(void)  #define ecard_probeirqhw() (0)  #endif -#ifndef IO_EC_MEMC8_BASE -#define IO_EC_MEMC8_BASE 0 -#endif - -static unsigned int __ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed) +static void __iomem *__ecard_address(ecard_t *ec, card_type_t type, card_speed_t speed)  { -	unsigned long address = 0; +	void __iomem *address = NULL;  	int slot = ec->slot_no;  	if (ec->slot_no == 8) -		return IO_EC_MEMC8_BASE; +		return ECARD_MEMC8_BASE;  	ectcr &= ~(1 << slot);  	switch (type) {  	case ECARD_MEMC:  		if (slot < 4) -			address = IO_EC_MEMC_BASE + (slot << 12); +			address = ECARD_MEMC_BASE + (slot << 14);  		break;  	case ECARD_IOC:  		if (slot < 4) -			address = IO_EC_IOC_BASE + (slot << 12); -#ifdef IO_EC_IOC4_BASE +			address = ECARD_IOC_BASE + (slot << 14);  		else -			address = IO_EC_IOC4_BASE + ((slot - 4) << 12); -#endif +			address = ECARD_IOC4_BASE + ((slot - 4) << 14);  		if (address) -			address +=  speed << 17; +			address += speed << 19;  		break; -#ifdef IO_EC_EASI_BASE  	case ECARD_EASI: -		address = IO_EC_EASI_BASE + (slot << 22); +		address = ECARD_EASI_BASE + (slot << 24);  		if (speed == ECARD_FAST)  			ectcr |= 1 << slot;  		break; -#endif +  	default:  		break;  	} @@ -990,6 +983,7 @@ ecard_probe(int slot, card_type_t type)  	ecard_t **ecp;  	ecard_t *ec;  	struct ex_ecid cid; +	void __iomem *addr;  	int i, rc;  	ec = ecard_alloc_card(type, slot); @@ -999,7 +993,7 @@ ecard_probe(int slot, card_type_t type)  	}  	rc = -ENODEV; -	if ((ec->podaddr = __ecard_address(ec, type, ECARD_SYNC)) == 0) +	if ((addr = __ecard_address(ec, type, ECARD_SYNC)) == NULL)  		goto nodev;  	cid.r_zero = 1; @@ -1019,7 +1013,7 @@ ecard_probe(int slot, card_type_t type)  	ec->cid.fiqmask = cid.r_fiqmask;  	ec->cid.fiqoff  = ecard_gets24(cid.r_fiqoff);  	ec->fiqaddr	= -	ec->irqaddr	= (void __iomem *)ioaddr(ec->podaddr); +	ec->irqaddr	= addr;  	if (ec->cid.is) {  		ec->irqmask = ec->cid.irqmask; @@ -1048,10 +1042,8 @@ ecard_probe(int slot, card_type_t type)  		set_irq_flags(ec->irq, IRQF_VALID);  	} -#ifdef IO_EC_MEMC8_BASE  	if (slot == 8)  		ec->irq = 11; -#endif  #ifdef CONFIG_ARCH_RPC  	/* On RiscPC, only first two slots have DMA capability */  	if (slot < 2) @@ -1097,9 +1089,7 @@ static int __init ecard_init(void)  			ecard_probe(slot, ECARD_IOC);  	} -#ifdef IO_EC_MEMC8_BASE  	ecard_probe(8, ECARD_IOC); -#endif  	irqhw = ecard_probeirqhw(); diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index dba0d8d8a4b..f87f5040e78 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c @@ -16,6 +16,7 @@  #include <asm/mach/irq.h>  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h> @@ -23,7 +24,6 @@  #include <mach/board.h>  #include <mach/cpu.h> -#include <mach/gpio.h>  #include <mach/at91cap9.h>  #include <mach/at91cap9_matrix.h>  #include <mach/at91sam9_smc.h> diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 7227755ffec..978be950035 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c @@ -14,11 +14,11 @@  #include <asm/mach/map.h>  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91rm9200.h>  #include <mach/at91rm9200_mc.h> diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 39f81f47b4b..a53b3de9daa 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c @@ -13,11 +13,11 @@  #include <asm/mach/map.h>  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/cpu.h>  #include <mach/at91sam9260.h>  #include <mach/at91sam9260_matrix.h> diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 0f917928eeb..4e647b65333 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c @@ -14,6 +14,7 @@  #include <asm/mach/map.h>  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h> @@ -21,7 +22,6 @@  #include <video/atmel_lcdc.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9261.h>  #include <mach/at91sam9261_matrix.h>  #include <mach/at91sam9_smc.h> diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index a050f41fc86..dd7662bc395 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c @@ -13,6 +13,7 @@  #include <asm/mach/map.h>  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h> @@ -20,7 +21,6 @@  #include <video/atmel_lcdc.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9263.h>  #include <mach/at91sam9263_matrix.h>  #include <mach/at91sam9_smc.h> diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index 600bffb01ed..c3dfb1b3b1e 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c @@ -13,6 +13,7 @@  #include <asm/mach/map.h>  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h>  #include <linux/atmel-mci.h> @@ -21,7 +22,6 @@  #include <video/atmel_lcdc.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9g45.h>  #include <mach/at91sam9g45_matrix.h>  #include <mach/at91sam9_smc.h> diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index aacb19dc922..305a851b5bf 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c @@ -10,6 +10,7 @@  #include <asm/mach/map.h>  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c-gpio.h> @@ -17,7 +18,6 @@  #include <video/atmel_lcdc.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9rl.h>  #include <mach/at91sam9rl_matrix.h>  #include <mach/at91sam9_smc.h> diff --git a/arch/arm/mach-at91/board-1arm.c b/arch/arm/mach-at91/board-1arm.c index 5aa58851eb3..367d5cd5e36 100644 --- a/arch/arm/mach-at91/board-1arm.c +++ b/arch/arm/mach-at91/board-1arm.c @@ -19,6 +19,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -34,7 +35,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/cpu.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-afeb-9260v1.c b/arch/arm/mach-at91/board-afeb-9260v1.c index b0c796d42e4..0487ea10c2d 100644 --- a/arch/arm/mach-at91/board-afeb-9260v1.c +++ b/arch/arm/mach-at91/board-afeb-9260v1.c @@ -25,6 +25,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -43,7 +44,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cam60.c b/arch/arm/mach-at91/board-cam60.c index d1abd5898e8..747b2eaa973 100644 --- a/arch/arm/mach-at91/board-cam60.c +++ b/arch/arm/mach-at91/board-cam60.c @@ -21,6 +21,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -38,7 +39,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" diff --git a/arch/arm/mach-at91/board-cap9adk.c b/arch/arm/mach-at91/board-cap9adk.c index 679b0b743e9..062670351a6 100644 --- a/arch/arm/mach-at91/board-cap9adk.c +++ b/arch/arm/mach-at91/board-cap9adk.c @@ -22,6 +22,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -41,7 +42,6 @@  #include <asm/mach/map.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91cap9_matrix.h>  #include <mach/at91sam9_smc.h>  #include <mach/system_rev.h> diff --git a/arch/arm/mach-at91/board-carmeva.c b/arch/arm/mach-at91/board-carmeva.c index c578c5d9072..774c87fcbd5 100644 --- a/arch/arm/mach-at91/board-carmeva.c +++ b/arch/arm/mach-at91/board-carmeva.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -35,7 +36,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-cpu9krea.c b/arch/arm/mach-at91/board-cpu9krea.c index f4da8a16d5d..fc885a4ce24 100644 --- a/arch/arm/mach-at91/board-cpu9krea.c +++ b/arch/arm/mach-at91/board-cpu9krea.c @@ -21,6 +21,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -40,7 +41,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91sam9260_matrix.h> diff --git a/arch/arm/mach-at91/board-cpuat91.c b/arch/arm/mach-at91/board-cpuat91.c index 2d919f5a4f5..d35e65b08cc 100644 --- a/arch/arm/mach-at91/board-cpuat91.c +++ b/arch/arm/mach-at91/board-cpuat91.c @@ -19,6 +19,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -36,7 +37,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91rm9200_mc.h>  #include <mach/cpu.h> diff --git a/arch/arm/mach-at91/board-csb337.c b/arch/arm/mach-at91/board-csb337.c index 17654d5e94e..c3936665e64 100644 --- a/arch/arm/mach-at91/board-csb337.c +++ b/arch/arm/mach-at91/board-csb337.c @@ -19,6 +19,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -38,7 +39,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-csb637.c b/arch/arm/mach-at91/board-csb637.c index 72b55674616..586100e2acb 100644 --- a/arch/arm/mach-at91/board-csb637.c +++ b/arch/arm/mach-at91/board-csb637.c @@ -20,6 +20,7 @@  #include <linux/types.h>  #include <linux/init.h> +#include <linux/gpio.h>  #include <linux/mm.h>  #include <linux/module.h>  #include <linux/platform_device.h> @@ -35,7 +36,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-eb9200.c b/arch/arm/mach-at91/board-eb9200.c index 01170a2766a..45db7a3dbef 100644 --- a/arch/arm/mach-at91/board-eb9200.c +++ b/arch/arm/mach-at91/board-eb9200.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -35,7 +36,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-ecbat91.c b/arch/arm/mach-at91/board-ecbat91.c index 7c0313c51f2..2f9c16d2921 100644 --- a/arch/arm/mach-at91/board-ecbat91.c +++ b/arch/arm/mach-at91/board-ecbat91.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -37,7 +38,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/cpu.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-kafa.c b/arch/arm/mach-at91/board-kafa.c index 4a170890b3b..3bae73e6363 100644 --- a/arch/arm/mach-at91/board-kafa.c +++ b/arch/arm/mach-at91/board-kafa.c @@ -19,6 +19,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -34,7 +35,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/cpu.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-kb9202.c b/arch/arm/mach-at91/board-kb9202.c index 9dc8d496ead..15a3f1a87ab 100644 --- a/arch/arm/mach-at91/board-kb9202.c +++ b/arch/arm/mach-at91/board-kb9202.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -35,7 +36,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/cpu.h>  #include <mach/at91rm9200_mc.h> diff --git a/arch/arm/mach-at91/board-neocore926.c b/arch/arm/mach-at91/board-neocore926.c index 9bc6ab32e0a..6094496f7ed 100644 --- a/arch/arm/mach-at91/board-neocore926.c +++ b/arch/arm/mach-at91/board-neocore926.c @@ -21,6 +21,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -44,7 +45,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" diff --git a/arch/arm/mach-at91/board-picotux200.c b/arch/arm/mach-at91/board-picotux200.c index b7b8390e8a0..0a8fe6a1b7c 100644 --- a/arch/arm/mach-at91/board-picotux200.c +++ b/arch/arm/mach-at91/board-picotux200.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -37,7 +38,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91rm9200_mc.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-qil-a9260.c b/arch/arm/mach-at91/board-qil-a9260.c index 81f91103368..938cc390bea 100644 --- a/arch/arm/mach-at91/board-qil-a9260.c +++ b/arch/arm/mach-at91/board-qil-a9260.c @@ -21,6 +21,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -40,7 +41,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h> diff --git a/arch/arm/mach-at91/board-rm9200dk.c b/arch/arm/mach-at91/board-rm9200dk.c index 6f08faadb47..b4ac30e38a9 100644 --- a/arch/arm/mach-at91/board-rm9200dk.c +++ b/arch/arm/mach-at91/board-rm9200dk.c @@ -22,6 +22,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -39,7 +40,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91rm9200_mc.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-rm9200ek.c b/arch/arm/mach-at91/board-rm9200ek.c index 85bcccd7b9e..99fd7f8aee0 100644 --- a/arch/arm/mach-at91/board-rm9200ek.c +++ b/arch/arm/mach-at91/board-rm9200ek.c @@ -22,6 +22,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -39,7 +40,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91rm9200_mc.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/board-sam9-l9260.c b/arch/arm/mach-at91/board-sam9-l9260.c index 4d3a02f1289..2a21e790250 100644 --- a/arch/arm/mach-at91/board-sam9-l9260.c +++ b/arch/arm/mach-at91/board-sam9-l9260.c @@ -21,6 +21,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -37,7 +38,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include "sam9_smc.h" diff --git a/arch/arm/mach-at91/board-sam9260ek.c b/arch/arm/mach-at91/board-sam9260ek.c index 8a50c3e6718..89c8b579bfd 100644 --- a/arch/arm/mach-at91/board-sam9260ek.c +++ b/arch/arm/mach-at91/board-sam9260ek.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -41,7 +42,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> diff --git a/arch/arm/mach-at91/board-sam9261ek.c b/arch/arm/mach-at91/board-sam9261ek.c index 5096a0ec50c..3741f43cdae 100644 --- a/arch/arm/mach-at91/board-sam9261ek.c +++ b/arch/arm/mach-at91/board-sam9261ek.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -45,7 +46,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> diff --git a/arch/arm/mach-at91/board-sam9263ek.c b/arch/arm/mach-at91/board-sam9263ek.c index ea8f185d3b9..a580dd451a4 100644 --- a/arch/arm/mach-at91/board-sam9263ek.c +++ b/arch/arm/mach-at91/board-sam9263ek.c @@ -20,6 +20,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -44,7 +45,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> diff --git a/arch/arm/mach-at91/board-sam9g20ek.c b/arch/arm/mach-at91/board-sam9g20ek.c index 817f59d7251..8d77c2ff96b 100644 --- a/arch/arm/mach-at91/board-sam9g20ek.c +++ b/arch/arm/mach-at91/board-sam9g20ek.c @@ -18,6 +18,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -41,7 +42,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/system_rev.h> diff --git a/arch/arm/mach-at91/board-sam9m10g45ek.c b/arch/arm/mach-at91/board-sam9m10g45ek.c index ad234ccbf57..2d6203ac1a4 100644 --- a/arch/arm/mach-at91/board-sam9m10g45ek.c +++ b/arch/arm/mach-at91/board-sam9m10g45ek.c @@ -14,6 +14,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -38,7 +39,6 @@  #include <asm/mach/irq.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h>  #include <mach/system_rev.h> diff --git a/arch/arm/mach-at91/board-sam9rlek.c b/arch/arm/mach-at91/board-sam9rlek.c index 4f14b54b93a..39a28effc3d 100644 --- a/arch/arm/mach-at91/board-sam9rlek.c +++ b/arch/arm/mach-at91/board-sam9rlek.c @@ -8,6 +8,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -30,7 +31,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h> diff --git a/arch/arm/mach-at91/board-usb-a9260.c b/arch/arm/mach-at91/board-usb-a9260.c index 8c4c1a02c4b..bac9b65cf55 100644 --- a/arch/arm/mach-at91/board-usb-a9260.c +++ b/arch/arm/mach-at91/board-usb-a9260.c @@ -21,6 +21,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -40,7 +41,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h> diff --git a/arch/arm/mach-at91/board-usb-a9263.c b/arch/arm/mach-at91/board-usb-a9263.c index 25e793782a4..5bd735787d6 100644 --- a/arch/arm/mach-at91/board-usb-a9263.c +++ b/arch/arm/mach-at91/board-usb-a9263.c @@ -21,6 +21,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -39,7 +40,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91sam9_smc.h>  #include <mach/at91_shdwc.h> diff --git a/arch/arm/mach-at91/board-yl-9200.c b/arch/arm/mach-at91/board-yl-9200.c index 95edcbd2aec..3c288b396fc 100644 --- a/arch/arm/mach-at91/board-yl-9200.c +++ b/arch/arm/mach-at91/board-yl-9200.c @@ -22,6 +22,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/mm.h>  #include <linux/module.h> @@ -43,7 +44,6 @@  #include <mach/hardware.h>  #include <mach/board.h> -#include <mach/gpio.h>  #include <mach/at91rm9200_mc.h>  #include <mach/cpu.h> diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index 4615528205c..224e9e2f867 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c @@ -11,6 +11,7 @@  #include <linux/clk.h>  #include <linux/errno.h> +#include <linux/gpio.h>  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/debugfs.h> @@ -22,9 +23,6 @@  #include <mach/hardware.h>  #include <mach/at91_pio.h> -#include <mach/gpio.h> - -#include <asm/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-at91/include/mach/gpio.h b/arch/arm/mach-at91/include/mach/gpio.h index 056dc6674b6..2b9a1f51210 100644 --- a/arch/arm/mach-at91/include/mach/gpio.h +++ b/arch/arm/mach-at91/include/mach/gpio.h @@ -214,11 +214,6 @@ extern void at91_gpio_resume(void);   */  #include <asm/errno.h> -#include <asm-generic/gpio.h>		/* cansleep wrappers */ - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep  #define gpio_to_irq(gpio) (gpio)  #define irq_to_gpio(irq)  (irq) diff --git a/arch/arm/mach-at91/leds.c b/arch/arm/mach-at91/leds.c index 0415a839e1a..8dfafe76ffe 100644 --- a/arch/arm/mach-at91/leds.c +++ b/arch/arm/mach-at91/leds.c @@ -9,13 +9,13 @@   * 2 of the License, or (at your option) any later version.  */ +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/init.h>  #include <linux/platform_device.h>  #include <mach/board.h> -#include <mach/gpio.h>  /* ------------------------------------------------------------------------- */ diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 4159eca7894..7046158109d 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c @@ -10,6 +10,7 @@   * (at your option) any later version.   */ +#include <linux/gpio.h>  #include <linux/suspend.h>  #include <linux/sched.h>  #include <linux/proc_fs.h> @@ -25,7 +26,6 @@  #include <asm/mach/irq.h>  #include <mach/at91_pmc.h> -#include <mach/gpio.h>  #include <mach/cpu.h>  #include "generic.h" diff --git a/arch/arm/mach-davinci/Makefile b/arch/arm/mach-davinci/Makefile index 0b87a1ca2bb..495e31306fc 100644 --- a/arch/arm/mach-davinci/Makefile +++ b/arch/arm/mach-davinci/Makefile @@ -5,7 +5,7 @@  # Common objects  obj-y 			:= time.o clock.o serial.o io.o psc.o \ -			   gpio.o dma.o usb.o common.o sram.o aemif.o +			   dma.o usb.o common.o sram.o aemif.o  obj-$(CONFIG_DAVINCI_MUX)		+= mux.o @@ -17,7 +17,6 @@ obj-$(CONFIG_ARCH_DAVINCI_DM365)	+= dm365.o devices.o  obj-$(CONFIG_ARCH_DAVINCI_DA830)        += da830.o devices-da8xx.o  obj-$(CONFIG_ARCH_DAVINCI_DA850)        += da850.o devices-da8xx.o  obj-$(CONFIG_ARCH_DAVINCI_TNETV107X)    += tnetv107x.o devices-tnetv107x.o -obj-$(CONFIG_ARCH_DAVINCI_TNETV107X)    += gpio-tnetv107x.o  obj-$(CONFIG_AINTC)			+= irq.o  obj-$(CONFIG_CP_INTC)			+= cp_intc.o diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c index 2ed2f822fc4..a6bf5dcaef1 100644 --- a/arch/arm/mach-davinci/da830.c +++ b/arch/arm/mach-davinci/da830.c @@ -8,6 +8,7 @@   * is licensed "as is" without any warranty of any kind, whether express   * or implied.   */ +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/clk.h> @@ -19,7 +20,7 @@  #include <mach/common.h>  #include <mach/time.h>  #include <mach/da8xx.h> -#include <mach/gpio.h> +#include <mach/gpio-davinci.h>  #include "clock.h"  #include "mux.h" diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c index 935dbed5c54..4aae01576aa 100644 --- a/arch/arm/mach-davinci/da850.c +++ b/arch/arm/mach-davinci/da850.c @@ -11,6 +11,7 @@   * is licensed "as is" without any warranty of any kind, whether express   * or implied.   */ +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/clk.h>  #include <linux/platform_device.h> @@ -27,7 +28,7 @@  #include <mach/da8xx.h>  #include <mach/cpufreq.h>  #include <mach/pm.h> -#include <mach/gpio.h> +#include <mach/gpio-davinci.h>  #include "clock.h"  #include "mux.h" diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c index a3a94e9c937..c143f43addc 100644 --- a/arch/arm/mach-davinci/dm355.c +++ b/arch/arm/mach-davinci/dm355.c @@ -13,7 +13,6 @@  #include <linux/serial_8250.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h> -#include <linux/gpio.h>  #include <linux/spi/spi.h> @@ -30,6 +29,7 @@  #include <mach/common.h>  #include <mach/asp.h>  #include <mach/spi.h> +#include <mach/gpio-davinci.h>  #include "clock.h"  #include "mux.h" diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c index 4604e72d7d9..679e168dce3 100644 --- a/arch/arm/mach-davinci/dm365.c +++ b/arch/arm/mach-davinci/dm365.c @@ -17,7 +17,6 @@  #include <linux/serial_8250.h>  #include <linux/platform_device.h>  #include <linux/dma-mapping.h> -#include <linux/gpio.h>  #include <linux/spi/spi.h>  #include <asm/mach/map.h> @@ -34,7 +33,7 @@  #include <mach/asp.h>  #include <mach/keyscan.h>  #include <mach/spi.h> - +#include <mach/gpio-davinci.h>  #include "clock.h"  #include "mux.h" diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c index 4c82c271629..9a274665edc 100644 --- a/arch/arm/mach-davinci/dm644x.c +++ b/arch/arm/mach-davinci/dm644x.c @@ -12,7 +12,6 @@  #include <linux/clk.h>  #include <linux/serial_8250.h>  #include <linux/platform_device.h> -#include <linux/gpio.h>  #include <asm/mach/map.h> @@ -26,6 +25,7 @@  #include <mach/serial.h>  #include <mach/common.h>  #include <mach/asp.h> +#include <mach/gpio-davinci.h>  #include "clock.h"  #include "mux.h" diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c index 1802e711a2b..03e5f4931b4 100644 --- a/arch/arm/mach-davinci/dm646x.c +++ b/arch/arm/mach-davinci/dm646x.c @@ -13,7 +13,6 @@  #include <linux/clk.h>  #include <linux/serial_8250.h>  #include <linux/platform_device.h> -#include <linux/gpio.h>  #include <asm/mach/map.h> @@ -27,6 +26,7 @@  #include <mach/serial.h>  #include <mach/common.h>  #include <mach/asp.h> +#include <mach/gpio-davinci.h>  #include "clock.h"  #include "mux.h" diff --git a/arch/arm/mach-davinci/include/mach/gpio-davinci.h b/arch/arm/mach-davinci/include/mach/gpio-davinci.h new file mode 100644 index 00000000000..1fdd1fd3544 --- /dev/null +++ b/arch/arm/mach-davinci/include/mach/gpio-davinci.h @@ -0,0 +1,91 @@ +/* + * TI DaVinci GPIO Support + * + * Copyright (c) 2006 David Brownell + * Copyright (c) 2007, MontaVista Software, Inc. <source@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	__DAVINCI_DAVINCI_GPIO_H +#define	__DAVINCI_DAVINCI_GPIO_H + +#include <linux/io.h> +#include <linux/spinlock.h> + +#include <asm-generic/gpio.h> + +#include <mach/irqs.h> +#include <mach/common.h> + +#define DAVINCI_GPIO_BASE 0x01C67000 + +enum davinci_gpio_type { +	GPIO_TYPE_DAVINCI = 0, +	GPIO_TYPE_TNETV107X, +}; + +/* + * basic gpio routines + * + * board-specific init should be done by arch/.../.../board-XXX.c (maybe + * initializing banks together) rather than boot loaders; kexec() won't + * go through boot loaders. + * + * the gpio clock will be turned on when gpios are used, and you may also + * need to pay attention to PINMUX registers to be sure those pins are + * used as gpios, not with other peripherals. + * + * On-chip GPIOs are numbered 0..(DAVINCI_N_GPIO-1).  For documentation, + * and maybe for later updates, code may write GPIO(N).  These may be + * all 1.8V signals, all 3.3V ones, or a mix of the two.  A given chip + * may not support all the GPIOs in that range. + * + * GPIOs can also be on external chips, numbered after the ones built-in + * to the DaVinci chip.  For now, they won't be usable as IRQ sources. + */ +#define	GPIO(X)		(X)		/* 0 <= X <= (DAVINCI_N_GPIO - 1) */ + +/* Convert GPIO signal to GPIO pin number */ +#define GPIO_TO_PIN(bank, gpio)	(16 * (bank) + (gpio)) + +struct davinci_gpio_controller { +	struct gpio_chip	chip; +	int			irq_base; +	spinlock_t		lock; +	void __iomem		*regs; +	void __iomem		*set_data; +	void __iomem		*clr_data; +	void __iomem		*in_data; +}; + +/* The __gpio_to_controller() and __gpio_mask() functions inline to constants + * with constant parameters; or in outlined code they execute at runtime. + * + * You'd access the controller directly when reading or writing more than + * one gpio value at a time, and to support wired logic where the value + * being driven by the cpu need not match the value read back. + * + * These are NOT part of the cross-platform GPIO interface + */ +static inline struct davinci_gpio_controller * +__gpio_to_controller(unsigned gpio) +{ +	struct davinci_gpio_controller *ctlrs = davinci_soc_info.gpio_ctlrs; +	int index = gpio / 32; + +	if (!ctlrs || index >= davinci_soc_info.gpio_ctlrs_num) +		return NULL; + +	return ctlrs + index; +} + +static inline u32 __gpio_mask(unsigned gpio) +{ +	return 1 << (gpio % 32); +} + +#endif	/* __DAVINCI_DAVINCI_GPIO_H */ diff --git a/arch/arm/mach-davinci/include/mach/gpio.h b/arch/arm/mach-davinci/include/mach/gpio.h index fbece126c2b..fbaae4772b9 100644 --- a/arch/arm/mach-davinci/include/mach/gpio.h +++ b/arch/arm/mach-davinci/include/mach/gpio.h @@ -13,80 +13,10 @@  #ifndef	__DAVINCI_GPIO_H  #define	__DAVINCI_GPIO_H -#include <linux/io.h> -#include <linux/spinlock.h> -  #include <asm-generic/gpio.h> -#include <mach/irqs.h> -#include <mach/common.h> - -#define DAVINCI_GPIO_BASE 0x01C67000 - -enum davinci_gpio_type { -	GPIO_TYPE_DAVINCI = 0, -	GPIO_TYPE_TNETV107X, -}; - -/* - * basic gpio routines - * - * board-specific init should be done by arch/.../.../board-XXX.c (maybe - * initializing banks together) rather than boot loaders; kexec() won't - * go through boot loaders. - * - * the gpio clock will be turned on when gpios are used, and you may also - * need to pay attention to PINMUX registers to be sure those pins are - * used as gpios, not with other peripherals. - * - * On-chip GPIOs are numbered 0..(DAVINCI_N_GPIO-1).  For documentation, - * and maybe for later updates, code may write GPIO(N).  These may be - * all 1.8V signals, all 3.3V ones, or a mix of the two.  A given chip - * may not support all the GPIOs in that range. - * - * GPIOs can also be on external chips, numbered after the ones built-in - * to the DaVinci chip.  For now, they won't be usable as IRQ sources. - */ -#define	GPIO(X)		(X)		/* 0 <= X <= (DAVINCI_N_GPIO - 1) */ - -/* Convert GPIO signal to GPIO pin number */ -#define GPIO_TO_PIN(bank, gpio)	(16 * (bank) + (gpio)) - -struct davinci_gpio_controller { -	struct gpio_chip	chip; -	int			irq_base; -	spinlock_t		lock; -	void __iomem		*regs; -	void __iomem		*set_data; -	void __iomem		*clr_data; -	void __iomem		*in_data; -}; - -/* The __gpio_to_controller() and __gpio_mask() functions inline to constants - * with constant parameters; or in outlined code they execute at runtime. - * - * You'd access the controller directly when reading or writing more than - * one gpio value at a time, and to support wired logic where the value - * being driven by the cpu need not match the value read back. - * - * These are NOT part of the cross-platform GPIO interface - */ -static inline struct davinci_gpio_controller * -__gpio_to_controller(unsigned gpio) -{ -	struct davinci_gpio_controller *ctlrs = davinci_soc_info.gpio_ctlrs; -	int index = gpio / 32; - -	if (!ctlrs || index >= davinci_soc_info.gpio_ctlrs_num) -		return NULL; - -	return ctlrs + index; -} - -static inline u32 __gpio_mask(unsigned gpio) -{ -	return 1 << (gpio % 32); -} +/* The inline versions use the static inlines in the driver header */ +#include "gpio-davinci.h"  /*   * The get/set/clear functions will inline when called with constant @@ -147,11 +77,6 @@ static inline int gpio_cansleep(unsigned gpio)  		return __gpio_cansleep(gpio);  } -static inline int gpio_to_irq(unsigned gpio) -{ -	return __gpio_to_irq(gpio); -} -  static inline int irq_to_gpio(unsigned irq)  {  	/* don't support the reverse mapping */ diff --git a/arch/arm/mach-davinci/tnetv107x.c b/arch/arm/mach-davinci/tnetv107x.c index 1b28fdd892a..409bb869c7c 100644 --- a/arch/arm/mach-davinci/tnetv107x.c +++ b/arch/arm/mach-davinci/tnetv107x.c @@ -12,6 +12,7 @@   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * GNU General Public License for more details.   */ +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/clk.h> @@ -27,9 +28,9 @@  #include <mach/psc.h>  #include <mach/cp_intc.h>  #include <mach/irqs.h> -#include <mach/gpio.h>  #include <mach/hardware.h>  #include <mach/tnetv107x.h> +#include <mach/gpio-davinci.h>  #include "clock.h"  #include "mux.h" diff --git a/arch/arm/mach-ebsa110/include/mach/io.h b/arch/arm/mach-ebsa110/include/mach/io.h index f68daa632af..44679db672f 100644 --- a/arch/arm/mach-ebsa110/include/mach/io.h +++ b/arch/arm/mach-ebsa110/include/mach/io.h @@ -13,8 +13,6 @@  #ifndef __ASM_ARM_ARCH_IO_H  #define __ASM_ARM_ARCH_IO_H -#define IO_SPACE_LIMIT 0xffff -  u8 __inb8(unsigned int port);  void __outb8(u8  val, unsigned int port); diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index c60f081e930..94c78bc6627 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -38,6 +38,7 @@  #include <mach/fb.h>  #include <mach/ep93xx_keypad.h>  #include <mach/ep93xx_spi.h> +#include <mach/gpio-ep93xx.h>  #include <asm/mach/map.h>  #include <asm/mach/time.h> diff --git a/arch/arm/mach-ep93xx/edb93xx.c b/arch/arm/mach-ep93xx/edb93xx.c index 257175edc57..c63a5ec1a8e 100644 --- a/arch/arm/mach-ep93xx/edb93xx.c +++ b/arch/arm/mach-ep93xx/edb93xx.c @@ -37,6 +37,7 @@  #include <mach/hardware.h>  #include <mach/fb.h>  #include <mach/ep93xx_spi.h> +#include <mach/gpio-ep93xx.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-ep93xx/include/mach/gpio.h b/arch/arm/mach-ep93xx/include/mach/gpio-ep93xx.h index c57152c231f..8aff2ea3587 100644 --- a/arch/arm/mach-ep93xx/include/mach/gpio.h +++ b/arch/arm/mach-ep93xx/include/mach/gpio-ep93xx.h @@ -1,9 +1,7 @@ -/* - * arch/arm/mach-ep93xx/include/mach/gpio.h - */ +/* Include file for the EP93XX GPIO controller machine specifics */ -#ifndef __ASM_ARCH_GPIO_H -#define __ASM_ARCH_GPIO_H +#ifndef __GPIO_EP93XX_H +#define __GPIO_EP93XX_H  /* GPIO port A.  */  #define EP93XX_GPIO_LINE_A(x)		((x) + 0) @@ -99,22 +97,4 @@  /* maximum value for irq capable line identifiers */  #define EP93XX_GPIO_LINE_MAX_IRQ	EP93XX_GPIO_LINE_F(7) -/* new generic GPIO API - see Documentation/gpio.txt */ - -#include <asm-generic/gpio.h> - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep - -/* - * Map GPIO A0..A7  (0..7)  to irq 64..71, - *          B0..B7  (7..15) to irq 72..79, and - *          F0..F7 (16..24) to irq 80..87. - */ -#define gpio_to_irq(gpio)	\ -	(((gpio) <= EP93XX_GPIO_LINE_MAX_IRQ) ? (64 + (gpio)) : -EINVAL) - -#define irq_to_gpio(irq)	((irq) - gpio_to_irq(0)) - -#endif +#endif /* __GPIO_EP93XX_H */ diff --git a/arch/arm/mach-ep93xx/simone.c b/arch/arm/mach-ep93xx/simone.c index 238bc603da8..d6f286b4db9 100644 --- a/arch/arm/mach-ep93xx/simone.c +++ b/arch/arm/mach-ep93xx/simone.c @@ -18,12 +18,12 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> -#include <linux/gpio.h>  #include <linux/i2c.h>  #include <linux/i2c-gpio.h>  #include <mach/hardware.h>  #include <mach/fb.h> +#include <mach/gpio-ep93xx.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c index 3bdf3a2e5ad..2b4d4b0201d 100644 --- a/arch/arm/mach-ep93xx/snappercl15.c +++ b/arch/arm/mach-ep93xx/snappercl15.c @@ -20,7 +20,6 @@  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/io.h> -#include <linux/gpio.h>  #include <linux/i2c.h>  #include <linux/i2c-gpio.h>  #include <linux/fb.h> @@ -30,6 +29,7 @@  #include <mach/hardware.h>  #include <mach/fb.h> +#include <mach/gpio-ep93xx.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-exynos4/include/mach/gpio.h b/arch/arm/mach-exynos4/include/mach/gpio.h index be9266b10fd..80523ca9bb4 100644 --- a/arch/arm/mach-exynos4/include/mach/gpio.h +++ b/arch/arm/mach-exynos4/include/mach/gpio.h @@ -13,11 +13,6 @@  #ifndef __ASM_ARCH_GPIO_H  #define __ASM_ARCH_GPIO_H __FILE__ -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq -  /* Practically, GPIO banks up to GPZ are the configurable gpio banks */  /* GPIO bank sizes */ @@ -151,6 +146,4 @@ enum s5p_gpio_number {  #define ARCH_NR_GPIOS		(EXYNOS4_GPZ(EXYNOS4_GPIO_Z_NR) +	\  				 CONFIG_SAMSUNG_GPIO_EXTRA + 1) -#include <asm-generic/gpio.h> -  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-footbridge/include/mach/io.h b/arch/arm/mach-footbridge/include/mach/io.h index 32e4cc397c2..15a70396c27 100644 --- a/arch/arm/mach-footbridge/include/mach/io.h +++ b/arch/arm/mach-footbridge/include/mach/io.h @@ -23,8 +23,6 @@  #define PCIO_SIZE       0x00100000  #define PCIO_BASE       MMU_IO(0xff000000, 0x7c000000) -#define IO_SPACE_LIMIT 0xffff -  /*   * Translation of various region addresses to virtual addresses   */ diff --git a/arch/arm/mach-gemini/include/mach/gpio.h b/arch/arm/mach-gemini/include/mach/gpio.h index 3bc2c70f298..40a0527bada 100644 --- a/arch/arm/mach-gemini/include/mach/gpio.h +++ b/arch/arm/mach-gemini/include/mach/gpio.h @@ -13,11 +13,6 @@  #define __MACH_GPIO_H__  #include <mach/irqs.h> -#include <asm-generic/gpio.h> - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep  #define gpio_to_irq(x)	((x) + GPIO_IRQ_BASE)  #define irq_to_gpio(x)	((x) - GPIO_IRQ_BASE) diff --git a/arch/arm/mach-highbank/Makefile b/arch/arm/mach-highbank/Makefile new file mode 100644 index 00000000000..986958a5a72 --- /dev/null +++ b/arch/arm/mach-highbank/Makefile @@ -0,0 +1,6 @@ +obj-y					:= clock.o highbank.o system.o +obj-$(CONFIG_DEBUG_HIGHBANK_UART)	+= lluart.o +obj-$(CONFIG_SMP)			+= platsmp.o +obj-$(CONFIG_LOCAL_TIMERS)		+= localtimer.o +obj-$(CONFIG_HOTPLUG_CPU)		+= hotplug.o +obj-$(CONFIG_PM_SLEEP)			+= pm.o diff --git a/arch/arm/mach-highbank/Makefile.boot b/arch/arm/mach-highbank/Makefile.boot new file mode 100644 index 00000000000..dae9661a768 --- /dev/null +++ b/arch/arm/mach-highbank/Makefile.boot @@ -0,0 +1 @@ +zreladdr-y	:= 0x00008000 diff --git a/arch/arm/mach-highbank/clock.c b/arch/arm/mach-highbank/clock.c new file mode 100644 index 00000000000..c25a2ae4fde --- /dev/null +++ b/arch/arm/mach-highbank/clock.c @@ -0,0 +1,62 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/clk.h> +#include <linux/clkdev.h> + +struct clk { +	unsigned long rate; +}; + +int clk_enable(struct clk *clk) +{ +	return 0; +} + +void clk_disable(struct clk *clk) +{} + +unsigned long clk_get_rate(struct clk *clk) +{ +	return clk->rate; +} + +long clk_round_rate(struct clk *clk, unsigned long rate) +{ +	return clk->rate; +} + +int clk_set_rate(struct clk *clk, unsigned long rate) +{ +	return 0; +} + +static struct clk eclk = { .rate = 200000000 }; +static struct clk pclk = { .rate = 150000000 }; + +static struct clk_lookup lookups[] = { +	{ .clk = &pclk, .con_id = "apb_pclk", }, +	{ .clk = &pclk, .dev_id = "sp804", }, +	{ .clk = &eclk, .dev_id = "ffe0e000.sdhci", }, +	{ .clk = &pclk, .dev_id = "fff36000.serial", }, +}; + +void __init highbank_clocks_init(void) +{ +	clkdev_add_table(lookups, ARRAY_SIZE(lookups)); +} diff --git a/arch/arm/mach-highbank/core.h b/arch/arm/mach-highbank/core.h new file mode 100644 index 00000000000..7e33fc94cd1 --- /dev/null +++ b/arch/arm/mach-highbank/core.h @@ -0,0 +1,9 @@ +extern void highbank_set_cpu_jump(int cpu, void *jump_addr); +extern void highbank_clocks_init(void); +extern void __iomem *scu_base_addr; +#ifdef CONFIG_DEBUG_HIGHBANK_UART +extern void highbank_lluart_map_io(void); +#else +static inline void highbank_lluart_map_io(void) {} +#endif + diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c new file mode 100644 index 00000000000..b82dcf08e74 --- /dev/null +++ b/arch/arm/mach-highbank/highbank.c @@ -0,0 +1,145 @@ +/* + * Copyright 2010-2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/clk.h> +#include <linux/clkdev.h> +#include <linux/io.h> +#include <linux/irq.h> +#include <linux/irqdomain.h> +#include <linux/of.h> +#include <linux/of_irq.h> +#include <linux/of_platform.h> +#include <linux/of_address.h> + +#include <asm/cacheflush.h> +#include <asm/unified.h> +#include <asm/smp_scu.h> +#include <asm/hardware/arm_timer.h> +#include <asm/hardware/timer-sp.h> +#include <asm/hardware/gic.h> +#include <asm/hardware/cache-l2x0.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/time.h> +#include <mach/irqs.h> + +#include "core.h" +#include "sysregs.h" + +void __iomem *sregs_base; + +#define HB_SCU_VIRT_BASE	0xfee00000 +void __iomem *scu_base_addr = ((void __iomem *)(HB_SCU_VIRT_BASE)); + +static struct map_desc scu_io_desc __initdata = { +	.virtual	= HB_SCU_VIRT_BASE, +	.pfn		= 0, /* run-time */ +	.length		= SZ_4K, +	.type		= MT_DEVICE, +}; + +static void __init highbank_scu_map_io(void) +{ +	unsigned long base; + +	/* Get SCU base */ +	asm("mrc p15, 4, %0, c15, c0, 0" : "=r" (base)); + +	scu_io_desc.pfn = __phys_to_pfn(base); +	iotable_init(&scu_io_desc, 1); +} + +static void __init highbank_map_io(void) +{ +	highbank_scu_map_io(); +	highbank_lluart_map_io(); +} + +#define HB_JUMP_TABLE_PHYS(cpu)		(0x40 + (0x10 * (cpu))) +#define HB_JUMP_TABLE_VIRT(cpu)		phys_to_virt(HB_JUMP_TABLE_PHYS(cpu)) + +void highbank_set_cpu_jump(int cpu, void *jump_addr) +{ +	writel(BSYM(virt_to_phys(jump_addr)), HB_JUMP_TABLE_VIRT(cpu)); +	__cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16); +	outer_clean_range(HB_JUMP_TABLE_PHYS(cpu), +			  HB_JUMP_TABLE_PHYS(cpu) + 15); +} + +const static struct of_device_id irq_match[] = { +	{ .compatible = "arm,cortex-a9-gic", .data = gic_of_init, }, +	{} +}; + +static void __init highbank_init_irq(void) +{ +	of_irq_init(irq_match); +	l2x0_of_init(0, ~0UL); +} + +static void __init highbank_timer_init(void) +{ +	int irq; +	struct device_node *np; +	void __iomem *timer_base; + +	/* Map system registers */ +	np = of_find_compatible_node(NULL, NULL, "calxeda,hb-sregs"); +	sregs_base = of_iomap(np, 0); +	WARN_ON(!sregs_base); + +	np = of_find_compatible_node(NULL, NULL, "arm,sp804"); +	timer_base = of_iomap(np, 0); +	WARN_ON(!timer_base); +	irq = irq_of_parse_and_map(np, 0); + +	highbank_clocks_init(); + +	sp804_clocksource_init(timer_base + 0x20, "timer1"); +	sp804_clockevents_init(timer_base, irq, "timer0"); +} + +static struct sys_timer highbank_timer = { +	.init = highbank_timer_init, +}; + +static void highbank_power_off(void) +{ +	hignbank_set_pwr_shutdown(); +	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); + +	while (1) +		cpu_do_idle(); +} + +static void __init highbank_init(void) +{ +	pm_power_off = highbank_power_off; + +	of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char *highbank_match[] __initconst = { +	"calxeda,highbank", +	NULL, +}; + +DT_MACHINE_START(HIGHBANK, "Highbank") +	.map_io		= highbank_map_io, +	.init_irq	= highbank_init_irq, +	.timer		= &highbank_timer, +	.init_machine	= highbank_init, +	.dt_compat	= highbank_match, +MACHINE_END diff --git a/arch/arm/mach-highbank/hotplug.c b/arch/arm/mach-highbank/hotplug.c new file mode 100644 index 00000000000..977cebbea58 --- /dev/null +++ b/arch/arm/mach-highbank/hotplug.c @@ -0,0 +1,56 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/kernel.h> +#include <linux/errno.h> +#include <linux/smp.h> + +#include <asm/smp_scu.h> +#include <asm/cacheflush.h> + +#include "core.h" + +extern void secondary_startup(void); + +int platform_cpu_kill(unsigned int cpu) +{ +	return 1; +} + +/* + * platform-specific code to shutdown a CPU + * + */ +void platform_cpu_die(unsigned int cpu) +{ +	flush_cache_all(); + +	highbank_set_cpu_jump(cpu, secondary_startup); +	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); + +	cpu_do_idle(); + +	/* We should never return from idle */ +	panic("highbank: cpu %d unexpectedly exit from shutdown\n", cpu); +} + +int platform_cpu_disable(unsigned int cpu) +{ +	/* +	 * CPU0 should not be shut down via hotplug.  cpu_idle can WFI +	 * or a proper shutdown or hibernate should be used. +	 */ +	return cpu == 0 ? -EPERM : 0; +} diff --git a/arch/arm/mach-highbank/include/mach/debug-macro.S b/arch/arm/mach-highbank/include/mach/debug-macro.S new file mode 100644 index 00000000000..cb57fe5bcd0 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/debug-macro.S @@ -0,0 +1,19 @@ +/* + * Debugging macro include header + * + *  Copyright (C) 1994-1999 Russell King + *  Moved from linux/arch/arm/kernel/debug.S by Ben Dooks + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +		.macro	addruart,rp,rv,tmp +		movw	\rv, #0x6000 +		movt	\rv, #0xfee3 +		movw	\rp, #0x6000 +		movt	\rp, #0xfff3 +		.endm + +#include <asm/hardware/debug-pl01x.S> diff --git a/arch/arm/mach-highbank/include/mach/entry-macro.S b/arch/arm/mach-highbank/include/mach/entry-macro.S new file mode 100644 index 00000000000..73c11297509 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/entry-macro.S @@ -0,0 +1,7 @@ +#include <asm/hardware/entry-macro-gic.S> + +	.macro	disable_fiq +	.endm + +	.macro	arch_ret_to_user, tmp1, tmp2 +	.endm diff --git a/arch/arm/mach-highbank/include/mach/gpio.h b/arch/arm/mach-highbank/include/mach/gpio.h new file mode 100644 index 00000000000..40a8c178f10 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/gpio.h @@ -0,0 +1 @@ +/* empty */ diff --git a/arch/arm/mach-highbank/include/mach/io.h b/arch/arm/mach-highbank/include/mach/io.h new file mode 100644 index 00000000000..70cfa3ba769 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/io.h @@ -0,0 +1,7 @@ +#ifndef __MACH_IO_H +#define __MACH_IO_H + +#define __io(a)		({ (void)(a); __typesafe_io(0); }) +#define __mem_pci(a)	(a) + +#endif diff --git a/arch/arm/mach-highbank/include/mach/irqs.h b/arch/arm/mach-highbank/include/mach/irqs.h new file mode 100644 index 00000000000..9746aab14e9 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/irqs.h @@ -0,0 +1,6 @@ +#ifndef __MACH_IRQS_H +#define __MACH_IRQS_H + +#define NR_IRQS			192 + +#endif diff --git a/arch/arm/mach-highbank/include/mach/memory.h b/arch/arm/mach-highbank/include/mach/memory.h new file mode 100644 index 00000000000..40a8c178f10 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/memory.h @@ -0,0 +1 @@ +/* empty */ diff --git a/arch/arm/mach-highbank/include/mach/system.h b/arch/arm/mach-highbank/include/mach/system.h new file mode 100644 index 00000000000..7e8192296ca --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/system.h @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef __MACH_SYSTEM_H +#define __MACH_SYSTEM_H + +static inline void arch_idle(void) +{ +	cpu_do_idle(); +} + +extern void arch_reset(char mode, const char *cmd); + +#endif diff --git a/arch/arm/mach-highbank/include/mach/timex.h b/arch/arm/mach-highbank/include/mach/timex.h new file mode 100644 index 00000000000..88dac7a55a9 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/timex.h @@ -0,0 +1,6 @@ +#ifndef __MACH_TIMEX_H +#define __MACH_TIMEX_H + +#define CLOCK_TICK_RATE		1000000 + +#endif diff --git a/arch/arm/mach-highbank/include/mach/uncompress.h b/arch/arm/mach-highbank/include/mach/uncompress.h new file mode 100644 index 00000000000..bbe20e69632 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/uncompress.h @@ -0,0 +1,9 @@ +#ifndef __MACH_UNCOMPRESS_H +#define __MACH_UNCOMPRESS_H + +#define putc(c) +#define flush() +#define arch_decomp_setup() +#define arch_decomp_wdog() + +#endif diff --git a/arch/arm/mach-highbank/include/mach/vmalloc.h b/arch/arm/mach-highbank/include/mach/vmalloc.h new file mode 100644 index 00000000000..1969e954277 --- /dev/null +++ b/arch/arm/mach-highbank/include/mach/vmalloc.h @@ -0,0 +1 @@ +#define VMALLOC_END		0xFEE00000UL diff --git a/arch/arm/mach-highbank/lluart.c b/arch/arm/mach-highbank/lluart.c new file mode 100644 index 00000000000..371575019f3 --- /dev/null +++ b/arch/arm/mach-highbank/lluart.c @@ -0,0 +1,34 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/init.h> +#include <asm/page.h> +#include <asm/sizes.h> +#include <asm/mach/map.h> + +#define HB_DEBUG_LL_PHYS_BASE	0xfff36000 +#define HB_DEBUG_LL_VIRT_BASE	0xfee36000 + +static struct map_desc lluart_io_desc __initdata = { +	.virtual	= HB_DEBUG_LL_VIRT_BASE, +	.pfn		= __phys_to_pfn(HB_DEBUG_LL_PHYS_BASE), +	.length		= SZ_4K, +	.type		= MT_DEVICE, +}; + +void __init highbank_lluart_map_io(void) +{ +	iotable_init(&lluart_io_desc, 1); +} diff --git a/arch/arm/mach-highbank/localtimer.c b/arch/arm/mach-highbank/localtimer.c new file mode 100644 index 00000000000..5a00e7945fd --- /dev/null +++ b/arch/arm/mach-highbank/localtimer.c @@ -0,0 +1,40 @@ +/* + * Copyright 2010-2011 Calxeda, Inc. + * Based on localtimer.c, Copyright (C) 2002 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/init.h> +#include <linux/clockchips.h> +#include <linux/of.h> +#include <linux/of_address.h> +#include <linux/of_irq.h> + +#include <asm/smp_twd.h> + +/* + * Setup the local clock events for a CPU. + */ +int __cpuinit local_timer_setup(struct clock_event_device *evt) +{ +	struct device_node *np; + +	np = of_find_compatible_node(NULL, NULL, "arm,smp-twd"); +	if (!twd_base) { +		twd_base = of_iomap(np, 0); +		WARN_ON(!twd_base); +	} +	evt->irq = irq_of_parse_and_map(np, 0); +	twd_timer_setup(evt); +	return 0; +} diff --git a/arch/arm/mach-highbank/platsmp.c b/arch/arm/mach-highbank/platsmp.c new file mode 100644 index 00000000000..d01364c72b4 --- /dev/null +++ b/arch/arm/mach-highbank/platsmp.c @@ -0,0 +1,78 @@ +/* + * Copyright 2010-2011 Calxeda, Inc. + * Based on platsmp.c, Copyright (C) 2002 ARM Ltd. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/init.h> +#include <linux/smp.h> +#include <linux/io.h> + +#include <asm/smp_scu.h> +#include <asm/hardware/gic.h> + +#include "core.h" + +extern void secondary_startup(void); + +void __cpuinit platform_secondary_init(unsigned int cpu) +{ +	gic_secondary_init(0); +} + +int __cpuinit boot_secondary(unsigned int cpu, struct task_struct *idle) +{ +	gic_raise_softirq(cpumask_of(cpu), 0); +	return 0; +} + +/* + * Initialise the CPU possible map early - this describes the CPUs + * which may be present or become present in the system. + */ +void __init smp_init_cpus(void) +{ +	unsigned int i, ncores; + +	ncores = scu_get_core_count(scu_base_addr); + +	/* sanity check */ +	if (ncores > NR_CPUS) { +		printk(KERN_WARNING +		       "highbank: no. of cores (%d) greater than configured " +		       "maximum of %d - clipping\n", +		       ncores, NR_CPUS); +		ncores = NR_CPUS; +	} + +	for (i = 0; i < ncores; i++) +		set_cpu_possible(i, true); + +	set_smp_cross_call(gic_raise_softirq); +} + +void __init platform_smp_prepare_cpus(unsigned int max_cpus) +{ +	int i; + +	scu_enable(scu_base_addr); + +	/* +	 * Write the address of secondary startup into the jump table +	 * The cores are in wfi and wait until they receive a soft interrupt +	 * and a non-zero value to jump to. Then the secondary CPU branches +	 * to this address. +	 */ +	for (i = 1; i < max_cpus; i++) +		highbank_set_cpu_jump(i, secondary_startup); +} diff --git a/arch/arm/mach-highbank/pm.c b/arch/arm/mach-highbank/pm.c new file mode 100644 index 00000000000..33b3beb8998 --- /dev/null +++ b/arch/arm/mach-highbank/pm.c @@ -0,0 +1,55 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ + +#include <linux/init.h> +#include <linux/io.h> +#include <linux/suspend.h> + +#include <asm/proc-fns.h> +#include <asm/smp_scu.h> +#include <asm/suspend.h> + +#include "core.h" +#include "sysregs.h" + +static int highbank_suspend_finish(unsigned long val) +{ +	cpu_do_idle(); +	return 0; +} + +static int highbank_pm_enter(suspend_state_t state) +{ +	hignbank_set_pwr_suspend(); +	highbank_set_cpu_jump(0, cpu_resume); + +	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); +	cpu_suspend(0, highbank_suspend_finish); + +	return 0; +} + +static const struct platform_suspend_ops highbank_pm_ops = { +	.enter = highbank_pm_enter, +	.valid = suspend_valid_only_mem, +}; + +static int __init highbank_pm_init(void) +{ +	suspend_set_ops(&highbank_pm_ops); +	return 0; +} +module_init(highbank_pm_init); diff --git a/arch/arm/mach-highbank/sysregs.h b/arch/arm/mach-highbank/sysregs.h new file mode 100644 index 00000000000..0e913389f44 --- /dev/null +++ b/arch/arm/mach-highbank/sysregs.h @@ -0,0 +1,52 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef _MACH_HIGHBANK__SYSREGS_H_ +#define _MACH_HIGHBANK__SYSREGS_H_ + +#include <linux/io.h> + +extern void __iomem *sregs_base; + +#define HB_SREG_A9_PWR_REQ		0xf00 +#define HB_SREG_A9_BOOT_STAT		0xf04 +#define HB_SREG_A9_BOOT_DATA		0xf08 + +#define HB_PWR_SUSPEND			0 +#define HB_PWR_SOFT_RESET		1 +#define HB_PWR_HARD_RESET		2 +#define HB_PWR_SHUTDOWN			3 + +static inline void hignbank_set_pwr_suspend(void) +{ +	writel(HB_PWR_SUSPEND, sregs_base + HB_SREG_A9_PWR_REQ); +} + +static inline void hignbank_set_pwr_shutdown(void) +{ +	writel(HB_PWR_SHUTDOWN, sregs_base + HB_SREG_A9_PWR_REQ); +} + +static inline void hignbank_set_pwr_soft_reset(void) +{ +	writel(HB_PWR_SOFT_RESET, sregs_base + HB_SREG_A9_PWR_REQ); +} + +static inline void hignbank_set_pwr_hard_reset(void) +{ +	writel(HB_PWR_HARD_RESET, sregs_base + HB_SREG_A9_PWR_REQ); +} + +#endif diff --git a/arch/arm/mach-highbank/system.c b/arch/arm/mach-highbank/system.c new file mode 100644 index 00000000000..53f0c4c5ef1 --- /dev/null +++ b/arch/arm/mach-highbank/system.c @@ -0,0 +1,33 @@ +/* + * Copyright 2011 Calxeda, Inc. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program.  If not, see <http://www.gnu.org/licenses/>. + */ +#include <linux/io.h> +#include <asm/smp_scu.h> +#include <asm/proc-fns.h> + +#include "core.h" +#include "sysregs.h" + +void arch_reset(char mode, const char *cmd) +{ +	if (mode == 'h') +		hignbank_set_pwr_hard_reset(); +	else +		hignbank_set_pwr_soft_reset(); + +	scu_power_mode(scu_base_addr, SCU_PM_POWEROFF); +	cpu_do_idle(); +} + diff --git a/arch/arm/mach-imx/iomux-imx31.c b/arch/arm/mach-imx/iomux-imx31.c index cf8f8099ebd..82bd4403b45 100644 --- a/arch/arm/mach-imx/iomux-imx31.c +++ b/arch/arm/mach-imx/iomux-imx31.c @@ -17,13 +17,12 @@   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,   * MA 02110-1301, USA.   */ - +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/spinlock.h>  #include <linux/io.h>  #include <linux/kernel.h>  #include <mach/hardware.h> -#include <mach/gpio.h>  #include <mach/iomux-mx3.h>  /* diff --git a/arch/arm/mach-imx/mach-mx27ads.c b/arch/arm/mach-imx/mach-mx27ads.c index e75f3914784..74dd5731eb6 100644 --- a/arch/arm/mach-imx/mach-mx27ads.c +++ b/arch/arm/mach-imx/mach-mx27ads.c @@ -13,7 +13,7 @@   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * GNU General Public License for more details.   */ - +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/mtd/mtd.h>  #include <linux/mtd/map.h> @@ -27,7 +27,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/time.h>  #include <asm/mach/map.h> -#include <mach/gpio.h>  #include <mach/iomux-mx27.h>  #include "devices-imx27.h" diff --git a/arch/arm/mach-integrator/include/mach/io.h b/arch/arm/mach-integrator/include/mach/io.h index f21bb5493dd..37beed3fa3e 100644 --- a/arch/arm/mach-integrator/include/mach/io.h +++ b/arch/arm/mach-integrator/include/mach/io.h @@ -20,8 +20,6 @@  #ifndef __ASM_ARM_ARCH_IO_H  #define __ASM_ARM_ARCH_IO_H -#define IO_SPACE_LIMIT 0xffff -  /*   * WARNING: this has to mirror definitions in platform.h   */ diff --git a/arch/arm/mach-ixp2000/core.c b/arch/arm/mach-ixp2000/core.c index 4068166c899..59a512672bb 100644 --- a/arch/arm/mach-ixp2000/core.c +++ b/arch/arm/mach-ixp2000/core.c @@ -13,7 +13,7 @@   * License version 2. This program is licensed "as is" without any    * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/spinlock.h> @@ -39,7 +39,7 @@  #include <asm/mach/time.h>  #include <asm/mach/irq.h> -#include <mach/gpio.h> +#include <mach/gpio-ixp2000.h>  static DEFINE_SPINLOCK(ixp2000_slowport_lock);  static unsigned long ixp2000_slowport_irq_flags; diff --git a/arch/arm/mach-ixp2000/include/mach/gpio.h b/arch/arm/mach-ixp2000/include/mach/gpio-ixp2000.h index 4a88d2c33da..af836c76c3f 100644 --- a/arch/arm/mach-ixp2000/include/mach/gpio.h +++ b/arch/arm/mach-ixp2000/include/mach/gpio-ixp2000.h @@ -3,7 +3,7 @@   *   * Copyright (C) 2002 Intel Corporation.   * - * This program is free software, you can redistribute it and/or modify  + * This program is free software, you can redistribute it and/or modify   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ @@ -11,7 +11,7 @@  /*   * IXP2000 GPIO in/out, edge/level detection for IRQs:   * IRQs are generated on Falling-edge, Rising-Edge, Level-low, Level-High - * or both Falling-edge and Rising-edge.   + * or both Falling-edge and Rising-edge.   * This must be called *before* the corresponding IRQ is registerd.   * Use this instead of directly setting the GPIO registers.   * GPIOs may also be used as GPIOs (e.g. for emulating i2c/smb) diff --git a/arch/arm/mach-ixp2000/ixdp2x00.c b/arch/arm/mach-ixp2000/ixdp2x00.c index 235638f800e..634b6c852f6 100644 --- a/arch/arm/mach-ixp2000/ixdp2x00.c +++ b/arch/arm/mach-ixp2000/ixdp2x00.c @@ -14,6 +14,7 @@   *  Free Software Foundation;  either version 2 of the  License, or (at your   *  option) any later version.   */ +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/mm.h> @@ -40,8 +41,7 @@  #include <asm/mach/flash.h>  #include <asm/mach/arch.h> -#include <mach/gpio.h> - +#include <mach/gpio-ixp2000.h>  /*************************************************************************   * IXDP2x00 IRQ Initialization diff --git a/arch/arm/mach-ixp4xx/dsmg600-setup.c b/arch/arm/mach-ixp4xx/dsmg600-setup.c index 71607a7ecc7..8837fbca27c 100644 --- a/arch/arm/mach-ixp4xx/dsmg600-setup.c +++ b/arch/arm/mach-ixp4xx/dsmg600-setup.c @@ -16,7 +16,7 @@   * Author: Rod Whitby <rod@whitby.id.au>   * Maintainers: http://www.nslu2-linux.org/   */ - +#include <linux/gpio.h>  #include <linux/irq.h>  #include <linux/jiffies.h>  #include <linux/timer.h> @@ -31,7 +31,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/time.h> -#include <asm/gpio.h>  #define DSMG600_SDA_PIN		5  #define DSMG600_SCL_PIN		4 diff --git a/arch/arm/mach-ixp4xx/fsg-setup.c b/arch/arm/mach-ixp4xx/fsg-setup.c index a9540cd9037..2887c3578c1 100644 --- a/arch/arm/mach-ixp4xx/fsg-setup.c +++ b/arch/arm/mach-ixp4xx/fsg-setup.c @@ -14,7 +14,7 @@   * Maintainers: http://www.nslu2-linux.org/   *   */ - +#include <linux/gpio.h>  #include <linux/if_ether.h>  #include <linux/irq.h>  #include <linux/serial.h> @@ -27,7 +27,6 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/flash.h> -#include <asm/gpio.h>  #define FSG_SDA_PIN		12  #define FSG_SCL_PIN		13 diff --git a/arch/arm/mach-ixp4xx/include/mach/gpio.h b/arch/arm/mach-ixp4xx/include/mach/gpio.h index a5f87ded2f2..83d6b4ed60b 100644 --- a/arch/arm/mach-ixp4xx/include/mach/gpio.h +++ b/arch/arm/mach-ixp4xx/include/mach/gpio.h @@ -28,6 +28,8 @@  #include <linux/kernel.h>  #include <mach/hardware.h> +#define __ARM_GPIOLIB_COMPLEX +  static inline int gpio_request(unsigned gpio, const char *label)  {  	return 0; @@ -70,6 +72,7 @@ static inline void gpio_set_value(unsigned gpio, int value)  #include <asm-generic/gpio.h>			/* cansleep wrappers */  extern int gpio_to_irq(int gpio); +#define gpio_to_irq gpio_to_irq  extern int irq_to_gpio(unsigned int irq);  #endif diff --git a/arch/arm/mach-ixp4xx/include/mach/io.h b/arch/arm/mach-ixp4xx/include/mach/io.h index 57b5410c31f..ffb9d6afb89 100644 --- a/arch/arm/mach-ixp4xx/include/mach/io.h +++ b/arch/arm/mach-ixp4xx/include/mach/io.h @@ -17,8 +17,6 @@  #include <mach/hardware.h> -#define IO_SPACE_LIMIT 0x0000ffff -  extern int (*ixp4xx_pci_read)(u32 addr, u32 cmd, u32* data);  extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data); diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c index 9f4669260d4..de716fa1aab 100644 --- a/arch/arm/mach-ixp4xx/nas100d-setup.c +++ b/arch/arm/mach-ixp4xx/nas100d-setup.c @@ -17,7 +17,7 @@   * Maintainers: http://www.nslu2-linux.org/   *   */ - +#include <linux/gpio.h>  #include <linux/if_ether.h>  #include <linux/irq.h>  #include <linux/jiffies.h> @@ -32,7 +32,6 @@  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <asm/mach/flash.h> -#include <asm/gpio.h>  #define NAS100D_SDA_PIN		5  #define NAS100D_SCL_PIN		6 diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c index 3676fbf6ef9..ac81ccb26bf 100644 --- a/arch/arm/mach-ixp4xx/nslu2-setup.c +++ b/arch/arm/mach-ixp4xx/nslu2-setup.c @@ -16,7 +16,7 @@   * Maintainers: http://www.nslu2-linux.org/   *   */ - +#include <linux/gpio.h>  #include <linux/if_ether.h>  #include <linux/irq.h>  #include <linux/serial.h> @@ -30,7 +30,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/flash.h>  #include <asm/mach/time.h> -#include <asm/gpio.h>  #define NSLU2_SDA_PIN		7  #define NSLU2_SCL_PIN		6 diff --git a/arch/arm/mach-kirkwood/irq.c b/arch/arm/mach-kirkwood/irq.c index 05d193a25b2..c4c68e5b94f 100644 --- a/arch/arm/mach-kirkwood/irq.c +++ b/arch/arm/mach-kirkwood/irq.c @@ -7,14 +7,13 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/irq.h>  #include <linux/io.h>  #include <mach/bridge-regs.h>  #include <plat/irq.h> -#include <asm/gpio.h>  #include "common.h"  static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) diff --git a/arch/arm/mach-kirkwood/mpp.c b/arch/arm/mach-kirkwood/mpp.c index b0a7d979a8e..cc431fa22cc 100644 --- a/arch/arm/mach-kirkwood/mpp.c +++ b/arch/arm/mach-kirkwood/mpp.c @@ -7,12 +7,11 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/mbus.h>  #include <linux/io.h> -#include <asm/gpio.h>  #include <mach/hardware.h>  #include <plat/mpp.h>  #include "common.h" diff --git a/arch/arm/mach-ks8695/Makefile b/arch/arm/mach-ks8695/Makefile index 7e3e8160ed3..853efd9133c 100644 --- a/arch/arm/mach-ks8695/Makefile +++ b/arch/arm/mach-ks8695/Makefile @@ -3,7 +3,7 @@  # Makefile for KS8695 architecture support  # -obj-y				:= cpu.o irq.o time.o gpio.o devices.o +obj-y				:= cpu.o irq.o time.o devices.o  obj-m				:=  obj-n				:=  obj-				:= diff --git a/arch/arm/mach-ks8695/board-acs5k.c b/arch/arm/mach-ks8695/board-acs5k.c index a5fcc7c7fe1..a91f99d265a 100644 --- a/arch/arm/mach-ks8695/board-acs5k.c +++ b/arch/arm/mach-ks8695/board-acs5k.c @@ -10,7 +10,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/interrupt.h> @@ -34,7 +34,7 @@  #include <asm/mach/irq.h>  #include <mach/devices.h> -#include <mach/gpio.h> +#include <mach/gpio-ks8695.h>  #include "generic.h" diff --git a/arch/arm/mach-ks8695/board-dsm320.c b/arch/arm/mach-ks8695/board-dsm320.c index fb91a716a7d..d24bcef2e2d 100644 --- a/arch/arm/mach-ks8695/board-dsm320.c +++ b/arch/arm/mach-ks8695/board-dsm320.c @@ -10,7 +10,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/interrupt.h> @@ -29,7 +29,7 @@  #include <asm/mach/irq.h>  #include <mach/devices.h> -#include <mach/gpio.h> +#include <mach/gpio-ks8695.h>  #include "generic.h" diff --git a/arch/arm/mach-ks8695/board-micrel.c b/arch/arm/mach-ks8695/board-micrel.c index 8f67a750b6c..16c95657f8f 100644 --- a/arch/arm/mach-ks8695/board-micrel.c +++ b/arch/arm/mach-ks8695/board-micrel.c @@ -5,7 +5,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/interrupt.h> @@ -18,7 +18,7 @@  #include <asm/mach/map.h>  #include <asm/mach/irq.h> -#include <mach/gpio.h> +#include <mach/gpio-ks8695.h>  #include <mach/devices.h>  #include "generic.h" diff --git a/arch/arm/mach-ks8695/devices.c b/arch/arm/mach-ks8695/devices.c index b89fb6d46cc..73bd6381287 100644 --- a/arch/arm/mach-ks8695/devices.c +++ b/arch/arm/mach-ks8695/devices.c @@ -20,6 +20,7 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <mach/irqs.h> diff --git a/arch/arm/mach-ks8695/include/mach/gpio-ks8695.h b/arch/arm/mach-ks8695/include/mach/gpio-ks8695.h new file mode 100644 index 00000000000..6eb034d6032 --- /dev/null +++ b/arch/arm/mach-ks8695/include/mach/gpio-ks8695.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2006 Andrew Victor + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#ifndef __MACH_KS8659_GPIO_H +#define __MACH_KS8659_GPIO_H + +#include <linux/kernel.h> + +#define KS8695_GPIO_0		0 +#define KS8695_GPIO_1		1 +#define KS8695_GPIO_2		2 +#define KS8695_GPIO_3		3 +#define KS8695_GPIO_4		4 +#define KS8695_GPIO_5		5 +#define KS8695_GPIO_6		6 +#define KS8695_GPIO_7		7 +#define KS8695_GPIO_8		8 +#define KS8695_GPIO_9		9 +#define KS8695_GPIO_10		10 +#define KS8695_GPIO_11		11 +#define KS8695_GPIO_12		12 +#define KS8695_GPIO_13		13 +#define KS8695_GPIO_14		14 +#define KS8695_GPIO_15		15 + +/* + * Configure GPIO pin as external interrupt source. + */ +extern int ks8695_gpio_interrupt(unsigned int pin, unsigned int type); + +/* Register the GPIOs */ +extern void ks8695_register_gpios(void); + +#endif /* __MACH_KS8659_GPIO_H */ diff --git a/arch/arm/mach-ks8695/include/mach/gpio.h b/arch/arm/mach-ks8695/include/mach/gpio.h index 86312d476bc..f5fda36e451 100644 --- a/arch/arm/mach-ks8695/include/mach/gpio.h +++ b/arch/arm/mach-ks8695/include/mach/gpio.h @@ -11,47 +11,9 @@  #ifndef __ASM_ARCH_GPIO_H_  #define __ASM_ARCH_GPIO_H_ -#include <linux/kernel.h> - -#define KS8695_GPIO_0		0 -#define KS8695_GPIO_1		1 -#define KS8695_GPIO_2		2 -#define KS8695_GPIO_3		3 -#define KS8695_GPIO_4		4 -#define KS8695_GPIO_5		5 -#define KS8695_GPIO_6		6 -#define KS8695_GPIO_7		7 -#define KS8695_GPIO_8		8 -#define KS8695_GPIO_9		9 -#define KS8695_GPIO_10		10 -#define KS8695_GPIO_11		11 -#define KS8695_GPIO_12		12 -#define KS8695_GPIO_13		13 -#define KS8695_GPIO_14		14 -#define KS8695_GPIO_15		15 - -/* - * Configure GPIO pin as external interrupt source. - */ -extern int ks8695_gpio_interrupt(unsigned int pin, unsigned int type); -  /*   * Map IRQ number to GPIO line.   */  extern int irq_to_gpio(unsigned int irq); -#include <asm-generic/gpio.h> - -/* If it turns out that we need to optimise GPIO access for the - * Micrel's GPIOs, then these can be changed to check their argument - * directly as static inlines. However for now it's probably not - * worthwhile. - */ -#define gpio_get_value __gpio_get_value -#define gpio_set_value __gpio_set_value -#define gpio_to_irq __gpio_to_irq - -/* Register the GPIOs */ -extern void ks8695_register_gpios(void); -  #endif diff --git a/arch/arm/mach-ks8695/leds.c b/arch/arm/mach-ks8695/leds.c index 184ef74e4be..d6f6502ac9b 100644 --- a/arch/arm/mach-ks8695/leds.c +++ b/arch/arm/mach-ks8695/leds.c @@ -7,14 +7,14 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/init.h> +#include <linux/gpio.h>  #include <asm/leds.h>  #include <mach/devices.h> -#include <mach/gpio.h>  static inline void ks8695_led_on(unsigned int led) diff --git a/arch/arm/mach-lpc32xx/Makefile b/arch/arm/mach-lpc32xx/Makefile index a5fc5d0eeae..f5db805ab95 100644 --- a/arch/arm/mach-lpc32xx/Makefile +++ b/arch/arm/mach-lpc32xx/Makefile @@ -3,6 +3,6 @@  #  obj-y	:= timer.o irq.o common.o serial.o clock.o -obj-y	+= gpiolib.o pm.o suspend.o +obj-y	+= pm.o suspend.o  obj-y	+= phy3250.o diff --git a/arch/arm/mach-lpc32xx/include/mach/gpio-lpc32xx.h b/arch/arm/mach-lpc32xx/include/mach/gpio-lpc32xx.h new file mode 100644 index 00000000000..1816e22a347 --- /dev/null +++ b/arch/arm/mach-lpc32xx/include/mach/gpio-lpc32xx.h @@ -0,0 +1,50 @@ +/* + * Author: Kevin Wells <kevin.wells@nxp.com> + * + * Copyright (C) 2010 NXP Semiconductors + * + * 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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + */ + +#ifndef __MACH_GPIO_LPC32XX_H +#define __MACH_GPIO_LPC32XX_H + +/* + * Note! + * Muxed GP pins need to be setup to the GP state in the board level + * code prior to using this driver. + * GPI pins : 28xP3 group + * GPO pins : 24xP3 group + * GPIO pins: 8xP0 group, 24xP1 group, 13xP2 group, 6xP3 group + */ + +#define LPC32XX_GPIO_P0_MAX 8 +#define LPC32XX_GPIO_P1_MAX 24 +#define LPC32XX_GPIO_P2_MAX 13 +#define LPC32XX_GPIO_P3_MAX 6 +#define LPC32XX_GPI_P3_MAX 28 +#define LPC32XX_GPO_P3_MAX 24 + +#define LPC32XX_GPIO_P0_GRP 0 +#define LPC32XX_GPIO_P1_GRP (LPC32XX_GPIO_P0_GRP + LPC32XX_GPIO_P0_MAX) +#define LPC32XX_GPIO_P2_GRP (LPC32XX_GPIO_P1_GRP + LPC32XX_GPIO_P1_MAX) +#define LPC32XX_GPIO_P3_GRP (LPC32XX_GPIO_P2_GRP + LPC32XX_GPIO_P2_MAX) +#define LPC32XX_GPI_P3_GRP (LPC32XX_GPIO_P3_GRP + LPC32XX_GPIO_P3_MAX) +#define LPC32XX_GPO_P3_GRP (LPC32XX_GPI_P3_GRP + LPC32XX_GPI_P3_MAX) + +/* + * A specific GPIO can be selected with this macro + * ie, GPIO_05 can be selected with LPC32XX_GPIO(LPC32XX_GPIO_P3_GRP, 5) + * See the LPC32x0 User's guide for GPIO group numbers + */ +#define LPC32XX_GPIO(x, y) ((x) + (y)) + +#endif /* __MACH_GPIO_LPC32XX_H */ diff --git a/arch/arm/mach-lpc32xx/include/mach/gpio.h b/arch/arm/mach-lpc32xx/include/mach/gpio.h index 67d03da1eee..e69de29bb2d 100644 --- a/arch/arm/mach-lpc32xx/include/mach/gpio.h +++ b/arch/arm/mach-lpc32xx/include/mach/gpio.h @@ -1,74 +0,0 @@ -/* - * arch/arm/mach-lpc32xx/include/mach/gpio.h - * - * Author: Kevin Wells <kevin.wells@nxp.com> - * - * Copyright (C) 2010 NXP Semiconductors - * - * 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. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - */ - -#ifndef __ASM_ARCH_GPIO_H -#define __ASM_ARCH_GPIO_H - -#include <asm-generic/gpio.h> - -/* - * Note! - * Muxed GP pins need to be setup to the GP state in the board level - * code prior to using this driver. - * GPI pins : 28xP3 group - * GPO pins : 24xP3 group - * GPIO pins: 8xP0 group, 24xP1 group, 13xP2 group, 6xP3 group - */ - -#define LPC32XX_GPIO_P0_MAX 8 -#define LPC32XX_GPIO_P1_MAX 24 -#define LPC32XX_GPIO_P2_MAX 13 -#define LPC32XX_GPIO_P3_MAX 6 -#define LPC32XX_GPI_P3_MAX 28 -#define LPC32XX_GPO_P3_MAX 24 - -#define LPC32XX_GPIO_P0_GRP 0 -#define LPC32XX_GPIO_P1_GRP (LPC32XX_GPIO_P0_GRP + LPC32XX_GPIO_P0_MAX) -#define LPC32XX_GPIO_P2_GRP (LPC32XX_GPIO_P1_GRP + LPC32XX_GPIO_P1_MAX) -#define LPC32XX_GPIO_P3_GRP (LPC32XX_GPIO_P2_GRP + LPC32XX_GPIO_P2_MAX) -#define LPC32XX_GPI_P3_GRP (LPC32XX_GPIO_P3_GRP + LPC32XX_GPIO_P3_MAX) -#define LPC32XX_GPO_P3_GRP (LPC32XX_GPI_P3_GRP + LPC32XX_GPI_P3_MAX) - -/* - * A specific GPIO can be selected with this macro - * ie, GPIO_05 can be selected with LPC32XX_GPIO(LPC32XX_GPIO_P3_GRP, 5) - * See the LPC32x0 User's guide for GPIO group numbers - */ -#define LPC32XX_GPIO(x, y) ((x) + (y)) - -static inline int gpio_get_value(unsigned gpio) -{ -	return __gpio_get_value(gpio); -} - -static inline void gpio_set_value(unsigned gpio, int value) -{ -	__gpio_set_value(gpio, value); -} - -static inline int gpio_cansleep(unsigned gpio) -{ -	return __gpio_cansleep(gpio); -} - -static inline int gpio_to_irq(unsigned gpio) -{ -	return __gpio_to_irq(gpio); -} - -#endif diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index 9b621e14d16..6d2f0d1b937 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c @@ -37,6 +37,7 @@  #include <mach/hardware.h>  #include <mach/platform.h> +#include <mach/gpio-lpc32xx.h>  #include "common.h"  /* diff --git a/arch/arm/mach-mmp/aspenite.c b/arch/arm/mach-mmp/aspenite.c index 06b5fa853c9..833c3a2784a 100644 --- a/arch/arm/mach-mmp/aspenite.c +++ b/arch/arm/mach-mmp/aspenite.c @@ -8,7 +8,7 @@   *  it under the terms of the GNU General Public License version 2 as   *  publishhed by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/platform_device.h> @@ -17,13 +17,13 @@  #include <linux/mtd/partitions.h>  #include <linux/mtd/nand.h>  #include <linux/interrupt.h> +#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <mach/addr-map.h>  #include <mach/mfp-pxa168.h>  #include <mach/pxa168.h> -#include <mach/gpio.h>  #include <video/pxa168fb.h>  #include <linux/input.h>  #include <plat/pxa27x_keypad.h> diff --git a/arch/arm/mach-mmp/brownstone.c b/arch/arm/mach-mmp/brownstone.c index c79162a50f2..e411252e3d3 100644 --- a/arch/arm/mach-mmp/brownstone.c +++ b/arch/arm/mach-mmp/brownstone.c @@ -14,7 +14,6 @@  #include <linux/kernel.h>  #include <linux/platform_device.h>  #include <linux/io.h> -#include <linux/gpio.h>  #include <linux/regulator/machine.h>  #include <linux/regulator/max8649.h>  #include <linux/regulator/fixed.h> diff --git a/arch/arm/mach-mmp/gplugd.c b/arch/arm/mach-mmp/gplugd.c index 98e25d9aaab..32776f3739f 100644 --- a/arch/arm/mach-mmp/gplugd.c +++ b/arch/arm/mach-mmp/gplugd.c @@ -9,11 +9,11 @@   */  #include <linux/init.h> +#include <linux/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach-types.h> -#include <mach/gpio.h>  #include <mach/pxa168.h>  #include <mach/mfp-pxa168.h> diff --git a/arch/arm/mach-mmp/include/mach/gpio-pxa.h b/arch/arm/mach-mmp/include/mach/gpio-pxa.h new file mode 100644 index 00000000000..c017a983ece --- /dev/null +++ b/arch/arm/mach-mmp/include/mach/gpio-pxa.h @@ -0,0 +1,30 @@ +#ifndef __ASM_MACH_GPIO_PXA_H +#define __ASM_MACH_GPIO_PXA_H + +#include <mach/addr-map.h> +#include <mach/irqs.h> + +#define GPIO_REGS_VIRT	(APB_VIRT_BASE + 0x19000) + +#define BANK_OFF(n)	(((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2)) +#define GPIO_REG(x)	(*((volatile u32 *)(GPIO_REGS_VIRT + (x)))) + +#define NR_BUILTIN_GPIO		IRQ_GPIO_NUM + +#define gpio_to_bank(gpio)	((gpio) >> 5) + +/* NOTE: these macros are defined here to make optimization of + * gpio_{get,set}_value() to work when 'gpio' is a constant. + * Usage of these macros otherwise is no longer recommended, + * use generic GPIO API whenever possible. + */ +#define GPIO_bit(gpio)	(1 << ((gpio) & 0x1f)) + +#define GPLR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x00) +#define GPDR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x0c) +#define GPSR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x18) +#define GPCR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x24) + +#include <plat/gpio-pxa.h> + +#endif /* __ASM_MACH_GPIO_PXA_H */ diff --git a/arch/arm/mach-mmp/include/mach/gpio.h b/arch/arm/mach-mmp/include/mach/gpio.h index 7bfb827f3fe..681262359d1 100644 --- a/arch/arm/mach-mmp/include/mach/gpio.h +++ b/arch/arm/mach-mmp/include/mach/gpio.h @@ -1,36 +1,13 @@  #ifndef __ASM_MACH_GPIO_H  #define __ASM_MACH_GPIO_H -#include <mach/addr-map.h> -#include <mach/irqs.h>  #include <asm-generic/gpio.h> -#define GPIO_REGS_VIRT	(APB_VIRT_BASE + 0x19000) - -#define BANK_OFF(n)	(((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2)) -#define GPIO_REG(x)	(*((volatile u32 *)(GPIO_REGS_VIRT + (x)))) - -#define NR_BUILTIN_GPIO		IRQ_GPIO_NUM - -#define gpio_to_bank(gpio)	((gpio) >> 5)  #define gpio_to_irq(gpio)	(IRQ_GPIO_START + (gpio))  #define irq_to_gpio(irq)	((irq) - IRQ_GPIO_START) -  #define __gpio_is_inverted(gpio)	(0)  #define __gpio_is_occupied(gpio)	(0) -/* NOTE: these macros are defined here to make optimization of - * gpio_{get,set}_value() to work when 'gpio' is a constant. - * Usage of these macros otherwise is no longer recommended, - * use generic GPIO API whenever possible. - */ -#define GPIO_bit(gpio)	(1 << ((gpio) & 0x1f)) - -#define GPLR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x00) -#define GPDR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x0c) -#define GPSR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x18) -#define GPCR(x)		GPIO_REG(BANK_OFF(gpio_to_bank(x)) + 0x24) -  #include <plat/gpio.h>  #endif /* __ASM_MACH_GPIO_H */ diff --git a/arch/arm/mach-mmp/jasper.c b/arch/arm/mach-mmp/jasper.c index 5d6421d6325..8bfac661262 100644 --- a/arch/arm/mach-mmp/jasper.c +++ b/arch/arm/mach-mmp/jasper.c @@ -14,7 +14,6 @@  #include <linux/kernel.h>  #include <linux/platform_device.h>  #include <linux/io.h> -#include <linux/gpio.h>  #include <linux/regulator/machine.h>  #include <linux/regulator/max8649.h>  #include <linux/mfd/max8925.h> diff --git a/arch/arm/mach-mmp/mmp2.c b/arch/arm/mach-mmp/mmp2.c index 079c18861d5..65d8689e40c 100644 --- a/arch/arm/mach-mmp/mmp2.c +++ b/arch/arm/mach-mmp/mmp2.c @@ -9,7 +9,6 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -25,7 +24,7 @@  #include <mach/irqs.h>  #include <mach/dma.h>  #include <mach/mfp.h> -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  #include <mach/devices.h>  #include <mach/mmp2.h> diff --git a/arch/arm/mach-mmp/pxa168.c b/arch/arm/mach-mmp/pxa168.c index 0156f535dae..50c1763911f 100644 --- a/arch/arm/mach-mmp/pxa168.c +++ b/arch/arm/mach-mmp/pxa168.c @@ -7,7 +7,6 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -21,7 +20,7 @@  #include <mach/regs-apbc.h>  #include <mach/regs-apmu.h>  #include <mach/irqs.h> -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  #include <mach/dma.h>  #include <mach/devices.h>  #include <mach/mfp.h> diff --git a/arch/arm/mach-mmp/pxa910.c b/arch/arm/mach-mmp/pxa910.c index 1464607aa60..4ebbfbba39f 100644 --- a/arch/arm/mach-mmp/pxa910.c +++ b/arch/arm/mach-mmp/pxa910.c @@ -7,7 +7,6 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -20,7 +19,7 @@  #include <mach/regs-apmu.h>  #include <mach/cputype.h>  #include <mach/irqs.h> -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  #include <mach/dma.h>  #include <mach/mfp.h>  #include <mach/devices.h> diff --git a/arch/arm/mach-mmp/tavorevb.c b/arch/arm/mach-mmp/tavorevb.c index c296b75c445..eb5be879fd8 100644 --- a/arch/arm/mach-mmp/tavorevb.c +++ b/arch/arm/mach-mmp/tavorevb.c @@ -7,18 +7,18 @@   *  it under the terms of the GNU General Public License version 2 as   *  publishhed by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/platform_device.h>  #include <linux/smc91x.h> +#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h>  #include <mach/addr-map.h>  #include <mach/mfp-pxa910.h>  #include <mach/pxa910.h> -#include <mach/gpio.h>  #include "common.h" diff --git a/arch/arm/mach-msm/board-msm7x27.c b/arch/arm/mach-msm/board-msm7x27.c index a80765533f1..6d84ee740df 100644 --- a/arch/arm/mach-msm/board-msm7x27.c +++ b/arch/arm/mach-msm/board-msm7x27.c @@ -13,7 +13,7 @@   * GNU General Public License for more details.   *   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -34,7 +34,6 @@  #include <mach/vreg.h>  #include <mach/mpp.h> -#include <mach/gpio.h>  #include <mach/board.h>  #include <mach/msm_iomap.h> diff --git a/arch/arm/mach-msm/board-msm7x30.c b/arch/arm/mach-msm/board-msm7x30.c index bb72ea0383b..71de5062c71 100644 --- a/arch/arm/mach-msm/board-msm7x30.c +++ b/arch/arm/mach-msm/board-msm7x30.c @@ -14,7 +14,7 @@   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA   * 02110-1301, USA.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/irq.h>  #include <linux/gpio.h> @@ -31,7 +31,6 @@  #include <asm/memory.h>  #include <asm/setup.h> -#include <mach/gpio.h>  #include <mach/board.h>  #include <mach/msm_iomap.h>  #include <mach/dma.h> diff --git a/arch/arm/mach-msm/board-qsd8x50.c b/arch/arm/mach-msm/board-qsd8x50.c index 51109b1f434..7e8909c978c 100644 --- a/arch/arm/mach-msm/board-qsd8x50.c +++ b/arch/arm/mach-msm/board-qsd8x50.c @@ -14,7 +14,7 @@   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA   * 02110-1301, USA.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/irq.h>  #include <linux/gpio.h> @@ -32,7 +32,6 @@  #include <mach/board.h>  #include <mach/irqs.h>  #include <mach/sirc.h> -#include <mach/gpio.h>  #include <mach/vreg.h>  #include <mach/mmc.h> diff --git a/arch/arm/mach-msm/board-sapphire.c b/arch/arm/mach-msm/board-sapphire.c index dc0bcb5a6b9..afa9293d580 100644 --- a/arch/arm/mach-msm/board-sapphire.c +++ b/arch/arm/mach-msm/board-sapphire.c @@ -11,7 +11,7 @@   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * GNU General Public License for more details.  */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -22,7 +22,6 @@  #include <linux/delay.h> -#include <asm/gpio.h>  #include <mach/hardware.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-msm/board-trout-mmc.c b/arch/arm/mach-msm/board-trout-mmc.c index f7a9724788b..8650342b749 100644 --- a/arch/arm/mach-msm/board-trout-mmc.c +++ b/arch/arm/mach-msm/board-trout-mmc.c @@ -1,7 +1,7 @@  /* linux/arch/arm/mach-msm/board-trout-mmc.c  ** Author: Brian Swetland <swetland@google.com>  */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -11,7 +11,6 @@  #include <linux/err.h>  #include <linux/debugfs.h> -#include <asm/gpio.h>  #include <asm/io.h>  #include <mach/vreg.h> diff --git a/arch/arm/mach-msm/board-trout-panel.c b/arch/arm/mach-msm/board-trout-panel.c index 729bb49a44c..25105c1027f 100644 --- a/arch/arm/mach-msm/board-trout-panel.c +++ b/arch/arm/mach-msm/board-trout-panel.c @@ -1,7 +1,7 @@  /* linux/arch/arm/mach-msm/board-trout-mddi.c  ** Author: Brian Swetland <swetland@google.com>  */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -11,7 +11,6 @@  #include <linux/err.h>  #include <asm/io.h> -#include <asm/gpio.h>  #include <asm/mach-types.h>  #include <mach/msm_fb.h> diff --git a/arch/arm/mach-msm/include/mach/gpio.h b/arch/arm/mach-msm/include/mach/gpio.h index 36ad50d3bfa..40a8c178f10 100644 --- a/arch/arm/mach-msm/include/mach/gpio.h +++ b/arch/arm/mach-msm/include/mach/gpio.h @@ -1,26 +1 @@ -/* - * Copyright (C) 2007 Google, Inc. - * Copyright (c) 2009-2010, Code Aurora Forum. All rights reserved. - * Author: Mike Lockwood <lockwood@android.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - */ -#ifndef __ASM_ARCH_MSM_GPIO_H -#define __ASM_ARCH_MSM_GPIO_H - -#include <asm-generic/gpio.h> - -#define gpio_get_value  __gpio_get_value -#define gpio_set_value  __gpio_set_value -#define gpio_cansleep   __gpio_cansleep -#define gpio_to_irq     __gpio_to_irq - -#endif /* __ASM_ARCH_MSM_GPIO_H */ +/* empty */ diff --git a/arch/arm/mach-mv78xx0/irq.c b/arch/arm/mach-mv78xx0/irq.c index 3e24431bb5e..e421b701663 100644 --- a/arch/arm/mach-mv78xx0/irq.c +++ b/arch/arm/mach-mv78xx0/irq.c @@ -7,12 +7,11 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/pci.h>  #include <linux/irq.h> -#include <asm/gpio.h>  #include <mach/bridge-regs.h>  #include <plat/irq.h>  #include "common.h" diff --git a/arch/arm/mach-mv78xx0/mpp.c b/arch/arm/mach-mv78xx0/mpp.c index 59b7686b920..cf4e494d44b 100644 --- a/arch/arm/mach-mv78xx0/mpp.c +++ b/arch/arm/mach-mv78xx0/mpp.c @@ -7,13 +7,12 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/mbus.h>  #include <linux/io.h>  #include <plat/mpp.h> -#include <asm/gpio.h>  #include <mach/hardware.h>  #include "common.h"  #include "mpp.h" diff --git a/arch/arm/mach-mxs/include/mach/gpio.h b/arch/arm/mach-mxs/include/mach/gpio.h index 56025aa0a63..40a8c178f10 100644 --- a/arch/arm/mach-mxs/include/mach/gpio.h +++ b/arch/arm/mach-mxs/include/mach/gpio.h @@ -1,31 +1 @@ -/* - * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. - * Copyright 2008 Juergen Beisert, kernel@pengutronix.de - * - * 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. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA  02110-1301, USA. - */ - -#ifndef __MACH_MXS_GPIO_H__ -#define __MACH_MXS_GPIO_H__ - -#include <asm-generic/gpio.h> - -/* use gpiolib dispatchers */ -#define gpio_get_value		__gpio_get_value -#define gpio_set_value		__gpio_set_value -#define gpio_cansleep		__gpio_cansleep -#define gpio_to_irq		__gpio_to_irq - -#endif /* __MACH_MXS_GPIO_H__ */ +/* empty */ diff --git a/arch/arm/mach-nomadik/board-nhk8815.c b/arch/arm/mach-nomadik/board-nhk8815.c index 398a75f62be..0cbb74c96ef 100644 --- a/arch/arm/mach-nomadik/board-nhk8815.c +++ b/arch/arm/mach-nomadik/board-nhk8815.c @@ -27,6 +27,7 @@  #include <asm/mach/irq.h>  #include <asm/mach/flash.h> +#include <plat/gpio-nomadik.h>  #include <plat/mtu.h>  #include <mach/setup.h> diff --git a/arch/arm/mach-nomadik/cpu-8815.c b/arch/arm/mach-nomadik/cpu-8815.c index ac58e3b03b1..dc67717db6f 100644 --- a/arch/arm/mach-nomadik/cpu-8815.c +++ b/arch/arm/mach-nomadik/cpu-8815.c @@ -21,8 +21,8 @@  #include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/platform_device.h> -#include <linux/gpio.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h>  #include <mach/irqs.h>  #include <asm/mach/map.h> diff --git a/arch/arm/mach-nomadik/i2c-8815nhk.c b/arch/arm/mach-nomadik/i2c-8815nhk.c index abfe25a08d6..0fc2f6f1cc9 100644 --- a/arch/arm/mach-nomadik/i2c-8815nhk.c +++ b/arch/arm/mach-nomadik/i2c-8815nhk.c @@ -3,8 +3,8 @@  #include <linux/i2c.h>  #include <linux/i2c-algo-bit.h>  #include <linux/i2c-gpio.h> -#include <linux/gpio.h>  #include <linux/platform_device.h> +#include <plat/gpio-nomadik.h>  /*   * There are two busses in the 8815NHK. diff --git a/arch/arm/mach-nomadik/include/mach/gpio.h b/arch/arm/mach-nomadik/include/mach/gpio.h index 7a81a042034..efdde0ae0a4 100644 --- a/arch/arm/mach-nomadik/include/mach/gpio.h +++ b/arch/arm/mach-nomadik/include/mach/gpio.h @@ -1,6 +1,4 @@  #ifndef __ASM_ARCH_GPIO_H  #define __ASM_ARCH_GPIO_H -#include <plat/gpio.h> -  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-omap1/board-ams-delta.c b/arch/arm/mach-omap1/board-ams-delta.c index eb36b25450a..4ea60e2038e 100644 --- a/arch/arm/mach-omap1/board-ams-delta.c +++ b/arch/arm/mach-omap1/board-ams-delta.c @@ -11,7 +11,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/input.h> @@ -30,7 +30,6 @@  #include <plat/io.h>  #include <plat/board-ams-delta.h> -#include <mach/gpio.h>  #include <plat/keypad.h>  #include <plat/mux.h>  #include <plat/usb.h> diff --git a/arch/arm/mach-omap1/board-fsample.c b/arch/arm/mach-omap1/board-fsample.c index 999789c4811..31e089b6f03 100644 --- a/arch/arm/mach-omap1/board-fsample.c +++ b/arch/arm/mach-omap1/board-fsample.c @@ -10,7 +10,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -28,7 +28,6 @@  #include <asm/mach/map.h>  #include <plat/tc.h> -#include <mach/gpio.h>  #include <plat/mux.h>  #include <plat/flash.h>  #include <plat/fpga.h> diff --git a/arch/arm/mach-omap1/board-generic.c b/arch/arm/mach-omap1/board-generic.c index 23cc9e4ad50..05c6e9d858f 100644 --- a/arch/arm/mach-omap1/board-generic.c +++ b/arch/arm/mach-omap1/board-generic.c @@ -12,7 +12,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -22,7 +22,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/gpio.h>  #include <plat/mux.h>  #include <plat/usb.h>  #include <plat/board.h> diff --git a/arch/arm/mach-omap1/board-h2-mmc.c b/arch/arm/mach-omap1/board-h2-mmc.c index f2fc43d8382..da0e37d4082 100644 --- a/arch/arm/mach-omap1/board-h2-mmc.c +++ b/arch/arm/mach-omap1/board-h2-mmc.c @@ -11,13 +11,12 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c/tps65010.h>  #include <plat/mmc.h> -#include <mach/gpio.h>  #include "board-h2.h" diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 6c70c28d055..c2e279173d4 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -18,7 +18,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/platform_device.h>  #include <linux/delay.h> @@ -32,7 +32,6 @@  #include <linux/smc91x.h>  #include <mach/hardware.h> -#include <asm/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-omap1/board-h3-mmc.c b/arch/arm/mach-omap1/board-h3-mmc.c index 2098525e7cc..f8242aa9b76 100644 --- a/arch/arm/mach-omap1/board-h3-mmc.c +++ b/arch/arm/mach-omap1/board-h3-mmc.c @@ -11,13 +11,12 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/i2c/tps65010.h>  #include <plat/mmc.h> -#include <mach/gpio.h>  #include "board-h3.h" diff --git a/arch/arm/mach-omap1/board-h3.c b/arch/arm/mach-omap1/board-h3.c index 8e2b64a4692..8f5b6af7ed5 100644 --- a/arch/arm/mach-omap1/board-h3.c +++ b/arch/arm/mach-omap1/board-h3.c @@ -13,7 +13,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/types.h>  #include <linux/init.h>  #include <linux/major.h> @@ -34,7 +34,6 @@  #include <asm/setup.h>  #include <asm/page.h>  #include <mach/hardware.h> -#include <asm/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-omap1/board-htcherald.c b/arch/arm/mach-omap1/board-htcherald.c index e81ead1c89e..fcd1a3c3189 100644 --- a/arch/arm/mach-omap1/board-htcherald.c +++ b/arch/arm/mach-omap1/board-htcherald.c @@ -23,7 +23,6 @@   * 02110-1301, USA.   *   */ -  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 8b034594fbc..c2234caf8a7 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -15,7 +15,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -34,7 +34,6 @@  #include <plat/mux.h>  #include <plat/flash.h>  #include <plat/fpga.h> -#include <mach/gpio.h>  #include <plat/tc.h>  #include <plat/usb.h>  #include <plat/keypad.h> diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index 6825635ac68..02789c5d370 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c @@ -7,7 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/mutex.h> @@ -26,7 +26,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/gpio.h>  #include <plat/mux.h>  #include <plat/usb.h>  #include <plat/board.h> diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 44b8e9362bf..e4dca1deebb 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -25,7 +25,7 @@   * with this program; if not, write  to the Free Software Foundation, Inc.,   * 675 Mass Ave, Cambridge, MA 02139, USA.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -42,7 +42,6 @@  #include <linux/i2c/tps65010.h>  #include <mach/hardware.h> -#include <asm/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> diff --git a/arch/arm/mach-omap1/board-palmte.c b/arch/arm/mach-omap1/board-palmte.c index 3d8cd90b1db..50c4e398bcc 100644 --- a/arch/arm/mach-omap1/board-palmte.c +++ b/arch/arm/mach-omap1/board-palmte.c @@ -16,7 +16,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/input.h> @@ -33,7 +33,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/gpio.h>  #include <plat/flash.h>  #include <plat/mux.h>  #include <plat/usb.h> diff --git a/arch/arm/mach-omap1/board-palmtt.c b/arch/arm/mach-omap1/board-palmtt.c index d0eefe81cd1..273771cb1b6 100644 --- a/arch/arm/mach-omap1/board-palmtt.c +++ b/arch/arm/mach-omap1/board-palmtt.c @@ -12,6 +12,7 @@   */  #include <linux/delay.h> +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -30,7 +31,6 @@  #include <asm/mach/map.h>  #include <plat/led.h> -#include <mach/gpio.h>  #include <plat/flash.h>  #include <plat/mux.h>  #include <plat/usb.h> diff --git a/arch/arm/mach-omap1/board-palmz71.c b/arch/arm/mach-omap1/board-palmz71.c index 98e79bc0921..de36ade38ef 100644 --- a/arch/arm/mach-omap1/board-palmz71.c +++ b/arch/arm/mach-omap1/board-palmz71.c @@ -15,6 +15,7 @@   */  #include <linux/delay.h> +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -32,7 +33,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/gpio.h>  #include <plat/flash.h>  #include <plat/mux.h>  #include <plat/usb.h> diff --git a/arch/arm/mach-omap1/board-perseus2.c b/arch/arm/mach-omap1/board-perseus2.c index ad3a1567604..04b1befaced 100644 --- a/arch/arm/mach-omap1/board-perseus2.c +++ b/arch/arm/mach-omap1/board-perseus2.c @@ -10,7 +10,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -28,7 +28,6 @@  #include <asm/mach/map.h>  #include <plat/tc.h> -#include <mach/gpio.h>  #include <plat/mux.h>  #include <plat/fpga.h>  #include <plat/flash.h> diff --git a/arch/arm/mach-omap1/board-sx1-mmc.c b/arch/arm/mach-omap1/board-sx1-mmc.c index e8ddd86e3fd..b59f78850e6 100644 --- a/arch/arm/mach-omap1/board-sx1-mmc.c +++ b/arch/arm/mach-omap1/board-sx1-mmc.c @@ -12,11 +12,11 @@   * published by the Free Software Foundation.   */ +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <mach/hardware.h>  #include <plat/mmc.h> -#include <mach/gpio.h>  #include <plat/board-sx1.h>  #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) diff --git a/arch/arm/mach-omap1/board-sx1.c b/arch/arm/mach-omap1/board-sx1.c index 602b55c39d3..2bea941741d 100644 --- a/arch/arm/mach-omap1/board-sx1.c +++ b/arch/arm/mach-omap1/board-sx1.c @@ -14,7 +14,7 @@  * it under the terms of the GNU General Public License version 2 as  * published by the Free Software Foundation.  */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/input.h> @@ -32,7 +32,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/gpio.h>  #include <plat/flash.h>  #include <plat/mux.h>  #include <plat/dma.h> diff --git a/arch/arm/mach-omap1/board-voiceblue.c b/arch/arm/mach-omap1/board-voiceblue.c index 80165154617..940faed82be 100644 --- a/arch/arm/mach-omap1/board-voiceblue.c +++ b/arch/arm/mach-omap1/board-voiceblue.c @@ -13,6 +13,7 @@   */  #include <linux/delay.h> +#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/interrupt.h>  #include <linux/irq.h> @@ -33,7 +34,6 @@  #include <plat/board-voiceblue.h>  #include <plat/common.h> -#include <mach/gpio.h>  #include <plat/flash.h>  #include <plat/mux.h>  #include <plat/tc.h> diff --git a/arch/arm/mach-omap1/devices.c b/arch/arm/mach-omap1/devices.c index 36f26c3fa25..7c50ecf6812 100644 --- a/arch/arm/mach-omap1/devices.c +++ b/arch/arm/mach-omap1/devices.c @@ -10,6 +10,7 @@   */  #include <linux/dma-mapping.h> +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -24,7 +25,6 @@  #include <plat/tc.h>  #include <plat/board.h>  #include <plat/mux.h> -#include <mach/gpio.h>  #include <plat/mmc.h>  #include <plat/omap7xx.h>  #include <plat/mcbsp.h> diff --git a/arch/arm/mach-omap1/fpga.c b/arch/arm/mach-omap1/fpga.c index cddbf8b089c..0a17a1a7e00 100644 --- a/arch/arm/mach-omap1/fpga.c +++ b/arch/arm/mach-omap1/fpga.c @@ -17,6 +17,7 @@   */  #include <linux/types.h> +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/device.h> @@ -28,7 +29,6 @@  #include <asm/mach/irq.h>  #include <plat/fpga.h> -#include <mach/gpio.h>  static void fpga_mask_irq(struct irq_data *d)  { diff --git a/arch/arm/mach-omap1/irq.c b/arch/arm/mach-omap1/irq.c index e2b9c901ab6..e5b104b7fce 100644 --- a/arch/arm/mach-omap1/irq.c +++ b/arch/arm/mach-omap1/irq.c @@ -35,7 +35,7 @@   * with this program; if not, write  to the Free Software Foundation, Inc.,   * 675 Mass Ave, Cambridge, MA 02139, USA.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/module.h>  #include <linux/sched.h> @@ -45,7 +45,6 @@  #include <mach/hardware.h>  #include <asm/irq.h>  #include <asm/mach/irq.h> -#include <mach/gpio.h>  #include <plat/cpu.h>  #define IRQ_BANK(irq) ((irq) >> 5) diff --git a/arch/arm/mach-omap1/leds-h2p2-debug.c b/arch/arm/mach-omap1/leds-h2p2-debug.c index b4f9be52e1e..4b818eb9f91 100644 --- a/arch/arm/mach-omap1/leds-h2p2-debug.c +++ b/arch/arm/mach-omap1/leds-h2p2-debug.c @@ -9,6 +9,7 @@   * The "surfer" expansion board and H2 sample board also have two-color   * green+red LEDs (in parallel), used here for timer and idle indicators.   */ +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/kernel_stat.h>  #include <linux/sched.h> @@ -20,7 +21,6 @@  #include <asm/mach-types.h>  #include <plat/fpga.h> -#include <mach/gpio.h>  #include "leds.h" diff --git a/arch/arm/mach-omap1/leds-osk.c b/arch/arm/mach-omap1/leds-osk.c index 499d7ad8697..da09f436497 100644 --- a/arch/arm/mach-omap1/leds-osk.c +++ b/arch/arm/mach-omap1/leds-osk.c @@ -3,14 +3,13 @@   *   * LED driver for OSK with optional Mistral QVGA board   */ +#include <linux/gpio.h>  #include <linux/init.h>  #include <mach/hardware.h>  #include <asm/leds.h>  #include <asm/system.h> -#include <mach/gpio.h> -  #include "leds.h" diff --git a/arch/arm/mach-omap1/leds.c b/arch/arm/mach-omap1/leds.c index 22eb11dde9e..ae6dd93b8dd 100644 --- a/arch/arm/mach-omap1/leds.c +++ b/arch/arm/mach-omap1/leds.c @@ -3,13 +3,13 @@   *   * OMAP LEDs dispatcher   */ +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <asm/leds.h>  #include <asm/mach-types.h> -#include <mach/gpio.h>  #include <plat/mux.h>  #include "leds.h" diff --git a/arch/arm/mach-omap1/serial.c b/arch/arm/mach-omap1/serial.c index 550ca9d9991..93ae8f29727 100644 --- a/arch/arm/mach-omap1/serial.c +++ b/arch/arm/mach-omap1/serial.c @@ -7,7 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -24,7 +24,6 @@  #include <plat/board.h>  #include <plat/mux.h> -#include <mach/gpio.h>  #include <plat/fpga.h>  #include "pm.h" diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 0c427976d62..67f0a122e18 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c @@ -11,7 +11,10 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/device.h>  #include <linux/io.h>  #include <linux/of_platform.h>  #include <linux/irqdomain.h> @@ -20,6 +23,7 @@  #include <mach/hardware.h>  #include <asm/mach/arch.h> +#include <plat/usb.h>  #include <plat/board.h>  #include <plat/common.h>  #include <mach/omap4-common.h> diff --git a/arch/arm/mach-omap2/board-h4.c b/arch/arm/mach-omap2/board-h4.c index fe75c195f69..a65effe7e8d 100644 --- a/arch/arm/mach-omap2/board-h4.c +++ b/arch/arm/mach-omap2/board-h4.c @@ -10,7 +10,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -31,7 +31,6 @@  #include <asm/mach/arch.h>  #include <asm/mach/map.h> -#include <mach/gpio.h>  #include <plat/usb.h>  #include <plat/board.h>  #include <plat/common.h> diff --git a/arch/arm/mach-omap2/board-ldp.c b/arch/arm/mach-omap2/board-ldp.c index 0fa28be2cfd..57979175cff 100644 --- a/arch/arm/mach-omap2/board-ldp.c +++ b/arch/arm/mach-omap2/board-ldp.c @@ -10,7 +10,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -34,7 +34,6 @@  #include <asm/mach/map.h>  #include <plat/mcspi.h> -#include <mach/gpio.h>  #include <plat/board.h>  #include <plat/common.h>  #include <plat/gpmc.h> diff --git a/arch/arm/mach-omap2/devices.c b/arch/arm/mach-omap2/devices.c index 0f8e0eb1816..37b4ef8b07e 100644 --- a/arch/arm/mach-omap2/devices.c +++ b/arch/arm/mach-omap2/devices.c @@ -8,7 +8,7 @@   * the Free Software Foundation; either version 2 of the License, or   * (at your option) any later version.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -27,7 +27,6 @@  #include <plat/tc.h>  #include <plat/board.h>  #include <plat/mcbsp.h> -#include <mach/gpio.h>  #include <plat/mmc.h>  #include <plat/dma.h>  #include <plat/omap_hwmod.h> diff --git a/arch/arm/mach-orion5x/db88f5281-setup.c b/arch/arm/mach-orion5x/db88f5281-setup.c index 88432aba972..4b79a80d5e1 100644 --- a/arch/arm/mach-orion5x/db88f5281-setup.c +++ b/arch/arm/mach-orion5x/db88f5281-setup.c @@ -9,7 +9,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -21,7 +21,6 @@  #include <linux/mv643xx_eth.h>  #include <linux/i2c.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c index 9e5c1663fc4..343f60e9639 100644 --- a/arch/arm/mach-orion5x/dns323-setup.c +++ b/arch/arm/mach-orion5x/dns323-setup.c @@ -13,7 +13,7 @@   * License, or (at your option) any later version.   *   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/delay.h> @@ -30,7 +30,6 @@  #include <linux/phy.h>  #include <linux/marvell_phy.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-orion5x/irq.c b/arch/arm/mach-orion5x/irq.c index 43cf8bc9767..b1b45fff776 100644 --- a/arch/arm/mach-orion5x/irq.c +++ b/arch/arm/mach-orion5x/irq.c @@ -9,12 +9,11 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/irq.h>  #include <linux/io.h> -#include <asm/gpio.h>  #include <mach/bridge-regs.h>  #include <plat/irq.h>  #include "common.h" diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c index 9115511dc03..d3cd3f63258 100644 --- a/arch/arm/mach-orion5x/kurobox_pro-setup.c +++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c @@ -7,7 +7,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -21,7 +21,6 @@  #include <linux/serial_reg.h>  #include <linux/ata_platform.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c index b3356ada64b..201ae367628 100644 --- a/arch/arm/mach-orion5x/mv2120-setup.c +++ b/arch/arm/mach-orion5x/mv2120-setup.c @@ -7,7 +7,7 @@   * published by the Free Software Foundation; either version 2 of the   * License, or (at your option) any later version.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -20,7 +20,6 @@  #include <linux/i2c.h>  #include <linux/ata_platform.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <mach/orion5x.h>  #include "common.h" diff --git a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c index 8c876664f49..ebd6767d8e8 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-fxo-setup.c @@ -7,7 +7,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -18,7 +18,6 @@  #include <linux/ethtool.h>  #include <net/dsa.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/leds.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h> diff --git a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c index 994644f59d8..05db2d336b0 100644 --- a/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f5181l-ge-setup.c @@ -7,7 +7,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -19,7 +19,6 @@  #include <linux/i2c.h>  #include <net/dsa.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/leds.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h> diff --git a/arch/arm/mach-orion5x/rd88f5182-setup.c b/arch/arm/mach-orion5x/rd88f5182-setup.c index 1903d25ecae..e47fa0578ae 100644 --- a/arch/arm/mach-orion5x/rd88f5182-setup.c +++ b/arch/arm/mach-orion5x/rd88f5182-setup.c @@ -9,7 +9,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -20,7 +20,6 @@  #include <linux/ata_platform.h>  #include <linux/i2c.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/leds.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h> diff --git a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c index e06fdae77f0..64317251ec0 100644 --- a/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c +++ b/arch/arm/mach-orion5x/rd88f6183ap-ge-setup.c @@ -7,7 +7,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -21,7 +21,6 @@  #include <linux/ethtool.h>  #include <net/dsa.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/leds.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h> diff --git a/arch/arm/mach-orion5x/terastation_pro2-setup.c b/arch/arm/mach-orion5x/terastation_pro2-setup.c index 306183273eb..29f1526f7b7 100644 --- a/arch/arm/mach-orion5x/terastation_pro2-setup.c +++ b/arch/arm/mach-orion5x/terastation_pro2-setup.c @@ -8,7 +8,7 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -20,7 +20,6 @@  #include <linux/i2c.h>  #include <linux/serial_reg.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c index 3dbcd5ed77e..31e51f9b4b6 100644 --- a/arch/arm/mach-orion5x/ts209-setup.c +++ b/arch/arm/mach-orion5x/ts209-setup.c @@ -8,7 +8,7 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -23,7 +23,6 @@  #include <linux/serial_reg.h>  #include <linux/ata_platform.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c index 23c9e2e5e55..0fbcc14e09d 100644 --- a/arch/arm/mach-orion5x/ts409-setup.c +++ b/arch/arm/mach-orion5x/ts409-setup.c @@ -11,7 +11,7 @@   * as published by the Free Software Foundation; either version   * 2 of the License, or (at your option) any later version.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -25,7 +25,6 @@  #include <linux/i2c.h>  #include <linux/serial_reg.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-orion5x/wnr854t-setup.c b/arch/arm/mach-orion5x/wnr854t-setup.c index 1c63a76f3ca..b8be7d8d0cf 100644 --- a/arch/arm/mach-orion5x/wnr854t-setup.c +++ b/arch/arm/mach-orion5x/wnr854t-setup.c @@ -5,7 +5,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -17,7 +17,6 @@  #include <linux/ethtool.h>  #include <net/dsa.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-orion5x/wrt350n-v2-setup.c b/arch/arm/mach-orion5x/wrt350n-v2-setup.c index 4fd9f18c9d5..faf81a03936 100644 --- a/arch/arm/mach-orion5x/wrt350n-v2-setup.c +++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c @@ -5,7 +5,7 @@   * License version 2.  This program is licensed "as is" without any   * warranty of any kind, whether express or implied.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -20,7 +20,6 @@  #include <linux/input.h>  #include <net/dsa.h>  #include <asm/mach-types.h> -#include <asm/gpio.h>  #include <asm/mach/arch.h>  #include <asm/mach/pci.h>  #include <mach/orion5x.h> diff --git a/arch/arm/mach-pnx4008/gpio.c b/arch/arm/mach-pnx4008/gpio.c index f219914f5b2..d3e71d3847b 100644 --- a/arch/arm/mach-pnx4008/gpio.c +++ b/arch/arm/mach-pnx4008/gpio.c @@ -13,14 +13,13 @@   * is licensed "as is" without any warranty of any kind, whether express   * or implied.   */ -  #include <linux/types.h>  #include <linux/kernel.h>  #include <linux/module.h>  #include <linux/io.h>  #include <mach/hardware.h>  #include <mach/platform.h> -#include <mach/gpio.h> +#include <mach/gpio-pnx4008.h>  /* register definitions */  #define PIO_VA_BASE	IO_ADDRESS(PNX4008_PIO_BASE) diff --git a/arch/arm/mach-pnx4008/include/mach/gpio.h b/arch/arm/mach-pnx4008/include/mach/gpio-pnx4008.h index 9591467eb9e..41027dd7cf7 100644 --- a/arch/arm/mach-pnx4008/include/mach/gpio.h +++ b/arch/arm/mach-pnx4008/include/mach/gpio-pnx4008.h @@ -1,5 +1,5 @@  /* - * arch/arm/mach-pnx4008/include/mach/gpio.h + * arch/arm/mach-pnx4008/include/mach/gpio-pnx4008.h   *   * PNX4008 GPIO driver - header file   * diff --git a/arch/arm/mach-pnx4008/serial.c b/arch/arm/mach-pnx4008/serial.c index f40961e5191..374c138ac1a 100644 --- a/arch/arm/mach-pnx4008/serial.c +++ b/arch/arm/mach-pnx4008/serial.c @@ -9,7 +9,6 @@   *  it under the terms of the GNU General Public License version 2 as   *  published by the Free Software Foundation.   */ -  #include <linux/kernel.h>  #include <linux/types.h>  #include <linux/io.h> @@ -19,8 +18,8 @@  #include <linux/serial_core.h>  #include <linux/serial_reg.h> -#include <mach/gpio.h> +#include <mach/gpio-pnx4008.h>  #include <mach/clock.h>  #define UART_3		0 diff --git a/arch/arm/mach-pxa/cm-x255.c b/arch/arm/mach-pxa/cm-x255.c index 93f59f877fc..be751470d37 100644 --- a/arch/arm/mach-pxa/cm-x255.c +++ b/arch/arm/mach-pxa/cm-x255.c @@ -11,7 +11,6 @@  #include <linux/platform_device.h>  #include <linux/irq.h> -#include <linux/gpio.h>  #include <linux/mtd/partitions.h>  #include <linux/mtd/physmap.h>  #include <linux/mtd/nand-gpio.h> diff --git a/arch/arm/mach-pxa/generic.c b/arch/arm/mach-pxa/generic.c index f5d91efc296..5432ecb15de 100644 --- a/arch/arm/mach-pxa/generic.c +++ b/arch/arm/mach-pxa/generic.c @@ -16,6 +16,7 @@   * initialization stuff for PXA machines which can be overridden later if   * need be.   */ +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -26,7 +27,6 @@  #include <asm/mach-types.h>  #include <mach/reset.h> -#include <mach/gpio.h>  #include <mach/smemc.h>  #include <mach/pxa3xx-regs.h> diff --git a/arch/arm/mach-pxa/include/mach/gpio-pxa.h b/arch/arm/mach-pxa/include/mach/gpio-pxa.h new file mode 100644 index 00000000000..41b4c93a96c --- /dev/null +++ b/arch/arm/mach-pxa/include/mach/gpio-pxa.h @@ -0,0 +1,133 @@ +/* + * Written by Philipp Zabel <philipp.zabel@gmail.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. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#ifndef __MACH_PXA_GPIO_PXA_H +#define __MACH_PXA_GPIO_PXA_H + +#include <mach/irqs.h> +#include <mach/hardware.h> + +#define GPIO_REGS_VIRT	io_p2v(0x40E00000) + +#define BANK_OFF(n)	(((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2)) +#define GPIO_REG(x)	(*(volatile u32 *)(GPIO_REGS_VIRT + (x))) + +/* GPIO Pin Level Registers */ +#define GPLR0		GPIO_REG(BANK_OFF(0) + 0x00) +#define GPLR1		GPIO_REG(BANK_OFF(1) + 0x00) +#define GPLR2		GPIO_REG(BANK_OFF(2) + 0x00) +#define GPLR3		GPIO_REG(BANK_OFF(3) + 0x00) + +/* GPIO Pin Direction Registers */ +#define GPDR0		GPIO_REG(BANK_OFF(0) + 0x0c) +#define GPDR1		GPIO_REG(BANK_OFF(1) + 0x0c) +#define GPDR2		GPIO_REG(BANK_OFF(2) + 0x0c) +#define GPDR3		GPIO_REG(BANK_OFF(3) + 0x0c) + +/* GPIO Pin Output Set Registers */ +#define GPSR0		GPIO_REG(BANK_OFF(0) + 0x18) +#define GPSR1		GPIO_REG(BANK_OFF(1) + 0x18) +#define GPSR2		GPIO_REG(BANK_OFF(2) + 0x18) +#define GPSR3		GPIO_REG(BANK_OFF(3) + 0x18) + +/* GPIO Pin Output Clear Registers */ +#define GPCR0		GPIO_REG(BANK_OFF(0) + 0x24) +#define GPCR1		GPIO_REG(BANK_OFF(1) + 0x24) +#define GPCR2		GPIO_REG(BANK_OFF(2) + 0x24) +#define GPCR3		GPIO_REG(BANK_OFF(3) + 0x24) + +/* GPIO Rising Edge Detect Registers */ +#define GRER0		GPIO_REG(BANK_OFF(0) + 0x30) +#define GRER1		GPIO_REG(BANK_OFF(1) + 0x30) +#define GRER2		GPIO_REG(BANK_OFF(2) + 0x30) +#define GRER3		GPIO_REG(BANK_OFF(3) + 0x30) + +/* GPIO Falling Edge Detect Registers */ +#define GFER0		GPIO_REG(BANK_OFF(0) + 0x3c) +#define GFER1		GPIO_REG(BANK_OFF(1) + 0x3c) +#define GFER2		GPIO_REG(BANK_OFF(2) + 0x3c) +#define GFER3		GPIO_REG(BANK_OFF(3) + 0x3c) + +/* GPIO Edge Detect Status Registers */ +#define GEDR0		GPIO_REG(BANK_OFF(0) + 0x48) +#define GEDR1		GPIO_REG(BANK_OFF(1) + 0x48) +#define GEDR2		GPIO_REG(BANK_OFF(2) + 0x48) +#define GEDR3		GPIO_REG(BANK_OFF(3) + 0x48) + +/* GPIO Alternate Function Select Registers */ +#define GAFR0_L		GPIO_REG(0x0054) +#define GAFR0_U		GPIO_REG(0x0058) +#define GAFR1_L		GPIO_REG(0x005C) +#define GAFR1_U		GPIO_REG(0x0060) +#define GAFR2_L		GPIO_REG(0x0064) +#define GAFR2_U		GPIO_REG(0x0068) +#define GAFR3_L		GPIO_REG(0x006C) +#define GAFR3_U		GPIO_REG(0x0070) + +/* More handy macros.  The argument is a literal GPIO number. */ + +#define GPIO_bit(x)	(1 << ((x) & 0x1f)) + +#define GPLR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x00) +#define GPDR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x0c) +#define GPSR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x18) +#define GPCR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x24) +#define GRER(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x30) +#define GFER(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x3c) +#define GEDR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x48) +#define GAFR(x)		GPIO_REG(0x54 + (((x) & 0x70) >> 2)) + + +#define NR_BUILTIN_GPIO		PXA_GPIO_IRQ_NUM + +#define gpio_to_bank(gpio)	((gpio) >> 5) + +#ifdef CONFIG_CPU_PXA26x +/* GPIO86/87/88/89 on PXA26x have their direction bits in GPDR2 inverted, + * as well as their Alternate Function value being '1' for GPIO in GAFRx. + */ +static inline int __gpio_is_inverted(unsigned gpio) +{ +	return cpu_is_pxa25x() && gpio > 85; +} +#else +static inline int __gpio_is_inverted(unsigned gpio) { return 0; } +#endif + +/* + * On PXA25x and PXA27x, GAFRx and GPDRx together decide the alternate + * function of a GPIO, and GPDRx cannot be altered once configured. It + * is attributed as "occupied" here (I know this terminology isn't + * accurate, you are welcome to propose a better one :-) + */ +static inline int __gpio_is_occupied(unsigned gpio) +{ +	if (cpu_is_pxa27x() || cpu_is_pxa25x()) { +		int af = (GAFR(gpio) >> ((gpio & 0xf) * 2)) & 0x3; +		int dir = GPDR(gpio) & GPIO_bit(gpio); + +		if (__gpio_is_inverted(gpio)) +			return af != 1 || dir == 0; +		else +			return af != 0 || dir != 0; +	} else +		return GPDR(gpio) & GPIO_bit(gpio); +} + +#include <plat/gpio-pxa.h> +#endif /* __MACH_PXA_GPIO_PXA_H */ diff --git a/arch/arm/mach-pxa/include/mach/gpio.h b/arch/arm/mach-pxa/include/mach/gpio.h index c4639502efc..004cade7bb1 100644 --- a/arch/arm/mach-pxa/include/mach/gpio.h +++ b/arch/arm/mach-pxa/include/mach/gpio.h @@ -24,84 +24,10 @@  #ifndef __ASM_ARCH_PXA_GPIO_H  #define __ASM_ARCH_PXA_GPIO_H -#include <mach/irqs.h> -#include <mach/hardware.h>  #include <asm-generic/gpio.h> +/* The defines for the driver are needed for the accelerated accessors */ +#include "gpio-pxa.h" -#define GPIO_REGS_VIRT	io_p2v(0x40E00000) - -#define BANK_OFF(n)	(((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2)) -#define GPIO_REG(x)	(*(volatile u32 *)(GPIO_REGS_VIRT + (x))) - -/* GPIO Pin Level Registers */ -#define GPLR0		GPIO_REG(BANK_OFF(0) + 0x00) -#define GPLR1		GPIO_REG(BANK_OFF(1) + 0x00) -#define GPLR2		GPIO_REG(BANK_OFF(2) + 0x00) -#define GPLR3		GPIO_REG(BANK_OFF(3) + 0x00) - -/* GPIO Pin Direction Registers */ -#define GPDR0		GPIO_REG(BANK_OFF(0) + 0x0c) -#define GPDR1		GPIO_REG(BANK_OFF(1) + 0x0c) -#define GPDR2		GPIO_REG(BANK_OFF(2) + 0x0c) -#define GPDR3		GPIO_REG(BANK_OFF(3) + 0x0c) - -/* GPIO Pin Output Set Registers */ -#define GPSR0		GPIO_REG(BANK_OFF(0) + 0x18) -#define GPSR1		GPIO_REG(BANK_OFF(1) + 0x18) -#define GPSR2		GPIO_REG(BANK_OFF(2) + 0x18) -#define GPSR3		GPIO_REG(BANK_OFF(3) + 0x18) - -/* GPIO Pin Output Clear Registers */ -#define GPCR0		GPIO_REG(BANK_OFF(0) + 0x24) -#define GPCR1		GPIO_REG(BANK_OFF(1) + 0x24) -#define GPCR2		GPIO_REG(BANK_OFF(2) + 0x24) -#define GPCR3		GPIO_REG(BANK_OFF(3) + 0x24) - -/* GPIO Rising Edge Detect Registers */ -#define GRER0		GPIO_REG(BANK_OFF(0) + 0x30) -#define GRER1		GPIO_REG(BANK_OFF(1) + 0x30) -#define GRER2		GPIO_REG(BANK_OFF(2) + 0x30) -#define GRER3		GPIO_REG(BANK_OFF(3) + 0x30) - -/* GPIO Falling Edge Detect Registers */ -#define GFER0		GPIO_REG(BANK_OFF(0) + 0x3c) -#define GFER1		GPIO_REG(BANK_OFF(1) + 0x3c) -#define GFER2		GPIO_REG(BANK_OFF(2) + 0x3c) -#define GFER3		GPIO_REG(BANK_OFF(3) + 0x3c) - -/* GPIO Edge Detect Status Registers */ -#define GEDR0		GPIO_REG(BANK_OFF(0) + 0x48) -#define GEDR1		GPIO_REG(BANK_OFF(1) + 0x48) -#define GEDR2		GPIO_REG(BANK_OFF(2) + 0x48) -#define GEDR3		GPIO_REG(BANK_OFF(3) + 0x48) - -/* GPIO Alternate Function Select Registers */ -#define GAFR0_L		GPIO_REG(0x0054) -#define GAFR0_U		GPIO_REG(0x0058) -#define GAFR1_L		GPIO_REG(0x005C) -#define GAFR1_U		GPIO_REG(0x0060) -#define GAFR2_L		GPIO_REG(0x0064) -#define GAFR2_U		GPIO_REG(0x0068) -#define GAFR3_L		GPIO_REG(0x006C) -#define GAFR3_U		GPIO_REG(0x0070) - -/* More handy macros.  The argument is a literal GPIO number. */ - -#define GPIO_bit(x)	(1 << ((x) & 0x1f)) - -#define GPLR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x00) -#define GPDR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x0c) -#define GPSR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x18) -#define GPCR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x24) -#define GRER(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x30) -#define GFER(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x3c) -#define GEDR(x)		GPIO_REG(BANK_OFF((x) >> 5) + 0x48) -#define GAFR(x)		GPIO_REG(0x54 + (((x) & 0x70) >> 2)) - - -#define NR_BUILTIN_GPIO		PXA_GPIO_IRQ_NUM - -#define gpio_to_bank(gpio)	((gpio) >> 5)  #define gpio_to_irq(gpio)	IRQ_GPIO(gpio)  static inline int irq_to_gpio(unsigned int irq) @@ -118,37 +44,5 @@ static inline int irq_to_gpio(unsigned int irq)  	return -1;  } -#ifdef CONFIG_CPU_PXA26x -/* GPIO86/87/88/89 on PXA26x have their direction bits in GPDR2 inverted, - * as well as their Alternate Function value being '1' for GPIO in GAFRx. - */ -static inline int __gpio_is_inverted(unsigned gpio) -{ -	return cpu_is_pxa25x() && gpio > 85; -} -#else -static inline int __gpio_is_inverted(unsigned gpio) { return 0; } -#endif - -/* - * On PXA25x and PXA27x, GAFRx and GPDRx together decide the alternate - * function of a GPIO, and GPDRx cannot be altered once configured. It - * is attributed as "occupied" here (I know this terminology isn't - * accurate, you are welcome to propose a better one :-) - */ -static inline int __gpio_is_occupied(unsigned gpio) -{ -	if (cpu_is_pxa27x() || cpu_is_pxa25x()) { -		int af = (GAFR(gpio) >> ((gpio & 0xf) * 2)) & 0x3; -		int dir = GPDR(gpio) & GPIO_bit(gpio); - -		if (__gpio_is_inverted(gpio)) -			return af != 1 || dir == 0; -		else -			return af != 0 || dir != 0; -	} else -		return GPDR(gpio) & GPIO_bit(gpio); -} -  #include <plat/gpio.h>  #endif diff --git a/arch/arm/mach-pxa/include/mach/littleton.h b/arch/arm/mach-pxa/include/mach/littleton.h index 2a5726c15e0..b6238cbd8ae 100644 --- a/arch/arm/mach-pxa/include/mach/littleton.h +++ b/arch/arm/mach-pxa/include/mach/littleton.h @@ -1,7 +1,7 @@  #ifndef __ASM_ARCH_LITTLETON_H  #define __ASM_ARCH_LITTLETON_H -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  #define LITTLETON_ETH_PHYS	0x30000000 diff --git a/arch/arm/mach-pxa/irq.c b/arch/arm/mach-pxa/irq.c index ca607571782..8d9200f9226 100644 --- a/arch/arm/mach-pxa/irq.c +++ b/arch/arm/mach-pxa/irq.c @@ -11,7 +11,6 @@   *  it under the terms of the GNU General Public License version 2 as   *  published by the Free Software Foundation.   */ -  #include <linux/init.h>  #include <linux/module.h>  #include <linux/interrupt.h> @@ -23,7 +22,7 @@  #include <mach/hardware.h>  #include <mach/irqs.h> -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  #include "generic.h" diff --git a/arch/arm/mach-pxa/lpd270.c b/arch/arm/mach-pxa/lpd270.c index 16df0fc0879..64540d90895 100644 --- a/arch/arm/mach-pxa/lpd270.c +++ b/arch/arm/mach-pxa/lpd270.c @@ -12,7 +12,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/syscore_ops.h> @@ -39,7 +39,6 @@  #include <asm/mach/flash.h>  #include <mach/pxa27x.h> -#include <mach/gpio.h>  #include <mach/lpd270.h>  #include <mach/audio.h>  #include <mach/pxafb.h> diff --git a/arch/arm/mach-pxa/lubbock.c b/arch/arm/mach-pxa/lubbock.c index a8c696bfc13..c48ce6da918 100644 --- a/arch/arm/mach-pxa/lubbock.c +++ b/arch/arm/mach-pxa/lubbock.c @@ -11,6 +11,7 @@   *  it under the terms of the GNU General Public License version 2 as   *  published by the Free Software Foundation.   */ +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -42,7 +43,6 @@  #include <asm/hardware/sa1111.h>  #include <mach/pxa25x.h> -#include <mach/gpio.h>  #include <mach/audio.h>  #include <mach/lubbock.h>  #include <mach/udc.h> diff --git a/arch/arm/mach-pxa/mainstone.c b/arch/arm/mach-pxa/mainstone.c index cc6e14f6d11..0567d3965fd 100644 --- a/arch/arm/mach-pxa/mainstone.c +++ b/arch/arm/mach-pxa/mainstone.c @@ -12,7 +12,7 @@   *  it under the terms of the GNU General Public License version 2 as   *  published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/syscore_ops.h> @@ -43,7 +43,6 @@  #include <asm/mach/flash.h>  #include <mach/pxa27x.h> -#include <mach/gpio.h>  #include <mach/mainstone.h>  #include <mach/audio.h>  #include <mach/pxafb.h> diff --git a/arch/arm/mach-pxa/mfp-pxa2xx.c b/arch/arm/mach-pxa/mfp-pxa2xx.c index b27544bcafc..43a5f6861ca 100644 --- a/arch/arm/mach-pxa/mfp-pxa2xx.c +++ b/arch/arm/mach-pxa/mfp-pxa2xx.c @@ -12,15 +12,15 @@   *  it under the terms of the GNU General Public License version 2 as   *  published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/syscore_ops.h> -#include <mach/gpio.h>  #include <mach/pxa2xx-regs.h>  #include <mach/mfp-pxa2xx.h> +#include <mach/gpio-pxa.h>  #include "generic.h" diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c index 6d5b7e06212..9a9c539f6c0 100644 --- a/arch/arm/mach-pxa/pcm990-baseboard.c +++ b/arch/arm/mach-pxa/pcm990-baseboard.c @@ -19,7 +19,7 @@   *  it under the terms of the GNU General Public License version 2 as   *  published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/irq.h>  #include <linux/platform_device.h>  #include <linux/i2c.h> @@ -28,7 +28,6 @@  #include <media/soc_camera.h> -#include <asm/gpio.h>  #include <mach/camera.h>  #include <asm/mach/map.h>  #include <mach/pxa27x.h> diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c index 9c434d21a27..8746e1090b6 100644 --- a/arch/arm/mach-pxa/pxa25x.c +++ b/arch/arm/mach-pxa/pxa25x.c @@ -16,6 +16,7 @@   * initialization stuff for PXA machines which can be overridden later if   * need be.   */ +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -23,12 +24,12 @@  #include <linux/suspend.h>  #include <linux/syscore_ops.h>  #include <linux/irq.h> +#include <linux/gpio.h>  #include <asm/mach/map.h>  #include <asm/suspend.h>  #include <mach/hardware.h>  #include <mach/irqs.h> -#include <mach/gpio.h>  #include <mach/pxa25x.h>  #include <mach/reset.h>  #include <mach/pm.h> diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c index 9d2400b5f50..2bb5cf8ba6e 100644 --- a/arch/arm/mach-pxa/pxa27x.c +++ b/arch/arm/mach-pxa/pxa27x.c @@ -11,6 +11,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -20,13 +21,13 @@  #include <linux/io.h>  #include <linux/irq.h>  #include <linux/i2c/pxa-i2c.h> +#include <linux/gpio.h>  #include <asm/mach/map.h>  #include <mach/hardware.h>  #include <asm/irq.h>  #include <asm/suspend.h>  #include <mach/irqs.h> -#include <mach/gpio.h>  #include <mach/pxa27x.h>  #include <mach/reset.h>  #include <mach/ohci.h> diff --git a/arch/arm/mach-pxa/pxa3xx.c b/arch/arm/mach-pxa/pxa3xx.c index b5cd9e5aba3..f940a134553 100644 --- a/arch/arm/mach-pxa/pxa3xx.c +++ b/arch/arm/mach-pxa/pxa3xx.c @@ -12,7 +12,6 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -26,7 +25,7 @@  #include <asm/mach/map.h>  #include <asm/suspend.h>  #include <mach/hardware.h> -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  #include <mach/pxa3xx-regs.h>  #include <mach/reset.h>  #include <mach/ohci.h> diff --git a/arch/arm/mach-pxa/pxa95x.c b/arch/arm/mach-pxa/pxa95x.c index 0ee166b61f8..51371b39d2a 100644 --- a/arch/arm/mach-pxa/pxa95x.c +++ b/arch/arm/mach-pxa/pxa95x.c @@ -9,7 +9,6 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -21,7 +20,7 @@  #include <linux/syscore_ops.h>  #include <mach/hardware.h> -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  #include <mach/pxa3xx-regs.h>  #include <mach/pxa930.h>  #include <mach/reset.h> diff --git a/arch/arm/mach-pxa/saarb.c b/arch/arm/mach-pxa/saarb.c index 5ce340320ab..3c988b6f718 100644 --- a/arch/arm/mach-pxa/saarb.c +++ b/arch/arm/mach-pxa/saarb.c @@ -9,12 +9,13 @@   *  it under the terms of the GNU General Public License version 2 as   *  publishhed by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/kernel.h>  #include <linux/i2c.h>  #include <linux/i2c/pxa-i2c.h>  #include <linux/mfd/88pm860x.h> +#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <asm/mach/arch.h> @@ -23,7 +24,6 @@  #include <mach/hardware.h>  #include <mach/mfp.h>  #include <mach/mfp-pxa930.h> -#include <mach/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-realview/include/mach/gpio.h b/arch/arm/mach-realview/include/mach/gpio.h index 94ff27678a4..40a8c178f10 100644 --- a/arch/arm/mach-realview/include/mach/gpio.h +++ b/arch/arm/mach-realview/include/mach/gpio.h @@ -1,6 +1 @@ -#include <asm-generic/gpio.h> - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq +/* empty */ diff --git a/arch/arm/mach-rpc/include/mach/hardware.h b/arch/arm/mach-rpc/include/mach/hardware.h index dde6b3c0e29..050d63c74cc 100644 --- a/arch/arm/mach-rpc/include/mach/hardware.h +++ b/arch/arm/mach-rpc/include/mach/hardware.h @@ -36,7 +36,7 @@  #define EASI_SIZE		0x08000000	/* EASI I/O */  #define EASI_START		0x08000000 -#define EASI_BASE		0xe5000000 +#define EASI_BASE		IOMEM(0xe5000000)  #define IO_START		0x03000000	/* I/O */  #define IO_SIZE			0x01000000 @@ -51,21 +51,20 @@  /*   * IO Addresses   */ -#define VIDC_BASE		IOMEM(0xe0400000) -#define EXPMASK_BASE		0xe0360000 -#define IOMD_BASE		IOMEM(0xe0200000) -#define IOC_BASE		IOMEM(0xe0200000) -#define PCIO_BASE		IOMEM(0xe0010000) -#define FLOPPYDMA_BASE		IOMEM(0xe002a000) +#define ECARD_EASI_BASE		(EASI_BASE) +#define VIDC_BASE		(IO_BASE + 0x00400000) +#define EXPMASK_BASE		(IO_BASE + 0x00360000) +#define ECARD_IOC4_BASE		(IO_BASE + 0x00270000) +#define ECARD_IOC_BASE		(IO_BASE + 0x00240000) +#define IOMD_BASE		(IO_BASE + 0x00200000) +#define IOC_BASE		(IO_BASE + 0x00200000) +#define ECARD_MEMC8_BASE	(IO_BASE + 0x0002b000) +#define FLOPPYDMA_BASE		(IO_BASE + 0x0002a000) +#define PCIO_BASE		(IO_BASE + 0x00010000) +#define ECARD_MEMC_BASE		(IO_BASE + 0x00000000)  #define vidc_writel(val)	__raw_writel(val, VIDC_BASE) -#define IO_EC_EASI_BASE		0x81400000 -#define IO_EC_IOC4_BASE		0x8009c000 -#define IO_EC_IOC_BASE		0x80090000 -#define IO_EC_MEMC8_BASE	0x8000ac00 -#define IO_EC_MEMC_BASE		0x80000000 -  #define NETSLOT_BASE		0x0302b000  #define NETSLOT_SIZE		0x00001000 diff --git a/arch/arm/mach-rpc/include/mach/io.h b/arch/arm/mach-rpc/include/mach/io.h index 20da7f486e5..695f4ed2e11 100644 --- a/arch/arm/mach-rpc/include/mach/io.h +++ b/arch/arm/mach-rpc/include/mach/io.h @@ -15,195 +15,18 @@  #include <mach/hardware.h> -#define IO_SPACE_LIMIT 0xffffffff +#define IO_SPACE_LIMIT 0xffff  /* - * We use two different types of addressing - PC style addresses, and ARM - * addresses.  PC style accesses the PC hardware with the normal PC IO - * addresses, eg 0x3f8 for serial#1.  ARM addresses are 0x80000000+ - * and are translated to the start of IO.  Note that all addresses are - * shifted left! - */ -#define __PORT_PCIO(x)	(!((x) & 0x80000000)) - -/* - * Dynamic IO functions. - */ -static inline void __outb (unsigned int value, unsigned int port) -{ -	unsigned long temp; -	__asm__ __volatile__( -	"tst	%2, #0x80000000\n\t" -	"mov	%0, %4\n\t" -	"addeq	%0, %0, %3\n\t" -	"strb	%1, [%0, %2, lsl #2]	@ outb" -	: "=&r" (temp) -	: "r" (value), "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE) -	: "cc"); -} - -static inline void __outw (unsigned int value, unsigned int port) -{ -	unsigned long temp; -	__asm__ __volatile__( -	"tst	%2, #0x80000000\n\t" -	"mov	%0, %4\n\t" -	"addeq	%0, %0, %3\n\t" -	"str	%1, [%0, %2, lsl #2]	@ outw" -	: "=&r" (temp) -	: "r" (value|value<<16), "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE) -	: "cc"); -} - -static inline void __outl (unsigned int value, unsigned int port) -{ -	unsigned long temp; -	__asm__ __volatile__( -	"tst	%2, #0x80000000\n\t" -	"mov	%0, %4\n\t" -	"addeq	%0, %0, %3\n\t" -	"str	%1, [%0, %2, lsl #2]	@ outl" -	: "=&r" (temp) -	: "r" (value), "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE) -	: "cc"); -} - -#define DECLARE_DYN_IN(sz,fnsuffix,instr)					\ -static inline unsigned sz __in##fnsuffix (unsigned int port)		\ -{										\ -	unsigned long temp, value;						\ -	__asm__ __volatile__(							\ -	"tst	%2, #0x80000000\n\t"						\ -	"mov	%0, %4\n\t"							\ -	"addeq	%0, %0, %3\n\t"							\ -	"ldr" instr "	%1, [%0, %2, lsl #2]	@ in" #fnsuffix			\ -	: "=&r" (temp), "=r" (value)						\ -	: "r" (port), "Ir" (PCIO_BASE - IO_BASE), "Ir" (IO_BASE)		\ -	: "cc");								\ -	return (unsigned sz)value;						\ -} - -static inline void __iomem *__deprecated __ioaddr(unsigned int port) -{ -	void __iomem *ret; -	if (__PORT_PCIO(port)) -		ret = PCIO_BASE; -	else -		ret = IO_BASE; -	return ret + (port << 2); -} - -#define DECLARE_IO(sz,fnsuffix,instr)	\ -	DECLARE_DYN_IN(sz,fnsuffix,instr) - -DECLARE_IO(char,b,"b") -DECLARE_IO(short,w,"") -DECLARE_IO(int,l,"") - -#undef DECLARE_IO -#undef DECLARE_DYN_IN - -/* - * Constant address IO functions + * We need PC style IO addressing for: + *  - floppy (at 0x3f2,0x3f4,0x3f5,0x3f7) + *  - parport (at 0x278-0x27a, 0x27b-0x27f, 0x778-0x77a) + *  - 8250 serial (only for compile)   * - * These have to be macros for the 'J' constraint to work - - * +/-4096 immediate operand. + * These peripherals are found in an area of MMIO which looks very much + * like an ISA bus, but with registers at the low byte of each word.   */ -#define __outbc(value,port)							\ -({										\ -	if (__PORT_PCIO((port)))						\ -		__asm__ __volatile__(						\ -		"strb	%0, [%1, %2]	@ outbc"				\ -		: : "r" (value), "r" (PCIO_BASE), "Jr" ((port) << 2));		\ -	else									\ -		__asm__ __volatile__(						\ -		"strb	%0, [%1, %2]	@ outbc"				\ -		: : "r" (value), "r" (IO_BASE), "r" ((port) << 2));		\ -}) - -#define __inbc(port)								\ -({										\ -	unsigned char result;							\ -	if (__PORT_PCIO((port)))						\ -		__asm__ __volatile__(						\ -		"ldrb	%0, [%1, %2]	@ inbc"					\ -		: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port) << 2));		\ -	else									\ -		__asm__ __volatile__(						\ -		"ldrb	%0, [%1, %2]	@ inbc"					\ -		: "=r" (result) : "r" (IO_BASE), "r" ((port) << 2));		\ -	result;									\ -}) - -#define __outwc(value,port)							\ -({										\ -	unsigned long __v = value;						\ -	if (__PORT_PCIO((port)))						\ -		__asm__ __volatile__(						\ -		"str	%0, [%1, %2]	@ outwc"				\ -		: : "r" (__v|__v<<16), "r" (PCIO_BASE), "Jr" ((port) << 2));	\ -	else									\ -		__asm__ __volatile__(						\ -		"str	%0, [%1, %2]	@ outwc"				\ -		: : "r" (__v|__v<<16), "r" (IO_BASE), "r" ((port) << 2));		\ -}) - -#define __inwc(port)								\ -({										\ -	unsigned short result;							\ -	if (__PORT_PCIO((port)))						\ -		__asm__ __volatile__(						\ -		"ldr	%0, [%1, %2]	@ inwc"					\ -		: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port) << 2));		\ -	else									\ -		__asm__ __volatile__(						\ -		"ldr	%0, [%1, %2]	@ inwc"					\ -		: "=r" (result) : "r" (IO_BASE), "r" ((port) << 2));		\ -	result & 0xffff;							\ -}) - -#define __outlc(value,port)							\ -({										\ -	unsigned long __v = value;						\ -	if (__PORT_PCIO((port)))						\ -		__asm__ __volatile__(						\ -		"str	%0, [%1, %2]	@ outlc"				\ -		: : "r" (__v), "r" (PCIO_BASE), "Jr" ((port) << 2));		\ -	else									\ -		__asm__ __volatile__(						\ -		"str	%0, [%1, %2]	@ outlc"				\ -		: : "r" (__v), "r" (IO_BASE), "r" ((port) << 2));		\ -}) - -#define __inlc(port)								\ -({										\ -	unsigned long result;							\ -	if (__PORT_PCIO((port)))						\ -		__asm__ __volatile__(						\ -		"ldr	%0, [%1, %2]	@ inlc"					\ -		: "=r" (result) : "r" (PCIO_BASE), "Jr" ((port) << 2));		\ -	else									\ -		__asm__ __volatile__(						\ -		"ldr	%0, [%1, %2]	@ inlc"					\ -		: "=r" (result) : "r" (IO_BASE), "r" ((port) << 2));		\ -	result;									\ -}) - -#define inb(p)	 	(__builtin_constant_p((p)) ? __inbc(p)    : __inb(p)) -#define inw(p)	 	(__builtin_constant_p((p)) ? __inwc(p)    : __inw(p)) -#define inl(p)	 	(__builtin_constant_p((p)) ? __inlc(p)    : __inl(p)) -#define outb(v,p)	(__builtin_constant_p((p)) ? __outbc(v,p) : __outb(v,p)) -#define outw(v,p)	(__builtin_constant_p((p)) ? __outwc(v,p) : __outw(v,p)) -#define outl(v,p)	(__builtin_constant_p((p)) ? __outlc(v,p) : __outl(v,p)) - -/* the following macro is deprecated */ -#define ioaddr(port)	((unsigned long)__ioaddr((port))) - -#define insb(p,d,l)	__raw_readsb(__ioaddr(p),d,l) -#define insw(p,d,l)	__raw_readsw(__ioaddr(p),d,l) - -#define outsb(p,d,l)	__raw_writesb(__ioaddr(p),d,l) -#define outsw(p,d,l)	__raw_writesw(__ioaddr(p),d,l) +#define __io(a)		(PCIO_BASE + ((a) << 2))  /*   * 1:1 mapping for ioremapped regions. diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c index a9241eb8772..8559598ab76 100644 --- a/arch/arm/mach-rpc/riscpc.c +++ b/arch/arm/mach-rpc/riscpc.c @@ -74,7 +74,7 @@ static struct map_desc rpc_io_desc[] __initdata = {  		.length		= 	IO_SIZE	 ,  		.type		= MT_DEVICE  	}, {	/* EASI space	*/ -		.virtual	= EASI_BASE, +		.virtual	= (unsigned long)EASI_BASE,  		.pfn		= __phys_to_pfn(EASI_START),  		.length		= EASI_SIZE,  		.type		= MT_DEVICE diff --git a/arch/arm/mach-s3c2410/include/mach/gpio.h b/arch/arm/mach-s3c2410/include/mach/gpio.h index f7f6b07df30..6fac70f3484 100644 --- a/arch/arm/mach-s3c2410/include/mach/gpio.h +++ b/arch/arm/mach-s3c2410/include/mach/gpio.h @@ -11,11 +11,6 @@   * published by the Free Software Foundation.  */ -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq -  /* some boards require extra gpio capacity to support external   * devices that need GPIO.   */ @@ -28,7 +23,6 @@  #define ARCH_NR_GPIOS	(256 + CONFIG_S3C24XX_GPIO_EXTRA)  #endif -#include <asm-generic/gpio.h>  #include <mach/gpio-nrs.h>  #include <mach/gpio-fns.h> diff --git a/arch/arm/mach-s3c2410/include/mach/h1940-latch.h b/arch/arm/mach-s3c2410/include/mach/h1940-latch.h index 97e42bfce81..fc897d3a056 100644 --- a/arch/arm/mach-s3c2410/include/mach/h1940-latch.h +++ b/arch/arm/mach-s3c2410/include/mach/h1940-latch.h @@ -14,7 +14,7 @@  #ifndef __ASM_ARCH_H1940_LATCH_H  #define __ASM_ARCH_H1940_LATCH_H -#include <mach/gpio.h> +#include <asm/gpio.h>  #define H1940_LATCH_GPIO(x)		(S3C_GPIO_END + (x)) diff --git a/arch/arm/mach-s3c2410/include/mach/io.h b/arch/arm/mach-s3c2410/include/mach/io.h index 9813dbf2ae4..118749f37c4 100644 --- a/arch/arm/mach-s3c2410/include/mach/io.h +++ b/arch/arm/mach-s3c2410/include/mach/io.h @@ -199,8 +199,6 @@ DECLARE_IO(int,l,"")  #define outw(v,p)	(__builtin_constant_p((p)) ? __outwc(v,p) : __outw(v,p))  #define outl(v,p)	(__builtin_constant_p((p)) ? __outlc(v,p) : __outl(v,p))  #define __ioaddr(p)	(__builtin_constant_p((p)) ? __ioaddr(p)  : __ioaddrc(p)) -/* the following macro is deprecated */ -#define ioaddr(port)	__ioaddr((port))  #define insb(p,d,l)	__raw_readsb(__ioaddr(p),d,l)  #define insw(p,d,l)	__raw_readsw(__ioaddr(p),d,l) diff --git a/arch/arm/mach-s3c64xx/include/mach/gpio.h b/arch/arm/mach-s3c64xx/include/mach/gpio.h index 0d46e994048..6e34c2f6e67 100644 --- a/arch/arm/mach-s3c64xx/include/mach/gpio.h +++ b/arch/arm/mach-s3c64xx/include/mach/gpio.h @@ -12,11 +12,6 @@   * published by the Free Software Foundation.  */ -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq -  /* GPIO bank sizes */  #define S3C64XX_GPIO_A_NR	(8)  #define S3C64XX_GPIO_B_NR	(7) @@ -96,5 +91,3 @@ enum s3c_gpio_number {  #define BOARD_NR_GPIOS 16  #define ARCH_NR_GPIOS	(GPIO_BOARD_START + BOARD_NR_GPIOS) - -#include <asm-generic/gpio.h> diff --git a/arch/arm/mach-s5p64x0/include/mach/gpio.h b/arch/arm/mach-s5p64x0/include/mach/gpio.h index adb5f298ead..06cd3c9b16a 100644 --- a/arch/arm/mach-s5p64x0/include/mach/gpio.h +++ b/arch/arm/mach-s5p64x0/include/mach/gpio.h @@ -13,11 +13,6 @@  #ifndef __ASM_ARCH_GPIO_H  #define __ASM_ARCH_GPIO_H __FILE__ -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq -  /* GPIO bank sizes */  #define S5P6440_GPIO_A_NR	(6) @@ -134,6 +129,4 @@ enum s5p6450_gpio_number {  #define ARCH_NR_GPIOS		(S5P64X0_GPIO_END + CONFIG_SAMSUNG_GPIO_EXTRA) -#include <asm-generic/gpio.h> -  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-s5pc100/include/mach/gpio.h b/arch/arm/mach-s5pc100/include/mach/gpio.h index 29a8a12d9b4..5e1a924b595 100644 --- a/arch/arm/mach-s5pc100/include/mach/gpio.h +++ b/arch/arm/mach-s5pc100/include/mach/gpio.h @@ -15,11 +15,6 @@  #ifndef __ASM_ARCH_GPIO_H  #define __ASM_ARCH_GPIO_H __FILE__ -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq -  /* GPIO bank sizes */  #define S5PC100_GPIO_A0_NR	(8)  #define S5PC100_GPIO_A1_NR	(5) @@ -146,6 +141,4 @@ enum s5p_gpio_number {  /* define the number of gpios we need to the one after the MP04() range */  #define ARCH_NR_GPIOS		(S5PC100_GPIO_END + 1) -#include <asm-generic/gpio.h> -  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-s5pv210/include/mach/gpio.h b/arch/arm/mach-s5pv210/include/mach/gpio.h index a5a1e331f8e..6c8b903c02e 100644 --- a/arch/arm/mach-s5pv210/include/mach/gpio.h +++ b/arch/arm/mach-s5pv210/include/mach/gpio.h @@ -13,11 +13,6 @@  #ifndef __ASM_ARCH_GPIO_H  #define __ASM_ARCH_GPIO_H __FILE__ -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq -  /* Practically, GPIO banks up to MP03 are the configurable gpio banks */  /* GPIO bank sizes */ @@ -142,6 +137,4 @@ enum s5p_gpio_number {  #define ARCH_NR_GPIOS		(S5PV210_MP05(S5PV210_GPIO_MP05_NR) +	\  				 CONFIG_SAMSUNG_GPIO_EXTRA + 1) -#include <asm-generic/gpio.h> -  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-sa1100/Makefile b/arch/arm/mach-sa1100/Makefile index 41252d22e65..73a5c643179 100644 --- a/arch/arm/mach-sa1100/Makefile +++ b/arch/arm/mach-sa1100/Makefile @@ -3,7 +3,7 @@  #  # Common support -obj-y := clock.o generic.o gpio.o irq.o dma.o time.o #nmi-oopser.o +obj-y := clock.o generic.o irq.o dma.o time.o #nmi-oopser.o  obj-m :=  obj-n :=  obj-  := diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c index e21f3470eec..5fa5ae1f39e 100644 --- a/arch/arm/mach-sa1100/generic.c +++ b/arch/arm/mach-sa1100/generic.c @@ -9,6 +9,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -24,7 +25,6 @@  #include <asm/mach/map.h>  #include <asm/mach/flash.h>  #include <asm/irq.h> -#include <asm/gpio.h>  #include "generic.h" diff --git a/arch/arm/mach-sa1100/include/mach/gpio.h b/arch/arm/mach-sa1100/include/mach/gpio.h index 7befc104e9a..703631887c9 100644 --- a/arch/arm/mach-sa1100/include/mach/gpio.h +++ b/arch/arm/mach-sa1100/include/mach/gpio.h @@ -28,6 +28,8 @@  #include <asm/irq.h>  #include <asm-generic/gpio.h> +#define __ARM_GPIOLIB_COMPLEX +  static inline int gpio_get_value(unsigned gpio)  {  	if (__builtin_constant_p(gpio) && (gpio <= GPIO_MAX)) @@ -51,7 +53,5 @@ static inline void gpio_set_value(unsigned gpio, int value)  #define gpio_to_irq(gpio)	((gpio < 11) ? (IRQ_GPIO0 + gpio) : \  					(IRQ_GPIO11 - 11 + gpio)) -#define irq_to_gpio(irq)	((irq < IRQ_GPIO11_27) ? (irq - IRQ_GPIO0) : \ -					(irq - IRQ_GPIO11 + 11))  #endif diff --git a/arch/arm/mach-sa1100/include/mach/io.h b/arch/arm/mach-sa1100/include/mach/io.h index d8b43f3dcd2..dfc27ff0834 100644 --- a/arch/arm/mach-sa1100/include/mach/io.h +++ b/arch/arm/mach-sa1100/include/mach/io.h @@ -10,11 +10,9 @@  #ifndef __ASM_ARM_ARCH_IO_H  #define __ASM_ARM_ARCH_IO_H -#define IO_SPACE_LIMIT 0xffffffff -  /* - * We don't actually have real ISA nor PCI buses, but there is so many  - * drivers out there that might just work if we fake them... + * __io() is required to be an equivalent mapping to __mem_pci() for + * SOC_COMMON to work.   */  #define __io(a)		__typesafe_io(a)  #define __mem_pci(a)	(a) diff --git a/arch/arm/mach-shmobile/include/mach/gpio.h b/arch/arm/mach-shmobile/include/mach/gpio.h index 2b1bb9e43dd..7bf0890e16b 100644 --- a/arch/arm/mach-shmobile/include/mach/gpio.h +++ b/arch/arm/mach-shmobile/include/mach/gpio.h @@ -18,31 +18,15 @@  #ifdef CONFIG_GPIOLIB -static inline int gpio_get_value(unsigned gpio) -{ -	return __gpio_get_value(gpio); -} - -static inline void gpio_set_value(unsigned gpio, int value) -{ -	__gpio_set_value(gpio, value); -} - -static inline int gpio_cansleep(unsigned gpio) -{ -	return __gpio_cansleep(gpio); -} - -static inline int gpio_to_irq(unsigned gpio) -{ -	return __gpio_to_irq(gpio); -} -  static inline int irq_to_gpio(unsigned int irq)  {  	return -ENOSYS;  } +#else + +#define __ARM_GPIOLIB_COMPLEX +  #endif /* CONFIG_GPIOLIB */  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-tegra/board-harmony-pcie.c b/arch/arm/mach-tegra/board-harmony-pcie.c index 9c27b95b8d8..6db7d699ef1 100644 --- a/arch/arm/mach-tegra/board-harmony-pcie.c +++ b/arch/arm/mach-tegra/board-harmony-pcie.c @@ -24,12 +24,10 @@  #include <mach/pinmux.h>  #include "board.h" +#include "board-harmony.h"  #ifdef CONFIG_TEGRA_PCI -/* GPIO 3 of the PMIC */ -#define EN_VDD_1V05_GPIO	(TEGRA_NR_GPIOS + 2) -  static int __init harmony_pcie_init(void)  {  	struct regulator *regulator = NULL; @@ -38,11 +36,11 @@ static int __init harmony_pcie_init(void)  	if (!machine_is_harmony())  		return 0; -	err = gpio_request(EN_VDD_1V05_GPIO, "EN_VDD_1V05"); +	err = gpio_request(TEGRA_GPIO_EN_VDD_1V05_GPIO, "EN_VDD_1V05");  	if (err)  		return err; -	gpio_direction_output(EN_VDD_1V05_GPIO, 1); +	gpio_direction_output(TEGRA_GPIO_EN_VDD_1V05_GPIO, 1);  	regulator = regulator_get(NULL, "pex_clk");  	if (IS_ERR_OR_NULL(regulator)) @@ -68,7 +66,7 @@ err_pcie:  	regulator_disable(regulator);  	regulator_put(regulator);  err_reg: -	gpio_free(EN_VDD_1V05_GPIO); +	gpio_free(TEGRA_GPIO_EN_VDD_1V05_GPIO);  	return err;  } diff --git a/arch/arm/mach-tegra/board-harmony.h b/arch/arm/mach-tegra/board-harmony.h index d85142edaf6..139d96c9384 100644 --- a/arch/arm/mach-tegra/board-harmony.h +++ b/arch/arm/mach-tegra/board-harmony.h @@ -17,6 +17,8 @@  #ifndef _MACH_TEGRA_BOARD_HARMONY_H  #define _MACH_TEGRA_BOARD_HARMONY_H +#include <mach/gpio-tegra.h> +  #define HARMONY_GPIO_TPS6586X(_x_)	(TEGRA_NR_GPIOS + (_x_))  #define HARMONY_GPIO_WM8903(_x_)	(HARMONY_GPIO_TPS6586X(4) + (_x_)) @@ -31,6 +33,7 @@  #define TEGRA_GPIO_HP_DET		TEGRA_GPIO_PW2  #define TEGRA_GPIO_INT_MIC_EN		TEGRA_GPIO_PX0  #define TEGRA_GPIO_EXT_MIC_EN		TEGRA_GPIO_PX1 +#define TEGRA_GPIO_EN_VDD_1V05_GPIO	HARMONY_GPIO_TPS6586X(2)  void harmony_pinmux_init(void);  int harmony_regulator_init(void); diff --git a/arch/arm/mach-tegra/board-paz00.h b/arch/arm/mach-tegra/board-paz00.h index d4ff39ddaeb..42ce8639b90 100644 --- a/arch/arm/mach-tegra/board-paz00.h +++ b/arch/arm/mach-tegra/board-paz00.h @@ -17,6 +17,8 @@  #ifndef _MACH_TEGRA_BOARD_PAZ00_H  #define _MACH_TEGRA_BOARD_PAZ00_H +#include <mach/gpio-tegra.h> +  #define TEGRA_GPIO_SD1_CD		TEGRA_GPIO_PV5  #define TEGRA_GPIO_SD1_WP		TEGRA_GPIO_PH1  #define TEGRA_GPIO_SD1_POWER		TEGRA_GPIO_PT3 diff --git a/arch/arm/mach-tegra/board-seaboard.h b/arch/arm/mach-tegra/board-seaboard.h index d8415e1a843..15b6c57361b 100644 --- a/arch/arm/mach-tegra/board-seaboard.h +++ b/arch/arm/mach-tegra/board-seaboard.h @@ -17,6 +17,8 @@  #ifndef _MACH_TEGRA_BOARD_SEABOARD_H  #define _MACH_TEGRA_BOARD_SEABOARD_H +#include <mach/gpio-tegra.h> +  #define TEGRA_GPIO_SD2_CD		TEGRA_GPIO_PI5  #define TEGRA_GPIO_SD2_WP		TEGRA_GPIO_PH1  #define TEGRA_GPIO_SD2_POWER		TEGRA_GPIO_PI6 diff --git a/arch/arm/mach-tegra/board-trimslice-pinmux.c b/arch/arm/mach-tegra/board-trimslice-pinmux.c index 47c596cdbf3..bcb1916e68b 100644 --- a/arch/arm/mach-tegra/board-trimslice-pinmux.c +++ b/arch/arm/mach-tegra/board-trimslice-pinmux.c @@ -13,12 +13,11 @@   * GNU General Public License for more details.   *   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <mach/pinmux.h> -#include <mach/gpio.h>  #include "gpio-names.h"  #include "board-trimslice.h" diff --git a/arch/arm/mach-tegra/board-trimslice.h b/arch/arm/mach-tegra/board-trimslice.h index 7a7dee86b4d..50f128d8777 100644 --- a/arch/arm/mach-tegra/board-trimslice.h +++ b/arch/arm/mach-tegra/board-trimslice.h @@ -17,6 +17,8 @@  #ifndef _MACH_TEGRA_BOARD_TRIMSLICE_H  #define _MACH_TEGRA_BOARD_TRIMSLICE_H +#include <mach/gpio-tegra.h> +  #define TRIMSLICE_GPIO_SD4_CD	TEGRA_GPIO_PP1	/* mmc4 cd */  #define TRIMSLICE_GPIO_SD4_WP	TEGRA_GPIO_PP2	/* mmc4 wp */ diff --git a/arch/arm/mach-tegra/include/mach/gpio-tegra.h b/arch/arm/mach-tegra/include/mach/gpio-tegra.h new file mode 100644 index 00000000000..87d37fdf508 --- /dev/null +++ b/arch/arm/mach-tegra/include/mach/gpio-tegra.h @@ -0,0 +1,39 @@ +/* + * arch/arm/mach-tegra/include/mach/gpio.h + * + * Copyright (C) 2010 Google, Inc. + * + * Author: + *	Erik Gilling <konkers@google.com> + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + */ + +#ifndef __MACH_TEGRA_GPIO_TEGRA_H +#define __MACH_TEGRA_GPIO_TEGRA_H + +#include <linux/types.h> +#include <mach/irqs.h> + +#define TEGRA_NR_GPIOS		INT_GPIO_NR + +#define TEGRA_GPIO_TO_IRQ(gpio) (INT_GPIO_BASE + (gpio)) + +struct tegra_gpio_table { +	int	gpio;	/* GPIO number */ +	bool	enable;	/* Enable for GPIO at init? */ +}; + +void tegra_gpio_config(struct tegra_gpio_table *table, int num); +void tegra_gpio_enable(int gpio); +void tegra_gpio_disable(int gpio); + +#endif diff --git a/arch/arm/mach-tegra/include/mach/gpio.h b/arch/arm/mach-tegra/include/mach/gpio.h index 196f114dc24..e69de29bb2d 100644 --- a/arch/arm/mach-tegra/include/mach/gpio.h +++ b/arch/arm/mach-tegra/include/mach/gpio.h @@ -1,60 +0,0 @@ -/* - * arch/arm/mach-tegra/include/mach/gpio.h - * - * Copyright (C) 2010 Google, Inc. - * - * Author: - *	Erik Gilling <konkers@google.com> - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - */ - -#ifndef __MACH_TEGRA_GPIO_H -#define __MACH_TEGRA_GPIO_H - -#include <linux/init.h> -#include <mach/irqs.h> - -#define TEGRA_NR_GPIOS		INT_GPIO_NR - -#include <asm-generic/gpio.h> - -#define gpio_get_value		__gpio_get_value -#define gpio_set_value		__gpio_set_value -#define gpio_cansleep		__gpio_cansleep - -#define TEGRA_GPIO_TO_IRQ(gpio) (INT_GPIO_BASE + (gpio)) -#define TEGRA_IRQ_TO_GPIO(irq) ((irq) - INT_GPIO_BASE) - -static inline int gpio_to_irq(unsigned int gpio) -{ -	if (gpio < TEGRA_NR_GPIOS) -		return INT_GPIO_BASE + gpio; -	return -EINVAL; -} - -static inline int irq_to_gpio(unsigned int irq) -{ -	if ((irq >= INT_GPIO_BASE) && (irq < INT_GPIO_BASE + INT_GPIO_NR)) -		return irq - INT_GPIO_BASE; -	return -EINVAL; -} - -struct tegra_gpio_table { -	int	gpio;	/* GPIO number */ -	bool	enable;	/* Enable for GPIO at init? */ -}; - -void tegra_gpio_config(struct tegra_gpio_table *table, int num); -void tegra_gpio_enable(int gpio); -void tegra_gpio_disable(int gpio); - -#endif diff --git a/arch/arm/mach-tegra/usb_phy.c b/arch/arm/mach-tegra/usb_phy.c index 88081bb3ec5..37576a721ae 100644 --- a/arch/arm/mach-tegra/usb_phy.c +++ b/arch/arm/mach-tegra/usb_phy.c @@ -28,6 +28,7 @@  #include <linux/usb/otg.h>  #include <linux/usb/ulpi.h>  #include <asm/mach-types.h> +#include <mach/gpio-tegra.h>  #include <mach/usb_phy.h>  #include <mach/iomap.h> diff --git a/arch/arm/mach-u300/Kconfig b/arch/arm/mach-u300/Kconfig index 32a7b0f7e9f..7b5c229dc7e 100644 --- a/arch/arm/mach-u300/Kconfig +++ b/arch/arm/mach-u300/Kconfig @@ -6,6 +6,7 @@ comment "ST-Ericsson Mobile Platform Products"  config MACH_U300  	bool "U300" +	select GPIO_U300  comment "ST-Ericsson U300/U330/U335/U365 Feature Selections" diff --git a/arch/arm/mach-u300/core.c b/arch/arm/mach-u300/core.c index 376b6dfdfae..22c5ab79a74 100644 --- a/arch/arm/mach-u300/core.c +++ b/arch/arm/mach-u300/core.c @@ -38,6 +38,7 @@  #include <mach/hardware.h>  #include <mach/syscon.h>  #include <mach/dma_channels.h> +#include <mach/gpio-u300.h>  #include "clock.h"  #include "mmc.h" @@ -242,7 +243,7 @@ static struct resource gpio_resources[] = {  		.end   = IRQ_U300_GPIO_PORT2,  		.flags = IORESOURCE_IRQ,  	}, -#ifdef U300_COH901571_3 +#if defined(CONFIG_MACH_U300_BS365) || defined(CONFIG_MACH_U300_BS335)  	{  		.name  = "gpio3",  		.start = IRQ_U300_GPIO_PORT3, @@ -255,6 +256,7 @@ static struct resource gpio_resources[] = {  		.end   = IRQ_U300_GPIO_PORT4,  		.flags = IORESOURCE_IRQ,  	}, +#endif  #ifdef CONFIG_MACH_U300_BS335  	{  		.name  = "gpio5", @@ -269,7 +271,6 @@ static struct resource gpio_resources[] = {  		.flags = IORESOURCE_IRQ,  	},  #endif /* CONFIG_MACH_U300_BS335 */ -#endif /* U300_COH901571_3 */  };  static struct resource keypad_resources[] = { @@ -1559,11 +1560,35 @@ static struct platform_device i2c1_device = {  	.resource = i2c1_resources,  }; +/* + * The different variants have a few different versions of the + * GPIO block, with different number of ports. + */ +static struct u300_gpio_platform u300_gpio_plat = { +#if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330) +	.variant = U300_GPIO_COH901335, +	.ports = 3, +#endif +#ifdef CONFIG_MACH_U300_BS335 +	.variant = U300_GPIO_COH901571_3_BS335, +	.ports = 7, +#endif +#ifdef CONFIG_MACH_U300_BS365 +	.variant = U300_GPIO_COH901571_3_BS365, +	.ports = 5, +#endif +	.gpio_base = 0, +	.gpio_irq_base = IRQ_U300_GPIO_BASE, +}; +  static struct platform_device gpio_device = {  	.name = "u300-gpio",  	.id = -1,  	.num_resources = ARRAY_SIZE(gpio_resources),  	.resource = gpio_resources, +	.dev = { +		.platform_data = &u300_gpio_plat, +	},  };  static struct platform_device keypad_device = { @@ -1669,7 +1694,7 @@ void __init u300_init_irq(void)  	BUG_ON(IS_ERR(clk));  	clk_enable(clk); -	for (i = 0; i < NR_IRQS; i++) +	for (i = 0; i < U300_VIC_IRQS_END; i++)  		set_bit(i, (unsigned long *) &mask[0]);  	vic_init((void __iomem *) U300_INTCON0_VBASE, 0, mask[0], mask[0]);  	vic_init((void __iomem *) U300_INTCON1_VBASE, 32, mask[1], mask[1]); diff --git a/arch/arm/mach-u300/include/mach/gpio-u300.h b/arch/arm/mach-u300/include/mach/gpio-u300.h new file mode 100644 index 00000000000..0c2b2021951 --- /dev/null +++ b/arch/arm/mach-u300/include/mach/gpio-u300.h @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2007-2011 ST-Ericsson AB + * License terms: GNU General Public License (GPL) version 2 + * GPIO block resgister definitions and inline macros for + * U300 GPIO COH 901 335 or COH 901 571/3 + * Author: Linus Walleij <linus.walleij@stericsson.com> + */ + +#ifndef __MACH_U300_GPIO_U300_H +#define __MACH_U300_GPIO_U300_H + +/* + * Individual pin assignments for the B26/S26. Notice that the + * actual usage of these pins depends on the PAD MUX settings, that + * is why the same number can potentially appear several times. + * In the reference design each pin is only used for one purpose. + * These were determined by inspecting the B26/S26 schematic: + * 2/1911-ROA 128 1603 + */ +#ifdef CONFIG_MACH_U300_BS2X +#define U300_GPIO_PIN_UART_RX		0 +#define U300_GPIO_PIN_UART_TX		1 +#define U300_GPIO_PIN_GPIO02		2  /* Unrouted */ +#define U300_GPIO_PIN_GPIO03		3  /* Unrouted */ +#define U300_GPIO_PIN_CAM_SLEEP		4 +#define U300_GPIO_PIN_CAM_REG_EN	5 +#define U300_GPIO_PIN_GPIO06		6  /* Unrouted */ +#define U300_GPIO_PIN_GPIO07		7  /* Unrouted */ + +#define U300_GPIO_PIN_GPIO08		8  /* Service point SP2321 */ +#define U300_GPIO_PIN_GPIO09		9  /* Service point SP2322 */ +#define U300_GPIO_PIN_PHFSENSE		10 /* Headphone jack sensing */ +#define U300_GPIO_PIN_MMC_CLKRET	11 /* Clock return from MMC/SD card */ +#define U300_GPIO_PIN_MMC_CD		12 /* MMC Card insertion detection */ +#define U300_GPIO_PIN_FLIPSENSE		13 /* Mechanical flip sensing */ +#define U300_GPIO_PIN_GPIO14		14 /* DSP JTAG Port RTCK */ +#define U300_GPIO_PIN_GPIO15		15 /* Unrouted */ + +#define U300_GPIO_PIN_GPIO16		16 /* Unrouted */ +#define U300_GPIO_PIN_GPIO17		17 /* Unrouted */ +#define U300_GPIO_PIN_GPIO18		18 /* Unrouted */ +#define U300_GPIO_PIN_GPIO19		19 /* Unrouted */ +#define U300_GPIO_PIN_GPIO20		20 /* Unrouted */ +#define U300_GPIO_PIN_GPIO21		21 /* Unrouted */ +#define U300_GPIO_PIN_GPIO22		22 /* Unrouted */ +#define U300_GPIO_PIN_GPIO23		23 /* Unrouted */ +#endif + +/* + * Individual pin assignments for the B330/S330 and B365/S365. + * Notice that the actual usage of these pins depends on the + * PAD MUX settings, that is why the same number can potentially + * appear several times. In the reference design each pin is only + * used for one purpose. These were determined by inspecting the + * S365 schematic. + */ +#if defined(CONFIG_MACH_U300_BS330) || defined(CONFIG_MACH_U300_BS365) || \ +    defined(CONFIG_MACH_U300_BS335) +#define U300_GPIO_PIN_UART_RX		0 +#define U300_GPIO_PIN_UART_TX		1 +#define U300_GPIO_PIN_UART_CTS		2 +#define U300_GPIO_PIN_UART_RTS		3 +#define U300_GPIO_PIN_CAM_MAIN_STANDBY	4 /* Camera MAIN standby */ +#define U300_GPIO_PIN_GPIO05		5 /* Unrouted */ +#define U300_GPIO_PIN_MS_CD		6 /* Memory Stick Card insertion */ +#define U300_GPIO_PIN_GPIO07		7 /* Test point TP2430 */ + +#define U300_GPIO_PIN_GPIO08		8 /* Test point TP2437 */ +#define U300_GPIO_PIN_GPIO09		9 /* Test point TP2431 */ +#define U300_GPIO_PIN_GPIO10		10 /* Test point TP2432 */ +#define U300_GPIO_PIN_MMC_CLKRET	11 /* Clock return from MMC/SD card */ +#define U300_GPIO_PIN_MMC_CD		12 /* MMC Card insertion detection */ +#define U300_GPIO_PIN_CAM_SUB_STANDBY	13 /* Camera SUB standby */ +#define U300_GPIO_PIN_GPIO14		14 /* Test point TP2436 */ +#define U300_GPIO_PIN_GPIO15		15 /* Unrouted */ + +#define U300_GPIO_PIN_GPIO16		16 /* Test point TP2438 */ +#define U300_GPIO_PIN_PHFSENSE		17 /* Headphone jack sensing */ +#define U300_GPIO_PIN_GPIO18		18 /* Test point TP2439 */ +#define U300_GPIO_PIN_GPIO19		19 /* Routed somewhere */ +#define U300_GPIO_PIN_GPIO20		20 /* Unrouted */ +#define U300_GPIO_PIN_GPIO21		21 /* Unrouted */ +#define U300_GPIO_PIN_GPIO22		22 /* Unrouted */ +#define U300_GPIO_PIN_GPIO23		23 /* Unrouted */ + +#define U300_GPIO_PIN_GPIO24		24 /* Unrouted */ +#define U300_GPIO_PIN_GPIO25		25 /* Unrouted */ +#define U300_GPIO_PIN_GPIO26		26 /* Unrouted */ +#define U300_GPIO_PIN_GPIO27		27 /* Unrouted */ +#define U300_GPIO_PIN_GPIO28		28 /* Unrouted */ +#define U300_GPIO_PIN_GPIO29		29 /* Unrouted */ +#define U300_GPIO_PIN_GPIO30		30 /* Unrouted */ +#define U300_GPIO_PIN_GPIO31		31 /* Unrouted */ + +#define U300_GPIO_PIN_GPIO32		32 /* Unrouted */ +#define U300_GPIO_PIN_GPIO33		33 /* Unrouted */ +#define U300_GPIO_PIN_GPIO34		34 /* Unrouted */ +#define U300_GPIO_PIN_GPIO35		35 /* Unrouted */ +#define U300_GPIO_PIN_GPIO36		36 /* Unrouted */ +#define U300_GPIO_PIN_GPIO37		37 /* Unrouted */ +#define U300_GPIO_PIN_GPIO38		38 /* Unrouted */ +#define U300_GPIO_PIN_GPIO39		39 /* Unrouted */ + +#ifdef CONFIG_MACH_U300_BS335 + +#define U300_GPIO_PIN_GPIO40		40 /* Unrouted */ +#define U300_GPIO_PIN_GPIO41		41 /* Unrouted */ +#define U300_GPIO_PIN_GPIO42		42 /* Unrouted */ +#define U300_GPIO_PIN_GPIO43		43 /* Unrouted */ +#define U300_GPIO_PIN_GPIO44		44 /* Unrouted */ +#define U300_GPIO_PIN_GPIO45		45 /* Unrouted */ +#define U300_GPIO_PIN_GPIO46		46 /* Unrouted */ +#define U300_GPIO_PIN_GPIO47		47 /* Unrouted */ + +#define U300_GPIO_PIN_GPIO48		48 /* Unrouted */ +#define U300_GPIO_PIN_GPIO49		49 /* Unrouted */ +#define U300_GPIO_PIN_GPIO50		50 /* Unrouted */ +#define U300_GPIO_PIN_GPIO51		51 /* Unrouted */ +#define U300_GPIO_PIN_GPIO52		52 /* Unrouted */ +#define U300_GPIO_PIN_GPIO53		53 /* Unrouted */ +#define U300_GPIO_PIN_GPIO54		54 /* Unrouted */ +#define U300_GPIO_PIN_GPIO55		55 /* Unrouted */ +#endif + +#endif + +/** + * enum u300_gpio_variant - the type of U300 GPIO employed + */ +enum u300_gpio_variant { +	U300_GPIO_COH901335, +	U300_GPIO_COH901571_3_BS335, +	U300_GPIO_COH901571_3_BS365, +}; + +/** + * struct u300_gpio_platform - U300 GPIO platform data + * @variant: IP block variant + * @ports: number of GPIO block ports + * @gpio_base: first GPIO number for this block (use a free range) + * @gpio_irq_base: first GPIO IRQ number for this block (use a free range) + */ +struct u300_gpio_platform { +	enum u300_gpio_variant variant; +	u8 ports; +	int gpio_base; +	int gpio_irq_base; +}; + +#endif /* __MACH_U300_GPIO_U300_H */ diff --git a/arch/arm/mach-u300/include/mach/gpio.h b/arch/arm/mach-u300/include/mach/gpio.h index d5a71abcbae..e69de29bb2d 100644 --- a/arch/arm/mach-u300/include/mach/gpio.h +++ b/arch/arm/mach-u300/include/mach/gpio.h @@ -1,294 +0,0 @@ -/* - * - * arch/arm/mach-u300/include/mach/gpio.h - * - * - * Copyright (C) 2007-2009 ST-Ericsson AB - * License terms: GNU General Public License (GPL) version 2 - * GPIO block resgister definitions and inline macros for - * U300 GPIO COH 901 335 or COH 901 571/3 - * Author: Linus Walleij <linus.walleij@stericsson.com> - */ - -#ifndef __MACH_U300_GPIO_H -#define __MACH_U300_GPIO_H - -#include <linux/kernel.h> -#include <linux/io.h> -#include <mach/hardware.h> -#include <asm/irq.h> - -/* Switch type depending on platform/chip variant */ -#if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330) -#define U300_COH901335 -#endif -#if defined(CONFIG_MACH_U300_BS365) || defined(CONFIG_MACH_U300_BS335) -#define U300_COH901571_3 -#endif - -/* Get base address for regs here */ -#include "u300-regs.h" -/* IRQ numbers */ -#include "irqs.h" - -/* - * This is the GPIO block definitions. GPIO (General Purpose I/O) can be - * used for anything, and often is. The event/enable etc figures are for - * the lowermost pin (pin 0 on each port), shift this left to match your - * pin if you're gonna use these values. - */ -#ifdef U300_COH901335 -#define U300_GPIO_PORTX_SPACING				(0x1C) -/* Port X Pin Data Register 32bit, this is both input and output (R/W) */ -#define U300_GPIO_PXPDIR				(0x00) -#define U300_GPIO_PXPDOR				(0x00) -/* Port X Pin Config Register 32bit (R/W) */ -#define U300_GPIO_PXPCR					(0x04) -#define U300_GPIO_PXPCR_ALL_PINS_MODE_MASK		(0x0000FFFFUL) -#define U300_GPIO_PXPCR_PIN_MODE_MASK			(0x00000003UL) -#define U300_GPIO_PXPCR_PIN_MODE_SHIFT			(0x00000002UL) -#define U300_GPIO_PXPCR_PIN_MODE_INPUT			(0x00000000UL) -#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL	(0x00000001UL) -#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_DRAIN	(0x00000002UL) -#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_SOURCE	(0x00000003UL) -/* Port X Interrupt Event Register 32bit (R/W) */ -#define U300_GPIO_PXIEV					(0x08) -#define U300_GPIO_PXIEV_ALL_IRQ_EVENT_MASK		(0x000000FFUL) -#define U300_GPIO_PXIEV_IRQ_EVENT			(0x00000001UL) -/* Port X Interrupt Enable Register 32bit (R/W) */ -#define U300_GPIO_PXIEN					(0x0C) -#define U300_GPIO_PXIEN_ALL_IRQ_ENABLE_MASK		(0x000000FFUL) -#define U300_GPIO_PXIEN_IRQ_ENABLE			(0x00000001UL) -/* Port X Interrupt Force Register 32bit (R/W) */ -#define U300_GPIO_PXIFR					(0x10) -#define U300_GPIO_PXIFR_ALL_IRQ_FORCE_MASK		(0x000000FFUL) -#define U300_GPIO_PXIFR_IRQ_FORCE			(0x00000001UL) -/* Port X Interrupt Config Register 32bit (R/W) */ -#define U300_GPIO_PXICR					(0x14) -#define U300_GPIO_PXICR_ALL_IRQ_CONFIG_MASK		(0x000000FFUL) -#define U300_GPIO_PXICR_IRQ_CONFIG_MASK			(0x00000001UL) -#define U300_GPIO_PXICR_IRQ_CONFIG_FALLING_EDGE		(0x00000000UL) -#define U300_GPIO_PXICR_IRQ_CONFIG_RISING_EDGE		(0x00000001UL) -/* Port X Pull-up Enable Register 32bit (R/W) */ -#define U300_GPIO_PXPER					(0x18) -#define U300_GPIO_PXPER_ALL_PULL_UP_DISABLE_MASK	(0x000000FFUL) -#define U300_GPIO_PXPER_PULL_UP_DISABLE			(0x00000001UL) -/* Control Register 32bit (R/W) */ -#define U300_GPIO_CR					(0x54) -#define U300_GPIO_CR_BLOCK_CLOCK_ENABLE			(0x00000001UL) -/* three ports of 8 bits each = GPIO pins 0..23 */ -#define U300_GPIO_NUM_PORTS 3 -#define U300_GPIO_PINS_PER_PORT 8 -#define U300_GPIO_MAX	(U300_GPIO_PINS_PER_PORT * U300_GPIO_NUM_PORTS - 1) -#endif - -#ifdef U300_COH901571_3 -/* - * Control Register 32bit (R/W) - * bit 15-9 (mask 0x0000FE00) contains the number of cores. 8*cores - * gives the number of GPIO pins. - * bit 8-2  (mask 0x000001FC) contains the core version ID. - */ -#define U300_GPIO_CR					(0x00) -#define U300_GPIO_CR_SYNC_SEL_ENABLE			(0x00000002UL) -#define U300_GPIO_CR_BLOCK_CLKRQ_ENABLE			(0x00000001UL) -#define U300_GPIO_PORTX_SPACING				(0x30) -/* Port X Pin Data INPUT Register 32bit (R/W) */ -#define U300_GPIO_PXPDIR				(0x04) -/* Port X Pin Data OUTPUT Register 32bit (R/W) */ -#define U300_GPIO_PXPDOR				(0x08) -/* Port X Pin Config Register 32bit (R/W) */ -#define U300_GPIO_PXPCR					(0x0C) -#define U300_GPIO_PXPCR_ALL_PINS_MODE_MASK		(0x0000FFFFUL) -#define U300_GPIO_PXPCR_PIN_MODE_MASK			(0x00000003UL) -#define U300_GPIO_PXPCR_PIN_MODE_SHIFT			(0x00000002UL) -#define U300_GPIO_PXPCR_PIN_MODE_INPUT			(0x00000000UL) -#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL	(0x00000001UL) -#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_DRAIN	(0x00000002UL) -#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_SOURCE	(0x00000003UL) -/* Port X Pull-up Enable Register 32bit (R/W) */ -#define U300_GPIO_PXPER					(0x10) -#define U300_GPIO_PXPER_ALL_PULL_UP_DISABLE_MASK	(0x000000FFUL) -#define U300_GPIO_PXPER_PULL_UP_DISABLE			(0x00000001UL) -/* Port X Interrupt Event Register 32bit (R/W) */ -#define U300_GPIO_PXIEV					(0x14) -#define U300_GPIO_PXIEV_ALL_IRQ_EVENT_MASK		(0x000000FFUL) -#define U300_GPIO_PXIEV_IRQ_EVENT			(0x00000001UL) -/* Port X Interrupt Enable Register 32bit (R/W) */ -#define U300_GPIO_PXIEN					(0x18) -#define U300_GPIO_PXIEN_ALL_IRQ_ENABLE_MASK		(0x000000FFUL) -#define U300_GPIO_PXIEN_IRQ_ENABLE			(0x00000001UL) -/* Port X Interrupt Force Register 32bit (R/W) */ -#define U300_GPIO_PXIFR					(0x1C) -#define U300_GPIO_PXIFR_ALL_IRQ_FORCE_MASK		(0x000000FFUL) -#define U300_GPIO_PXIFR_IRQ_FORCE			(0x00000001UL) -/* Port X Interrupt Config Register 32bit (R/W) */ -#define U300_GPIO_PXICR					(0x20) -#define U300_GPIO_PXICR_ALL_IRQ_CONFIG_MASK		(0x000000FFUL) -#define U300_GPIO_PXICR_IRQ_CONFIG_MASK			(0x00000001UL) -#define U300_GPIO_PXICR_IRQ_CONFIG_FALLING_EDGE		(0x00000000UL) -#define U300_GPIO_PXICR_IRQ_CONFIG_RISING_EDGE		(0x00000001UL) -#ifdef CONFIG_MACH_U300_BS335 -/* seven ports of 8 bits each = GPIO pins 0..55 */ -#define U300_GPIO_NUM_PORTS 7 -#else -/* five ports of 8 bits each = GPIO pins 0..39 */ -#define U300_GPIO_NUM_PORTS 5 -#endif -#define U300_GPIO_PINS_PER_PORT 8 -#define U300_GPIO_MAX (U300_GPIO_PINS_PER_PORT * U300_GPIO_NUM_PORTS - 1) -#endif - -/* - * Individual pin assignments for the B26/S26. Notice that the - * actual usage of these pins depends on the PAD MUX settings, that - * is why the same number can potentially appear several times. - * In the reference design each pin is only used for one purpose. - * These were determined by inspecting the B26/S26 schematic: - * 2/1911-ROA 128 1603 - */ -#ifdef CONFIG_MACH_U300_BS2X -#define U300_GPIO_PIN_UART_RX		0 -#define U300_GPIO_PIN_UART_TX		1 -#define U300_GPIO_PIN_GPIO02		2  /* Unrouted */ -#define U300_GPIO_PIN_GPIO03		3  /* Unrouted */ -#define U300_GPIO_PIN_CAM_SLEEP		4 -#define U300_GPIO_PIN_CAM_REG_EN	5 -#define U300_GPIO_PIN_GPIO06		6  /* Unrouted */ -#define U300_GPIO_PIN_GPIO07		7  /* Unrouted */ - -#define U300_GPIO_PIN_GPIO08		8  /* Service point SP2321 */ -#define U300_GPIO_PIN_GPIO09		9  /* Service point SP2322 */ -#define U300_GPIO_PIN_PHFSENSE		10 /* Headphone jack sensing */ -#define U300_GPIO_PIN_MMC_CLKRET	11 /* Clock return from MMC/SD card */ -#define U300_GPIO_PIN_MMC_CD		12 /* MMC Card insertion detection */ -#define U300_GPIO_PIN_FLIPSENSE		13 /* Mechanical flip sensing */ -#define U300_GPIO_PIN_GPIO14		14 /* DSP JTAG Port RTCK */ -#define U300_GPIO_PIN_GPIO15		15 /* Unrouted */ - -#define U300_GPIO_PIN_GPIO16		16 /* Unrouted */ -#define U300_GPIO_PIN_GPIO17		17 /* Unrouted */ -#define U300_GPIO_PIN_GPIO18		18 /* Unrouted */ -#define U300_GPIO_PIN_GPIO19		19 /* Unrouted */ -#define U300_GPIO_PIN_GPIO20		20 /* Unrouted */ -#define U300_GPIO_PIN_GPIO21		21 /* Unrouted */ -#define U300_GPIO_PIN_GPIO22		22 /* Unrouted */ -#define U300_GPIO_PIN_GPIO23		23 /* Unrouted */ -#endif - -/* - * Individual pin assignments for the B330/S330 and B365/S365. - * Notice that the actual usage of these pins depends on the - * PAD MUX settings, that is why the same number can potentially - * appear several times. In the reference design each pin is only - * used for one purpose. These were determined by inspecting the - * S365 schematic. - */ -#if defined(CONFIG_MACH_U300_BS330) || defined(CONFIG_MACH_U300_BS365) || \ -    defined(CONFIG_MACH_U300_BS335) -#define U300_GPIO_PIN_UART_RX		0 -#define U300_GPIO_PIN_UART_TX		1 -#define U300_GPIO_PIN_UART_CTS		2 -#define U300_GPIO_PIN_UART_RTS		3 -#define U300_GPIO_PIN_CAM_MAIN_STANDBY	4 /* Camera MAIN standby */ -#define U300_GPIO_PIN_GPIO05		5 /* Unrouted */ -#define U300_GPIO_PIN_MS_CD		6 /* Memory Stick Card insertion */ -#define U300_GPIO_PIN_GPIO07		7 /* Test point TP2430 */ - -#define U300_GPIO_PIN_GPIO08		8 /* Test point TP2437 */ -#define U300_GPIO_PIN_GPIO09		9 /* Test point TP2431 */ -#define U300_GPIO_PIN_GPIO10		10 /* Test point TP2432 */ -#define U300_GPIO_PIN_MMC_CLKRET	11 /* Clock return from MMC/SD card */ -#define U300_GPIO_PIN_MMC_CD		12 /* MMC Card insertion detection */ -#define U300_GPIO_PIN_CAM_SUB_STANDBY	13 /* Camera SUB standby */ -#define U300_GPIO_PIN_GPIO14		14 /* Test point TP2436 */ -#define U300_GPIO_PIN_GPIO15		15 /* Unrouted */ - -#define U300_GPIO_PIN_GPIO16		16 /* Test point TP2438 */ -#define U300_GPIO_PIN_PHFSENSE		17 /* Headphone jack sensing */ -#define U300_GPIO_PIN_GPIO18		18 /* Test point TP2439 */ -#define U300_GPIO_PIN_GPIO19		19 /* Routed somewhere */ -#define U300_GPIO_PIN_GPIO20		20 /* Unrouted */ -#define U300_GPIO_PIN_GPIO21		21 /* Unrouted */ -#define U300_GPIO_PIN_GPIO22		22 /* Unrouted */ -#define U300_GPIO_PIN_GPIO23		23 /* Unrouted */ - -#define U300_GPIO_PIN_GPIO24		24 /* Unrouted */ -#define U300_GPIO_PIN_GPIO25		25 /* Unrouted */ -#define U300_GPIO_PIN_GPIO26		26 /* Unrouted */ -#define U300_GPIO_PIN_GPIO27		27 /* Unrouted */ -#define U300_GPIO_PIN_GPIO28		28 /* Unrouted */ -#define U300_GPIO_PIN_GPIO29		29 /* Unrouted */ -#define U300_GPIO_PIN_GPIO30		30 /* Unrouted */ -#define U300_GPIO_PIN_GPIO31		31 /* Unrouted */ - -#define U300_GPIO_PIN_GPIO32		32 /* Unrouted */ -#define U300_GPIO_PIN_GPIO33		33 /* Unrouted */ -#define U300_GPIO_PIN_GPIO34		34 /* Unrouted */ -#define U300_GPIO_PIN_GPIO35		35 /* Unrouted */ -#define U300_GPIO_PIN_GPIO36		36 /* Unrouted */ -#define U300_GPIO_PIN_GPIO37		37 /* Unrouted */ -#define U300_GPIO_PIN_GPIO38		38 /* Unrouted */ -#define U300_GPIO_PIN_GPIO39		39 /* Unrouted */ - -#ifdef CONFIG_MACH_U300_BS335 - -#define U300_GPIO_PIN_GPIO40		40 /* Unrouted */ -#define U300_GPIO_PIN_GPIO41		41 /* Unrouted */ -#define U300_GPIO_PIN_GPIO42		42 /* Unrouted */ -#define U300_GPIO_PIN_GPIO43		43 /* Unrouted */ -#define U300_GPIO_PIN_GPIO44		44 /* Unrouted */ -#define U300_GPIO_PIN_GPIO45		45 /* Unrouted */ -#define U300_GPIO_PIN_GPIO46		46 /* Unrouted */ -#define U300_GPIO_PIN_GPIO47		47 /* Unrouted */ - -#define U300_GPIO_PIN_GPIO48		48 /* Unrouted */ -#define U300_GPIO_PIN_GPIO49		49 /* Unrouted */ -#define U300_GPIO_PIN_GPIO50		50 /* Unrouted */ -#define U300_GPIO_PIN_GPIO51		51 /* Unrouted */ -#define U300_GPIO_PIN_GPIO52		52 /* Unrouted */ -#define U300_GPIO_PIN_GPIO53		53 /* Unrouted */ -#define U300_GPIO_PIN_GPIO54		54 /* Unrouted */ -#define U300_GPIO_PIN_GPIO55		55 /* Unrouted */ -#endif - -#endif - -/* translates a pin number to a port number */ -#define PIN_TO_PORT(val) (val >> 3) - -/* These can be found in arch/arm/mach-u300/gpio.c */ -extern int gpio_is_valid(int number); -extern int gpio_request(unsigned gpio, const char *label); -extern void gpio_free(unsigned gpio); -extern int gpio_direction_input(unsigned gpio); -extern int gpio_direction_output(unsigned gpio, int value); -extern int gpio_register_callback(unsigned gpio, -				  int (*func)(void *arg), -				  void *); -extern int gpio_unregister_callback(unsigned gpio); -extern void enable_irq_on_gpio_pin(unsigned gpio, int edge); -extern void disable_irq_on_gpio_pin(unsigned gpio); -extern void gpio_pullup(unsigned gpio, int value); -extern int gpio_get_value(unsigned gpio); -extern void gpio_set_value(unsigned gpio, int value); - -#define gpio_get_value_cansleep gpio_get_value -#define gpio_set_value_cansleep gpio_set_value - -/* wrappers to sleep-enable the previous two functions */ -static inline unsigned gpio_to_irq(unsigned gpio) -{ -	return PIN_TO_PORT(gpio) + IRQ_U300_GPIO_PORT0; -} - -static inline unsigned irq_to_gpio(unsigned irq) -{ -	/* -	 * FIXME: This is no 1-1 mapping at all, it points to the -	 * whole block of 8 pins. -	 */ -	return (irq - IRQ_U300_GPIO_PORT0) << 3; -} - -#endif diff --git a/arch/arm/mach-u300/include/mach/irqs.h b/arch/arm/mach-u300/include/mach/irqs.h index 09b1b28fa8f..d270fea3292 100644 --- a/arch/arm/mach-u300/include/mach/irqs.h +++ b/arch/arm/mach-u300/include/mach/irqs.h @@ -72,7 +72,7 @@  /* DB3150 and DB3200 have only 45 IRQs */  #if defined(CONFIG_MACH_U300_BS2X) || defined(CONFIG_MACH_U300_BS330) -#define U300_NR_IRQS			45 +#define U300_VIC_IRQS_END		45  #endif  /* The DB3350-specific interrupt lines */ @@ -88,7 +88,7 @@  #define IRQ_U300_GPIO_PORT4		53  #define IRQ_U300_GPIO_PORT5		54  #define IRQ_U300_GPIO_PORT6		55 -#define U300_NR_IRQS			56 +#define U300_VIC_IRQS_END		56  #endif  /* The DB3210-specific interrupt lines */ @@ -106,16 +106,25 @@  #define IRQ_U300_NFIF			45  #define IRQ_U300_NFIF2			46  #define IRQ_U300_SYSCON_PLL_LOCK	47 -#define U300_NR_IRQS			48 +#define U300_VIC_IRQS_END		48  #endif -#ifdef CONFIG_AB3550_CORE -#define IRQ_AB3550_BASE			(U300_NR_IRQS) -#define IRQ_AB3550_END			(IRQ_AB3550_BASE + 37) +/* Maximum 8*7 GPIO lines */ +#ifdef CONFIG_GPIO_U300 +#define IRQ_U300_GPIO_BASE		(U300_VIC_IRQS_END) +#define IRQ_U300_GPIO_END		(IRQ_U300_GPIO_BASE + 56) +#else +#define IRQ_U300_GPIO_END		(U300_VIC_IRQS_END) +#endif -#define NR_IRQS				(IRQ_AB3550_END + 1) +/* Optional AB3550 mixsig chip */ +#ifdef CONFIG_AB3550_CORE +#define IRQ_AB3550_BASE			(IRQ_U300_GPIO_END) +#define IRQ_AB3550_END			(IRQ_AB3550_BASE + 38)  #else -#define NR_IRQS U300_NR_IRQS +#define IRQ_AB3550_END			(IRQ_U300_GPIO_END)  #endif +#define NR_IRQS				(IRQ_AB3550_END) +  #endif diff --git a/arch/arm/mach-u300/mmc.c b/arch/arm/mach-u300/mmc.c index 677ccef5cd3..d9a5c92db74 100644 --- a/arch/arm/mach-u300/mmc.c +++ b/arch/arm/mach-u300/mmc.c @@ -13,12 +13,12 @@  #include <linux/device.h>  #include <linux/amba/bus.h>  #include <linux/mmc/host.h> -#include <linux/gpio.h>  #include <linux/dmaengine.h>  #include <linux/amba/mmci.h>  #include <linux/slab.h>  #include <mach/coh901318.h>  #include <mach/dma_channels.h> +#include <mach/gpio-u300.h>  #include "mmc.h"  #include "padmux.h" diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c index f26fd76f72b..15b23e4bd48 100644 --- a/arch/arm/mach-ux500/board-mop500-pins.c +++ b/arch/arm/mach-ux500/board-mop500-pins.c @@ -6,10 +6,10 @@  #include <linux/kernel.h>  #include <linux/init.h> -#include <linux/gpio.h>  #include <asm/mach-types.h>  #include <plat/pincfg.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h>  #include "pins-db8500.h" diff --git a/arch/arm/mach-ux500/board-mop500-u8500uib.c b/arch/arm/mach-ux500/board-mop500-u8500uib.c index 8ce46c0fdfd..feb5744d98b 100644 --- a/arch/arm/mach-ux500/board-mop500-u8500uib.c +++ b/arch/arm/mach-ux500/board-mop500-u8500uib.c @@ -4,7 +4,7 @@   * Board data for the U8500 UIB, also known as the New UIB   * License terms: GNU General Public License (GPL), version 2   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/i2c.h> @@ -13,7 +13,6 @@  #include <linux/mfd/tc3589x.h>  #include <linux/input/matrix_keypad.h> -#include <mach/gpio.h>  #include <mach/irqs.h>  #include "board-mop500.h" diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 2cc4876db21..f67b83dd901 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -37,6 +37,7 @@  #include <plat/i2c.h>  #include <plat/ste_dma40.h>  #include <plat/pincfg.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h>  #include <mach/setup.h> diff --git a/arch/arm/mach-ux500/board-u5500-sdi.c b/arch/arm/mach-ux500/board-u5500-sdi.c index 739fb4c5b16..63c3f8058ff 100644 --- a/arch/arm/mach-ux500/board-u5500-sdi.c +++ b/arch/arm/mach-ux500/board-u5500-sdi.c @@ -7,9 +7,9 @@  #include <linux/amba/mmci.h>  #include <linux/mmc/host.h> -#include <linux/gpio.h>  #include <plat/pincfg.h> +#include <plat/gpio-nomadik.h>  #include <mach/db5500-regs.h>  #include <plat/ste_dma40.h> diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c index 166d47a5f4f..e014aa749b0 100644 --- a/arch/arm/mach-ux500/board-u5500.c +++ b/arch/arm/mach-ux500/board-u5500.c @@ -8,7 +8,6 @@  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/amba/bus.h> -#include <linux/gpio.h>  #include <linux/irq.h>  #include <linux/i2c.h> @@ -17,6 +16,7 @@  #include <plat/pincfg.h>  #include <plat/i2c.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h>  #include <mach/devices.h> diff --git a/arch/arm/mach-ux500/cpu-db5500.c b/arch/arm/mach-ux500/cpu-db5500.c index 22705d246fc..9de1af00809 100644 --- a/arch/arm/mach-ux500/cpu-db5500.c +++ b/arch/arm/mach-ux500/cpu-db5500.c @@ -13,7 +13,7 @@  #include <asm/mach/map.h>  #include <asm/pmu.h> -#include <plat/gpio.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h>  #include <mach/devices.h> diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 4598b06c8c5..13e8890a8b8 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c @@ -14,12 +14,12 @@  #include <linux/amba/bus.h>  #include <linux/interrupt.h>  #include <linux/irq.h> -#include <linux/gpio.h>  #include <linux/platform_device.h>  #include <linux/io.h>  #include <asm/mach/map.h>  #include <asm/pmu.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h>  #include <mach/setup.h>  #include <mach/devices.h> diff --git a/arch/arm/mach-ux500/devices-common.c b/arch/arm/mach-ux500/devices-common.c index 13a4ce046ae..c563e5418d8 100644 --- a/arch/arm/mach-ux500/devices-common.c +++ b/arch/arm/mach-ux500/devices-common.c @@ -13,7 +13,7 @@  #include <linux/platform_device.h>  #include <linux/amba/bus.h> -#include <plat/gpio.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h> diff --git a/arch/arm/mach-ux500/include/mach/gpio.h b/arch/arm/mach-ux500/include/mach/gpio.h index 3c4cd31ad9f..7389df911b1 100644 --- a/arch/arm/mach-ux500/include/mach/gpio.h +++ b/arch/arm/mach-ux500/include/mach/gpio.h @@ -7,6 +7,4 @@   */  #define ARCH_NR_GPIOS	350 -#include <plat/gpio.h> -  #endif /* __ASM_ARCH_GPIO_H */ diff --git a/arch/arm/mach-versatile/include/mach/gpio.h b/arch/arm/mach-versatile/include/mach/gpio.h index 94ff27678a4..40a8c178f10 100644 --- a/arch/arm/mach-versatile/include/mach/gpio.h +++ b/arch/arm/mach-versatile/include/mach/gpio.h @@ -1,6 +1 @@ -#include <asm-generic/gpio.h> - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq +/* empty */ diff --git a/arch/arm/mach-vexpress/include/mach/io.h b/arch/arm/mach-vexpress/include/mach/io.h index 748bb524ee7..13522d86685 100644 --- a/arch/arm/mach-vexpress/include/mach/io.h +++ b/arch/arm/mach-vexpress/include/mach/io.h @@ -20,8 +20,6 @@  #ifndef __ASM_ARM_ARCH_IO_H  #define __ASM_ARM_ARCH_IO_H -#define IO_SPACE_LIMIT 0xffffffff -  #define __io(a)		__typesafe_io(a)  #define __mem_pci(a)	(a) diff --git a/arch/arm/mach-vt8500/include/mach/gpio.h b/arch/arm/mach-vt8500/include/mach/gpio.h index 94ff27678a4..40a8c178f10 100644 --- a/arch/arm/mach-vt8500/include/mach/gpio.h +++ b/arch/arm/mach-vt8500/include/mach/gpio.h @@ -1,6 +1 @@ -#include <asm-generic/gpio.h> - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq +/* empty */ diff --git a/arch/arm/mach-vt8500/include/mach/io.h b/arch/arm/mach-vt8500/include/mach/io.h index 9077239f78c..46181eecf27 100644 --- a/arch/arm/mach-vt8500/include/mach/io.h +++ b/arch/arm/mach-vt8500/include/mach/io.h @@ -20,8 +20,6 @@  #ifndef __ASM_ARM_ARCH_IO_H  #define __ASM_ARM_ARCH_IO_H -#define IO_SPACE_LIMIT 0xffff -  #define __io(a)		__typesafe_io((a) + 0xf0000000)  #define __mem_pci(a)	(a) diff --git a/arch/arm/mach-w90x900/include/mach/gpio.h b/arch/arm/mach-w90x900/include/mach/gpio.h index 034da3e390c..5385a420327 100644 --- a/arch/arm/mach-w90x900/include/mach/gpio.h +++ b/arch/arm/mach-w90x900/include/mach/gpio.h @@ -15,16 +15,12 @@  #include <mach/hardware.h>  #include <asm/irq.h> -#include <asm-generic/gpio.h> - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep  static inline int gpio_to_irq(unsigned gpio)  {  	return gpio;  } +#define gpio_to_irq gpio_to_irq  static inline int irq_to_gpio(unsigned irq)  { diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig index 88633fe01a5..7d5fff7b363 100644 --- a/arch/arm/mm/Kconfig +++ b/arch/arm/mm/Kconfig @@ -822,7 +822,7 @@ config CACHE_L2X0  		   REALVIEW_EB_A9MP || SOC_IMX35 || SOC_IMX31 || MACH_REALVIEW_PBX || \  		   ARCH_NOMADIK || ARCH_OMAP4 || ARCH_EXYNOS4 || ARCH_TEGRA || \  		   ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || ARCH_SHMOBILE || \ -		   ARCH_PRIMA2 || ARCH_ZYNQ || ARCH_CNS3XXX +		   ARCH_PRIMA2 || ARCH_ZYNQ || ARCH_CNS3XXX || ARCH_HIGHBANK  	default y  	select OUTER_CACHE  	select OUTER_CACHE_SYNC diff --git a/arch/arm/mm/cache-l2x0.c b/arch/arm/mm/cache-l2x0.c index 9ecfdb51195..3f9b9980478 100644 --- a/arch/arm/mm/cache-l2x0.c +++ b/arch/arm/mm/cache-l2x0.c @@ -16,9 +16,12 @@   * along with this program; if not, write to the Free Software   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA   */ +#include <linux/err.h>  #include <linux/init.h>  #include <linux/spinlock.h>  #include <linux/io.h> +#include <linux/of.h> +#include <linux/of_address.h>  #include <asm/cacheflush.h>  #include <asm/hardware/cache-l2x0.h> @@ -30,11 +33,19 @@ static DEFINE_SPINLOCK(l2x0_lock);  static uint32_t l2x0_way_mask;	/* Bitmask of active ways */  static uint32_t l2x0_size; +struct l2x0_regs l2x0_saved_regs; + +struct l2x0_of_data { +	void (*setup)(const struct device_node *, __u32 *, __u32 *); +	void (*save)(void); +	void (*resume)(void); +}; +  static inline void cache_wait_way(void __iomem *reg, unsigned long mask)  {  	/* wait for cache operation by line or way to complete */  	while (readl_relaxed(reg) & mask) -		; +		cpu_relax();  }  #ifdef CONFIG_CACHE_PL310 @@ -277,7 +288,7 @@ static void l2x0_disable(void)  	spin_unlock_irqrestore(&l2x0_lock, flags);  } -static void __init l2x0_unlock(__u32 cache_id) +static void l2x0_unlock(__u32 cache_id)  {  	int lockregs;  	int i; @@ -353,6 +364,8 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)  		/* l2x0 controller is disabled */  		writel_relaxed(aux, l2x0_base + L2X0_AUX_CTRL); +		l2x0_saved_regs.aux_ctrl = aux; +  		l2x0_inv_all();  		/* enable L2X0 */ @@ -372,3 +385,202 @@ void __init l2x0_init(void __iomem *base, __u32 aux_val, __u32 aux_mask)  	printk(KERN_INFO "l2x0: %d ways, CACHE_ID 0x%08x, AUX_CTRL 0x%08x, Cache size: %d B\n",  			ways, cache_id, aux, l2x0_size);  } + +#ifdef CONFIG_OF +static void __init l2x0_of_setup(const struct device_node *np, +				 __u32 *aux_val, __u32 *aux_mask) +{ +	u32 data[2] = { 0, 0 }; +	u32 tag = 0; +	u32 dirty = 0; +	u32 val = 0, mask = 0; + +	of_property_read_u32(np, "arm,tag-latency", &tag); +	if (tag) { +		mask |= L2X0_AUX_CTRL_TAG_LATENCY_MASK; +		val |= (tag - 1) << L2X0_AUX_CTRL_TAG_LATENCY_SHIFT; +	} + +	of_property_read_u32_array(np, "arm,data-latency", +				   data, ARRAY_SIZE(data)); +	if (data[0] && data[1]) { +		mask |= L2X0_AUX_CTRL_DATA_RD_LATENCY_MASK | +			L2X0_AUX_CTRL_DATA_WR_LATENCY_MASK; +		val |= ((data[0] - 1) << L2X0_AUX_CTRL_DATA_RD_LATENCY_SHIFT) | +		       ((data[1] - 1) << L2X0_AUX_CTRL_DATA_WR_LATENCY_SHIFT); +	} + +	of_property_read_u32(np, "arm,dirty-latency", &dirty); +	if (dirty) { +		mask |= L2X0_AUX_CTRL_DIRTY_LATENCY_MASK; +		val |= (dirty - 1) << L2X0_AUX_CTRL_DIRTY_LATENCY_SHIFT; +	} + +	*aux_val &= ~mask; +	*aux_val |= val; +	*aux_mask &= ~mask; +} + +static void __init pl310_of_setup(const struct device_node *np, +				  __u32 *aux_val, __u32 *aux_mask) +{ +	u32 data[3] = { 0, 0, 0 }; +	u32 tag[3] = { 0, 0, 0 }; +	u32 filter[2] = { 0, 0 }; + +	of_property_read_u32_array(np, "arm,tag-latency", tag, ARRAY_SIZE(tag)); +	if (tag[0] && tag[1] && tag[2]) +		writel_relaxed( +			((tag[0] - 1) << L2X0_LATENCY_CTRL_RD_SHIFT) | +			((tag[1] - 1) << L2X0_LATENCY_CTRL_WR_SHIFT) | +			((tag[2] - 1) << L2X0_LATENCY_CTRL_SETUP_SHIFT), +			l2x0_base + L2X0_TAG_LATENCY_CTRL); + +	of_property_read_u32_array(np, "arm,data-latency", +				   data, ARRAY_SIZE(data)); +	if (data[0] && data[1] && data[2]) +		writel_relaxed( +			((data[0] - 1) << L2X0_LATENCY_CTRL_RD_SHIFT) | +			((data[1] - 1) << L2X0_LATENCY_CTRL_WR_SHIFT) | +			((data[2] - 1) << L2X0_LATENCY_CTRL_SETUP_SHIFT), +			l2x0_base + L2X0_DATA_LATENCY_CTRL); + +	of_property_read_u32_array(np, "arm,filter-ranges", +				   filter, ARRAY_SIZE(filter)); +	if (filter[1]) { +		writel_relaxed(ALIGN(filter[0] + filter[1], SZ_1M), +			       l2x0_base + L2X0_ADDR_FILTER_END); +		writel_relaxed((filter[0] & ~(SZ_1M - 1)) | L2X0_ADDR_FILTER_EN, +			       l2x0_base + L2X0_ADDR_FILTER_START); +	} +} + +static void __init pl310_save(void) +{ +	u32 l2x0_revision = readl_relaxed(l2x0_base + L2X0_CACHE_ID) & +		L2X0_CACHE_ID_RTL_MASK; + +	l2x0_saved_regs.tag_latency = readl_relaxed(l2x0_base + +		L2X0_TAG_LATENCY_CTRL); +	l2x0_saved_regs.data_latency = readl_relaxed(l2x0_base + +		L2X0_DATA_LATENCY_CTRL); +	l2x0_saved_regs.filter_end = readl_relaxed(l2x0_base + +		L2X0_ADDR_FILTER_END); +	l2x0_saved_regs.filter_start = readl_relaxed(l2x0_base + +		L2X0_ADDR_FILTER_START); + +	if (l2x0_revision >= L2X0_CACHE_ID_RTL_R2P0) { +		/* +		 * From r2p0, there is Prefetch offset/control register +		 */ +		l2x0_saved_regs.prefetch_ctrl = readl_relaxed(l2x0_base + +			L2X0_PREFETCH_CTRL); +		/* +		 * From r3p0, there is Power control register +		 */ +		if (l2x0_revision >= L2X0_CACHE_ID_RTL_R3P0) +			l2x0_saved_regs.pwr_ctrl = readl_relaxed(l2x0_base + +				L2X0_POWER_CTRL); +	} +} + +static void l2x0_resume(void) +{ +	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { +		/* restore aux ctrl and enable l2 */ +		l2x0_unlock(readl_relaxed(l2x0_base + L2X0_CACHE_ID)); + +		writel_relaxed(l2x0_saved_regs.aux_ctrl, l2x0_base + +			L2X0_AUX_CTRL); + +		l2x0_inv_all(); + +		writel_relaxed(1, l2x0_base + L2X0_CTRL); +	} +} + +static void pl310_resume(void) +{ +	u32 l2x0_revision; + +	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { +		/* restore pl310 setup */ +		writel_relaxed(l2x0_saved_regs.tag_latency, +			l2x0_base + L2X0_TAG_LATENCY_CTRL); +		writel_relaxed(l2x0_saved_regs.data_latency, +			l2x0_base + L2X0_DATA_LATENCY_CTRL); +		writel_relaxed(l2x0_saved_regs.filter_end, +			l2x0_base + L2X0_ADDR_FILTER_END); +		writel_relaxed(l2x0_saved_regs.filter_start, +			l2x0_base + L2X0_ADDR_FILTER_START); + +		l2x0_revision = readl_relaxed(l2x0_base + L2X0_CACHE_ID) & +			L2X0_CACHE_ID_RTL_MASK; + +		if (l2x0_revision >= L2X0_CACHE_ID_RTL_R2P0) { +			writel_relaxed(l2x0_saved_regs.prefetch_ctrl, +				l2x0_base + L2X0_PREFETCH_CTRL); +			if (l2x0_revision >= L2X0_CACHE_ID_RTL_R3P0) +				writel_relaxed(l2x0_saved_regs.pwr_ctrl, +					l2x0_base + L2X0_POWER_CTRL); +		} +	} + +	l2x0_resume(); +} + +static const struct l2x0_of_data pl310_data = { +	pl310_of_setup, +	pl310_save, +	pl310_resume, +}; + +static const struct l2x0_of_data l2x0_data = { +	l2x0_of_setup, +	NULL, +	l2x0_resume, +}; + +static const struct of_device_id l2x0_ids[] __initconst = { +	{ .compatible = "arm,pl310-cache", .data = (void *)&pl310_data }, +	{ .compatible = "arm,l220-cache", .data = (void *)&l2x0_data }, +	{ .compatible = "arm,l210-cache", .data = (void *)&l2x0_data }, +	{} +}; + +int __init l2x0_of_init(__u32 aux_val, __u32 aux_mask) +{ +	struct device_node *np; +	struct l2x0_of_data *data; +	struct resource res; + +	np = of_find_matching_node(NULL, l2x0_ids); +	if (!np) +		return -ENODEV; + +	if (of_address_to_resource(np, 0, &res)) +		return -ENODEV; + +	l2x0_base = ioremap(res.start, resource_size(&res)); +	if (!l2x0_base) +		return -ENOMEM; + +	l2x0_saved_regs.phy_base = res.start; + +	data = of_match_node(l2x0_ids, np)->data; + +	/* L2 configuration can only be changed if the cache is disabled */ +	if (!(readl_relaxed(l2x0_base + L2X0_CTRL) & 1)) { +		if (data->setup) +			data->setup(np, &aux_val, &aux_mask); +	} + +	if (data->save) +		data->save(); + +	l2x0_init(l2x0_base, aux_val, aux_mask); + +	outer_cache.resume = data->resume; +	return 0; +} +#endif diff --git a/arch/arm/plat-mxc/include/mach/gpio.h b/arch/arm/plat-mxc/include/mach/gpio.h index 44af0064ba1..40a8c178f10 100644 --- a/arch/arm/plat-mxc/include/mach/gpio.h +++ b/arch/arm/plat-mxc/include/mach/gpio.h @@ -1,32 +1 @@ -/* - * Copyright 2007 Freescale Semiconductor, Inc. All Rights Reserved. - * Copyright 2008 Juergen Beisert, kernel@pengutronix.de - * - * 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. - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. - */ - -#ifndef __ASM_ARCH_MXC_GPIO_H__ -#define __ASM_ARCH_MXC_GPIO_H__ - -#include <linux/spinlock.h> -#include <mach/hardware.h> -#include <asm-generic/gpio.h> - -/* use gpiolib dispatchers */ -#define gpio_get_value		__gpio_get_value -#define gpio_set_value		__gpio_set_value -#define gpio_cansleep		__gpio_cansleep -#define gpio_to_irq		__gpio_to_irq - -#endif +/* empty */ diff --git a/arch/arm/plat-nomadik/include/plat/gpio.h b/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h index d5d7e651269..3ba4d8f8073 100644 --- a/arch/arm/plat-nomadik/include/plat/gpio.h +++ b/arch/arm/plat-nomadik/include/plat/gpio-nomadik.h @@ -9,20 +9,9 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ -#ifndef __ASM_PLAT_GPIO_H -#define __ASM_PLAT_GPIO_H -#include <asm-generic/gpio.h> - -/* - * These currently cause a function call to happen, they may be optimized - * if needed by adding cpu-specific defines to identify blocks - * (see mach-pxa/include/mach/gpio.h as an example using GPLR etc) - */ -#define gpio_get_value  __gpio_get_value -#define gpio_set_value  __gpio_set_value -#define gpio_cansleep   __gpio_cansleep -#define gpio_to_irq     __gpio_to_irq +#ifndef __PLAT_NOMADIK_GPIO +#define __PLAT_NOMADIK_GPIO  /*   * "nmk_gpio" and "NMK_GPIO" stand for "Nomadik GPIO", leaving @@ -93,4 +82,4 @@ struct nmk_gpio_platform_data {  	bool supports_sleepmode;  }; -#endif /* __ASM_PLAT_GPIO_H */ +#endif /* __PLAT_NOMADIK_GPIO */ diff --git a/arch/arm/plat-omap/debug-devices.c b/arch/arm/plat-omap/debug-devices.c index 923c9621096..caa1f7b6cc2 100644 --- a/arch/arm/plat-omap/debug-devices.c +++ b/arch/arm/plat-omap/debug-devices.c @@ -8,7 +8,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/init.h>  #include <linux/platform_device.h> @@ -18,7 +18,6 @@  #include <mach/hardware.h>  #include <plat/board.h> -#include <mach/gpio.h>  /* Many OMAP development platforms reuse the same "debug board"; these diff --git a/arch/arm/plat-omap/debug-leds.c b/arch/arm/plat-omap/debug-leds.c index fc05b102260..61a1ec2a6af 100644 --- a/arch/arm/plat-omap/debug-leds.c +++ b/arch/arm/plat-omap/debug-leds.c @@ -7,7 +7,7 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/platform_device.h>  #include <linux/leds.h> @@ -19,7 +19,6 @@  #include <asm/mach-types.h>  #include <plat/fpga.h> -#include <mach/gpio.h>  /* Many OMAP development platforms reuse the same "debug board"; these diff --git a/arch/arm/plat-omap/devices.c b/arch/arm/plat-omap/devices.c index bd9a06b3ee8..acd132c2964 100644 --- a/arch/arm/plat-omap/devices.c +++ b/arch/arm/plat-omap/devices.c @@ -8,7 +8,7 @@   * the Free Software Foundation; either version 2 of the License, or   * (at your option) any later version.   */ - +#include <linux/gpio.h>  #include <linux/module.h>  #include <linux/kernel.h>  #include <linux/init.h> @@ -24,7 +24,6 @@  #include <plat/tc.h>  #include <plat/board.h>  #include <plat/mmc.h> -#include <mach/gpio.h>  #include <plat/menelaus.h>  #include <plat/omap44xx.h> diff --git a/arch/arm/plat-omap/include/plat/gpio.h b/arch/arm/plat-omap/include/plat/gpio.h index 91e8de3db08..9e86ee0aed0 100644 --- a/arch/arm/plat-omap/include/plat/gpio.h +++ b/arch/arm/plat-omap/include/plat/gpio.h @@ -222,26 +222,6 @@ extern void omap_gpio_restore_context(void);  #include <linux/errno.h>  #include <asm-generic/gpio.h> -static inline int gpio_get_value(unsigned gpio) -{ -	return __gpio_get_value(gpio); -} - -static inline void gpio_set_value(unsigned gpio, int value) -{ -	__gpio_set_value(gpio, value); -} - -static inline int gpio_cansleep(unsigned gpio) -{ -	return __gpio_cansleep(gpio); -} - -static inline int gpio_to_irq(unsigned gpio) -{ -	return __gpio_to_irq(gpio); -} -  static inline int irq_to_gpio(unsigned irq)  {  	int tmp; diff --git a/arch/arm/plat-orion/include/plat/gpio.h b/arch/arm/plat-orion/include/plat/gpio.h index 3075b9fdde8..3abf30428be 100644 --- a/arch/arm/plat-orion/include/plat/gpio.h +++ b/arch/arm/plat-orion/include/plat/gpio.h @@ -12,15 +12,7 @@  #define __PLAT_GPIO_H  #include <linux/init.h> -#include <asm-generic/gpio.h> - -/* - * GENERIC_GPIO primitives. - */ -#define gpio_get_value  __gpio_get_value -#define gpio_set_value  __gpio_set_value -#define gpio_cansleep   __gpio_cansleep -#define gpio_to_irq     __gpio_to_irq +#include <linux/types.h>  /*   * Orion-specific GPIO API extensions. diff --git a/arch/arm/plat-pxa/Makefile b/arch/arm/plat-pxa/Makefile index 3aca5ba0f87..f302d048392 100644 --- a/arch/arm/plat-pxa/Makefile +++ b/arch/arm/plat-pxa/Makefile @@ -4,7 +4,6 @@  obj-y	:= dma.o -obj-$(CONFIG_GENERIC_GPIO)	+= gpio.o  obj-$(CONFIG_PXA3xx)		+= mfp.o  obj-$(CONFIG_PXA95x)		+= mfp.o  obj-$(CONFIG_ARCH_MMP)		+= mfp.o diff --git a/arch/arm/plat-pxa/include/plat/gpio-pxa.h b/arch/arm/plat-pxa/include/plat/gpio-pxa.h new file mode 100644 index 00000000000..b6390beff32 --- /dev/null +++ b/arch/arm/plat-pxa/include/plat/gpio-pxa.h @@ -0,0 +1,44 @@ +#ifndef __PLAT_PXA_GPIO_H +#define __PLAT_PXA_GPIO_H + +struct irq_data; + +/* + * We handle the GPIOs by banks, each bank covers up to 32 GPIOs with + * one set of registers. The register offsets are organized below: + * + *           GPLR    GPDR    GPSR    GPCR    GRER    GFER    GEDR + * BANK 0 - 0x0000  0x000C  0x0018  0x0024  0x0030  0x003C  0x0048 + * BANK 1 - 0x0004  0x0010  0x001C  0x0028  0x0034  0x0040  0x004C + * BANK 2 - 0x0008  0x0014  0x0020  0x002C  0x0038  0x0044  0x0050 + * + * BANK 3 - 0x0100  0x010C  0x0118  0x0124  0x0130  0x013C  0x0148 + * BANK 4 - 0x0104  0x0110  0x011C  0x0128  0x0134  0x0140  0x014C + * BANK 5 - 0x0108  0x0114  0x0120  0x012C  0x0138  0x0144  0x0150 + * + * NOTE: + *   BANK 3 is only available on PXA27x and later processors. + *   BANK 4 and 5 are only available on PXA935 + */ + +#define GPIO_BANK(n)	(GPIO_REGS_VIRT + BANK_OFF(n)) + +#define GPLR_OFFSET	0x00 +#define GPDR_OFFSET	0x0C +#define GPSR_OFFSET	0x18 +#define GPCR_OFFSET	0x24 +#define GRER_OFFSET	0x30 +#define GFER_OFFSET	0x3C +#define GEDR_OFFSET	0x48 + +/* NOTE: some PXAs have fewer on-chip GPIOs (like PXA255, with 85). + * Those cases currently cause holes in the GPIO number space, the + * actual number of the last GPIO is recorded by 'pxa_last_gpio'. + */ +extern int pxa_last_gpio; + +typedef int (*set_wake_t)(struct irq_data *d, unsigned int on); + +extern void pxa_init_gpio(int mux_irq, int start, int end, set_wake_t fn); + +#endif /* __PLAT_PXA_GPIO_H */ diff --git a/arch/arm/plat-pxa/include/plat/gpio.h b/arch/arm/plat-pxa/include/plat/gpio.h index 1ddd2b97a72..258f77210b0 100644 --- a/arch/arm/plat-pxa/include/plat/gpio.h +++ b/arch/arm/plat-pxa/include/plat/gpio.h @@ -1,35 +1,10 @@  #ifndef __PLAT_GPIO_H  #define __PLAT_GPIO_H -struct irq_data; +#define __ARM_GPIOLIB_COMPLEX -/* - * We handle the GPIOs by banks, each bank covers up to 32 GPIOs with - * one set of registers. The register offsets are organized below: - * - *           GPLR    GPDR    GPSR    GPCR    GRER    GFER    GEDR - * BANK 0 - 0x0000  0x000C  0x0018  0x0024  0x0030  0x003C  0x0048 - * BANK 1 - 0x0004  0x0010  0x001C  0x0028  0x0034  0x0040  0x004C - * BANK 2 - 0x0008  0x0014  0x0020  0x002C  0x0038  0x0044  0x0050 - * - * BANK 3 - 0x0100  0x010C  0x0118  0x0124  0x0130  0x013C  0x0148 - * BANK 4 - 0x0104  0x0110  0x011C  0x0128  0x0134  0x0140  0x014C - * BANK 5 - 0x0108  0x0114  0x0120  0x012C  0x0138  0x0144  0x0150 - * - * NOTE: - *   BANK 3 is only available on PXA27x and later processors. - *   BANK 4 and 5 are only available on PXA935 - */ - -#define GPIO_BANK(n)	(GPIO_REGS_VIRT + BANK_OFF(n)) - -#define GPLR_OFFSET	0x00 -#define GPDR_OFFSET	0x0C -#define GPSR_OFFSET	0x18 -#define GPCR_OFFSET	0x24 -#define GRER_OFFSET	0x30 -#define GFER_OFFSET	0x3C -#define GEDR_OFFSET	0x48 +/* The individual machine provides register offsets and NR_BUILTIN_GPIO */ +#include <mach/gpio-pxa.h>  static inline int gpio_get_value(unsigned gpio)  { @@ -52,13 +27,4 @@ static inline void gpio_set_value(unsigned gpio, int value)  #define gpio_cansleep		__gpio_cansleep -/* NOTE: some PXAs have fewer on-chip GPIOs (like PXA255, with 85). - * Those cases currently cause holes in the GPIO number space, the - * actual number of the last GPIO is recorded by 'pxa_last_gpio'. - */ -extern int pxa_last_gpio; - -typedef int (*set_wake_t)(struct irq_data *d, unsigned int on); - -extern void pxa_init_gpio(int mux_irq, int start, int end, set_wake_t fn);  #endif /* __PLAT_GPIO_H */ diff --git a/arch/arm/plat-spear/include/plat/gpio.h b/arch/arm/plat-spear/include/plat/gpio.h index b857c91257d..40a8c178f10 100644 --- a/arch/arm/plat-spear/include/plat/gpio.h +++ b/arch/arm/plat-spear/include/plat/gpio.h @@ -1,24 +1 @@ -/* - * arch/arm/plat-spear/include/plat/gpio.h - * - * GPIO macros for SPEAr platform - * - * Copyright (C) 2009 ST Microelectronics - * Viresh Kumar<viresh.kumar@st.com> - * - * This file is licensed under the terms of the GNU General Public - * License version 2. This program is licensed "as is" without any - * warranty of any kind, whether express or implied. - */ - -#ifndef __PLAT_GPIO_H -#define __PLAT_GPIO_H - -#include <asm-generic/gpio.h> - -#define gpio_get_value	__gpio_get_value -#define gpio_set_value	__gpio_set_value -#define gpio_cansleep	__gpio_cansleep -#define gpio_to_irq	__gpio_to_irq - -#endif /* __PLAT_GPIO_H */ +/* empty */ diff --git a/drivers/ata/pata_at91.c b/drivers/ata/pata_at91.c index 960c7257139..3f4c2613b3d 100644 --- a/drivers/ata/pata_at91.c +++ b/drivers/ata/pata_at91.c @@ -30,7 +30,7 @@  #include <mach/at91sam9_smc.h>  #include <mach/board.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #define DRV_NAME		"pata_at91"  #define DRV_VERSION		"0.3" diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index d539efd96d4..4caa3d37bbd 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -178,6 +178,15 @@ config GPIO_SCH  	  The Intel Tunnel Creek processor has 5 GPIOs powered by the  	  core power rail and 9 from suspend power supply. +config GPIO_U300 +	bool "ST-Ericsson U300 COH 901 335/571 GPIO" +	depends on GPIOLIB && ARCH_U300 +	help +	  Say yes here to support GPIO interface on ST-Ericsson U300. +	  The names of the two IP block variants supported are +	  COH 901 335 and COH 901 571/3. They contain 3, 5 or 7 +	  ports of 8 GPIO pins each. +  config GPIO_VX855  	tristate "VIA VX855/VX875 GPIO"  	depends on MFD_SUPPORT && PCI diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 9588948c96f..19c5d27b6d2 100644 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -14,11 +14,14 @@ obj-$(CONFIG_GPIO_ADP5588)	+= gpio-adp5588.o  obj-$(CONFIG_GPIO_BT8XX)	+= gpio-bt8xx.o  obj-$(CONFIG_GPIO_CS5535)	+= gpio-cs5535.o  obj-$(CONFIG_GPIO_DA9052)	+= gpio-da9052.o +obj-$(CONFIG_ARCH_DAVINCI)	+= gpio-davinci.o  obj-$(CONFIG_GPIO_EP93XX)	+= gpio-ep93xx.o  obj-$(CONFIG_GPIO_EXYNOS4)	+= gpio-exynos4.o  obj-$(CONFIG_GPIO_IT8761E)	+= gpio-it8761e.o  obj-$(CONFIG_GPIO_JANZ_TTL)	+= gpio-janz-ttl.o +obj-$(CONFIG_MACH_KS8695)	+= gpio-ks8695.o  obj-$(CONFIG_GPIO_LANGWELL)	+= gpio-langwell.o +obj-$(CONFIG_ARCH_LPC32XX)	+= gpio-lpc32xx.o  obj-$(CONFIG_GPIO_MAX730X)	+= gpio-max730x.o  obj-$(CONFIG_GPIO_MAX7300)	+= gpio-max7300.o  obj-$(CONFIG_GPIO_MAX7301)	+= gpio-max7301.o @@ -37,18 +40,20 @@ obj-$(CONFIG_GPIO_PCA953X)	+= gpio-pca953x.o  obj-$(CONFIG_GPIO_PCF857X)	+= gpio-pcf857x.o  obj-$(CONFIG_GPIO_PCH)		+= gpio-pch.o  obj-$(CONFIG_GPIO_PL061)	+= gpio-pl061.o +obj-$(CONFIG_PLAT_PXA)		+= gpio-pxa.o  obj-$(CONFIG_GPIO_RDC321X)	+= gpio-rdc321x.o  obj-$(CONFIG_GPIO_PLAT_SAMSUNG)	+= gpio-plat-samsung.o  obj-$(CONFIG_GPIO_S5PC100)	+= gpio-s5pc100.o  obj-$(CONFIG_GPIO_S5PV210)	+= gpio-s5pv210.o - +obj-$(CONFIG_ARCH_SA1100)	+= gpio-sa1100.o  obj-$(CONFIG_GPIO_SCH)		+= gpio-sch.o  obj-$(CONFIG_GPIO_STMPE)	+= gpio-stmpe.o  obj-$(CONFIG_GPIO_SX150X)	+= gpio-sx150x.o  obj-$(CONFIG_GPIO_TC3589X)	+= gpio-tc3589x.o  obj-$(CONFIG_ARCH_TEGRA)	+= gpio-tegra.o  obj-$(CONFIG_GPIO_TIMBERDALE)	+= gpio-timberdale.o +obj-$(CONFIG_ARCH_DAVINCI_TNETV107X) += gpio-tnetv107x.o  obj-$(CONFIG_GPIO_TPS65910)	+= gpio-tps65910.o  obj-$(CONFIG_GPIO_TPS65912)	+= gpio-tps65912.o  obj-$(CONFIG_GPIO_TWL4030)	+= gpio-twl4030.o diff --git a/arch/arm/mach-davinci/gpio.c b/drivers/gpio/gpio-davinci.c index cafbe13a82a..df0d59570a8 100644 --- a/arch/arm/mach-davinci/gpio.c +++ b/drivers/gpio/gpio-davinci.c @@ -9,15 +9,13 @@   * the Free Software Foundation; either version 2 of the License, or   * (at your option) any later version.   */ - +#include <linux/gpio.h>  #include <linux/errno.h>  #include <linux/kernel.h>  #include <linux/clk.h>  #include <linux/err.h>  #include <linux/io.h> -#include <mach/gpio.h> -  #include <asm/mach/irq.h>  struct davinci_gpio_regs { @@ -232,9 +230,6 @@ static void gpio_irq_enable(struct irq_data *d)  static int gpio_irq_type(struct irq_data *d, unsigned trigger)  { -	struct davinci_gpio_regs __iomem *g = irq2regs(d->irq); -	u32 mask = (u32) irq_data_get_irq_handler_data(d); -  	if (trigger & ~(IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))  		return -EINVAL; diff --git a/drivers/gpio/gpio-ep93xx.c b/drivers/gpio/gpio-ep93xx.c index 72fb9c66532..7aafbb43733 100644 --- a/drivers/gpio/gpio-ep93xx.c +++ b/drivers/gpio/gpio-ep93xx.c @@ -23,6 +23,9 @@  #include <linux/basic_mmio_gpio.h>  #include <mach/hardware.h> +#include <mach/gpio-ep93xx.h> + +#define irq_to_gpio(irq)	((irq) - gpio_to_irq(0))  struct ep93xx_gpio {  	void __iomem		*mmio_base; @@ -307,6 +310,21 @@ static int ep93xx_gpio_set_debounce(struct gpio_chip *chip,  	return 0;  } +/* + * Map GPIO A0..A7  (0..7)  to irq 64..71, + *          B0..B7  (7..15) to irq 72..79, and + *          F0..F7 (16..24) to irq 80..87. + */ +static int ep93xx_gpio_to_irq(struct gpio_chip *chip, unsigned offset) +{ +	int gpio = chip->base + offset; + +	if (gpio > EP93XX_GPIO_LINE_MAX_IRQ) +		return -EINVAL; + +	return 64 + gpio; +} +  static int ep93xx_gpio_add_bank(struct bgpio_chip *bgc, struct device *dev,  	void __iomem *mmio_base, struct ep93xx_gpio_bank *bank)  { @@ -321,8 +339,10 @@ static int ep93xx_gpio_add_bank(struct bgpio_chip *bgc, struct device *dev,  	bgc->gc.label = bank->label;  	bgc->gc.base = bank->base; -	if (bank->has_debounce) +	if (bank->has_debounce) {  		bgc->gc.set_debounce = ep93xx_gpio_set_debounce; +		bgc->gc.to_irq = ep93xx_gpio_to_irq; +	}  	return gpiochip_add(&bgc->gc);  } diff --git a/arch/arm/mach-ks8695/gpio.c b/drivers/gpio/gpio-ks8695.c index 31e456508a6..a3ac66ea364 100644 --- a/arch/arm/mach-ks8695/gpio.c +++ b/drivers/gpio/gpio-ks8695.c @@ -18,7 +18,7 @@   * along with this program; if not, write to the Free Software   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA   */ - +#include <linux/gpio.h>  #include <linux/kernel.h>  #include <linux/mm.h>  #include <linux/init.h> @@ -31,7 +31,7 @@  #include <asm/mach/irq.h>  #include <mach/regs-gpio.h> -#include <mach/gpio.h> +#include <mach/gpio-ks8695.h>  /*   * Configure a GPIO line for either GPIO function, or its internal diff --git a/arch/arm/mach-lpc32xx/gpiolib.c b/drivers/gpio/gpio-lpc32xx.c index 69061ea8997..5b6948081f8 100644 --- a/arch/arm/mach-lpc32xx/gpiolib.c +++ b/drivers/gpio/gpio-lpc32xx.c @@ -24,7 +24,7 @@  #include <mach/hardware.h>  #include <mach/platform.h> -#include "common.h" +#include <mach/gpio-lpc32xx.h>  #define LPC32XX_GPIO_P3_INP_STATE		_GPREG(0x000)  #define LPC32XX_GPIO_P3_OUTP_SET		_GPREG(0x004) diff --git a/drivers/gpio/gpio-nomadik.c b/drivers/gpio/gpio-nomadik.c index 2c212c732d7..740caed2b27 100644 --- a/drivers/gpio/gpio-nomadik.c +++ b/drivers/gpio/gpio-nomadik.c @@ -27,8 +27,9 @@  #include <asm/mach/irq.h>  #include <plat/pincfg.h> +#include <plat/gpio-nomadik.h>  #include <mach/hardware.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  /*   * The GPIO module in the Nomadik family of Systems-on-Chip is an diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 118ec12d2d5..0e49d87f6c6 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -25,7 +25,7 @@  #include <mach/hardware.h>  #include <asm/irq.h>  #include <mach/irqs.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <asm/mach/irq.h>  struct gpio_bank { diff --git a/arch/arm/plat-pxa/gpio.c b/drivers/gpio/gpio-pxa.c index a11dc367050..9052925c6fa 100644 --- a/arch/arm/plat-pxa/gpio.c +++ b/drivers/gpio/gpio-pxa.c @@ -11,14 +11,14 @@   *  it under the terms of the GNU General Public License version 2 as   *  published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/irq.h>  #include <linux/io.h>  #include <linux/syscore_ops.h>  #include <linux/slab.h> -#include <mach/gpio.h> +#include <mach/gpio-pxa.h>  int pxa_last_gpio; diff --git a/arch/arm/mach-sa1100/gpio.c b/drivers/gpio/gpio-sa1100.c index 0d3829a8c2c..b6c1f6d8064 100644 --- a/arch/arm/mach-sa1100/gpio.c +++ b/drivers/gpio/gpio-sa1100.c @@ -7,13 +7,11 @@   * it under the terms of the GNU General Public License version 2 as   * published by the Free Software Foundation.   */ - +#include <linux/gpio.h>  #include <linux/init.h>  #include <linux/module.h> -#include <asm/gpio.h>  #include <mach/hardware.h> -#include "generic.h"  static int sa1100_gpio_get(struct gpio_chip *chip, unsigned offset)  { diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c index 747eb40e8af..6b65207c810 100644 --- a/drivers/gpio/gpio-tegra.c +++ b/drivers/gpio/gpio-tegra.c @@ -27,6 +27,7 @@  #include <asm/mach/irq.h> +#include <mach/gpio-tegra.h>  #include <mach/iomap.h>  #include <mach/suspend.h> @@ -134,7 +135,10 @@ static int tegra_gpio_direction_output(struct gpio_chip *chip, unsigned offset,  	return 0;  } - +static int tegra_gpio_to_irq(struct gpio_chip *chip, unsigned offset) +{ +	return TEGRA_GPIO_TO_IRQ(offset); +}  static struct gpio_chip tegra_gpio_chip = {  	.label			= "tegra-gpio", @@ -142,6 +146,7 @@ static struct gpio_chip tegra_gpio_chip = {  	.get			= tegra_gpio_get,  	.direction_output	= tegra_gpio_direction_output,  	.set			= tegra_gpio_set, +	.to_irq			= tegra_gpio_to_irq,  	.base			= 0,  	.ngpio			= TEGRA_NR_GPIOS,  }; @@ -331,6 +336,7 @@ static struct lock_class_key gpio_lock_class;  static int __init tegra_gpio_init(void)  {  	struct tegra_gpio_bank *bank; +	int gpio;  	int i;  	int j; @@ -352,14 +358,17 @@ static int __init tegra_gpio_init(void)  	gpiochip_add(&tegra_gpio_chip); -	for (i = INT_GPIO_BASE; i < (INT_GPIO_BASE + TEGRA_NR_GPIOS); i++) { -		bank = &tegra_gpio_banks[GPIO_BANK(irq_to_gpio(i))]; +	for (gpio = 0; gpio < TEGRA_NR_GPIOS; gpio++) { +		int irq = TEGRA_GPIO_TO_IRQ(gpio); +		/* No validity check; all Tegra GPIOs are valid IRQs */ + +		bank = &tegra_gpio_banks[GPIO_BANK(gpio)]; -		irq_set_lockdep_class(i, &gpio_lock_class); -		irq_set_chip_data(i, bank); -		irq_set_chip_and_handler(i, &tegra_gpio_irq_chip, +		irq_set_lockdep_class(irq, &gpio_lock_class); +		irq_set_chip_data(irq, bank); +		irq_set_chip_and_handler(irq, &tegra_gpio_irq_chip,  					 handle_simple_irq); -		set_irq_flags(i, IRQF_VALID); +		set_irq_flags(irq, IRQF_VALID);  	}  	for (i = 0; i < ARRAY_SIZE(tegra_gpio_banks); i++) { diff --git a/arch/arm/mach-davinci/gpio-tnetv107x.c b/drivers/gpio/gpio-tnetv107x.c index 3fa3e2867e1..3fa3e2867e1 100644 --- a/arch/arm/mach-davinci/gpio-tnetv107x.c +++ b/drivers/gpio/gpio-tnetv107x.c diff --git a/drivers/gpio/gpio-u300.c b/drivers/gpio/gpio-u300.c index 53e8255cb0b..4035778852b 100644 --- a/drivers/gpio/gpio-u300.c +++ b/drivers/gpio/gpio-u300.c @@ -1,18 +1,17 @@  /*   * U300 GPIO module.   * - * Copyright (C) 2007-2009 ST-Ericsson AB + * Copyright (C) 2007-2011 ST-Ericsson AB   * License terms: GNU General Public License (GPL) version 2   * This can driver either of the two basic GPIO cores   * available in the U300 platforms:   * COH 901 335   - Used in DB3150 (U300 1.0) and DB3200 (U330 1.0)   * COH 901 571/3 - Used in DB3210 (U365 2.0) and DB3350 (U335 1.0) - * Notice that you also have inline macros in <asm-arch/gpio.h> - * Author: Linus Walleij <linus.walleij@stericsson.com> + * Author: Linus Walleij <linus.walleij@linaro.org>   * Author: Jonas Aaberg <jonas.aberg@stericsson.com> - *   */  #include <linux/module.h> +#include <linux/irq.h>  #include <linux/interrupt.h>  #include <linux/delay.h>  #include <linux/errno.h> @@ -21,677 +20,898 @@  #include <linux/err.h>  #include <linux/platform_device.h>  #include <linux/gpio.h> +#include <linux/list.h> +#include <linux/slab.h> +#include <mach/gpio-u300.h> -/* Reference to GPIO block clock */ -static struct clk *clk; +/* + * Bias modes for U300 GPIOs + * + * GPIO_U300_CONFIG_BIAS_UNKNOWN: this bias mode is not known to us + * GPIO_U300_CONFIG_BIAS_FLOAT: no specific bias, the GPIO will float or state + *	is not controlled by software + * GPIO_U300_CONFIG_BIAS_PULL_UP: the GPIO will be pulled up (usually with high + *	impedance to VDD) + */ +#define GPIO_U300_CONFIG_BIAS_UNKNOWN	0x1000 +#define GPIO_U300_CONFIG_BIAS_FLOAT	0x1001 +#define GPIO_U300_CONFIG_BIAS_PULL_UP	0x1002 -/* Memory resource */ -static struct resource *memres; -static void __iomem *virtbase; -static struct device *gpiodev; +/* + * Drive modes for U300 GPIOs (output) + * + * GPIO_U300_CONFIG_DRIVE_PUSH_PULL: the GPIO will be driven actively high and + *	low, this is the most typical case and is typically achieved with two + *	active transistors on the output + * GPIO_U300_CONFIG_DRIVE_OPEN_DRAIN: the GPIO will be driven with open drain + *	(open collector) which means it is usually wired with other output + *	ports which are then pulled up with an external resistor + * GPIO_U300_CONFIG_DRIVE_OPEN_SOURCE: the GPIO will be driven with open drain + *	(open emitter) which is the same as open drain mutatis mutandis but + *	pulled to ground + */ +#define GPIO_U300_CONFIG_DRIVE_PUSH_PULL	0x2000 +#define GPIO_U300_CONFIG_DRIVE_OPEN_DRAIN	0x2001 +#define GPIO_U300_CONFIG_DRIVE_OPEN_SOURCE	0x2002 + +/* + * Register definitions for COH 901 335 variant + */ +#define U300_335_PORT_STRIDE				(0x1C) +/* Port X Pin Data Register 32bit, this is both input and output (R/W) */ +#define U300_335_PXPDIR					(0x00) +#define U300_335_PXPDOR					(0x00) +/* Port X Pin Config Register 32bit (R/W) */ +#define U300_335_PXPCR					(0x04) +/* This register layout is the same in both blocks */ +#define U300_GPIO_PXPCR_ALL_PINS_MODE_MASK		(0x0000FFFFUL) +#define U300_GPIO_PXPCR_PIN_MODE_MASK			(0x00000003UL) +#define U300_GPIO_PXPCR_PIN_MODE_SHIFT			(0x00000002UL) +#define U300_GPIO_PXPCR_PIN_MODE_INPUT			(0x00000000UL) +#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL	(0x00000001UL) +#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_DRAIN	(0x00000002UL) +#define U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_SOURCE	(0x00000003UL) +/* Port X Interrupt Event Register 32bit (R/W) */ +#define U300_335_PXIEV					(0x08) +/* Port X Interrupt Enable Register 32bit (R/W) */ +#define U300_335_PXIEN					(0x0C) +/* Port X Interrupt Force Register 32bit (R/W) */ +#define U300_335_PXIFR					(0x10) +/* Port X Interrupt Config Register 32bit (R/W) */ +#define U300_335_PXICR					(0x14) +/* This register layout is the same in both blocks */ +#define U300_GPIO_PXICR_ALL_IRQ_CONFIG_MASK		(0x000000FFUL) +#define U300_GPIO_PXICR_IRQ_CONFIG_MASK			(0x00000001UL) +#define U300_GPIO_PXICR_IRQ_CONFIG_FALLING_EDGE		(0x00000000UL) +#define U300_GPIO_PXICR_IRQ_CONFIG_RISING_EDGE		(0x00000001UL) +/* Port X Pull-up Enable Register 32bit (R/W) */ +#define U300_335_PXPER					(0x18) +/* This register layout is the same in both blocks */ +#define U300_GPIO_PXPER_ALL_PULL_UP_DISABLE_MASK	(0x000000FFUL) +#define U300_GPIO_PXPER_PULL_UP_DISABLE			(0x00000001UL) +/* Control Register 32bit (R/W) */ +#define U300_335_CR					(0x54) +#define U300_335_CR_BLOCK_CLOCK_ENABLE			(0x00000001UL) + +/* + * Register definitions for COH 901 571 / 3 variant + */ +#define U300_571_PORT_STRIDE				(0x30) +/* + * Control Register 32bit (R/W) + * bit 15-9 (mask 0x0000FE00) contains the number of cores. 8*cores + * gives the number of GPIO pins. + * bit 8-2  (mask 0x000001FC) contains the core version ID. + */ +#define U300_571_CR					(0x00) +#define U300_571_CR_SYNC_SEL_ENABLE			(0x00000002UL) +#define U300_571_CR_BLOCK_CLKRQ_ENABLE			(0x00000001UL) +/* + * These registers have the same layout and function as the corresponding + * COH 901 335 registers, just at different offset. + */ +#define U300_571_PXPDIR					(0x04) +#define U300_571_PXPDOR					(0x08) +#define U300_571_PXPCR					(0x0C) +#define U300_571_PXPER					(0x10) +#define U300_571_PXIEV					(0x14) +#define U300_571_PXIEN					(0x18) +#define U300_571_PXIFR					(0x1C) +#define U300_571_PXICR					(0x20) + +/* 8 bits per port, no version has more than 7 ports */ +#define U300_GPIO_PINS_PER_PORT 8 +#define U300_GPIO_MAX (U300_GPIO_PINS_PER_PORT * 7) + +struct u300_gpio { +	struct gpio_chip chip; +	struct list_head port_list; +	struct clk *clk; +	struct resource *memres; +	void __iomem *base; +	struct device *dev; +	int irq_base; +	u32 stride; +	/* Register offsets */ +	u32 pcr; +	u32 dor; +	u32 dir; +	u32 per; +	u32 icr; +	u32 ien; +	u32 iev; +};  struct u300_gpio_port { -	const char *name; +	struct list_head node; +	struct u300_gpio *gpio; +	char name[8];  	int irq;  	int number; +	u8 toggle_edge_mode;  }; +/* + * Macro to expand to read a specific register found in the "gpio" + * struct. It requires the struct u300_gpio *gpio variable to exist in + * its context. It calculates the port offset from the given pin + * offset, muliplies by the port stride and adds the register offset + * so it provides a pointer to the desired register. + */ +#define U300_PIN_REG(pin, reg) \ +	(gpio->base + (pin >> 3) * gpio->stride + gpio->reg) -static struct u300_gpio_port gpio_ports[] = { -	{ -		.name = "gpio0", -		.number = 0, -	}, -	{ -		.name = "gpio1", -		.number = 1, -	}, -	{ -		.name = "gpio2", -		.number = 2, -	}, -#ifdef U300_COH901571_3 -	{ -		.name = "gpio3", -		.number = 3, -	}, -	{ -		.name = "gpio4", -		.number = 4, -	}, -#ifdef CONFIG_MACH_U300_BS335 -	{ -		.name = "gpio5", -		.number = 5, -	}, -	{ -		.name = "gpio6", -		.number = 6, -	}, -#endif -#endif +/* + * Provides a bitmask for a specific gpio pin inside an 8-bit GPIO + * register. + */ +#define U300_PIN_BIT(pin) \ +	(1 << (pin & 0x07)) +struct u300_gpio_confdata { +	u16 bias_mode; +	bool output; +	int outval;  }; +/* BS335 has seven ports of 8 bits each = GPIO pins 0..55 */ +#define BS335_GPIO_NUM_PORTS 7 +/* BS365 has five ports of 8 bits each = GPIO pins 0..39 */ +#define BS365_GPIO_NUM_PORTS 5 -#ifdef U300_COH901571_3 +#define U300_FLOATING_INPUT { \ +	.bias_mode = GPIO_U300_CONFIG_BIAS_FLOAT, \ +	.output = false, \ +} -/* Default input value */ -#define DEFAULT_OUTPUT_LOW   0 -#define DEFAULT_OUTPUT_HIGH  1 +#define U300_PULL_UP_INPUT { \ +	.bias_mode = GPIO_U300_CONFIG_BIAS_PULL_UP, \ +	.output = false, \ +} -/* GPIO Pull-Up status */ -#define DISABLE_PULL_UP  0 -#define ENABLE_PULL_UP  1 +#define U300_OUTPUT_LOW { \ +	.output = true, \ +	.outval = 0, \ +} -#define GPIO_NOT_USED 0 -#define GPIO_IN       1 -#define GPIO_OUT      2 +#define U300_OUTPUT_HIGH { \ +	.output = true, \ +	.outval = 1, \ +} -struct u300_gpio_configuration_data { -	unsigned char pin_usage; -	unsigned char default_output_value; -	unsigned char pull_up; -};  /* Initial configuration */ -const struct u300_gpio_configuration_data -u300_gpio_config[U300_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = { -#ifdef CONFIG_MACH_U300_BS335 +static const struct __initdata u300_gpio_confdata +bs335_gpio_config[BS335_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {  	/* Port 0, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_HIGH,  DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_FLOATING_INPUT, +		U300_OUTPUT_HIGH, +		U300_FLOATING_INPUT, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW,  	},  	/* Port 1, pins 0-7 */  	{ -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_HIGH,  DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_PULL_UP_INPUT, +		U300_FLOATING_INPUT, +		U300_OUTPUT_HIGH, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW,  	},  	/* Port 2, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP} +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_OUTPUT_LOW, +		U300_PULL_UP_INPUT, +		U300_OUTPUT_LOW, +		U300_PULL_UP_INPUT,  	},  	/* Port 3, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_PULL_UP_INPUT, +		U300_OUTPUT_LOW, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT,  	},  	/* Port 4, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT,  	},  	/* Port 5, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT,  	},  	/* Port 6, pind 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT,  	} -#endif +}; -#ifdef CONFIG_MACH_U300_BS365 +static const struct __initdata u300_gpio_confdata +bs365_gpio_config[BS365_GPIO_NUM_PORTS][U300_GPIO_PINS_PER_PORT] = {  	/* Port 0, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_FLOATING_INPUT, +		U300_OUTPUT_LOW, +		U300_FLOATING_INPUT, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_PULL_UP_INPUT, +		U300_FLOATING_INPUT,  	},  	/* Port 1, pins 0-7 */  	{ -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_HIGH,  DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP} +		U300_OUTPUT_LOW, +		U300_FLOATING_INPUT, +		U300_OUTPUT_LOW, +		U300_FLOATING_INPUT, +		U300_FLOATING_INPUT, +		U300_OUTPUT_HIGH, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW,  	},  	/* Port 2, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,   DISABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP} +		U300_FLOATING_INPUT, +		U300_PULL_UP_INPUT, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT,  	},  	/* Port 3, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP} +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT,  	},  	/* Port 4, pins 0-7 */  	{ -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_IN,  DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT, +		U300_PULL_UP_INPUT,  		/* These 4 pins doesn't exist on DB3210 */ -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP}, -		{GPIO_OUT, DEFAULT_OUTPUT_LOW,    ENABLE_PULL_UP} +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW, +		U300_OUTPUT_LOW,  	} -#endif -}; -#endif - - -/* No users == we can power down GPIO */ -static int gpio_users; - -struct gpio_struct { -	int (*callback)(void *); -	void *data; -	int users;  }; -static struct gpio_struct gpio_pin[U300_GPIO_MAX]; - -/* - * Let drivers register callback in order to get notified when there is - * an interrupt on the gpio pin +/** + * to_u300_gpio() - get the pointer to u300_gpio + * @chip: the gpio chip member of the structure u300_gpio   */ -int gpio_register_callback(unsigned gpio, int (*func)(void *arg), void *data) +static inline struct u300_gpio *to_u300_gpio(struct gpio_chip *chip)  { -	if (gpio_pin[gpio].callback) -		dev_warn(gpiodev, "%s: WARNING: callback already " -			 "registered for gpio pin#%d\n", __func__, gpio); -	gpio_pin[gpio].callback = func; -	gpio_pin[gpio].data = data; - -	return 0; +	return container_of(chip, struct u300_gpio, chip);  } -EXPORT_SYMBOL(gpio_register_callback); -int gpio_unregister_callback(unsigned gpio) +static int u300_gpio_get(struct gpio_chip *chip, unsigned offset)  { -	if (!gpio_pin[gpio].callback) -		dev_warn(gpiodev, "%s: WARNING: callback already " -			 "unregistered for gpio pin#%d\n", __func__, gpio); -	gpio_pin[gpio].callback = NULL; -	gpio_pin[gpio].data = NULL; +	struct u300_gpio *gpio = to_u300_gpio(chip); -	return 0; +	return readl(U300_PIN_REG(offset, dir)) & U300_PIN_BIT(offset);  } -EXPORT_SYMBOL(gpio_unregister_callback); -/* Non-zero means valid */ -int gpio_is_valid(int number) +static void u300_gpio_set(struct gpio_chip *chip, unsigned offset, int value)  { -	if (number >= 0 && -	    number < (U300_GPIO_NUM_PORTS * U300_GPIO_PINS_PER_PORT)) -		return 1; -	return 0; -} -EXPORT_SYMBOL(gpio_is_valid); +	struct u300_gpio *gpio = to_u300_gpio(chip); +	unsigned long flags; +	u32 val; -int gpio_request(unsigned gpio, const char *label) -{ -	if (gpio_pin[gpio].users) -		return -EINVAL; -	else -		gpio_pin[gpio].users++; +	local_irq_save(flags); -	gpio_users++; +	val = readl(U300_PIN_REG(offset, dor)); +	if (value) +		writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, dor)); +	else +		writel(val & ~U300_PIN_BIT(offset), U300_PIN_REG(offset, dor)); -	return 0; +	local_irq_restore(flags);  } -EXPORT_SYMBOL(gpio_request); -void gpio_free(unsigned gpio) +static int u300_gpio_direction_input(struct gpio_chip *chip, unsigned offset)  { -	gpio_users--; -	gpio_pin[gpio].users--; -	if (unlikely(gpio_pin[gpio].users < 0)) { -		dev_warn(gpiodev, "warning: gpio#%d release mismatch\n", -			 gpio); -		gpio_pin[gpio].users = 0; -	} +	struct u300_gpio *gpio = to_u300_gpio(chip); +	unsigned long flags; +	u32 val; -	return; +	local_irq_save(flags); +	val = readl(U300_PIN_REG(offset, pcr)); +	/* Mask out this pin, note 2 bits per setting */ +	val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((offset & 0x07) << 1)); +	writel(val, U300_PIN_REG(offset, pcr)); +	local_irq_restore(flags); +	return 0;  } -EXPORT_SYMBOL(gpio_free); -/* This returns zero or nonzero */ -int gpio_get_value(unsigned gpio) +static int u300_gpio_direction_output(struct gpio_chip *chip, unsigned offset, +				      int value)  { -	return readl(virtbase + U300_GPIO_PXPDIR + -	  PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) & (1 << (gpio & 0x07)); -} -EXPORT_SYMBOL(gpio_get_value); - -/* - * We hope that the compiler will optimize away the unused branch - * in case "value" is a constant - */ -void gpio_set_value(unsigned gpio, int value) -{ -	u32 val; +	struct u300_gpio *gpio = to_u300_gpio(chip);  	unsigned long flags; +	u32 oldmode; +	u32 val;  	local_irq_save(flags); -	if (value) { -		/* set */ -		val = readl(virtbase + U300_GPIO_PXPDOR + -		  PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) -		  & (1 << (gpio & 0x07)); -		writel(val | (1 << (gpio & 0x07)), virtbase + -		  U300_GPIO_PXPDOR + -		  PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); -	} else { -		/* clear */ -		val = readl(virtbase + U300_GPIO_PXPDOR + -		  PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING) -		  & (1 << (gpio & 0x07)); -		writel(val & ~(1 << (gpio & 0x07)), virtbase + -		  U300_GPIO_PXPDOR + -		  PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); +	val = readl(U300_PIN_REG(offset, pcr)); +	/* +	 * Drive mode must be set by the special mode set function, set +	 * push/pull mode by default if no mode has been selected. +	 */ +	oldmode = val & (U300_GPIO_PXPCR_PIN_MODE_MASK << +			 ((offset & 0x07) << 1)); +	/* mode = 0 means input, else some mode is already set */ +	if (oldmode == 0) { +		val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << +			 ((offset & 0x07) << 1)); +		val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL +			<< ((offset & 0x07) << 1)); +		writel(val, U300_PIN_REG(offset, pcr));  	} +	u300_gpio_set(chip, offset, value);  	local_irq_restore(flags); +	return 0; +} + +static int u300_gpio_to_irq(struct gpio_chip *chip, unsigned offset) +{ +	struct u300_gpio *gpio = to_u300_gpio(chip); +	int retirq = gpio->irq_base + offset; + +	dev_dbg(gpio->dev, "request IRQ for GPIO %d, return %d\n", offset, +		retirq); +	return retirq;  } -EXPORT_SYMBOL(gpio_set_value); -int gpio_direction_input(unsigned gpio) +static int u300_gpio_config(struct gpio_chip *chip, unsigned offset, +		     u16 param, unsigned long *data)  { +	struct u300_gpio *gpio = to_u300_gpio(chip);  	unsigned long flags;  	u32 val; -	if (gpio > U300_GPIO_MAX) -		return -EINVAL; -  	local_irq_save(flags); -	val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	/* Mask out this pin*/ -	val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1)); -	/* This is not needed since it sets the bits to zero.*/ -	/* val |= (U300_GPIO_PXPCR_PIN_MODE_INPUT << (gpio*2)); */ -	writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); +	switch (param) { +	case GPIO_U300_CONFIG_BIAS_UNKNOWN: +	case GPIO_U300_CONFIG_BIAS_FLOAT: +		val = readl(U300_PIN_REG(offset, per)); +		writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, per)); +		break; +	case GPIO_U300_CONFIG_BIAS_PULL_UP: +		val = readl(U300_PIN_REG(offset, per)); +		writel(val & ~U300_PIN_BIT(offset), U300_PIN_REG(offset, per)); +		break; +	case GPIO_U300_CONFIG_DRIVE_PUSH_PULL: +		val = readl(U300_PIN_REG(offset, pcr)); +		val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK +			 << ((offset & 0x07) << 1)); +		val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL +			<< ((offset & 0x07) << 1)); +		writel(val, U300_PIN_REG(offset, pcr)); +		break; +	case GPIO_U300_CONFIG_DRIVE_OPEN_DRAIN: +		val = readl(U300_PIN_REG(offset, pcr)); +		val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK +			 << ((offset & 0x07) << 1)); +		val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_DRAIN +			<< ((offset & 0x07) << 1)); +		writel(val, U300_PIN_REG(offset, pcr)); +		break; +	case GPIO_U300_CONFIG_DRIVE_OPEN_SOURCE: +		val = readl(U300_PIN_REG(offset, pcr)); +		val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK +			 << ((offset & 0x07) << 1)); +		val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_OPEN_SOURCE +			<< ((offset & 0x07) << 1)); +		writel(val, U300_PIN_REG(offset, pcr)); +		break; +	default: +		local_irq_restore(flags); +		dev_err(gpio->dev, "illegal configuration requested\n"); +		return -EINVAL; +	}  	local_irq_restore(flags);  	return 0;  } -EXPORT_SYMBOL(gpio_direction_input); -int gpio_direction_output(unsigned gpio, int value) +static struct gpio_chip u300_gpio_chip = { +	.label			= "u300-gpio-chip", +	.owner			= THIS_MODULE, +	.get			= u300_gpio_get, +	.set			= u300_gpio_set, +	.direction_input	= u300_gpio_direction_input, +	.direction_output	= u300_gpio_direction_output, +	.to_irq			= u300_gpio_to_irq, +}; + +static void u300_toggle_trigger(struct u300_gpio *gpio, unsigned offset)  { -	unsigned long flags;  	u32 val; -	if (gpio > U300_GPIO_MAX) -		return -EINVAL; - -	local_irq_save(flags); -	val = readl(virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	/* Mask out this pin */ -	val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << ((gpio & 0x07) << 1)); -	/* -	 * FIXME: configure for push/pull, open drain or open source per pin -	 * in setup. The current driver will only support push/pull. -	 */ -	val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL -			<< ((gpio & 0x07) << 1)); -	writel(val, virtbase + U300_GPIO_PXPCR + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	gpio_set_value(gpio, value); -	local_irq_restore(flags); -	return 0; +	val = readl(U300_PIN_REG(offset, icr)); +	/* Set mode depending on state */ +	if (u300_gpio_get(&gpio->chip, offset)) { +		/* High now, let's trigger on falling edge next then */ +		writel(val & ~U300_PIN_BIT(offset), U300_PIN_REG(offset, icr)); +		dev_dbg(gpio->dev, "next IRQ on falling edge on pin %d\n", +			offset); +	} else { +		/* Low now, let's trigger on rising edge next then */ +		writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, icr)); +		dev_dbg(gpio->dev, "next IRQ on rising edge on pin %d\n", +			offset); +	}  } -EXPORT_SYMBOL(gpio_direction_output); -/* - * Enable an IRQ, edge is rising edge (!= 0) or falling edge (==0). - */ -void enable_irq_on_gpio_pin(unsigned gpio, int edge) +static int u300_gpio_irq_type(struct irq_data *d, unsigned trigger)  { +	struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); +	struct u300_gpio *gpio = port->gpio; +	int offset = d->irq - gpio->irq_base;  	u32 val; -	unsigned long flags; -	local_irq_save(flags); -	val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	val |= (1 << (gpio & 0x07)); -	writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	val = readl(virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	if (edge) -		val |= (1 << (gpio & 0x07)); -	else -		val &= ~(1 << (gpio & 0x07)); -	writel(val, virtbase + U300_GPIO_PXICR + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	local_irq_restore(flags); +	if ((trigger & IRQF_TRIGGER_RISING) && +	    (trigger & IRQF_TRIGGER_FALLING)) { +		/* +		 * The GPIO block can only trigger on falling OR rising edges, +		 * not both. So we need to toggle the mode whenever the pin +		 * goes from one state to the other with a special state flag +		 */ +		dev_dbg(gpio->dev, +			"trigger on both rising and falling edge on pin %d\n", +			offset); +		port->toggle_edge_mode |= U300_PIN_BIT(offset); +		u300_toggle_trigger(gpio, offset); +	} else if (trigger & IRQF_TRIGGER_RISING) { +		dev_dbg(gpio->dev, "trigger on rising edge on pin %d\n", +			offset); +		val = readl(U300_PIN_REG(offset, icr)); +		writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, icr)); +		port->toggle_edge_mode &= ~U300_PIN_BIT(offset); +	} else if (trigger & IRQF_TRIGGER_FALLING) { +		dev_dbg(gpio->dev, "trigger on falling edge on pin %d\n", +			offset); +		val = readl(U300_PIN_REG(offset, icr)); +		writel(val & ~U300_PIN_BIT(offset), U300_PIN_REG(offset, icr)); +		port->toggle_edge_mode &= ~U300_PIN_BIT(offset); +	} + +	return 0;  } -EXPORT_SYMBOL(enable_irq_on_gpio_pin); -void disable_irq_on_gpio_pin(unsigned gpio) +static void u300_gpio_irq_enable(struct irq_data *d)  { +	struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); +	struct u300_gpio *gpio = port->gpio; +	int offset = d->irq - gpio->irq_base;  	u32 val;  	unsigned long flags;  	local_irq_save(flags); -	val = readl(virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); -	val &= ~(1 << (gpio & 0x07)); -	writel(val, virtbase + U300_GPIO_PXIEN + PIN_TO_PORT(gpio) * -				U300_GPIO_PORTX_SPACING); +	val = readl(U300_PIN_REG(offset, ien)); +	writel(val | U300_PIN_BIT(offset), U300_PIN_REG(offset, ien));  	local_irq_restore(flags);  } -EXPORT_SYMBOL(disable_irq_on_gpio_pin); -/* Enable (value == 0) or disable (value == 1) internal pullup */ -void gpio_pullup(unsigned gpio, int value) +static void u300_gpio_irq_disable(struct irq_data *d)  { +	struct u300_gpio_port *port = irq_data_get_irq_chip_data(d); +	struct u300_gpio *gpio = port->gpio; +	int offset = d->irq - gpio->irq_base;  	u32 val;  	unsigned long flags;  	local_irq_save(flags); -	if (value) { -		val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) * -					U300_GPIO_PORTX_SPACING); -		writel(val | (1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER + -				PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); -	} else { -		val = readl(virtbase + U300_GPIO_PXPER + PIN_TO_PORT(gpio) * -					U300_GPIO_PORTX_SPACING); -		writel(val & ~(1 << (gpio & 0x07)), virtbase + U300_GPIO_PXPER + -				PIN_TO_PORT(gpio) * U300_GPIO_PORTX_SPACING); -	} +	val = readl(U300_PIN_REG(offset, ien)); +	writel(val & ~U300_PIN_BIT(offset), U300_PIN_REG(offset, ien));  	local_irq_restore(flags);  } -EXPORT_SYMBOL(gpio_pullup); -static irqreturn_t gpio_irq_handler(int irq, void *dev_id) +static struct irq_chip u300_gpio_irqchip = { +	.name			= "u300-gpio-irqchip", +	.irq_enable		= u300_gpio_irq_enable, +	.irq_disable		= u300_gpio_irq_disable, +	.irq_set_type		= u300_gpio_irq_type, + +}; + +static void u300_gpio_irq_handler(unsigned irq, struct irq_desc *desc)  { -	struct u300_gpio_port *port = dev_id; -	u32 val; -	int pin; +	struct u300_gpio_port *port = irq_get_handler_data(irq); +	struct u300_gpio *gpio = port->gpio; +	int pinoffset = port->number << 3; /* get the right stride */ +	unsigned long val; +	desc->irq_data.chip->irq_ack(&desc->irq_data);  	/* Read event register */ -	val = readl(virtbase + U300_GPIO_PXIEV + port->number * -				U300_GPIO_PORTX_SPACING); -	/* Mask with enable register */ -	val &= readl(virtbase + U300_GPIO_PXIEV + port->number * -				U300_GPIO_PORTX_SPACING); +	val = readl(U300_PIN_REG(pinoffset, iev));  	/* Mask relevant bits */ -	val &= U300_GPIO_PXIEV_ALL_IRQ_EVENT_MASK; +	val &= 0xFFU; /* 8 bits per port */  	/* ACK IRQ (clear event) */ -	writel(val, virtbase + U300_GPIO_PXIEV + port->number * -				U300_GPIO_PORTX_SPACING); -	/* Print message */ -	while (val != 0) { -		unsigned gpio; +	writel(val, U300_PIN_REG(pinoffset, iev)); + +	/* Call IRQ handler */ +	if (val != 0) { +		int irqoffset; -		pin = __ffs(val); -		/* mask off this pin */ -		val &= ~(1 << pin); -		gpio = (port->number << 3) + pin; +		for_each_set_bit(irqoffset, &val, U300_GPIO_PINS_PER_PORT) { +			int pin_irq = gpio->irq_base + (port->number << 3) +				+ irqoffset; +			int offset = pinoffset + irqoffset; -		if (gpio_pin[gpio].callback) -			(void)gpio_pin[gpio].callback(gpio_pin[gpio].data); -		else -			dev_dbg(gpiodev, "stray GPIO IRQ on line %d\n", -			       gpio); +			dev_dbg(gpio->dev, "GPIO IRQ %d on pin %d\n", +				pin_irq, offset); +			generic_handle_irq(pin_irq); +			/* +			 * Triggering IRQ on both rising and falling edge +			 * needs mockery +			 */ +			if (port->toggle_edge_mode & U300_PIN_BIT(offset)) +				u300_toggle_trigger(gpio, offset); +		}  	} -	return IRQ_HANDLED; + +	desc->irq_data.chip->irq_unmask(&desc->irq_data);  } -static void gpio_set_initial_values(void) +static void __init u300_gpio_init_pin(struct u300_gpio *gpio, +				      int offset, +				      const struct u300_gpio_confdata *conf)  { -#ifdef U300_COH901571_3 -	int i, j; -	unsigned long flags; -	u32 val; +	/* Set mode: input or output */ +	if (conf->output) { +		u300_gpio_direction_output(&gpio->chip, offset, conf->outval); -	/* Write default values to all pins */ -	for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { -		val = 0; -		for (j = 0; j < 8; j++) -			val |= (u32) (u300_gpio_config[i][j].default_output_value != DEFAULT_OUTPUT_LOW) << j; -		local_irq_save(flags); -		writel(val, virtbase + U300_GPIO_PXPDOR + i * U300_GPIO_PORTX_SPACING); -		local_irq_restore(flags); +		/* Deactivate bias mode for output */ +		u300_gpio_config(&gpio->chip, offset, +				 GPIO_U300_CONFIG_BIAS_FLOAT, +				 NULL); + +		/* Set drive mode for output */ +		u300_gpio_config(&gpio->chip, offset, +				 GPIO_U300_CONFIG_DRIVE_PUSH_PULL, NULL); + +		dev_dbg(gpio->dev, "set up pin %d as output, value: %d\n", +			offset, conf->outval); +	} else { +		u300_gpio_direction_input(&gpio->chip, offset); + +		/* Always set output low on input pins */ +		u300_gpio_set(&gpio->chip, offset, 0); + +		/* Set bias mode for input */ +		u300_gpio_config(&gpio->chip, offset, conf->bias_mode, NULL); + +		dev_dbg(gpio->dev, "set up pin %d as input, bias: %04x\n", +			offset, conf->bias_mode);  	} +} -	/* -	 * Put all pins that are set to either 'GPIO_OUT' or 'GPIO_NOT_USED' -	 * to output and 'GPIO_IN' to input for each port. And initialize -	 * default value on outputs. -	 */ -	for (i = 0; i < U300_GPIO_NUM_PORTS; i++) { -		for (j = 0; j < U300_GPIO_PINS_PER_PORT; j++) { -			local_irq_save(flags); -			val = readl(virtbase + U300_GPIO_PXPCR + -					 i * U300_GPIO_PORTX_SPACING); -			/* Mask out this pin */ -			val &= ~(U300_GPIO_PXPCR_PIN_MODE_MASK << (j << 1)); +static void __init u300_gpio_init_coh901571(struct u300_gpio *gpio, +				     struct u300_gpio_platform *plat) +{ +	int i, j; + +	/* Write default config and values to all pins */ +	for (i = 0; i < plat->ports; i++) { +		for (j = 0; j < 8; j++) { +			const struct u300_gpio_confdata *conf; +			int offset = (i*8) + j; + +			if (plat->variant == U300_GPIO_COH901571_3_BS335) +				conf = &bs335_gpio_config[i][j]; +			else if (plat->variant == U300_GPIO_COH901571_3_BS365) +				conf = &bs365_gpio_config[i][j]; +			else +				break; -			if (u300_gpio_config[i][j].pin_usage != GPIO_IN) -				val |= (U300_GPIO_PXPCR_PIN_MODE_OUTPUT_PUSH_PULL << (j << 1)); -			writel(val, virtbase + U300_GPIO_PXPCR + -					 i * U300_GPIO_PORTX_SPACING); -			local_irq_restore(flags); +			u300_gpio_init_pin(gpio, offset, conf);  		}  	} +} -	/* Enable or disable the internal pull-ups in the GPIO ASIC block */ -	for (i = 0; i < U300_GPIO_MAX; i++) { -		val = 0; -		for (j = 0; j < 8; j++) -			val |= (u32)((u300_gpio_config[i][j].pull_up == DISABLE_PULL_UP) << j); -		local_irq_save(flags); -		writel(val, virtbase + U300_GPIO_PXPER + i * U300_GPIO_PORTX_SPACING); -		local_irq_restore(flags); +static inline void u300_gpio_free_ports(struct u300_gpio *gpio) +{ +	struct u300_gpio_port *port; +	struct list_head *p, *n; + +	list_for_each_safe(p, n, &gpio->port_list) { +		port = list_entry(p, struct u300_gpio_port, node); +		list_del(&port->node); +		free_irq(port->irq, port); +		kfree(port);  	} -#endif  } -static int __init gpio_probe(struct platform_device *pdev) +static int __init u300_gpio_probe(struct platform_device *pdev)  { -	u32 val; +	struct u300_gpio_platform *plat = dev_get_platdata(&pdev->dev); +	struct u300_gpio *gpio;  	int err = 0; +	int portno; +	u32 val; +	u32 ifr;  	int i; -	int num_irqs; -	gpiodev = &pdev->dev; -	memset(gpio_pin, 0, sizeof(gpio_pin)); +	gpio = kzalloc(sizeof(struct u300_gpio), GFP_KERNEL); +	if (gpio == NULL) { +		dev_err(&pdev->dev, "failed to allocate memory\n"); +		return -ENOMEM; +	} + +	gpio->chip = u300_gpio_chip; +	gpio->chip.ngpio = plat->ports * U300_GPIO_PINS_PER_PORT; +	gpio->irq_base = plat->gpio_irq_base; +	gpio->chip.dev = &pdev->dev; +	gpio->chip.base = plat->gpio_base; +	gpio->dev = &pdev->dev;  	/* Get GPIO clock */ -	clk = clk_get(&pdev->dev, NULL); -	if (IS_ERR(clk)) { -		err = PTR_ERR(clk); -		dev_err(gpiodev, "could not get GPIO clock\n"); +	gpio->clk = clk_get(gpio->dev, NULL); +	if (IS_ERR(gpio->clk)) { +		err = PTR_ERR(gpio->clk); +		dev_err(gpio->dev, "could not get GPIO clock\n");  		goto err_no_clk;  	} -	err = clk_enable(clk); +	err = clk_enable(gpio->clk);  	if (err) { -		dev_err(gpiodev, "could not enable GPIO clock\n"); +		dev_err(gpio->dev, "could not enable GPIO clock\n");  		goto err_no_clk_enable;  	} -	memres = platform_get_resource(pdev, IORESOURCE_MEM, 0); -	if (!memres) +	gpio->memres = platform_get_resource(pdev, IORESOURCE_MEM, 0); +	if (!gpio->memres) { +		dev_err(gpio->dev, "could not get GPIO memory resource\n"); +		err = -ENODEV;  		goto err_no_resource; +	} -	if (!request_mem_region(memres->start, resource_size(memres), +	if (!request_mem_region(gpio->memres->start, +				resource_size(gpio->memres),  				"GPIO Controller")) {  		err = -ENODEV;  		goto err_no_ioregion;  	} -	virtbase = ioremap(memres->start, resource_size(memres)); -	if (!virtbase) { +	gpio->base = ioremap(gpio->memres->start, resource_size(gpio->memres)); +	if (!gpio->base) {  		err = -ENOMEM;  		goto err_no_ioremap;  	} -	dev_info(gpiodev, "remapped 0x%08x to %p\n", -		 memres->start, virtbase); -#ifdef U300_COH901335 -	dev_info(gpiodev, "initializing GPIO Controller COH 901 335\n"); -	/* Turn on the GPIO block */ -	writel(U300_GPIO_CR_BLOCK_CLOCK_ENABLE, virtbase + U300_GPIO_CR); -#endif +	if (plat->variant == U300_GPIO_COH901335) { +		dev_info(gpio->dev, +			 "initializing GPIO Controller COH 901 335\n"); +		gpio->stride = U300_335_PORT_STRIDE; +		gpio->pcr = U300_335_PXPCR; +		gpio->dor = U300_335_PXPDOR; +		gpio->dir = U300_335_PXPDIR; +		gpio->per = U300_335_PXPER; +		gpio->icr = U300_335_PXICR; +		gpio->ien = U300_335_PXIEN; +		gpio->iev = U300_335_PXIEV; +		ifr = U300_335_PXIFR; -#ifdef U300_COH901571_3 -	dev_info(gpiodev, "initializing GPIO Controller COH 901 571/3\n"); -	val = readl(virtbase + U300_GPIO_CR); -	dev_info(gpiodev, "COH901571/3 block version: %d, " \ -	       "number of cores: %d\n", -	       ((val & 0x0000FE00) >> 9), -	       ((val & 0x000001FC) >> 2)); -	writel(U300_GPIO_CR_BLOCK_CLKRQ_ENABLE, virtbase + U300_GPIO_CR); -#endif +		/* Turn on the GPIO block */ +		writel(U300_335_CR_BLOCK_CLOCK_ENABLE, +		       gpio->base + U300_335_CR); +	} else if (plat->variant == U300_GPIO_COH901571_3_BS335 || +		   plat->variant == U300_GPIO_COH901571_3_BS365) { +		dev_info(gpio->dev, +			 "initializing GPIO Controller COH 901 571/3\n"); +		gpio->stride = U300_571_PORT_STRIDE; +		gpio->pcr = U300_571_PXPCR; +		gpio->dor = U300_571_PXPDOR; +		gpio->dir = U300_571_PXPDIR; +		gpio->per = U300_571_PXPER; +		gpio->icr = U300_571_PXICR; +		gpio->ien = U300_571_PXIEN; +		gpio->iev = U300_571_PXIEV; +		ifr = U300_571_PXIFR; -	gpio_set_initial_values(); +		val = readl(gpio->base + U300_571_CR); +		dev_info(gpio->dev, "COH901571/3 block version: %d, " \ +			 "number of cores: %d totalling %d pins\n", +			 ((val & 0x000001FC) >> 2), +			 ((val & 0x0000FE00) >> 9), +			 ((val & 0x0000FE00) >> 9) * 8); +		writel(U300_571_CR_BLOCK_CLKRQ_ENABLE, +		       gpio->base + U300_571_CR); +		u300_gpio_init_coh901571(gpio, plat); +	} else { +		dev_err(gpio->dev, "unknown block variant\n"); +		err = -ENODEV; +		goto err_unknown_variant; +	} + +	/* Add each port with its IRQ separately */ +	INIT_LIST_HEAD(&gpio->port_list); +	for (portno = 0 ; portno < plat->ports; portno++) { +		struct u300_gpio_port *port = +			kmalloc(sizeof(struct u300_gpio_port), GFP_KERNEL); + +		if (!port) { +			dev_err(gpio->dev, "out of memory\n"); +			err = -ENOMEM; +			goto err_no_port; +		} -	for (num_irqs = 0 ; num_irqs < U300_GPIO_NUM_PORTS; num_irqs++) { +		snprintf(port->name, 8, "gpio%d", portno); +		port->number = portno; +		port->gpio = gpio; -		gpio_ports[num_irqs].irq = -			platform_get_irq_byname(pdev, -						gpio_ports[num_irqs].name); +		port->irq = platform_get_irq_byname(pdev, +						    port->name); -		err = request_irq(gpio_ports[num_irqs].irq, -				  gpio_irq_handler, IRQF_DISABLED, -				  gpio_ports[num_irqs].name, -				  &gpio_ports[num_irqs]); -		if (err) { -			dev_err(gpiodev, "cannot allocate IRQ for %s!\n", -				gpio_ports[num_irqs].name); -			goto err_no_irq; +		dev_dbg(gpio->dev, "register IRQ %d for %s\n", port->irq, +			port->name); + +		irq_set_chained_handler(port->irq, u300_gpio_irq_handler); +		irq_set_handler_data(port->irq, port); + +		/* For each GPIO pin set the unique IRQ handler */ +		for (i = 0; i < U300_GPIO_PINS_PER_PORT; i++) { +			int irqno = gpio->irq_base + (portno << 3) + i; + +			dev_dbg(gpio->dev, "handler for IRQ %d on %s\n", +				irqno, port->name); +			irq_set_chip_and_handler(irqno, &u300_gpio_irqchip, +						 handle_simple_irq); +			set_irq_flags(irqno, IRQF_VALID); +			irq_set_chip_data(irqno, port);  		} -		/* Turns off PortX_irq_force */ -		writel(0x0, virtbase + U300_GPIO_PXIFR + -				 num_irqs * U300_GPIO_PORTX_SPACING); + +		/* Turns off irq force (test register) for this port */ +		writel(0x0, gpio->base + portno * gpio->stride + ifr); + +		list_add_tail(&port->node, &gpio->port_list);  	} +	dev_dbg(gpio->dev, "initialized %d GPIO ports\n", portno); + +	err = gpiochip_add(&gpio->chip); +	if (err) { +		dev_err(gpio->dev, "unable to add gpiochip: %d\n", err); +		goto err_no_chip; +	} + +	platform_set_drvdata(pdev, gpio);  	return 0; - err_no_irq: -	for (i = 0; i < num_irqs; i++) -		free_irq(gpio_ports[i].irq, &gpio_ports[i]); -	iounmap(virtbase); - err_no_ioremap: -	release_mem_region(memres->start, resource_size(memres)); - err_no_ioregion: - err_no_resource: -	clk_disable(clk); - err_no_clk_enable: -	clk_put(clk); - err_no_clk: -	dev_info(gpiodev, "module ERROR:%d\n", err); +err_no_chip: +err_no_port: +	u300_gpio_free_ports(gpio); +err_unknown_variant: +	iounmap(gpio->base); +err_no_ioremap: +	release_mem_region(gpio->memres->start, resource_size(gpio->memres)); +err_no_ioregion: +err_no_resource: +	clk_disable(gpio->clk); +err_no_clk_enable: +	clk_put(gpio->clk); +err_no_clk: +	kfree(gpio); +	dev_info(&pdev->dev, "module ERROR:%d\n", err);  	return err;  } -static int __exit gpio_remove(struct platform_device *pdev) +static int __exit u300_gpio_remove(struct platform_device *pdev)  { -	int i; +	struct u300_gpio_platform *plat = dev_get_platdata(&pdev->dev); +	struct u300_gpio *gpio = platform_get_drvdata(pdev); +	int err;  	/* Turn off the GPIO block */ -	writel(0x00000000U, virtbase + U300_GPIO_CR); -	for (i = 0 ; i < U300_GPIO_NUM_PORTS; i++) -		free_irq(gpio_ports[i].irq, &gpio_ports[i]); -	iounmap(virtbase); -	release_mem_region(memres->start, resource_size(memres)); -	clk_disable(clk); -	clk_put(clk); +	if (plat->variant == U300_GPIO_COH901335) +		writel(0x00000000U, gpio->base + U300_335_CR); +	if (plat->variant == U300_GPIO_COH901571_3_BS335 || +	    plat->variant == U300_GPIO_COH901571_3_BS365) +		writel(0x00000000U, gpio->base + U300_571_CR); + +	err = gpiochip_remove(&gpio->chip); +	if (err < 0) { +		dev_err(gpio->dev, "unable to remove gpiochip: %d\n", err); +		return err; +	} +	u300_gpio_free_ports(gpio); +	iounmap(gpio->base); +	release_mem_region(gpio->memres->start, +			   resource_size(gpio->memres)); +	clk_disable(gpio->clk); +	clk_put(gpio->clk); +	platform_set_drvdata(pdev, NULL); +	kfree(gpio);  	return 0;  } -static struct platform_driver gpio_driver = { +static struct platform_driver u300_gpio_driver = {  	.driver		= {  		.name	= "u300-gpio",  	}, -	.remove		= __exit_p(gpio_remove), +	.remove		= __exit_p(u300_gpio_remove),  };  static int __init u300_gpio_init(void)  { -	return platform_driver_probe(&gpio_driver, gpio_probe); +	return platform_driver_probe(&u300_gpio_driver, u300_gpio_probe);  }  static void __exit u300_gpio_exit(void)  { -	platform_driver_unregister(&gpio_driver); +	platform_driver_unregister(&u300_gpio_driver);  }  arch_initcall(u300_gpio_init);  module_exit(u300_gpio_exit);  MODULE_AUTHOR("Linus Walleij <linus.walleij@stericsson.com>"); - -#ifdef U300_COH901571_3 -MODULE_DESCRIPTION("ST-Ericsson AB COH 901 571/3 GPIO driver"); -#endif - -#ifdef U300_COH901335 -MODULE_DESCRIPTION("ST-Ericsson AB COH 901 335 GPIO driver"); -#endif - +MODULE_DESCRIPTION("ST-Ericsson AB COH 901 335/COH 901 571/3 GPIO driver");  MODULE_LICENSE("GPL"); diff --git a/drivers/i2c/busses/i2c-ixp2000.c b/drivers/i2c/busses/i2c-ixp2000.c index 5d8aed5ec21..c01e9519f6c 100644 --- a/drivers/i2c/busses/i2c-ixp2000.c +++ b/drivers/i2c/busses/i2c-ixp2000.c @@ -35,7 +35,7 @@  #include <linux/slab.h>  #include <mach/hardware.h>	/* Pick up IXP2000-specific bits */ -#include <mach/gpio.h> +#include <mach/gpio-ixp2000.h>  static inline int ixp2000_scl_pin(void *data)  { diff --git a/drivers/ide/at91_ide.c b/drivers/ide/at91_ide.c index 000a78e5246..6dede8f366c 100644 --- a/drivers/ide/at91_ide.c +++ b/drivers/ide/at91_ide.c @@ -28,7 +28,7 @@  #include <linux/platform_device.h>  #include <mach/board.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <mach/at91sam9_smc.h>  #define DRV_NAME "at91_ide" diff --git a/drivers/input/keyboard/omap-keypad.c b/drivers/input/keyboard/omap-keypad.c index 33d0bdc837c..323bcdfff24 100644 --- a/drivers/input/keyboard/omap-keypad.c +++ b/drivers/input/keyboard/omap-keypad.c @@ -35,7 +35,7 @@  #include <linux/mutex.h>  #include <linux/errno.h>  #include <linux/slab.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/keypad.h>  #include <plat/menelaus.h>  #include <asm/irq.h> diff --git a/drivers/mfd/menelaus.c b/drivers/mfd/menelaus.c index 9cee8e7f0bc..af5d9d06137 100644 --- a/drivers/mfd/menelaus.c +++ b/drivers/mfd/menelaus.c @@ -44,7 +44,7 @@  #include <asm/mach/irq.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/menelaus.h>  #define DRIVER_NAME			"menelaus" diff --git a/drivers/mmc/host/omap.c b/drivers/mmc/host/omap.c index a6c32904014..2dba999caf2 100644 --- a/drivers/mmc/host/omap.c +++ b/drivers/mmc/host/omap.c @@ -33,7 +33,7 @@  #include <plat/board.h>  #include <plat/mmc.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/dma.h>  #include <plat/mux.h>  #include <plat/fpga.h> diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 18b0bd31de7..21b00cefae6 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -21,7 +21,9 @@  #include <linux/mmc/card.h>  #include <linux/mmc/host.h> -#include <mach/gpio.h> +#include <asm/gpio.h> + +#include <mach/gpio-tegra.h>  #include <mach/sdhci.h>  #include "sdhci-pltfm.h" diff --git a/drivers/mtd/nand/ams-delta.c b/drivers/mtd/nand/ams-delta.c index 78017eb9318..9e6b498c9be 100644 --- a/drivers/mtd/nand/ams-delta.c +++ b/drivers/mtd/nand/ams-delta.c @@ -26,7 +26,7 @@  #include <asm/io.h>  #include <mach/hardware.h>  #include <asm/sizes.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/board-ams-delta.h>  /* diff --git a/drivers/mtd/onenand/omap2.c b/drivers/mtd/onenand/omap2.c index a916dec2921..6a1d6d9a2df 100644 --- a/drivers/mtd/onenand/omap2.c +++ b/drivers/mtd/onenand/omap2.c @@ -40,7 +40,7 @@  #include <asm/mach/flash.h>  #include <plat/gpmc.h>  #include <plat/onenand.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/dma.h> diff --git a/drivers/net/arm/at91_ether.c b/drivers/net/arm/at91_ether.c index 29dc43523ce..48b4ec121f7 100644 --- a/drivers/net/arm/at91_ether.c +++ b/drivers/net/arm/at91_ether.c @@ -35,7 +35,7 @@  #include <asm/mach-types.h>  #include <mach/at91rm9200_emac.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <mach/board.h>  #include "at91_ether.h" diff --git a/drivers/pcmcia/pxa2xx_vpac270.c b/drivers/pcmcia/pxa2xx_vpac270.c index e956f659089..66ab92cf310 100644 --- a/drivers/pcmcia/pxa2xx_vpac270.c +++ b/drivers/pcmcia/pxa2xx_vpac270.c @@ -17,7 +17,7 @@  #include <asm/mach-types.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <mach/vpac270.h>  #include "soc_common.h" diff --git a/drivers/spi/spi-atmel.c b/drivers/spi/spi-atmel.c index 82dee9a6c0d..d3bff424286 100644 --- a/drivers/spi/spi-atmel.c +++ b/drivers/spi/spi-atmel.c @@ -22,7 +22,7 @@  #include <asm/io.h>  #include <mach/board.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <mach/cpu.h>  /* SPI register offsets */ diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c index b922f5d2e61..caba6730a94 100644 --- a/drivers/tty/serial/atmel_serial.c +++ b/drivers/tty/serial/atmel_serial.c @@ -46,7 +46,7 @@  #ifdef CONFIG_ARM  #include <mach/cpu.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #endif  #define PDC_BUFFER_SIZE		512 diff --git a/drivers/usb/host/ohci-pnx4008.c b/drivers/usb/host/ohci-pnx4008.c index 653d6a60edb..d1b41933199 100644 --- a/drivers/usb/host/ohci-pnx4008.c +++ b/drivers/usb/host/ohci-pnx4008.c @@ -26,7 +26,7 @@  #include <mach/platform.h>  #include <mach/irqs.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #define USB_CTRL	IO_ADDRESS(PNX4008_PWRMAN_BASE + 0x64) diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c index 8bdf25a8b02..f9a3f62a83b 100644 --- a/drivers/usb/musb/davinci.c +++ b/drivers/usb/musb/davinci.c @@ -35,7 +35,7 @@  #include <mach/hardware.h>  #include <mach/memory.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <mach/cputype.h>  #include <asm/mach-types.h> diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c index 817ab60f753..dda920623c6 100644 --- a/drivers/video/atmel_lcdfb.c +++ b/drivers/video/atmel_lcdfb.c @@ -21,7 +21,7 @@  #include <mach/board.h>  #include <mach/cpu.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <video/atmel_lcdc.h> diff --git a/drivers/video/omap/lcd_apollon.c b/drivers/video/omap/lcd_apollon.c index 10459d8bd9a..4b24f549f9b 100644 --- a/drivers/video/omap/lcd_apollon.c +++ b/drivers/video/omap/lcd_apollon.c @@ -24,7 +24,7 @@  #include <linux/module.h>  #include <linux/platform_device.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include "omapfb.h" diff --git a/drivers/video/omap/lcd_h3.c b/drivers/video/omap/lcd_h3.c index 8df688748b5..622ad839fd9 100644 --- a/drivers/video/omap/lcd_h3.c +++ b/drivers/video/omap/lcd_h3.c @@ -23,7 +23,7 @@  #include <linux/platform_device.h>  #include <linux/i2c/tps65010.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include "omapfb.h"  #define MODULE_NAME	"omapfb-lcd_h3" diff --git a/drivers/video/omap/lcd_inn1610.c b/drivers/video/omap/lcd_inn1610.c index 9fff86f67bd..12cc52a70f9 100644 --- a/drivers/video/omap/lcd_inn1610.c +++ b/drivers/video/omap/lcd_inn1610.c @@ -22,7 +22,7 @@  #include <linux/module.h>  #include <linux/platform_device.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include "omapfb.h"  #define MODULE_NAME	"omapfb-lcd_h3" diff --git a/drivers/video/omap/lcd_ldp.c b/drivers/video/omap/lcd_ldp.c index 0f5952cae85..062466402c0 100644 --- a/drivers/video/omap/lcd_ldp.c +++ b/drivers/video/omap/lcd_ldp.c @@ -26,7 +26,7 @@  #include <linux/delay.h>  #include <linux/i2c/twl.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/mux.h>  #include <asm/mach-types.h> diff --git a/drivers/video/omap/lcd_osk.c b/drivers/video/omap/lcd_osk.c index b87e8b83f29..6f8d13c4120 100644 --- a/drivers/video/omap/lcd_osk.c +++ b/drivers/video/omap/lcd_osk.c @@ -23,7 +23,7 @@  #include <linux/module.h>  #include <linux/platform_device.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/mux.h>  #include "omapfb.h" diff --git a/drivers/video/omap/lcd_overo.c b/drivers/video/omap/lcd_overo.c index 564933ffac6..b8fd5b2ec29 100644 --- a/drivers/video/omap/lcd_overo.c +++ b/drivers/video/omap/lcd_overo.c @@ -23,7 +23,7 @@  #include <linux/platform_device.h>  #include <linux/i2c/twl.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include <plat/mux.h>  #include <asm/mach-types.h> diff --git a/drivers/video/omap/lcd_palmtt.c b/drivers/video/omap/lcd_palmtt.c index ff0e6d7ab3a..b51b332e5a2 100644 --- a/drivers/video/omap/lcd_palmtt.c +++ b/drivers/video/omap/lcd_palmtt.c @@ -29,7 +29,7 @@ GPIO13 - screen blanking  #include <linux/module.h>  #include <linux/io.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include "omapfb.h"  static int palmtt_panel_init(struct lcd_panel *panel, diff --git a/drivers/video/pnx4008/sdum.c b/drivers/video/pnx4008/sdum.c index 5ec4f2d439c..50e00395240 100644 --- a/drivers/video/pnx4008/sdum.c +++ b/drivers/video/pnx4008/sdum.c @@ -30,7 +30,7 @@  #include <linux/clk.h>  #include <linux/gfp.h>  #include <asm/uaccess.h> -#include <mach/gpio.h> +#include <asm/gpio.h>  #include "sdum.h"  #include "fbcommon.h"  |