diff options
Diffstat (limited to 'arch/arm/mach-ixp4xx/include')
27 files changed, 2580 insertions, 0 deletions
diff --git a/arch/arm/mach-ixp4xx/include/mach/avila.h b/arch/arm/mach-ixp4xx/include/mach/avila.h new file mode 100644 index 00000000000..1640cb61972 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/avila.h @@ -0,0 +1,39 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/avila.h + * + * Gateworks Avila platform specific definitions + * + * Author: Michael-Luke Jones <mlj28@cam.ac.uk> + * + * Based on ixdp425.h + * Author: Deepak Saxena <dsaxena@plexity.net> + * + * Copyright 2004 (c) MontaVista, Software, Inc. + * + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#define	AVILA_SDA_PIN		7 +#define	AVILA_SCL_PIN		6 + +/* + * AVILA PCI IRQs + */ +#define AVILA_PCI_MAX_DEV	4 +#define LOFT_PCI_MAX_DEV    6 +#define AVILA_PCI_IRQ_LINES	4 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define AVILA_PCI_INTA_PIN	11 +#define AVILA_PCI_INTB_PIN	10 +#define AVILA_PCI_INTC_PIN	9 +#define AVILA_PCI_INTD_PIN	8 + + diff --git a/arch/arm/mach-ixp4xx/include/mach/coyote.h b/arch/arm/mach-ixp4xx/include/mach/coyote.h new file mode 100644 index 00000000000..717ac6d16f5 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/coyote.h @@ -0,0 +1,33 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/coyote.h + * + * ADI Engineering platform specific definitions + * + * Author: Deepak Saxena <dsaxena@plexity.net> + * + * Copyright 2004 (c) MontaVista, Software, Inc.  + *  + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +/* PCI controller GPIO to IRQ pin mappings */ +#define	COYOTE_PCI_SLOT0_PIN	6 +#define	COYOTE_PCI_SLOT1_PIN	11 + +#define	COYOTE_PCI_SLOT0_DEVID	14 +#define	COYOTE_PCI_SLOT1_DEVID	15 + +#define	COYOTE_IDE_BASE_PHYS	IXP4XX_EXP_BUS_BASE(3) +#define	COYOTE_IDE_BASE_VIRT	0xFFFE1000 +#define	COYOTE_IDE_REGION_SIZE	0x1000 + +#define	COYOTE_IDE_DATA_PORT	0xFFFE10E0 +#define	COYOTE_IDE_CTRL_PORT	0xFFFE10FC +#define	COYOTE_IDE_ERROR_PORT	0xFFFE10E2 + diff --git a/arch/arm/mach-ixp4xx/include/mach/cpu.h b/arch/arm/mach-ixp4xx/include/mach/cpu.h new file mode 100644 index 00000000000..ff8aa2393bf --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/cpu.h @@ -0,0 +1,46 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/cpu.h + * + * IXP4XX cpu type detection + * + * Copyright (C) 2007 MontaVista Software, Inc. + * + * 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 __ASM_ARCH_CPU_H__ +#define __ASM_ARCH_CPU_H__ + +extern unsigned int processor_id; +/* Processor id value in CP15 Register 0 */ +#define IXP425_PROCESSOR_ID_VALUE	0x690541c0 +#define IXP435_PROCESSOR_ID_VALUE	0x69054040 +#define IXP465_PROCESSOR_ID_VALUE	0x69054200 +#define IXP4XX_PROCESSOR_ID_MASK	0xfffffff0 + +#define cpu_is_ixp42x()	((processor_id & IXP4XX_PROCESSOR_ID_MASK) == \ +			  IXP425_PROCESSOR_ID_VALUE) +#define cpu_is_ixp43x()	((processor_id & IXP4XX_PROCESSOR_ID_MASK) == \ +			  IXP435_PROCESSOR_ID_VALUE) +#define cpu_is_ixp46x()	((processor_id & IXP4XX_PROCESSOR_ID_MASK) == \ +			  IXP465_PROCESSOR_ID_VALUE) + +static inline u32 ixp4xx_read_feature_bits(void) +{ +	unsigned int val = ~*IXP4XX_EXP_CFG2; +	val &= ~IXP4XX_FEATURE_RESERVED; +	if (!cpu_is_ixp46x()) +		val &= ~IXP4XX_FEATURE_IXP46X_ONLY; + +	return val; +} + +static inline void ixp4xx_write_feature_bits(u32 value) +{ +	*IXP4XX_EXP_CFG2 = ~value; +} + +#endif  /* _ASM_ARCH_CPU_H */ diff --git a/arch/arm/mach-ixp4xx/include/mach/debug-macro.S b/arch/arm/mach-ixp4xx/include/mach/debug-macro.S new file mode 100644 index 00000000000..7c6a6912acd --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/debug-macro.S @@ -0,0 +1,24 @@ +/* arch/arm/mach-ixp4xx/include/mach/debug-macro.S + * + * 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,rx +                mrc     p15, 0, \rx, c1, c0 +                tst     \rx, #1                 @ MMU enabled? +                moveq   \rx, #0xc8000000 +                movne   \rx, #0xff000000 +		orrne	\rx, \rx, #0x00b00000 +                add     \rx,\rx,#3              @ Uart regs are at off set of 3 if +						@ byte writes used - Big Endian. +                .endm + +#define UART_SHIFT	2 +#include <asm/hardware/debug-8250.S> diff --git a/arch/arm/mach-ixp4xx/include/mach/dma.h b/arch/arm/mach-ixp4xx/include/mach/dma.h new file mode 100644 index 00000000000..00c5070c020 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/dma.h @@ -0,0 +1,21 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/dma.h + * + * Copyright (C) 2001-2004 MontaVista Software, Inc. + * + * 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 __ASM_ARCH_DMA_H +#define __ASM_ARCH_DMA_H + +#include <linux/device.h> +#include <asm/page.h> +#include <asm/sizes.h> +#include <mach/hardware.h> + +#define MAX_DMA_ADDRESS		(PAGE_OFFSET + SZ_64M) + +#endif /* _ASM_ARCH_DMA_H */ diff --git a/arch/arm/mach-ixp4xx/include/mach/dsmg600.h b/arch/arm/mach-ixp4xx/include/mach/dsmg600.h new file mode 100644 index 00000000000..dc087a34a26 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/dsmg600.h @@ -0,0 +1,52 @@ +/* + * DSM-G600 platform specific definitions + * + * Copyright (C) 2006 Tower Technologies + * Author: Alessandro Zummo <a.zummo@towertech.it> + * + * based on ixdp425.h: + *	Copyright 2004 (C) MontaVista, Software, Inc. + * + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#define DSMG600_SDA_PIN		5 +#define DSMG600_SCL_PIN		4 + +/* + * DSMG600 PCI IRQs + */ +#define DSMG600_PCI_MAX_DEV	4 +#define DSMG600_PCI_IRQ_LINES	3 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define DSMG600_PCI_INTA_PIN	11 +#define DSMG600_PCI_INTB_PIN	10 +#define DSMG600_PCI_INTC_PIN	9 +#define DSMG600_PCI_INTD_PIN	8 +#define DSMG600_PCI_INTE_PIN	7 +#define DSMG600_PCI_INTF_PIN	6 + +/* DSM-G600 Timer Setting */ +#define DSMG600_FREQ 66000000 + +/* Buttons */ + +#define DSMG600_PB_GPIO		15	/* power button */ +#define DSMG600_RB_GPIO		3	/* reset button */ + +/* Power control */ + +#define DSMG600_PO_GPIO		2	/* power off */ + +/* LEDs */ + +#define DSMG600_LED_PWR_GPIO	0 +#define DSMG600_LED_WLAN_GPIO	14 diff --git a/arch/arm/mach-ixp4xx/include/mach/entry-macro.S b/arch/arm/mach-ixp4xx/include/mach/entry-macro.S new file mode 100644 index 00000000000..f2e14e94ed1 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/entry-macro.S @@ -0,0 +1,47 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/entry-macro.S + * + * Low-level IRQ helper macros for IXP4xx-based platforms + * + * 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. + */ +#include <mach/hardware.h> + +		.macro	disable_fiq +		.endm + +		.macro  get_irqnr_preamble, base, tmp +		.endm + +		.macro  arch_ret_to_user, tmp1, tmp2 +		.endm + +		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp +		ldr	\irqstat, =(IXP4XX_INTC_BASE_VIRT+IXP4XX_ICIP_OFFSET) +		ldr	\irqstat, [\irqstat]		@ get interrupts +		cmp	\irqstat, #0 +		beq	1001f				@ upper IRQ? +		clz     \irqnr, \irqstat +		mov     \base, #31 +		sub     \irqnr, \base, \irqnr +		b	1002f				@ lower IRQ being +							@ handled + +1001: +		/* +		 * IXP465/IXP435 has an upper IRQ status register +		 */ +#if defined(CONFIG_CPU_IXP46X) || defined(CONFIG_CPU_IXP43X) +		ldr	\irqstat, =(IXP4XX_INTC_BASE_VIRT+IXP4XX_ICIP2_OFFSET) +		ldr	\irqstat, [\irqstat]		@ get upper interrupts +		mov	\irqnr, #63 +		clz	\irqstat, \irqstat + 		cmp	\irqstat, #32 +		subne	\irqnr, \irqnr, \irqstat +#endif +1002: +		.endm + + diff --git a/arch/arm/mach-ixp4xx/include/mach/fsg.h b/arch/arm/mach-ixp4xx/include/mach/fsg.h new file mode 100644 index 00000000000..1f02b7e22a1 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/fsg.h @@ -0,0 +1,50 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/fsg.h + * + * Freecom FSG-3 platform specific definitions + * + * Author: Rod Whitby <rod@whitby.id.au> + * Author: Tomasz Chmielewski <mangoo@wpkg.org> + * Maintainers: http://www.nslu2-linux.org + * + * Based on coyote.h by + * Copyright 2004 (c) MontaVista, Software, Inc. + * + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#define FSG_SDA_PIN		12 +#define FSG_SCL_PIN		13 + +/* + * FSG PCI IRQs + */ +#define FSG_PCI_MAX_DEV		3 +#define FSG_PCI_IRQ_LINES	3 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define FSG_PCI_INTA_PIN	6 +#define FSG_PCI_INTB_PIN	7 +#define FSG_PCI_INTC_PIN	5 + +/* Buttons */ + +#define FSG_SB_GPIO		4	/* sync button */ +#define FSG_RB_GPIO		9	/* reset button */ +#define FSG_UB_GPIO		10	/* usb button */ + +/* LEDs */ + +#define FSG_LED_WLAN_BIT	0 +#define FSG_LED_WAN_BIT		1 +#define FSG_LED_SATA_BIT	2 +#define FSG_LED_USB_BIT		4 +#define FSG_LED_RING_BIT	5 +#define FSG_LED_SYNC_BIT	7 diff --git a/arch/arm/mach-ixp4xx/include/mach/gpio.h b/arch/arm/mach-ixp4xx/include/mach/gpio.h new file mode 100644 index 00000000000..9fbde177920 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/gpio.h @@ -0,0 +1,73 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/gpio.h + * + * IXP4XX GPIO wrappers for arch-neutral GPIO calls + * + * Written by Milan Svoboda <msvoboda@ra.rockwell.com> + * Based on PXA implementation 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 __ASM_ARCH_IXP4XX_GPIO_H +#define __ASM_ARCH_IXP4XX_GPIO_H + +#include <mach/hardware.h> + +static inline int gpio_request(unsigned gpio, const char *label) +{ +	return 0; +} + +static inline void gpio_free(unsigned gpio) +{ +	return; +} + +static inline int gpio_direction_input(unsigned gpio) +{ +	gpio_line_config(gpio, IXP4XX_GPIO_IN); +	return 0; +} + +static inline int gpio_direction_output(unsigned gpio, int level) +{ +	gpio_line_set(gpio, level); +	gpio_line_config(gpio, IXP4XX_GPIO_OUT); +	return 0; +} + +static inline int gpio_get_value(unsigned gpio) +{ +	int value; + +	gpio_line_get(gpio, &value); + +	return value; +} + +static inline void gpio_set_value(unsigned gpio, int value) +{ +	gpio_line_set(gpio, value); +} + +#include <asm-generic/gpio.h>			/* cansleep wrappers */ + +extern int gpio_to_irq(int gpio); +extern int irq_to_gpio(int gpio); + +#endif + diff --git a/arch/arm/mach-ixp4xx/include/mach/gtwx5715.h b/arch/arm/mach-ixp4xx/include/mach/gtwx5715.h new file mode 100644 index 00000000000..5d5e201cac7 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/gtwx5715.h @@ -0,0 +1,116 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/gtwx5715.h + * + * Gemtek GTWX5715 Gateway (Linksys WRV54G) + * + * Copyright 2004 (c) George T. Joseph + * + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif +#include "irqs.h" + +#define GTWX5715_GPIO0	0 +#define GTWX5715_GPIO1	1 +#define GTWX5715_GPIO2	2 +#define GTWX5715_GPIO3	3 +#define GTWX5715_GPIO4	4 +#define GTWX5715_GPIO5	5 +#define GTWX5715_GPIO6	6 +#define GTWX5715_GPIO7	7 +#define GTWX5715_GPIO8	8 +#define GTWX5715_GPIO9	9 +#define GTWX5715_GPIO10	10 +#define GTWX5715_GPIO11	11 +#define GTWX5715_GPIO12	12 +#define GTWX5715_GPIO13	13 +#define GTWX5715_GPIO14	14 + +#define GTWX5715_GPIO0_IRQ			IRQ_IXP4XX_GPIO0 +#define GTWX5715_GPIO1_IRQ			IRQ_IXP4XX_GPIO1 +#define GTWX5715_GPIO2_IRQ			IRQ_IXP4XX_GPIO2 +#define GTWX5715_GPIO3_IRQ			IRQ_IXP4XX_GPIO3 +#define GTWX5715_GPIO4_IRQ			IRQ_IXP4XX_GPIO4 +#define GTWX5715_GPIO5_IRQ			IRQ_IXP4XX_GPIO5 +#define GTWX5715_GPIO6_IRQ			IRQ_IXP4XX_GPIO6 +#define GTWX5715_GPIO7_IRQ			IRQ_IXP4XX_GPIO7 +#define GTWX5715_GPIO8_IRQ			IRQ_IXP4XX_GPIO8 +#define GTWX5715_GPIO9_IRQ			IRQ_IXP4XX_GPIO9 +#define GTWX5715_GPIO10_IRQ		IRQ_IXP4XX_GPIO10 +#define GTWX5715_GPIO11_IRQ		IRQ_IXP4XX_GPIO11 +#define GTWX5715_GPIO12_IRQ		IRQ_IXP4XX_GPIO12 +#define GTWX5715_GPIO13_IRQ		IRQ_IXP4XX_SW_INT1 +#define GTWX5715_GPIO14_IRQ		IRQ_IXP4XX_SW_INT2 + +/* PCI controller GPIO to IRQ pin mappings + +			INTA	INTB +SLOT 0	10		11 +SLOT 1	11		10 + +*/ + +#define	GTWX5715_PCI_SLOT0_DEVID	0 +#define	GTWX5715_PCI_SLOT0_INTA_GPIO	GTWX5715_GPIO10 +#define	GTWX5715_PCI_SLOT0_INTB_GPIO	GTWX5715_GPIO11 +#define	GTWX5715_PCI_SLOT0_INTA_IRQ	GTWX5715_GPIO10_IRQ +#define	GTWX5715_PCI_SLOT0_INTB_IRQ	GTWX5715_GPIO11_IRQ + +#define	GTWX5715_PCI_SLOT1_DEVID	1 +#define	GTWX5715_PCI_SLOT1_INTA_GPIO	GTWX5715_GPIO11 +#define	GTWX5715_PCI_SLOT1_INTB_GPIO	GTWX5715_GPIO10 +#define	GTWX5715_PCI_SLOT1_INTA_IRQ	GTWX5715_GPIO11_IRQ +#define	GTWX5715_PCI_SLOT1_INTB_IRQ	GTWX5715_GPIO10_IRQ + +#define GTWX5715_PCI_SLOT_COUNT			2 +#define GTWX5715_PCI_INT_PIN_COUNT		2 + +/* + * GPIO 5,6,7 and12 are hard wired to the Kendin KS8995M Switch + * and operate as an SPI type interface.  The details of the interface + * are available on Kendin/Micrel's web site. + */ + +#define GTWX5715_KSSPI_SELECT	GTWX5715_GPIO5 +#define GTWX5715_KSSPI_TXD		GTWX5715_GPIO6 +#define GTWX5715_KSSPI_CLOCK	GTWX5715_GPIO7 +#define GTWX5715_KSSPI_RXD		GTWX5715_GPIO12 + +/* + * The "reset" button is wired to GPIO 3. + * The GPIO is brought "low" when the button is pushed. + */ + +#define GTWX5715_BUTTON_GPIO	GTWX5715_GPIO3 +#define GTWX5715_BUTTON_IRQ	GTWX5715_GPIO3_IRQ + +/* + *  Board Label      Front Label + *  LED1             Power + *  LED2             Wireless-G + *  LED3             not populated but could be + *  LED4             Internet + *  LED5 - LED8      Controlled by KS8995M Switch + *  LED9             DMZ + */ + +#define GTWX5715_LED1_GPIO		GTWX5715_GPIO2 +#define GTWX5715_LED2_GPIO		GTWX5715_GPIO9 +#define GTWX5715_LED3_GPIO		GTWX5715_GPIO8 +#define GTWX5715_LED4_GPIO		GTWX5715_GPIO1 +#define GTWX5715_LED9_GPIO		GTWX5715_GPIO4 diff --git a/arch/arm/mach-ixp4xx/include/mach/hardware.h b/arch/arm/mach-ixp4xx/include/mach/hardware.h new file mode 100644 index 00000000000..f58a43a2396 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/hardware.h @@ -0,0 +1,50 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/hardware.h  + * + * Copyright (C) 2002 Intel Corporation. + * Copyright (C) 2003-2004 MontaVista Software, Inc. + * + * 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. + * + */ + +/* + * Hardware definitions for IXP4xx based systems + */ + +#ifndef __ASM_ARCH_HARDWARE_H__ +#define __ASM_ARCH_HARDWARE_H__ + +#define PCIBIOS_MIN_IO		0x00001000 +#define PCIBIOS_MIN_MEM		(cpu_is_ixp43x() ? 0x40000000 : 0x48000000) + +/* + * We override the standard dma-mask routines for bouncing. + */ +#define	HAVE_ARCH_PCI_SET_DMA_MASK + +#define pcibios_assign_all_busses()	1 + +/* Register locations and bits */ +#include "ixp4xx-regs.h" + +#ifndef __ASSEMBLER__ +#include <mach/cpu.h> +#endif + +/* Platform helper functions and definitions */ +#include "platform.h" + +/* Platform specific details */ +#include "ixdp425.h" +#include "avila.h" +#include "coyote.h" +#include "prpmc1100.h" +#include "nslu2.h" +#include "nas100d.h" +#include "dsmg600.h" +#include "fsg.h" + +#endif  /* _ASM_ARCH_HARDWARE_H */ diff --git a/arch/arm/mach-ixp4xx/include/mach/io.h b/arch/arm/mach-ixp4xx/include/mach/io.h new file mode 100644 index 00000000000..319948e31be --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/io.h @@ -0,0 +1,569 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/io.h + * + * Author: Deepak Saxena <dsaxena@plexity.net> + * + * Copyright (C) 2002-2005  MontaVista Software, Inc. + * + * 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 __ASM_ARM_ARCH_IO_H +#define __ASM_ARM_ARCH_IO_H + +#include <linux/bitops.h> + +#include <mach/hardware.h> + +#define IO_SPACE_LIMIT 0xffff0000 + +extern int (*ixp4xx_pci_read)(u32 addr, u32 cmd, u32* data); +extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data); + + +/* + * IXP4xx provides two methods of accessing PCI memory space: + * + * 1) A direct mapped window from 0x48000000 to 0x4bffffff (64MB). + *    To access PCI via this space, we simply ioremap() the BAR + *    into the kernel and we can use the standard read[bwl]/write[bwl] + *    macros. This is the preffered method due to speed but it + *    limits the system to just 64MB of PCI memory. This can be  + *    problamatic if using video cards and other memory-heavy + *    targets. + * + * 2) If > 64MB of memory space is required, the IXP4xx can be configured + *    to use indirect registers to access PCI (as we do below for I/O + *    transactions). This allows for up to 128MB (0x48000000 to 0x4fffffff) + *    of memory on the bus. The disadvantage of this is that every  + *    PCI access requires three local register accesses plus a spinlock, + *    but in some cases the performance hit is acceptable. In addition, + *    you cannot mmap() PCI devices in this case. + * + */ +#ifndef	CONFIG_IXP4XX_INDIRECT_PCI + +#define __mem_pci(a)		(a) + +#else + +#include <linux/mm.h> + +/* + * In the case of using indirect PCI, we simply return the actual PCI + * address and our read/write implementation use that to drive the  + * access registers. If something outside of PCI is ioremap'd, we + * fallback to the default. + */ +static inline void __iomem * +__ixp4xx_ioremap(unsigned long addr, size_t size, unsigned int mtype) +{ +	if((addr < PCIBIOS_MIN_MEM) || (addr > 0x4fffffff)) +		return __arm_ioremap(addr, size, mtype); + +	return (void __iomem *)addr; +} + +static inline void +__ixp4xx_iounmap(void __iomem *addr) +{ +	if ((__force u32)addr >= VMALLOC_START) +		__iounmap(addr); +} + +#define __arch_ioremap(a, s, f)		__ixp4xx_ioremap(a, s, f) +#define	__arch_iounmap(a)		__ixp4xx_iounmap(a) + +#define	writeb(v, p)			__ixp4xx_writeb(v, p) +#define	writew(v, p)			__ixp4xx_writew(v, p) +#define	writel(v, p)			__ixp4xx_writel(v, p) + +#define	writesb(p, v, l)		__ixp4xx_writesb(p, v, l) +#define	writesw(p, v, l)		__ixp4xx_writesw(p, v, l) +#define	writesl(p, v, l)		__ixp4xx_writesl(p, v, l) +	 +#define	readb(p)			__ixp4xx_readb(p) +#define	readw(p)			__ixp4xx_readw(p) +#define	readl(p)			__ixp4xx_readl(p) +	 +#define	readsb(p, v, l)			__ixp4xx_readsb(p, v, l) +#define	readsw(p, v, l)			__ixp4xx_readsw(p, v, l) +#define	readsl(p, v, l)			__ixp4xx_readsl(p, v, l) + +static inline void  +__ixp4xx_writeb(u8 value, volatile void __iomem *p) +{ +	u32 addr = (u32)p; +	u32 n, byte_enables, data; + +	if (addr >= VMALLOC_START) { +		__raw_writeb(value, addr); +		return; +	} + +	n = addr % 4; +	byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL; +	data = value << (8*n); +	ixp4xx_pci_write(addr, byte_enables | NP_CMD_MEMWRITE, data); +} + +static inline void +__ixp4xx_writesb(volatile void __iomem *bus_addr, const u8 *vaddr, int count) +{ +	while (count--) +		writeb(*vaddr++, bus_addr); +} + +static inline void  +__ixp4xx_writew(u16 value, volatile void __iomem *p) +{ +	u32 addr = (u32)p; +	u32 n, byte_enables, data; + +	if (addr >= VMALLOC_START) { +		__raw_writew(value, addr); +		return; +	} + +	n = addr % 4; +	byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL; +	data = value << (8*n); +	ixp4xx_pci_write(addr, byte_enables | NP_CMD_MEMWRITE, data); +} + +static inline void +__ixp4xx_writesw(volatile void __iomem *bus_addr, const u16 *vaddr, int count) +{ +	while (count--) +		writew(*vaddr++, bus_addr); +} + +static inline void  +__ixp4xx_writel(u32 value, volatile void __iomem *p) +{ +	u32 addr = (__force u32)p; +	if (addr >= VMALLOC_START) { +		__raw_writel(value, p); +		return; +	} + +	ixp4xx_pci_write(addr, NP_CMD_MEMWRITE, value); +} + +static inline void +__ixp4xx_writesl(volatile void __iomem *bus_addr, const u32 *vaddr, int count) +{ +	while (count--) +		writel(*vaddr++, bus_addr); +} + +static inline unsigned char  +__ixp4xx_readb(const volatile void __iomem *p) +{ +	u32 addr = (u32)p; +	u32 n, byte_enables, data; + +	if (addr >= VMALLOC_START) +		return __raw_readb(addr); + +	n = addr % 4; +	byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL; +	if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_MEMREAD, &data)) +		return 0xff; + +	return data >> (8*n); +} + +static inline void +__ixp4xx_readsb(const volatile void __iomem *bus_addr, u8 *vaddr, u32 count) +{ +	while (count--) +		*vaddr++ = readb(bus_addr); +} + +static inline unsigned short  +__ixp4xx_readw(const volatile void __iomem *p) +{ +	u32 addr = (u32)p; +	u32 n, byte_enables, data; + +	if (addr >= VMALLOC_START) +		return __raw_readw(addr); + +	n = addr % 4; +	byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL; +	if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_MEMREAD, &data)) +		return 0xffff; + +	return data>>(8*n); +} + +static inline void  +__ixp4xx_readsw(const volatile void __iomem *bus_addr, u16 *vaddr, u32 count) +{ +	while (count--) +		*vaddr++ = readw(bus_addr); +} + +static inline unsigned long  +__ixp4xx_readl(const volatile void __iomem *p) +{ +	u32 addr = (__force u32)p; +	u32 data; + +	if (addr >= VMALLOC_START) +		return __raw_readl(p); + +	if (ixp4xx_pci_read(addr, NP_CMD_MEMREAD, &data)) +		return 0xffffffff; + +	return data; +} + +static inline void  +__ixp4xx_readsl(const volatile void __iomem *bus_addr, u32 *vaddr, u32 count) +{ +	while (count--) +		*vaddr++ = readl(bus_addr); +} + + +/* + * We can use the built-in functions b/c they end up calling writeb/readb + */ +#define memset_io(c,v,l)		_memset_io((c),(v),(l)) +#define memcpy_fromio(a,c,l)		_memcpy_fromio((a),(c),(l)) +#define memcpy_toio(c,a,l)		_memcpy_toio((c),(a),(l)) + +#endif + +#ifndef CONFIG_PCI + +#define	__io(v)		v + +#else + +/* + * IXP4xx does not have a transparent cpu -> PCI I/O translation + * window.  Instead, it has a set of registers that must be tweaked + * with the proper byte lanes, command types, and address for the + * transaction.  This means that we need to override the default + * I/O functions. + */ +#define	outb(p, v)			__ixp4xx_outb(p, v) +#define	outw(p, v)			__ixp4xx_outw(p, v) +#define	outl(p, v)			__ixp4xx_outl(p, v) +	 +#define	outsb(p, v, l)			__ixp4xx_outsb(p, v, l) +#define	outsw(p, v, l)			__ixp4xx_outsw(p, v, l) +#define	outsl(p, v, l)			__ixp4xx_outsl(p, v, l) + +#define	inb(p)				__ixp4xx_inb(p) +#define	inw(p)				__ixp4xx_inw(p) +#define	inl(p)				__ixp4xx_inl(p) + +#define	insb(p, v, l)			__ixp4xx_insb(p, v, l) +#define	insw(p, v, l)			__ixp4xx_insw(p, v, l) +#define	insl(p, v, l)			__ixp4xx_insl(p, v, l) + + +static inline void  +__ixp4xx_outb(u8 value, u32 addr) +{ +	u32 n, byte_enables, data; +	n = addr % 4; +	byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL; +	data = value << (8*n); +	ixp4xx_pci_write(addr, byte_enables | NP_CMD_IOWRITE, data); +} + +static inline void  +__ixp4xx_outsb(u32 io_addr, const u8 *vaddr, u32 count) +{ +	while (count--) +		outb(*vaddr++, io_addr); +} + +static inline void  +__ixp4xx_outw(u16 value, u32 addr) +{ +	u32 n, byte_enables, data; +	n = addr % 4; +	byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL; +	data = value << (8*n); +	ixp4xx_pci_write(addr, byte_enables | NP_CMD_IOWRITE, data); +} + +static inline void  +__ixp4xx_outsw(u32 io_addr, const u16 *vaddr, u32 count) +{ +	while (count--) +		outw(cpu_to_le16(*vaddr++), io_addr); +} + +static inline void  +__ixp4xx_outl(u32 value, u32 addr) +{ +	ixp4xx_pci_write(addr, NP_CMD_IOWRITE, value); +} + +static inline void  +__ixp4xx_outsl(u32 io_addr, const u32 *vaddr, u32 count) +{ +	while (count--) +		outl(*vaddr++, io_addr); +} + +static inline u8  +__ixp4xx_inb(u32 addr) +{ +	u32 n, byte_enables, data; +	n = addr % 4; +	byte_enables = (0xf & ~BIT(n)) << IXP4XX_PCI_NP_CBE_BESL; +	if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_IOREAD, &data)) +		return 0xff; + +	return data >> (8*n); +} + +static inline void  +__ixp4xx_insb(u32 io_addr, u8 *vaddr, u32 count) +{ +	while (count--) +		*vaddr++ = inb(io_addr); +} + +static inline u16  +__ixp4xx_inw(u32 addr) +{ +	u32 n, byte_enables, data; +	n = addr % 4; +	byte_enables = (0xf & ~(BIT(n) | BIT(n+1))) << IXP4XX_PCI_NP_CBE_BESL; +	if (ixp4xx_pci_read(addr, byte_enables | NP_CMD_IOREAD, &data)) +		return 0xffff; + +	return data>>(8*n); +} + +static inline void  +__ixp4xx_insw(u32 io_addr, u16 *vaddr, u32 count) +{ +	while (count--) +		*vaddr++ = le16_to_cpu(inw(io_addr)); +} + +static inline u32  +__ixp4xx_inl(u32 addr) +{ +	u32 data; +	if (ixp4xx_pci_read(addr, NP_CMD_IOREAD, &data)) +		return 0xffffffff; + +	return data; +} + +static inline void  +__ixp4xx_insl(u32 io_addr, u32 *vaddr, u32 count) +{ +	while (count--) +		*vaddr++ = inl(io_addr); +} + +#define PIO_OFFSET      0x10000UL +#define PIO_MASK        0x0ffffUL + +#define	__is_io_address(p)	(((unsigned long)p >= PIO_OFFSET) && \ +					((unsigned long)p <= (PIO_MASK + PIO_OFFSET))) +static inline unsigned int +__ixp4xx_ioread8(const void __iomem *addr) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		return	(unsigned int)__ixp4xx_inb(port & PIO_MASK); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		return (unsigned int)__raw_readb(port); +#else +		return (unsigned int)__ixp4xx_readb(addr); +#endif +} + +static inline void +__ixp4xx_ioread8_rep(const void __iomem *addr, void *vaddr, u32 count) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_insb(port & PIO_MASK, vaddr, count); +	else +#ifndef	CONFIG_IXP4XX_INDIRECT_PCI +		__raw_readsb(addr, vaddr, count); +#else +		__ixp4xx_readsb(addr, vaddr, count); +#endif +} + +static inline unsigned int +__ixp4xx_ioread16(const void __iomem *addr) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		return	(unsigned int)__ixp4xx_inw(port & PIO_MASK); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		return le16_to_cpu(__raw_readw((u32)port)); +#else +		return (unsigned int)__ixp4xx_readw(addr); +#endif +} + +static inline void +__ixp4xx_ioread16_rep(const void __iomem *addr, void *vaddr, u32 count) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_insw(port & PIO_MASK, vaddr, count); +	else +#ifndef	CONFIG_IXP4XX_INDIRECT_PCI +		__raw_readsw(addr, vaddr, count); +#else +		__ixp4xx_readsw(addr, vaddr, count); +#endif +} + +static inline unsigned int +__ixp4xx_ioread32(const void __iomem *addr) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		return	(unsigned int)__ixp4xx_inl(port & PIO_MASK); +	else { +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		return le32_to_cpu((__force __le32)__raw_readl(addr)); +#else +		return (unsigned int)__ixp4xx_readl(addr); +#endif +	} +} + +static inline void +__ixp4xx_ioread32_rep(const void __iomem *addr, void *vaddr, u32 count) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_insl(port & PIO_MASK, vaddr, count); +	else +#ifndef	CONFIG_IXP4XX_INDIRECT_PCI +		__raw_readsl(addr, vaddr, count); +#else +		__ixp4xx_readsl(addr, vaddr, count); +#endif +} + +static inline void +__ixp4xx_iowrite8(u8 value, void __iomem *addr) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_outb(value, port & PIO_MASK); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		__raw_writeb(value, port); +#else +		__ixp4xx_writeb(value, addr); +#endif +} + +static inline void +__ixp4xx_iowrite8_rep(void __iomem *addr, const void *vaddr, u32 count) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_outsb(port & PIO_MASK, vaddr, count); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		__raw_writesb(addr, vaddr, count); +#else +		__ixp4xx_writesb(addr, vaddr, count); +#endif +} + +static inline void +__ixp4xx_iowrite16(u16 value, void __iomem *addr) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_outw(value, port & PIO_MASK); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		__raw_writew(cpu_to_le16(value), addr); +#else +		__ixp4xx_writew(value, addr); +#endif +} + +static inline void +__ixp4xx_iowrite16_rep(void __iomem *addr, const void *vaddr, u32 count) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_outsw(port & PIO_MASK, vaddr, count); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		__raw_writesw(addr, vaddr, count); +#else +		__ixp4xx_writesw(addr, vaddr, count); +#endif +} + +static inline void +__ixp4xx_iowrite32(u32 value, void __iomem *addr) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_outl(value, port & PIO_MASK); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		__raw_writel((u32 __force)cpu_to_le32(value), addr); +#else +		__ixp4xx_writel(value, addr); +#endif +} + +static inline void +__ixp4xx_iowrite32_rep(void __iomem *addr, const void *vaddr, u32 count) +{ +	unsigned long port = (unsigned long __force)addr; +	if (__is_io_address(port)) +		__ixp4xx_outsl(port & PIO_MASK, vaddr, count); +	else +#ifndef CONFIG_IXP4XX_INDIRECT_PCI +		__raw_writesl(addr, vaddr, count); +#else +		__ixp4xx_writesl(addr, vaddr, count); +#endif +} + +#define	ioread8(p)			__ixp4xx_ioread8(p) +#define	ioread16(p)			__ixp4xx_ioread16(p) +#define	ioread32(p)			__ixp4xx_ioread32(p) + +#define	ioread8_rep(p, v, c)		__ixp4xx_ioread8_rep(p, v, c) +#define	ioread16_rep(p, v, c)		__ixp4xx_ioread16_rep(p, v, c) +#define	ioread32_rep(p, v, c)		__ixp4xx_ioread32_rep(p, v, c) + +#define	iowrite8(v,p)			__ixp4xx_iowrite8(v,p) +#define	iowrite16(v,p)			__ixp4xx_iowrite16(v,p) +#define	iowrite32(v,p)			__ixp4xx_iowrite32(v,p) + +#define	iowrite8_rep(p, v, c)		__ixp4xx_iowrite8_rep(p, v, c) +#define	iowrite16_rep(p, v, c)		__ixp4xx_iowrite16_rep(p, v, c) +#define	iowrite32_rep(p, v, c)		__ixp4xx_iowrite32_rep(p, v, c) + +#define	ioport_map(port, nr)		((void __iomem*)(port + PIO_OFFSET)) +#define	ioport_unmap(addr) +#endif	// !CONFIG_PCI + +#endif	//  __ASM_ARM_ARCH_IO_H + diff --git a/arch/arm/mach-ixp4xx/include/mach/irqs.h b/arch/arm/mach-ixp4xx/include/mach/irqs.h new file mode 100644 index 00000000000..f4d74de1566 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/irqs.h @@ -0,0 +1,138 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/irqs.h  + * + * IRQ definitions for IXP4XX based systems + * + * Copyright (C) 2002 Intel Corporation. + * Copyright (C) 2003 MontaVista Software, Inc. + * + * 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 _ARCH_IXP4XX_IRQS_H_ +#define _ARCH_IXP4XX_IRQS_H_ + + +#define IRQ_IXP4XX_NPEA		0 +#define IRQ_IXP4XX_NPEB		1 +#define IRQ_IXP4XX_NPEC		2 +#define IRQ_IXP4XX_QM1		3 +#define IRQ_IXP4XX_QM2		4 +#define IRQ_IXP4XX_TIMER1	5 +#define IRQ_IXP4XX_GPIO0	6 +#define IRQ_IXP4XX_GPIO1	7 +#define IRQ_IXP4XX_PCI_INT	8 +#define IRQ_IXP4XX_PCI_DMA1	9 +#define IRQ_IXP4XX_PCI_DMA2	10 +#define IRQ_IXP4XX_TIMER2	11 +#define IRQ_IXP4XX_USB		12 +#define IRQ_IXP4XX_UART2	13 +#define IRQ_IXP4XX_TIMESTAMP	14 +#define IRQ_IXP4XX_UART1	15 +#define IRQ_IXP4XX_WDOG		16 +#define IRQ_IXP4XX_AHB_PMU	17 +#define IRQ_IXP4XX_XSCALE_PMU	18 +#define IRQ_IXP4XX_GPIO2	19 +#define IRQ_IXP4XX_GPIO3	20 +#define IRQ_IXP4XX_GPIO4	21 +#define IRQ_IXP4XX_GPIO5	22 +#define IRQ_IXP4XX_GPIO6	23 +#define IRQ_IXP4XX_GPIO7	24 +#define IRQ_IXP4XX_GPIO8	25 +#define IRQ_IXP4XX_GPIO9	26 +#define IRQ_IXP4XX_GPIO10	27 +#define IRQ_IXP4XX_GPIO11	28 +#define IRQ_IXP4XX_GPIO12	29 +#define IRQ_IXP4XX_SW_INT1	30 +#define IRQ_IXP4XX_SW_INT2	31 +#define IRQ_IXP4XX_USB_HOST	32 +#define IRQ_IXP4XX_I2C		33 +#define IRQ_IXP4XX_SSP		34 +#define IRQ_IXP4XX_TSYNC	35 +#define IRQ_IXP4XX_EAU_DONE	36 +#define IRQ_IXP4XX_SHA_DONE	37 +#define IRQ_IXP4XX_SWCP_PE	58 +#define IRQ_IXP4XX_QM_PE	60 +#define IRQ_IXP4XX_MCU_ECC	61 +#define IRQ_IXP4XX_EXP_PE	62 + +/* + * Only first 32 sources are valid if running on IXP42x systems + */ +#if defined(CONFIG_CPU_IXP46X) || defined(CONFIG_CPU_IXP43X) +#define NR_IRQS			64 +#else +#define NR_IRQS			32 +#endif + +#define	XSCALE_PMU_IRQ		(IRQ_IXP4XX_XSCALE_PMU) + +/* + * IXDP425 board IRQs + */ +#define	IRQ_IXDP425_PCI_INTA	IRQ_IXP4XX_GPIO11 +#define	IRQ_IXDP425_PCI_INTB	IRQ_IXP4XX_GPIO10 +#define	IRQ_IXDP425_PCI_INTC	IRQ_IXP4XX_GPIO9 +#define	IRQ_IXDP425_PCI_INTD	IRQ_IXP4XX_GPIO8 + +/* + * Gateworks Avila board IRQs + */ +#define	IRQ_AVILA_PCI_INTA	IRQ_IXP4XX_GPIO11 +#define	IRQ_AVILA_PCI_INTB	IRQ_IXP4XX_GPIO10 +#define	IRQ_AVILA_PCI_INTC	IRQ_IXP4XX_GPIO9 +#define	IRQ_AVILA_PCI_INTD	IRQ_IXP4XX_GPIO8 + + +/* + * PrPMC1100 Board IRQs + */ +#define	IRQ_PRPMC1100_PCI_INTA	IRQ_IXP4XX_GPIO11 +#define	IRQ_PRPMC1100_PCI_INTB	IRQ_IXP4XX_GPIO10 +#define	IRQ_PRPMC1100_PCI_INTC	IRQ_IXP4XX_GPIO9 +#define	IRQ_PRPMC1100_PCI_INTD	IRQ_IXP4XX_GPIO8 + +/* + * ADI Coyote Board IRQs + */ +#define	IRQ_COYOTE_PCI_SLOT0	IRQ_IXP4XX_GPIO6 +#define	IRQ_COYOTE_PCI_SLOT1	IRQ_IXP4XX_GPIO11 +#define	IRQ_COYOTE_IDE		IRQ_IXP4XX_GPIO5 + +/* + * NSLU2 board IRQs + */ +#define        IRQ_NSLU2_PCI_INTA      IRQ_IXP4XX_GPIO11 +#define        IRQ_NSLU2_PCI_INTB      IRQ_IXP4XX_GPIO10 +#define        IRQ_NSLU2_PCI_INTC      IRQ_IXP4XX_GPIO9 + +/* + * NAS100D board IRQs + */ +#define        IRQ_NAS100D_PCI_INTA    IRQ_IXP4XX_GPIO11 +#define        IRQ_NAS100D_PCI_INTB    IRQ_IXP4XX_GPIO10 +#define        IRQ_NAS100D_PCI_INTC    IRQ_IXP4XX_GPIO9 +#define        IRQ_NAS100D_PCI_INTD    IRQ_IXP4XX_GPIO8 +#define        IRQ_NAS100D_PCI_INTE    IRQ_IXP4XX_GPIO7 + +/* + * D-Link DSM-G600 RevA board IRQs + */ +#define        IRQ_DSMG600_PCI_INTA    IRQ_IXP4XX_GPIO11 +#define        IRQ_DSMG600_PCI_INTB    IRQ_IXP4XX_GPIO10 +#define        IRQ_DSMG600_PCI_INTC    IRQ_IXP4XX_GPIO9 +#define        IRQ_DSMG600_PCI_INTD    IRQ_IXP4XX_GPIO8 +#define        IRQ_DSMG600_PCI_INTE    IRQ_IXP4XX_GPIO7 +#define        IRQ_DSMG600_PCI_INTF    IRQ_IXP4XX_GPIO6 + +/* + * Freecom FSG-3 Board IRQs + */ +#define        IRQ_FSG_PCI_INTA        IRQ_IXP4XX_GPIO6 +#define        IRQ_FSG_PCI_INTB        IRQ_IXP4XX_GPIO7 +#define        IRQ_FSG_PCI_INTC        IRQ_IXP4XX_GPIO5 + +#endif diff --git a/arch/arm/mach-ixp4xx/include/mach/ixdp425.h b/arch/arm/mach-ixp4xx/include/mach/ixdp425.h new file mode 100644 index 00000000000..2cafe65ebfe --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/ixdp425.h @@ -0,0 +1,39 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/ixdp425.h + * + * IXDP425 platform specific definitions + * + * Author: Deepak Saxena <dsaxena@plexity.net> + * + * Copyright 2004 (c) MontaVista, Software, Inc.  + *  + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#define	IXDP425_SDA_PIN		7 +#define	IXDP425_SCL_PIN		6 + +/* + * IXDP425 PCI IRQs + */ +#define IXDP425_PCI_MAX_DEV	4 +#define IXDP425_PCI_IRQ_LINES	4 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define IXDP425_PCI_INTA_PIN	11 +#define IXDP425_PCI_INTB_PIN	10 +#define	IXDP425_PCI_INTC_PIN	9 +#define	IXDP425_PCI_INTD_PIN	8 + +/* NAND Flash pins */ +#define	IXDP425_NAND_NCE_PIN	12 + +#define	IXDP425_NAND_CMD_BYTE	0x01 +#define	IXDP425_NAND_ADDR_BYTE	0x02 diff --git a/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h new file mode 100644 index 00000000000..ad9c888dd85 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h @@ -0,0 +1,638 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/ixp4xx-regs.h + * + * Register definitions for IXP4xx chipset. This file contains  + * register location and bit definitions only. Platform specific  + * definitions and helper function declarations are in platform.h  + * and machine-name.h. + * + * Copyright (C) 2002 Intel Corporation. + * Copyright (C) 2003-2004 MontaVista Software, Inc. + * + * 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 _ASM_ARM_IXP4XX_H_ +#define _ASM_ARM_IXP4XX_H_ + +/* + * IXP4xx Linux Memory Map: + * + * Phy		Size		Virt		Description + * ========================================================================= + * + * 0x00000000	0x10000000(max)	PAGE_OFFSET	System RAM + * + * 0x48000000	0x04000000	ioremap'd	PCI Memory Space + * + * 0x50000000	0x10000000	ioremap'd	EXP BUS + * + * 0x6000000	0x00004000	ioremap'd	QMgr + * + * 0xC0000000	0x00001000	0xffbff000	PCI CFG + * + * 0xC4000000	0x00001000	0xffbfe000	EXP CFG + * + * 0xC8000000	0x00013000	0xffbeb000	On-Chip Peripherals + */ + +/* + * Queue Manager + */ +#define IXP4XX_QMGR_BASE_PHYS		(0x60000000) +#define IXP4XX_QMGR_REGION_SIZE		(0x00004000) + +/* + * Expansion BUS Configuration registers + */ +#define IXP4XX_EXP_CFG_BASE_PHYS	(0xC4000000) +#define IXP4XX_EXP_CFG_BASE_VIRT	(0xFFBFE000) +#define IXP4XX_EXP_CFG_REGION_SIZE	(0x00001000) + +/* + * PCI Config registers + */ +#define IXP4XX_PCI_CFG_BASE_PHYS	(0xC0000000) +#define	IXP4XX_PCI_CFG_BASE_VIRT	(0xFFBFF000) +#define IXP4XX_PCI_CFG_REGION_SIZE	(0x00001000) + +/* + * Peripheral space + */ +#define IXP4XX_PERIPHERAL_BASE_PHYS	(0xC8000000) +#define IXP4XX_PERIPHERAL_BASE_VIRT	(0xFFBEB000) +#define IXP4XX_PERIPHERAL_REGION_SIZE	(0x00013000) + +/* + * Debug UART + * + * This is basically a remap of UART1 into a region that is section + * aligned so that it * can be used with the low-level debug code. + */ +#define	IXP4XX_DEBUG_UART_BASE_PHYS	(0xC8000000) +#define	IXP4XX_DEBUG_UART_BASE_VIRT	(0xffb00000) +#define	IXP4XX_DEBUG_UART_REGION_SIZE	(0x00001000) + +#define IXP4XX_EXP_CS0_OFFSET	0x00 +#define IXP4XX_EXP_CS1_OFFSET   0x04 +#define IXP4XX_EXP_CS2_OFFSET   0x08 +#define IXP4XX_EXP_CS3_OFFSET   0x0C +#define IXP4XX_EXP_CS4_OFFSET   0x10 +#define IXP4XX_EXP_CS5_OFFSET   0x14 +#define IXP4XX_EXP_CS6_OFFSET   0x18 +#define IXP4XX_EXP_CS7_OFFSET   0x1C +#define IXP4XX_EXP_CFG0_OFFSET	0x20 +#define IXP4XX_EXP_CFG1_OFFSET	0x24 +#define IXP4XX_EXP_CFG2_OFFSET	0x28 +#define IXP4XX_EXP_CFG3_OFFSET	0x2C + +/* + * Expansion Bus Controller registers. + */ +#define IXP4XX_EXP_REG(x) ((volatile u32 *)(IXP4XX_EXP_CFG_BASE_VIRT+(x))) + +#define IXP4XX_EXP_CS0      IXP4XX_EXP_REG(IXP4XX_EXP_CS0_OFFSET) +#define IXP4XX_EXP_CS1      IXP4XX_EXP_REG(IXP4XX_EXP_CS1_OFFSET) +#define IXP4XX_EXP_CS2      IXP4XX_EXP_REG(IXP4XX_EXP_CS2_OFFSET)  +#define IXP4XX_EXP_CS3      IXP4XX_EXP_REG(IXP4XX_EXP_CS3_OFFSET) +#define IXP4XX_EXP_CS4      IXP4XX_EXP_REG(IXP4XX_EXP_CS4_OFFSET) +#define IXP4XX_EXP_CS5      IXP4XX_EXP_REG(IXP4XX_EXP_CS5_OFFSET) +#define IXP4XX_EXP_CS6      IXP4XX_EXP_REG(IXP4XX_EXP_CS6_OFFSET)      +#define IXP4XX_EXP_CS7      IXP4XX_EXP_REG(IXP4XX_EXP_CS7_OFFSET) + +#define IXP4XX_EXP_CFG0     IXP4XX_EXP_REG(IXP4XX_EXP_CFG0_OFFSET)  +#define IXP4XX_EXP_CFG1     IXP4XX_EXP_REG(IXP4XX_EXP_CFG1_OFFSET)  +#define IXP4XX_EXP_CFG2     IXP4XX_EXP_REG(IXP4XX_EXP_CFG2_OFFSET)  +#define IXP4XX_EXP_CFG3     IXP4XX_EXP_REG(IXP4XX_EXP_CFG3_OFFSET) + + +/* + * Peripheral Space Register Region Base Addresses + */ +#define IXP4XX_UART1_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x0000) +#define IXP4XX_UART2_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x1000) +#define IXP4XX_PMU_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x2000) +#define IXP4XX_INTC_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x3000) +#define IXP4XX_GPIO_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x4000) +#define IXP4XX_TIMER_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x5000) +#define IXP4XX_NPEA_BASE_PHYS   	(IXP4XX_PERIPHERAL_BASE_PHYS + 0x6000) +#define IXP4XX_NPEB_BASE_PHYS   	(IXP4XX_PERIPHERAL_BASE_PHYS + 0x7000) +#define IXP4XX_NPEC_BASE_PHYS   	(IXP4XX_PERIPHERAL_BASE_PHYS + 0x8000) +#define IXP4XX_EthB_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x9000) +#define IXP4XX_EthC_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0xA000) +#define IXP4XX_USB_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0xB000) +/* ixp46X only */ +#define IXP4XX_EthA_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0xC000) +#define IXP4XX_EthB1_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0xD000) +#define IXP4XX_EthB2_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0xE000) +#define IXP4XX_EthB3_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0xF000) +#define IXP4XX_TIMESYNC_BASE_PHYS	(IXP4XX_PERIPHERAL_BASE_PHYS + 0x10000) +#define IXP4XX_I2C_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x11000) +#define IXP4XX_SSP_BASE_PHYS		(IXP4XX_PERIPHERAL_BASE_PHYS + 0x12000) + + +#define IXP4XX_UART1_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x0000) +#define IXP4XX_UART2_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x1000) +#define IXP4XX_PMU_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x2000) +#define IXP4XX_INTC_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x3000) +#define IXP4XX_GPIO_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x4000) +#define IXP4XX_TIMER_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x5000) +#define IXP4XX_NPEA_BASE_VIRT   	(IXP4XX_PERIPHERAL_BASE_VIRT + 0x6000) +#define IXP4XX_NPEB_BASE_VIRT   	(IXP4XX_PERIPHERAL_BASE_VIRT + 0x7000) +#define IXP4XX_NPEC_BASE_VIRT   	(IXP4XX_PERIPHERAL_BASE_VIRT + 0x8000) +#define IXP4XX_EthB_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x9000) +#define IXP4XX_EthC_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xA000) +#define IXP4XX_USB_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xB000) +/* ixp46X only */ +#define IXP4XX_EthA_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xC000) +#define IXP4XX_EthB1_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xD000) +#define IXP4XX_EthB2_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xE000) +#define IXP4XX_EthB3_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0xF000) +#define IXP4XX_TIMESYNC_BASE_VIRT	(IXP4XX_PERIPHERAL_BASE_VIRT + 0x10000) +#define IXP4XX_I2C_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x11000) +#define IXP4XX_SSP_BASE_VIRT		(IXP4XX_PERIPHERAL_BASE_VIRT + 0x12000) + +/* + * Constants to make it easy to access  Interrupt Controller registers + */ +#define IXP4XX_ICPR_OFFSET	0x00 /* Interrupt Status */ +#define IXP4XX_ICMR_OFFSET	0x04 /* Interrupt Enable */ +#define IXP4XX_ICLR_OFFSET	0x08 /* Interrupt IRQ/FIQ Select */ +#define IXP4XX_ICIP_OFFSET      0x0C /* IRQ Status */ +#define IXP4XX_ICFP_OFFSET	0x10 /* FIQ Status */ +#define IXP4XX_ICHR_OFFSET	0x14 /* Interrupt Priority */ +#define IXP4XX_ICIH_OFFSET	0x18 /* IRQ Highest Pri Int */ +#define IXP4XX_ICFH_OFFSET	0x1C /* FIQ Highest Pri Int */ + +/* + * IXP465-only + */ +#define	IXP4XX_ICPR2_OFFSET	0x20 /* Interrupt Status 2 */ +#define	IXP4XX_ICMR2_OFFSET	0x24 /* Interrupt Enable 2 */ +#define	IXP4XX_ICLR2_OFFSET	0x28 /* Interrupt IRQ/FIQ Select 2 */ +#define IXP4XX_ICIP2_OFFSET     0x2C /* IRQ Status */ +#define IXP4XX_ICFP2_OFFSET	0x30 /* FIQ Status */ +#define IXP4XX_ICEEN_OFFSET	0x34 /* Error High Pri Enable */ + + +/* + * Interrupt Controller Register Definitions. + */ + +#define IXP4XX_INTC_REG(x) ((volatile u32 *)(IXP4XX_INTC_BASE_VIRT+(x))) + +#define IXP4XX_ICPR	IXP4XX_INTC_REG(IXP4XX_ICPR_OFFSET) +#define IXP4XX_ICMR     IXP4XX_INTC_REG(IXP4XX_ICMR_OFFSET) +#define IXP4XX_ICLR     IXP4XX_INTC_REG(IXP4XX_ICLR_OFFSET) +#define IXP4XX_ICIP     IXP4XX_INTC_REG(IXP4XX_ICIP_OFFSET) +#define IXP4XX_ICFP     IXP4XX_INTC_REG(IXP4XX_ICFP_OFFSET) +#define IXP4XX_ICHR     IXP4XX_INTC_REG(IXP4XX_ICHR_OFFSET) +#define IXP4XX_ICIH     IXP4XX_INTC_REG(IXP4XX_ICIH_OFFSET)  +#define IXP4XX_ICFH     IXP4XX_INTC_REG(IXP4XX_ICFH_OFFSET) +#define IXP4XX_ICPR2	IXP4XX_INTC_REG(IXP4XX_ICPR2_OFFSET) +#define IXP4XX_ICMR2    IXP4XX_INTC_REG(IXP4XX_ICMR2_OFFSET) +#define IXP4XX_ICLR2    IXP4XX_INTC_REG(IXP4XX_ICLR2_OFFSET) +#define IXP4XX_ICIP2    IXP4XX_INTC_REG(IXP4XX_ICIP2_OFFSET) +#define IXP4XX_ICFP2    IXP4XX_INTC_REG(IXP4XX_ICFP2_OFFSET) +#define IXP4XX_ICEEN    IXP4XX_INTC_REG(IXP4XX_ICEEN_OFFSET) +                                                                                 +/* + * Constants to make it easy to access GPIO registers + */ +#define IXP4XX_GPIO_GPOUTR_OFFSET       0x00 +#define IXP4XX_GPIO_GPOER_OFFSET        0x04 +#define IXP4XX_GPIO_GPINR_OFFSET        0x08 +#define IXP4XX_GPIO_GPISR_OFFSET        0x0C +#define IXP4XX_GPIO_GPIT1R_OFFSET	0x10 +#define IXP4XX_GPIO_GPIT2R_OFFSET	0x14 +#define IXP4XX_GPIO_GPCLKR_OFFSET	0x18 +#define IXP4XX_GPIO_GPDBSELR_OFFSET	0x1C + +/*  + * GPIO Register Definitions. + * [Only perform 32bit reads/writes] + */ +#define IXP4XX_GPIO_REG(x) ((volatile u32 *)(IXP4XX_GPIO_BASE_VIRT+(x))) + +#define IXP4XX_GPIO_GPOUTR	IXP4XX_GPIO_REG(IXP4XX_GPIO_GPOUTR_OFFSET) +#define IXP4XX_GPIO_GPOER       IXP4XX_GPIO_REG(IXP4XX_GPIO_GPOER_OFFSET) +#define IXP4XX_GPIO_GPINR       IXP4XX_GPIO_REG(IXP4XX_GPIO_GPINR_OFFSET) +#define IXP4XX_GPIO_GPISR       IXP4XX_GPIO_REG(IXP4XX_GPIO_GPISR_OFFSET) +#define IXP4XX_GPIO_GPIT1R      IXP4XX_GPIO_REG(IXP4XX_GPIO_GPIT1R_OFFSET) +#define IXP4XX_GPIO_GPIT2R      IXP4XX_GPIO_REG(IXP4XX_GPIO_GPIT2R_OFFSET) +#define IXP4XX_GPIO_GPCLKR      IXP4XX_GPIO_REG(IXP4XX_GPIO_GPCLKR_OFFSET) +#define IXP4XX_GPIO_GPDBSELR    IXP4XX_GPIO_REG(IXP4XX_GPIO_GPDBSELR_OFFSET) + +/* + * GPIO register bit definitions + */ + +/* Interrupt styles + */ +#define IXP4XX_GPIO_STYLE_ACTIVE_HIGH	0x0 +#define IXP4XX_GPIO_STYLE_ACTIVE_LOW	0x1 +#define IXP4XX_GPIO_STYLE_RISING_EDGE	0x2 +#define IXP4XX_GPIO_STYLE_FALLING_EDGE	0x3 +#define IXP4XX_GPIO_STYLE_TRANSITIONAL	0x4 + +/*  + * Mask used to clear interrupt styles  + */ +#define IXP4XX_GPIO_STYLE_CLEAR		0x7 +#define IXP4XX_GPIO_STYLE_SIZE		3 + +/* + * Constants to make it easy to access Timer Control/Status registers + */ +#define IXP4XX_OSTS_OFFSET	0x00  /* Continious TimeStamp */ +#define IXP4XX_OST1_OFFSET	0x04  /* Timer 1 Timestamp */ +#define IXP4XX_OSRT1_OFFSET	0x08  /* Timer 1 Reload */ +#define IXP4XX_OST2_OFFSET	0x0C  /* Timer 2 Timestamp */ +#define IXP4XX_OSRT2_OFFSET	0x10  /* Timer 2 Reload */ +#define IXP4XX_OSWT_OFFSET	0x14  /* Watchdog Timer */ +#define IXP4XX_OSWE_OFFSET	0x18  /* Watchdog Enable */ +#define IXP4XX_OSWK_OFFSET	0x1C  /* Watchdog Key */ +#define IXP4XX_OSST_OFFSET	0x20  /* Timer Status */ + +/* + * Operating System Timer Register Definitions. + */ + +#define IXP4XX_TIMER_REG(x) ((volatile u32 *)(IXP4XX_TIMER_BASE_VIRT+(x))) + +#define IXP4XX_OSTS	IXP4XX_TIMER_REG(IXP4XX_OSTS_OFFSET) +#define IXP4XX_OST1	IXP4XX_TIMER_REG(IXP4XX_OST1_OFFSET) +#define IXP4XX_OSRT1	IXP4XX_TIMER_REG(IXP4XX_OSRT1_OFFSET) +#define IXP4XX_OST2	IXP4XX_TIMER_REG(IXP4XX_OST2_OFFSET) +#define IXP4XX_OSRT2	IXP4XX_TIMER_REG(IXP4XX_OSRT2_OFFSET) +#define IXP4XX_OSWT	IXP4XX_TIMER_REG(IXP4XX_OSWT_OFFSET) +#define IXP4XX_OSWE	IXP4XX_TIMER_REG(IXP4XX_OSWE_OFFSET) +#define IXP4XX_OSWK	IXP4XX_TIMER_REG(IXP4XX_OSWK_OFFSET) +#define IXP4XX_OSST	IXP4XX_TIMER_REG(IXP4XX_OSST_OFFSET) + +/* + * Timer register values and bit definitions  + */ +#define IXP4XX_OST_ENABLE		0x00000001 +#define IXP4XX_OST_ONE_SHOT		0x00000002 +/* Low order bits of reload value ignored */ +#define IXP4XX_OST_RELOAD_MASK		0x00000003 +#define IXP4XX_OST_DISABLED		0x00000000 +#define IXP4XX_OSST_TIMER_1_PEND	0x00000001 +#define IXP4XX_OSST_TIMER_2_PEND	0x00000002 +#define IXP4XX_OSST_TIMER_TS_PEND	0x00000004 +#define IXP4XX_OSST_TIMER_WDOG_PEND	0x00000008 +#define IXP4XX_OSST_TIMER_WARM_RESET	0x00000010 + +#define	IXP4XX_WDT_KEY			0x0000482E + +#define	IXP4XX_WDT_RESET_ENABLE		0x00000001 +#define	IXP4XX_WDT_IRQ_ENABLE		0x00000002 +#define	IXP4XX_WDT_COUNT_ENABLE		0x00000004 + + +/* + * Constants to make it easy to access PCI Control/Status registers + */ +#define PCI_NP_AD_OFFSET            0x00 +#define PCI_NP_CBE_OFFSET           0x04 +#define PCI_NP_WDATA_OFFSET         0x08 +#define PCI_NP_RDATA_OFFSET         0x0c +#define PCI_CRP_AD_CBE_OFFSET       0x10 +#define PCI_CRP_WDATA_OFFSET        0x14 +#define PCI_CRP_RDATA_OFFSET        0x18 +#define PCI_CSR_OFFSET              0x1c +#define PCI_ISR_OFFSET              0x20 +#define PCI_INTEN_OFFSET            0x24 +#define PCI_DMACTRL_OFFSET          0x28 +#define PCI_AHBMEMBASE_OFFSET       0x2c +#define PCI_AHBIOBASE_OFFSET        0x30 +#define PCI_PCIMEMBASE_OFFSET       0x34 +#define PCI_AHBDOORBELL_OFFSET      0x38 +#define PCI_PCIDOORBELL_OFFSET      0x3C +#define PCI_ATPDMA0_AHBADDR_OFFSET  0x40 +#define PCI_ATPDMA0_PCIADDR_OFFSET  0x44 +#define PCI_ATPDMA0_LENADDR_OFFSET  0x48 +#define PCI_ATPDMA1_AHBADDR_OFFSET  0x4C +#define PCI_ATPDMA1_PCIADDR_OFFSET  0x50 +#define PCI_ATPDMA1_LENADDR_OFFSET	0x54 + +/* + * PCI Control/Status Registers + */ +#define IXP4XX_PCI_CSR(x) ((volatile u32 *)(IXP4XX_PCI_CFG_BASE_VIRT+(x))) + +#define PCI_NP_AD               IXP4XX_PCI_CSR(PCI_NP_AD_OFFSET) +#define PCI_NP_CBE              IXP4XX_PCI_CSR(PCI_NP_CBE_OFFSET) +#define PCI_NP_WDATA            IXP4XX_PCI_CSR(PCI_NP_WDATA_OFFSET) +#define PCI_NP_RDATA            IXP4XX_PCI_CSR(PCI_NP_RDATA_OFFSET) +#define PCI_CRP_AD_CBE          IXP4XX_PCI_CSR(PCI_CRP_AD_CBE_OFFSET) +#define PCI_CRP_WDATA           IXP4XX_PCI_CSR(PCI_CRP_WDATA_OFFSET) +#define PCI_CRP_RDATA           IXP4XX_PCI_CSR(PCI_CRP_RDATA_OFFSET) +#define PCI_CSR                 IXP4XX_PCI_CSR(PCI_CSR_OFFSET)  +#define PCI_ISR                 IXP4XX_PCI_CSR(PCI_ISR_OFFSET) +#define PCI_INTEN               IXP4XX_PCI_CSR(PCI_INTEN_OFFSET) +#define PCI_DMACTRL             IXP4XX_PCI_CSR(PCI_DMACTRL_OFFSET) +#define PCI_AHBMEMBASE          IXP4XX_PCI_CSR(PCI_AHBMEMBASE_OFFSET) +#define PCI_AHBIOBASE           IXP4XX_PCI_CSR(PCI_AHBIOBASE_OFFSET) +#define PCI_PCIMEMBASE          IXP4XX_PCI_CSR(PCI_PCIMEMBASE_OFFSET) +#define PCI_AHBDOORBELL         IXP4XX_PCI_CSR(PCI_AHBDOORBELL_OFFSET) +#define PCI_PCIDOORBELL         IXP4XX_PCI_CSR(PCI_PCIDOORBELL_OFFSET) +#define PCI_ATPDMA0_AHBADDR     IXP4XX_PCI_CSR(PCI_ATPDMA0_AHBADDR_OFFSET) +#define PCI_ATPDMA0_PCIADDR     IXP4XX_PCI_CSR(PCI_ATPDMA0_PCIADDR_OFFSET) +#define PCI_ATPDMA0_LENADDR     IXP4XX_PCI_CSR(PCI_ATPDMA0_LENADDR_OFFSET) +#define PCI_ATPDMA1_AHBADDR     IXP4XX_PCI_CSR(PCI_ATPDMA1_AHBADDR_OFFSET) +#define PCI_ATPDMA1_PCIADDR     IXP4XX_PCI_CSR(PCI_ATPDMA1_PCIADDR_OFFSET) +#define PCI_ATPDMA1_LENADDR     IXP4XX_PCI_CSR(PCI_ATPDMA1_LENADDR_OFFSET) + +/* + * PCI register values and bit definitions  + */ + +/* CSR bit definitions */ +#define PCI_CSR_HOST    	0x00000001 +#define PCI_CSR_ARBEN   	0x00000002 +#define PCI_CSR_ADS     	0x00000004 +#define PCI_CSR_PDS     	0x00000008 +#define PCI_CSR_ABE     	0x00000010 +#define PCI_CSR_DBT     	0x00000020 +#define PCI_CSR_ASE     	0x00000100 +#define PCI_CSR_IC      	0x00008000 + +/* ISR (Interrupt status) Register bit definitions */ +#define PCI_ISR_PSE     	0x00000001 +#define PCI_ISR_PFE     	0x00000002 +#define PCI_ISR_PPE     	0x00000004 +#define PCI_ISR_AHBE    	0x00000008 +#define PCI_ISR_APDC    	0x00000010 +#define PCI_ISR_PADC    	0x00000020 +#define PCI_ISR_ADB     	0x00000040 +#define PCI_ISR_PDB     	0x00000080 + +/* INTEN (Interrupt Enable) Register bit definitions */ +#define PCI_INTEN_PSE   	0x00000001 +#define PCI_INTEN_PFE   	0x00000002 +#define PCI_INTEN_PPE   	0x00000004 +#define PCI_INTEN_AHBE  	0x00000008 +#define PCI_INTEN_APDC  	0x00000010 +#define PCI_INTEN_PADC  	0x00000020 +#define PCI_INTEN_ADB   	0x00000040 +#define PCI_INTEN_PDB   	0x00000080 + +/* + * Shift value for byte enable on NP cmd/byte enable register + */ +#define IXP4XX_PCI_NP_CBE_BESL		4 + +/* + * PCI commands supported by NP access unit + */ +#define NP_CMD_IOREAD			0x2 +#define NP_CMD_IOWRITE			0x3 +#define NP_CMD_CONFIGREAD		0xa +#define NP_CMD_CONFIGWRITE		0xb +#define NP_CMD_MEMREAD			0x6 +#define	NP_CMD_MEMWRITE			0x7 + +/* + * Constants for CRP access into local config space + */ +#define CRP_AD_CBE_BESL         20 +#define CRP_AD_CBE_WRITE	0x00010000 + + +/* + * USB Device Controller + * + * These are used by the USB gadget driver, so they don't follow the + * IXP4XX_ naming convetions. + * + */ +# define IXP4XX_USB_REG(x)       (*((volatile u32 *)(x))) + +/* UDC Undocumented - Reserved1 */ +#define UDC_RES1	IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0004)   +/* UDC Undocumented - Reserved2 */ +#define UDC_RES2	IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0008)   +/* UDC Undocumented - Reserved3 */ +#define UDC_RES3	IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x000C)   +/* UDC Control Register */ +#define UDCCR		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0000)   +/* UDC Endpoint 0 Control/Status Register */ +#define UDCCS0		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0010)   +/* UDC Endpoint 1 (IN) Control/Status Register */ +#define UDCCS1		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0014)   +/* UDC Endpoint 2 (OUT) Control/Status Register */ +#define UDCCS2		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0018)   +/* UDC Endpoint 3 (IN) Control/Status Register */ +#define UDCCS3		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x001C)   +/* UDC Endpoint 4 (OUT) Control/Status Register */ +#define UDCCS4		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0020)   +/* UDC Endpoint 5 (Interrupt) Control/Status Register */ +#define UDCCS5		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0024)   +/* UDC Endpoint 6 (IN) Control/Status Register */ +#define UDCCS6		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0028)   +/* UDC Endpoint 7 (OUT) Control/Status Register */ +#define UDCCS7		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x002C)   +/* UDC Endpoint 8 (IN) Control/Status Register */ +#define UDCCS8		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0030)   +/* UDC Endpoint 9 (OUT) Control/Status Register */ +#define UDCCS9		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0034)   +/* UDC Endpoint 10 (Interrupt) Control/Status Register */ +#define UDCCS10		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0038)   +/* UDC Endpoint 11 (IN) Control/Status Register */ +#define UDCCS11		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x003C)   +/* UDC Endpoint 12 (OUT) Control/Status Register */ +#define UDCCS12		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0040)   +/* UDC Endpoint 13 (IN) Control/Status Register */ +#define UDCCS13		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0044)   +/* UDC Endpoint 14 (OUT) Control/Status Register */ +#define UDCCS14		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0048)   +/* UDC Endpoint 15 (Interrupt) Control/Status Register */ +#define UDCCS15		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x004C)   +/* UDC Frame Number Register High */ +#define UFNRH		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0060)   +/* UDC Frame Number Register Low */ +#define UFNRL		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0064)   +/* UDC Byte Count Reg 2 */ +#define UBCR2		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0068)   +/* UDC Byte Count Reg 4 */ +#define UBCR4		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x006c)   +/* UDC Byte Count Reg 7 */ +#define UBCR7		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0070)   +/* UDC Byte Count Reg 9 */ +#define UBCR9		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0074)   +/* UDC Byte Count Reg 12 */ +#define UBCR12		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0078)   +/* UDC Byte Count Reg 14 */ +#define UBCR14		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x007c)   +/* UDC Endpoint 0 Data Register */ +#define UDDR0		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0080)   +/* UDC Endpoint 1 Data Register */ +#define UDDR1		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0100)   +/* UDC Endpoint 2 Data Register */ +#define UDDR2		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0180)   +/* UDC Endpoint 3 Data Register */ +#define UDDR3		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0200)   +/* UDC Endpoint 4 Data Register */ +#define UDDR4		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0400)   +/* UDC Endpoint 5 Data Register */ +#define UDDR5		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x00A0)   +/* UDC Endpoint 6 Data Register */ +#define UDDR6		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0600)   +/* UDC Endpoint 7 Data Register */ +#define UDDR7		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0680)   +/* UDC Endpoint 8 Data Register */ +#define UDDR8		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0700)   +/* UDC Endpoint 9 Data Register */ +#define UDDR9		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0900)   +/* UDC Endpoint 10 Data Register */ +#define UDDR10		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x00C0)   +/* UDC Endpoint 11 Data Register */ +#define UDDR11		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0B00)   +/* UDC Endpoint 12 Data Register */ +#define UDDR12		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0B80)   +/* UDC Endpoint 13 Data Register */ +#define UDDR13		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0C00)   +/* UDC Endpoint 14 Data Register */ +#define UDDR14		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0E00)   +/* UDC Endpoint 15 Data Register */ +#define UDDR15		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x00E0)   +/* UDC Interrupt Control Register 0 */ +#define UICR0		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0050)   +/* UDC Interrupt Control Register 1 */ +#define UICR1		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0054)   +/* UDC Status Interrupt Register 0 */ +#define USIR0		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x0058)   +/* UDC Status Interrupt Register 1 */ +#define USIR1		IXP4XX_USB_REG(IXP4XX_USB_BASE_VIRT+0x005C)   + +#define UDCCR_UDE	(1 << 0)	/* UDC enable */ +#define UDCCR_UDA	(1 << 1)	/* UDC active */ +#define UDCCR_RSM	(1 << 2)	/* Device resume */ +#define UDCCR_RESIR	(1 << 3)	/* Resume interrupt request */ +#define UDCCR_SUSIR	(1 << 4)	/* Suspend interrupt request */ +#define UDCCR_SRM	(1 << 5)	/* Suspend/resume interrupt mask */ +#define UDCCR_RSTIR	(1 << 6)	/* Reset interrupt request */ +#define UDCCR_REM	(1 << 7)	/* Reset interrupt mask */ + +#define UDCCS0_OPR	(1 << 0)	/* OUT packet ready */ +#define UDCCS0_IPR	(1 << 1)	/* IN packet ready */ +#define UDCCS0_FTF	(1 << 2)	/* Flush Tx FIFO */ +#define UDCCS0_DRWF	(1 << 3)	/* Device remote wakeup feature */ +#define UDCCS0_SST	(1 << 4)	/* Sent stall */ +#define UDCCS0_FST	(1 << 5)	/* Force stall */ +#define UDCCS0_RNE	(1 << 6)	/* Receive FIFO no empty */ +#define UDCCS0_SA	(1 << 7)	/* Setup active */ + +#define UDCCS_BI_TFS	(1 << 0)	/* Transmit FIFO service */ +#define UDCCS_BI_TPC	(1 << 1)	/* Transmit packet complete */ +#define UDCCS_BI_FTF	(1 << 2)	/* Flush Tx FIFO */ +#define UDCCS_BI_TUR	(1 << 3)	/* Transmit FIFO underrun */ +#define UDCCS_BI_SST	(1 << 4)	/* Sent stall */ +#define UDCCS_BI_FST	(1 << 5)	/* Force stall */ +#define UDCCS_BI_TSP	(1 << 7)	/* Transmit short packet */ + +#define UDCCS_BO_RFS	(1 << 0)	/* Receive FIFO service */ +#define UDCCS_BO_RPC	(1 << 1)	/* Receive packet complete */ +#define UDCCS_BO_DME	(1 << 3)	/* DMA enable */ +#define UDCCS_BO_SST	(1 << 4)	/* Sent stall */ +#define UDCCS_BO_FST	(1 << 5)	/* Force stall */ +#define UDCCS_BO_RNE	(1 << 6)	/* Receive FIFO not empty */ +#define UDCCS_BO_RSP	(1 << 7)	/* Receive short packet */ + +#define UDCCS_II_TFS	(1 << 0)	/* Transmit FIFO service */ +#define UDCCS_II_TPC	(1 << 1)	/* Transmit packet complete */ +#define UDCCS_II_FTF	(1 << 2)	/* Flush Tx FIFO */ +#define UDCCS_II_TUR	(1 << 3)	/* Transmit FIFO underrun */ +#define UDCCS_II_TSP	(1 << 7)	/* Transmit short packet */ + +#define UDCCS_IO_RFS	(1 << 0)	/* Receive FIFO service */ +#define UDCCS_IO_RPC	(1 << 1)	/* Receive packet complete */ +#define UDCCS_IO_ROF	(1 << 3)	/* Receive overflow */ +#define UDCCS_IO_DME	(1 << 3)	/* DMA enable */ +#define UDCCS_IO_RNE	(1 << 6)	/* Receive FIFO not empty */ +#define UDCCS_IO_RSP	(1 << 7)	/* Receive short packet */ + +#define UDCCS_INT_TFS	(1 << 0)	/* Transmit FIFO service */ +#define UDCCS_INT_TPC	(1 << 1)	/* Transmit packet complete */ +#define UDCCS_INT_FTF	(1 << 2)	/* Flush Tx FIFO */ +#define UDCCS_INT_TUR	(1 << 3)	/* Transmit FIFO underrun */ +#define UDCCS_INT_SST	(1 << 4)	/* Sent stall */ +#define UDCCS_INT_FST	(1 << 5)	/* Force stall */ +#define UDCCS_INT_TSP	(1 << 7)	/* Transmit short packet */ + +#define UICR0_IM0	(1 << 0)	/* Interrupt mask ep 0 */ +#define UICR0_IM1	(1 << 1)	/* Interrupt mask ep 1 */ +#define UICR0_IM2	(1 << 2)	/* Interrupt mask ep 2 */ +#define UICR0_IM3	(1 << 3)	/* Interrupt mask ep 3 */ +#define UICR0_IM4	(1 << 4)	/* Interrupt mask ep 4 */ +#define UICR0_IM5	(1 << 5)	/* Interrupt mask ep 5 */ +#define UICR0_IM6	(1 << 6)	/* Interrupt mask ep 6 */ +#define UICR0_IM7	(1 << 7)	/* Interrupt mask ep 7 */ + +#define UICR1_IM8	(1 << 0)	/* Interrupt mask ep 8 */ +#define UICR1_IM9	(1 << 1)	/* Interrupt mask ep 9 */ +#define UICR1_IM10	(1 << 2)	/* Interrupt mask ep 10 */ +#define UICR1_IM11	(1 << 3)	/* Interrupt mask ep 11 */ +#define UICR1_IM12	(1 << 4)	/* Interrupt mask ep 12 */ +#define UICR1_IM13	(1 << 5)	/* Interrupt mask ep 13 */ +#define UICR1_IM14	(1 << 6)	/* Interrupt mask ep 14 */ +#define UICR1_IM15	(1 << 7)	/* Interrupt mask ep 15 */ + +#define USIR0_IR0	(1 << 0)	/* Interrupt request ep 0 */ +#define USIR0_IR1	(1 << 1)	/* Interrupt request ep 1 */ +#define USIR0_IR2	(1 << 2)	/* Interrupt request ep 2 */ +#define USIR0_IR3	(1 << 3)	/* Interrupt request ep 3 */ +#define USIR0_IR4	(1 << 4)	/* Interrupt request ep 4 */ +#define USIR0_IR5	(1 << 5)	/* Interrupt request ep 5 */ +#define USIR0_IR6	(1 << 6)	/* Interrupt request ep 6 */ +#define USIR0_IR7	(1 << 7)	/* Interrupt request ep 7 */ + +#define USIR1_IR8	(1 << 0)	/* Interrupt request ep 8 */ +#define USIR1_IR9	(1 << 1)	/* Interrupt request ep 9 */ +#define USIR1_IR10	(1 << 2)	/* Interrupt request ep 10 */ +#define USIR1_IR11	(1 << 3)	/* Interrupt request ep 11 */ +#define USIR1_IR12	(1 << 4)	/* Interrupt request ep 12 */ +#define USIR1_IR13	(1 << 5)	/* Interrupt request ep 13 */ +#define USIR1_IR14	(1 << 6)	/* Interrupt request ep 14 */ +#define USIR1_IR15	(1 << 7)	/* Interrupt request ep 15 */ + +#define DCMD_LENGTH	0x01fff		/* length mask (max = 8K - 1) */ + +/* "fuse" bits of IXP_EXP_CFG2 */ +#define IXP4XX_FEATURE_RCOMP		(1 << 0) +#define IXP4XX_FEATURE_USB_DEVICE	(1 << 1) +#define IXP4XX_FEATURE_HASH		(1 << 2) +#define IXP4XX_FEATURE_AES		(1 << 3) +#define IXP4XX_FEATURE_DES		(1 << 4) +#define IXP4XX_FEATURE_HDLC		(1 << 5) +#define IXP4XX_FEATURE_AAL		(1 << 6) +#define IXP4XX_FEATURE_HSS		(1 << 7) +#define IXP4XX_FEATURE_UTOPIA		(1 << 8) +#define IXP4XX_FEATURE_NPEB_ETH0	(1 << 9) +#define IXP4XX_FEATURE_NPEC_ETH		(1 << 10) +#define IXP4XX_FEATURE_RESET_NPEA	(1 << 11) +#define IXP4XX_FEATURE_RESET_NPEB	(1 << 12) +#define IXP4XX_FEATURE_RESET_NPEC	(1 << 13) +#define IXP4XX_FEATURE_PCI		(1 << 14) +#define IXP4XX_FEATURE_ECC_TIMESYNC	(1 << 15) +#define IXP4XX_FEATURE_UTOPIA_PHY_LIMIT	(3 << 16) +#define IXP4XX_FEATURE_USB_HOST		(1 << 18) +#define IXP4XX_FEATURE_NPEA_ETH		(1 << 19) +#define IXP4XX_FEATURE_NPEB_ETH_1_TO_3	(1 << 20) +#define IXP4XX_FEATURE_RSA		(1 << 21) +#define IXP4XX_FEATURE_XSCALE_MAX_FREQ	(3 << 22) +#define IXP4XX_FEATURE_RESERVED		(0xFF << 24) + +#define IXP4XX_FEATURE_IXP46X_ONLY (IXP4XX_FEATURE_ECC_TIMESYNC |	\ +				    IXP4XX_FEATURE_USB_HOST |		\ +				    IXP4XX_FEATURE_NPEA_ETH |		\ +				    IXP4XX_FEATURE_NPEB_ETH_1_TO_3 |	\ +				    IXP4XX_FEATURE_RSA |		\ +				    IXP4XX_FEATURE_XSCALE_MAX_FREQ) + +#endif diff --git a/arch/arm/mach-ixp4xx/include/mach/memory.h b/arch/arm/mach-ixp4xx/include/mach/memory.h new file mode 100644 index 00000000000..c4d2830ac98 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/memory.h @@ -0,0 +1,40 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/memory.h + * + * Copyright (c) 2001-2004 MontaVista Software, Inc. + */ + +#ifndef __ASM_ARCH_MEMORY_H +#define __ASM_ARCH_MEMORY_H + +#include <asm/sizes.h> + +/* + * Physical DRAM offset. + */ +#define PHYS_OFFSET	UL(0x00000000) + +#if !defined(__ASSEMBLY__) && defined(CONFIG_PCI) + +void ixp4xx_adjust_zones(int node, unsigned long *size, unsigned long *holes); + +#define arch_adjust_zones(node, size, holes) \ +	ixp4xx_adjust_zones(node, size, holes) + +#define ISA_DMA_THRESHOLD (SZ_64M - 1) + +#endif + +/* + * Virtual view <-> DMA view memory address translations + * virt_to_bus: Used to translate the virtual address to an + *		address suitable to be passed to set_dma_addr + * bus_to_virt: Used to convert an address for DMA operations + *		to an address that the kernel can use. + * + * These are dummies for now. + */ +#define __virt_to_bus(x)	 __virt_to_phys(x) +#define __bus_to_virt(x)	 __phys_to_virt(x) + +#endif diff --git a/arch/arm/mach-ixp4xx/include/mach/nas100d.h b/arch/arm/mach-ixp4xx/include/mach/nas100d.h new file mode 100644 index 00000000000..3771d62a974 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/nas100d.h @@ -0,0 +1,52 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/nas100d.h + * + * NAS100D platform specific definitions + * + * Copyright (c) 2005 Tower Technologies + * + * Author: Alessandro Zummo <a.zummo@towertech.it> + * + * based on ixdp425.h: + *	Copyright 2004 (c) MontaVista, Software, Inc. + * + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#define NAS100D_SDA_PIN		5 +#define NAS100D_SCL_PIN		6 + +/* + * NAS100D PCI IRQs + */ +#define NAS100D_PCI_MAX_DEV	3 +#define NAS100D_PCI_IRQ_LINES	3 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define NAS100D_PCI_INTA_PIN	11 +#define NAS100D_PCI_INTB_PIN	10 +#define NAS100D_PCI_INTC_PIN	9 +#define NAS100D_PCI_INTD_PIN	8 +#define NAS100D_PCI_INTE_PIN	7 + +/* Buttons */ + +#define NAS100D_PB_GPIO         14   /* power button */ +#define NAS100D_RB_GPIO         4    /* reset button */ + +/* Power control */ + +#define NAS100D_PO_GPIO         12   /* power off */ + +/* LEDs */ + +#define NAS100D_LED_WLAN_GPIO	0 +#define NAS100D_LED_DISK_GPIO	3 +#define NAS100D_LED_PWR_GPIO	15 diff --git a/arch/arm/mach-ixp4xx/include/mach/npe.h b/arch/arm/mach-ixp4xx/include/mach/npe.h new file mode 100644 index 00000000000..37d0511689d --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/npe.h @@ -0,0 +1,39 @@ +#ifndef __IXP4XX_NPE_H +#define __IXP4XX_NPE_H + +#include <linux/kernel.h> + +extern const char *npe_names[]; + +struct npe_regs { +	u32 exec_addr, exec_data, exec_status_cmd, exec_count; +	u32 action_points[4]; +	u32 watchpoint_fifo, watch_count; +	u32 profile_count; +	u32 messaging_status, messaging_control; +	u32 mailbox_status, /*messaging_*/ in_out_fifo; +}; + +struct npe { +	struct resource *mem_res; +	struct npe_regs __iomem *regs; +	u32 regs_phys; +	int id; +	int valid; +}; + + +static inline const char *npe_name(struct npe *npe) +{ +	return npe_names[npe->id]; +} + +int npe_running(struct npe *npe); +int npe_send_message(struct npe *npe, const void *msg, const char *what); +int npe_recv_message(struct npe *npe, void *msg, const char *what); +int npe_send_recv_message(struct npe *npe, void *msg, const char *what); +int npe_load_firmware(struct npe *npe, const char *name, struct device *dev); +struct npe *npe_request(int id); +void npe_release(struct npe *npe); + +#endif /* __IXP4XX_NPE_H */ diff --git a/arch/arm/mach-ixp4xx/include/mach/nslu2.h b/arch/arm/mach-ixp4xx/include/mach/nslu2.h new file mode 100644 index 00000000000..85d00adbfb9 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/nslu2.h @@ -0,0 +1,55 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/nslu2.h + * + * NSLU2 platform specific definitions + * + * Author: Mark Rakes <mrakes AT mac.com> + * Maintainers: http://www.nslu2-linux.org + * + * based on ixdp425.h: + *	Copyright 2004 (c) MontaVista, Software, Inc. + * + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#define NSLU2_SDA_PIN		7 +#define NSLU2_SCL_PIN		6 + +/* + * NSLU2 PCI IRQs + */ +#define NSLU2_PCI_MAX_DEV	3 +#define NSLU2_PCI_IRQ_LINES	3 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define NSLU2_PCI_INTA_PIN	11 +#define NSLU2_PCI_INTB_PIN	10 +#define NSLU2_PCI_INTC_PIN	9 +#define NSLU2_PCI_INTD_PIN	8 + +/* NSLU2 Timer */ +#define NSLU2_FREQ 66000000 + +/* Buttons */ + +#define NSLU2_PB_GPIO		5	/* power button */ +#define NSLU2_PO_GPIO		8	/* power off */ +#define NSLU2_RB_GPIO		12	/* reset button */ + +/* Buzzer */ + +#define NSLU2_GPIO_BUZZ		4 + +/* LEDs */ + +#define NSLU2_LED_RED_GPIO	0 +#define NSLU2_LED_GRN_GPIO	1 +#define NSLU2_LED_DISK1_GPIO	3 +#define NSLU2_LED_DISK2_GPIO	2 diff --git a/arch/arm/mach-ixp4xx/include/mach/platform.h b/arch/arm/mach-ixp4xx/include/mach/platform.h new file mode 100644 index 00000000000..e824c02c825 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/platform.h @@ -0,0 +1,173 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/platform.h + * + * Constants and functions that are useful to IXP4xx platform-specific code + * and device drivers. + * + * Copyright (C) 2004 MontaVista Software, Inc. + */ + +#ifndef __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#ifndef __ASSEMBLY__ + +#include <asm/types.h> + +#ifndef	__ARMEB__ +#define	REG_OFFSET	0 +#else +#define	REG_OFFSET	3 +#endif + +/* + * Expansion bus memory regions + */ +#define IXP4XX_EXP_BUS_BASE_PHYS	(0x50000000) + +/* + * The expansion bus on the IXP4xx can be configured for either 16 or + * 32MB windows and the CS offset for each region changes based on the + * current configuration. This means that we cannot simply hardcode + * each offset. ixp4xx_sys_init() looks at the expansion bus configuration + * as setup by the bootloader to determine our window size. + */ +extern unsigned long ixp4xx_exp_bus_size; + +#define	IXP4XX_EXP_BUS_BASE(region)\ +		(IXP4XX_EXP_BUS_BASE_PHYS + ((region) * ixp4xx_exp_bus_size)) + +#define IXP4XX_EXP_BUS_END(region)\ +		(IXP4XX_EXP_BUS_BASE(region) + ixp4xx_exp_bus_size - 1) + +/* Those macros can be used to adjust timing and configure + * other features for each region. + */ + +#define IXP4XX_EXP_BUS_RECOVERY_T(x)	(((x) & 0x0f) << 16) +#define IXP4XX_EXP_BUS_HOLD_T(x)	(((x) & 0x03) << 20) +#define IXP4XX_EXP_BUS_STROBE_T(x)	(((x) & 0x0f) << 22) +#define IXP4XX_EXP_BUS_SETUP_T(x)	(((x) & 0x03) << 26) +#define IXP4XX_EXP_BUS_ADDR_T(x)	(((x) & 0x03) << 28) +#define IXP4XX_EXP_BUS_SIZE(x)		(((x) & 0x0f) << 10) +#define IXP4XX_EXP_BUS_CYCLES(x)	(((x) & 0x03) << 14) + +#define IXP4XX_EXP_BUS_CS_EN		(1L << 31) +#define IXP4XX_EXP_BUS_BYTE_RD16	(1L << 6) +#define IXP4XX_EXP_BUS_HRDY_POL		(1L << 5) +#define IXP4XX_EXP_BUS_MUX_EN		(1L << 4) +#define IXP4XX_EXP_BUS_SPLT_EN		(1L << 3) +#define IXP4XX_EXP_BUS_WR_EN		(1L << 1) +#define IXP4XX_EXP_BUS_BYTE_EN		(1L << 0) + +#define IXP4XX_EXP_BUS_CYCLES_INTEL	0x00 +#define IXP4XX_EXP_BUS_CYCLES_MOTOROLA	0x01 +#define IXP4XX_EXP_BUS_CYCLES_HPI	0x02 + +#define IXP4XX_FLASH_WRITABLE	(0x2) +#define IXP4XX_FLASH_DEFAULT	(0xbcd23c40) +#define IXP4XX_FLASH_WRITE	(0xbcd23c42) + +/* + * Clock Speed Definitions. + */ +#define IXP4XX_PERIPHERAL_BUS_CLOCK 	(66) /* 66Mhzi APB BUS   */  +#define IXP4XX_UART_XTAL        	14745600 + +/* + * This structure provide a means for the board setup code + * to give information to th pata_ixp4xx driver. It is + * passed as platform_data. + */ +struct ixp4xx_pata_data { +	volatile u32	*cs0_cfg; +	volatile u32	*cs1_cfg; +	unsigned long	cs0_bits; +	unsigned long	cs1_bits; +	void __iomem	*cs0; +	void __iomem	*cs1; +}; + +struct sys_timer; + +#define IXP4XX_ETH_NPEA		0x00 +#define IXP4XX_ETH_NPEB		0x10 +#define IXP4XX_ETH_NPEC		0x20 + +/* Information about built-in Ethernet MAC interfaces */ +struct eth_plat_info { +	u8 phy;		/* MII PHY ID, 0 - 31 */ +	u8 rxq;		/* configurable, currently 0 - 31 only */ +	u8 txreadyq; +	u8 hwaddr[6]; +}; + +/* Information about built-in HSS (synchronous serial) interfaces */ +struct hss_plat_info { +	int (*set_clock)(int port, unsigned int clock_type); +	int (*open)(int port, void *pdev, +		    void (*set_carrier_cb)(void *pdev, int carrier)); +	void (*close)(int port, void *pdev); +	u8 txreadyq; +}; + +/* + * Frequency of clock used for primary clocksource + */ +extern unsigned long ixp4xx_timer_freq; + +/* + * Functions used by platform-level setup code + */ +extern void ixp4xx_map_io(void); +extern void ixp4xx_init_irq(void); +extern void ixp4xx_sys_init(void); +extern void ixp4xx_timer_init(void); +extern struct sys_timer ixp4xx_timer; +extern void ixp4xx_pci_preinit(void); +struct pci_sys_data; +extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); +extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); + +/* + * GPIO-functions + */ +/* + * The following converted to the real HW bits the gpio_line_config + */ +/* GPIO pin types */ +#define IXP4XX_GPIO_OUT 		0x1 +#define IXP4XX_GPIO_IN  		0x2 + +/* GPIO signal types */ +#define IXP4XX_GPIO_LOW			0 +#define IXP4XX_GPIO_HIGH		1 + +/* GPIO Clocks */ +#define IXP4XX_GPIO_CLK_0		14 +#define IXP4XX_GPIO_CLK_1		15 + +static inline void gpio_line_config(u8 line, u32 direction) +{ +	if (direction == IXP4XX_GPIO_IN) +		*IXP4XX_GPIO_GPOER |= (1 << line); +	else +		*IXP4XX_GPIO_GPOER &= ~(1 << line); +} + +static inline void gpio_line_get(u8 line, int *value) +{ +	*value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; +} + +static inline void gpio_line_set(u8 line, int value) +{ +	if (value == IXP4XX_GPIO_HIGH) +	    *IXP4XX_GPIO_GPOUTR |= (1 << line); +	else if (value == IXP4XX_GPIO_LOW) +	    *IXP4XX_GPIO_GPOUTR &= ~(1 << line); +} + +#endif // __ASSEMBLY__ + diff --git a/arch/arm/mach-ixp4xx/include/mach/prpmc1100.h b/arch/arm/mach-ixp4xx/include/mach/prpmc1100.h new file mode 100644 index 00000000000..17274a2e3de --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/prpmc1100.h @@ -0,0 +1,33 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/prpmc1100.h + * + * Motorolla PrPMC1100 platform specific definitions + * + * Author: Deepak Saxena <dsaxena@plexity.net> + * + * Copyright 2004 (c) MontaVista, Software, Inc.  + *  + * 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 __ASM_ARCH_HARDWARE_H__ +#error "Do not include this directly, instead #include <mach/hardware.h>" +#endif + +#define	PRPMC1100_FLASH_BASE	IXP4XX_EXP_BUS_CS0_BASE_PHYS +#define	PRPMC1100_FLASH_SIZE	IXP4XX_EXP_BUS_CSX_REGION_SIZE + +#define	PRPMC1100_PCI_MIN_DEVID	10 +#define	PRPMC1100_PCI_MAX_DEVID	16 +#define	PRPMC1100_PCI_IRQ_LINES	4 + + +/* PCI controller GPIO to IRQ pin mappings */ +#define PRPMC1100_PCI_INTA_PIN	11 +#define PRPMC1100_PCI_INTB_PIN	10 +#define	PRPMC1100_PCI_INTC_PIN	9 +#define	PRPMC1100_PCI_INTD_PIN	8 + + diff --git a/arch/arm/mach-ixp4xx/include/mach/qmgr.h b/arch/arm/mach-ixp4xx/include/mach/qmgr.h new file mode 100644 index 00000000000..1e52b95cede --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/qmgr.h @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2007 Krzysztof Halasa <khc@pm.waw.pl> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 of the GNU General Public License + * as published by the Free Software Foundation. + */ + +#ifndef IXP4XX_QMGR_H +#define IXP4XX_QMGR_H + +#include <linux/io.h> +#include <linux/kernel.h> + +#define HALF_QUEUES	32 +#define QUEUES		64	/* only 32 lower queues currently supported */ +#define MAX_QUEUE_LENGTH 4	/* in dwords */ + +#define QUEUE_STAT1_EMPTY		1 /* queue status bits */ +#define QUEUE_STAT1_NEARLY_EMPTY	2 +#define QUEUE_STAT1_NEARLY_FULL		4 +#define QUEUE_STAT1_FULL		8 +#define QUEUE_STAT2_UNDERFLOW		1 +#define QUEUE_STAT2_OVERFLOW		2 + +#define QUEUE_WATERMARK_0_ENTRIES	0 +#define QUEUE_WATERMARK_1_ENTRY		1 +#define QUEUE_WATERMARK_2_ENTRIES	2 +#define QUEUE_WATERMARK_4_ENTRIES	3 +#define QUEUE_WATERMARK_8_ENTRIES	4 +#define QUEUE_WATERMARK_16_ENTRIES	5 +#define QUEUE_WATERMARK_32_ENTRIES	6 +#define QUEUE_WATERMARK_64_ENTRIES	7 + +/* queue interrupt request conditions */ +#define QUEUE_IRQ_SRC_EMPTY		0 +#define QUEUE_IRQ_SRC_NEARLY_EMPTY	1 +#define QUEUE_IRQ_SRC_NEARLY_FULL	2 +#define QUEUE_IRQ_SRC_FULL		3 +#define QUEUE_IRQ_SRC_NOT_EMPTY		4 +#define QUEUE_IRQ_SRC_NOT_NEARLY_EMPTY	5 +#define QUEUE_IRQ_SRC_NOT_NEARLY_FULL	6 +#define QUEUE_IRQ_SRC_NOT_FULL		7 + +struct qmgr_regs { +	u32 acc[QUEUES][MAX_QUEUE_LENGTH]; /* 0x000 - 0x3FF */ +	u32 stat1[4];		/* 0x400 - 0x40F */ +	u32 stat2[2];		/* 0x410 - 0x417 */ +	u32 statne_h;		/* 0x418 - queue nearly empty */ +	u32 statf_h;		/* 0x41C - queue full */ +	u32 irqsrc[4];		/* 0x420 - 0x42F IRC source */ +	u32 irqen[2];		/* 0x430 - 0x437 IRQ enabled */ +	u32 irqstat[2];		/* 0x438 - 0x43F - IRQ access only */ +	u32 reserved[1776]; +	u32 sram[2048];		/* 0x2000 - 0x3FFF - config and buffer */ +}; + +void qmgr_set_irq(unsigned int queue, int src, +		  void (*handler)(void *pdev), void *pdev); +void qmgr_enable_irq(unsigned int queue); +void qmgr_disable_irq(unsigned int queue); + +/* request_ and release_queue() must be called from non-IRQ context */ +int qmgr_request_queue(unsigned int queue, unsigned int len /* dwords */, +		       unsigned int nearly_empty_watermark, +		       unsigned int nearly_full_watermark); +void qmgr_release_queue(unsigned int queue); + + +static inline void qmgr_put_entry(unsigned int queue, u32 val) +{ +	extern struct qmgr_regs __iomem *qmgr_regs; +	__raw_writel(val, &qmgr_regs->acc[queue][0]); +} + +static inline u32 qmgr_get_entry(unsigned int queue) +{ +	extern struct qmgr_regs __iomem *qmgr_regs; +	return __raw_readl(&qmgr_regs->acc[queue][0]); +} + +static inline int qmgr_get_stat1(unsigned int queue) +{ +	extern struct qmgr_regs __iomem *qmgr_regs; +	return (__raw_readl(&qmgr_regs->stat1[queue >> 3]) +		>> ((queue & 7) << 2)) & 0xF; +} + +static inline int qmgr_get_stat2(unsigned int queue) +{ +	extern struct qmgr_regs __iomem *qmgr_regs; +	return (__raw_readl(&qmgr_regs->stat2[queue >> 4]) +		>> ((queue & 0xF) << 1)) & 0x3; +} + +static inline int qmgr_stat_empty(unsigned int queue) +{ +	return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_EMPTY); +} + +static inline int qmgr_stat_nearly_empty(unsigned int queue) +{ +	return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_EMPTY); +} + +static inline int qmgr_stat_nearly_full(unsigned int queue) +{ +	return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_NEARLY_FULL); +} + +static inline int qmgr_stat_full(unsigned int queue) +{ +	return !!(qmgr_get_stat1(queue) & QUEUE_STAT1_FULL); +} + +static inline int qmgr_stat_underflow(unsigned int queue) +{ +	return !!(qmgr_get_stat2(queue) & QUEUE_STAT2_UNDERFLOW); +} + +static inline int qmgr_stat_overflow(unsigned int queue) +{ +	return !!(qmgr_get_stat2(queue) & QUEUE_STAT2_OVERFLOW); +} + +#endif diff --git a/arch/arm/mach-ixp4xx/include/mach/system.h b/arch/arm/mach-ixp4xx/include/mach/system.h new file mode 100644 index 00000000000..92a7e8ddf69 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/system.h @@ -0,0 +1,42 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/system.h + * + * Copyright (C) 2002 Intel Corporation. + * + * 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. + * + */ + +#include <mach/hardware.h> + +static inline void arch_idle(void) +{ +#if 0 +	if (!hlt_counter) +		cpu_do_idle(0); +#endif +} + + +static inline void arch_reset(char mode) +{ +	if ( 1 && mode == 's') { +		/* Jump into ROM at address 0 */ +		cpu_reset(0); +	} else { +		/* Use on-chip reset capability */ + +		/* set the "key" register to enable access to +		 * "timer" and "enable" registers +		 */ +		*IXP4XX_OSWK = IXP4XX_WDT_KEY; + +		/* write 0 to the timer register for an immediate reset */ +		*IXP4XX_OSWT = 0; + +		*IXP4XX_OSWE = IXP4XX_WDT_RESET_ENABLE | IXP4XX_WDT_COUNT_ENABLE; +	} +} + diff --git a/arch/arm/mach-ixp4xx/include/mach/timex.h b/arch/arm/mach-ixp4xx/include/mach/timex.h new file mode 100644 index 00000000000..89ce3ee8469 --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/timex.h @@ -0,0 +1,15 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/timex.h + *  + */ + +#include <mach/hardware.h> + +/* + * We use IXP425 General purpose timer for our timer needs, it runs at  + * 66.66... MHz. We do a convulted calculation of CLOCK_TICK_RATE b/c the + * timer register ignores the bottom 2 bits of the LATCH value. + */ +#define FREQ 66666666 +#define CLOCK_TICK_RATE (((FREQ / HZ & ~IXP4XX_OST_RELOAD_MASK) + 1) * HZ) + diff --git a/arch/arm/mach-ixp4xx/include/mach/udc.h b/arch/arm/mach-ixp4xx/include/mach/udc.h new file mode 100644 index 00000000000..80d6da2eafa --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/udc.h @@ -0,0 +1,8 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/udc.h + * + */ +#include <asm/mach/udc_pxa2xx.h> + +extern void ixp4xx_set_udc_info(struct pxa2xx_udc_mach_info *info); + diff --git a/arch/arm/mach-ixp4xx/include/mach/uncompress.h b/arch/arm/mach-ixp4xx/include/mach/uncompress.h new file mode 100644 index 00000000000..2db0078a8cf --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/uncompress.h @@ -0,0 +1,57 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/uncompress.h  + * + * Copyright (C) 2002 Intel Corporation. + * Copyright (C) 2003-2004 MontaVista Software, Inc. + * + * 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 _ARCH_UNCOMPRESS_H_ +#define _ARCH_UNCOMPRESS_H_ + +#include "ixp4xx-regs.h" +#include <asm/mach-types.h> +#include <linux/serial_reg.h> + +#define TX_DONE (UART_LSR_TEMT|UART_LSR_THRE) + +static volatile u32* uart_base; + +static inline void putc(int c) +{ +	/* Check THRE and TEMT bits before we transmit the character. +	 */ +	while ((uart_base[UART_LSR] & TX_DONE) != TX_DONE) +		barrier(); + +	*uart_base = c; +} + +static void flush(void) +{ +} + +static __inline__ void __arch_decomp_setup(unsigned long arch_id) +{ +	/* +	 * Some boards are using UART2 as console +	 */ +	if (machine_is_adi_coyote() || machine_is_gtwx5715() || +			 machine_is_gateway7001() || machine_is_wg302v2()) +		uart_base = (volatile u32*) IXP4XX_UART2_BASE_PHYS; +	else +		uart_base = (volatile u32*) IXP4XX_UART1_BASE_PHYS; +} + +/* + * arch_id is a variable in decompress_kernel() + */ +#define arch_decomp_setup()	__arch_decomp_setup(arch_id) + +#define arch_decomp_wdog() + +#endif diff --git a/arch/arm/mach-ixp4xx/include/mach/vmalloc.h b/arch/arm/mach-ixp4xx/include/mach/vmalloc.h new file mode 100644 index 00000000000..7b3580b53ad --- /dev/null +++ b/arch/arm/mach-ixp4xx/include/mach/vmalloc.h @@ -0,0 +1,5 @@ +/* + * arch/arm/mach-ixp4xx/include/mach/vmalloc.h + */ +#define VMALLOC_END       (0xFF000000) +  |