mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ARM: remove ixp23xx and ixp2000 platforms
ixp2xxx platforms have had no real changes since ~2006 and the maintainer has said on irc that they can be removed: 13:05 < nico> do you still care about ixp2000? 13:22 < lennert> not really, no 13:58 < nico> do you think we could remove it from the kernel tree? 14:01 < lennert> go for it, and remove ixp23xx too while you're at it Removing will help simplify ARM consolidation in general and PCI re-work specifically. Signed-off-by: Rob Herring <rob.herring@calxeda.com> Cc: Randy Dunlap <rdunlap@xenotime.net> Acked-by: Lennert Buytenhek <buytenh@wantstofly.org>
This commit is contained in:
		
							parent
							
								
									dd775ae254
								
							
						
					
					
						commit
						c65f2abf54
					
				
					 55 changed files with 0 additions and 6950 deletions
				
			
		| 
						 | 
				
			
			@ -4,8 +4,6 @@ Booting
 | 
			
		|||
	- requirements for booting
 | 
			
		||||
Interrupts
 | 
			
		||||
	- ARM Interrupt subsystem documentation
 | 
			
		||||
IXP2000
 | 
			
		||||
	- Release Notes for Linux on Intel's IXP2000 Network Processor
 | 
			
		||||
msm
 | 
			
		||||
	- MSM specific documentation
 | 
			
		||||
Netwinder
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,69 +0,0 @@
 | 
			
		|||
 | 
			
		||||
-------------------------------------------------------------------------
 | 
			
		||||
Release Notes for Linux on Intel's IXP2000 Network Processor
 | 
			
		||||
 | 
			
		||||
Maintained by Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
-------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
1. Overview
 | 
			
		||||
 | 
			
		||||
Intel's IXP2000 family of NPUs (IXP2400, IXP2800, IXP2850) is designed
 | 
			
		||||
for high-performance network applications such high-availability
 | 
			
		||||
telecom systems. In addition to an XScale core, it contains up to 8
 | 
			
		||||
"MicroEngines" that run special code, several high-end networking 
 | 
			
		||||
interfaces (UTOPIA, SPI, etc), a PCI host bridge, one serial port,
 | 
			
		||||
flash interface, and some other odds and ends. For more information, see:
 | 
			
		||||
 | 
			
		||||
http://developer.intel.com
 | 
			
		||||
 | 
			
		||||
2. Linux Support
 | 
			
		||||
 | 
			
		||||
Linux currently supports the following features on the IXP2000 NPUs:
 | 
			
		||||
 | 
			
		||||
- On-chip serial
 | 
			
		||||
- PCI
 | 
			
		||||
- Flash (MTD/JFFS2)
 | 
			
		||||
- I2C through GPIO
 | 
			
		||||
- Timers (watchdog, OS)
 | 
			
		||||
 | 
			
		||||
That is about all we can support under Linux ATM b/c the core networking
 | 
			
		||||
components of the chip are accessed via Intel's closed source SDK. 
 | 
			
		||||
Please contact Intel directly on issues with using those. There is
 | 
			
		||||
also a mailing list run by some folks at Princeton University that might
 | 
			
		||||
be of help:  https://lists.cs.princeton.edu/mailman/listinfo/ixp2xxx
 | 
			
		||||
 | 
			
		||||
WHATEVER YOU DO, DO NOT POST EMAIL TO THE LINUX-ARM OR LINUX-ARM-KERNEL
 | 
			
		||||
MAILING LISTS REGARDING THE INTEL SDK.
 | 
			
		||||
 | 
			
		||||
3. Supported Platforms
 | 
			
		||||
 | 
			
		||||
- Intel IXDP2400 Reference Platform
 | 
			
		||||
- Intel IXDP2800 Reference Platform
 | 
			
		||||
- Intel IXDP2401 Reference Platform
 | 
			
		||||
- Intel IXDP2801 Reference Platform
 | 
			
		||||
- RadiSys ENP-2611
 | 
			
		||||
 | 
			
		||||
4. Usage Notes
 | 
			
		||||
 | 
			
		||||
- The IXP2000 platforms usually have rather complex PCI bus topologies
 | 
			
		||||
  with large memory space requirements. In addition, b/c of the way the
 | 
			
		||||
  Intel SDK is designed, devices are enumerated in a very specific
 | 
			
		||||
  way. B/c of this this, we use "pci=firmware" option in the kernel
 | 
			
		||||
  command line so that we do not re-enumerate the bus.
 | 
			
		||||
 | 
			
		||||
- IXDP2x01 systems have variable clock tick rates that we cannot determine 
 | 
			
		||||
  via HW registers. The "ixdp2x01_clk=XXX" cmd line options allow you
 | 
			
		||||
  to pass the clock rate to the board port.
 | 
			
		||||
 | 
			
		||||
5. Thanks
 | 
			
		||||
 | 
			
		||||
The IXP2000 work has been funded by Intel Corp. and MontaVista Software, Inc.
 | 
			
		||||
 | 
			
		||||
The following people have contributed patches/comments/etc:
 | 
			
		||||
 | 
			
		||||
Naeem F. Afzal
 | 
			
		||||
Lennert Buytenhek
 | 
			
		||||
Jeffrey Daly
 | 
			
		||||
 | 
			
		||||
-------------------------------------------------------------------------
 | 
			
		||||
Last Update: 8/09/2004
 | 
			
		||||
							
								
								
									
										17
									
								
								MAINTAINERS
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								MAINTAINERS
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -640,13 +640,6 @@ S:	Maintained
 | 
			
		|||
F:	drivers/amba/
 | 
			
		||||
F:	include/linux/amba/bus.h
 | 
			
		||||
 | 
			
		||||
ARM/ADI ROADRUNNER MACHINE SUPPORT
 | 
			
		||||
M:	Lennert Buytenhek <kernel@wantstofly.org>
 | 
			
		||||
L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 | 
			
		||||
S:	Maintained
 | 
			
		||||
F:	arch/arm/mach-ixp23xx/
 | 
			
		||||
F:	arch/arm/mach-ixp23xx/include/mach/
 | 
			
		||||
 | 
			
		||||
ARM/ADS SPHERE MACHINE SUPPORT
 | 
			
		||||
M:	Lennert Buytenhek <kernel@wantstofly.org>
 | 
			
		||||
L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 | 
			
		||||
| 
						 | 
				
			
			@ -859,21 +852,11 @@ M:	Dan Williams <dan.j.williams@intel.com>
 | 
			
		|||
L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 | 
			
		||||
S:	Maintained
 | 
			
		||||
 | 
			
		||||
ARM/INTEL IXP2000 ARM ARCHITECTURE
 | 
			
		||||
M:	Lennert Buytenhek <kernel@wantstofly.org>
 | 
			
		||||
L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 | 
			
		||||
S:	Maintained
 | 
			
		||||
 | 
			
		||||
ARM/INTEL IXDP2850 MACHINE SUPPORT
 | 
			
		||||
M:	Lennert Buytenhek <kernel@wantstofly.org>
 | 
			
		||||
L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 | 
			
		||||
S:	Maintained
 | 
			
		||||
 | 
			
		||||
ARM/INTEL IXP23XX ARM ARCHITECTURE
 | 
			
		||||
M:	Lennert Buytenhek <kernel@wantstofly.org>
 | 
			
		||||
L:	linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 | 
			
		||||
S:	Maintained
 | 
			
		||||
 | 
			
		||||
ARM/INTEL IXP4XX ARM ARCHITECTURE
 | 
			
		||||
M:	Imre Kaloz <kaloz@openwrt.org>
 | 
			
		||||
M:	Krzysztof Halasa <khc@pm.waw.pl>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -527,28 +527,6 @@ config ARCH_IOP33X
 | 
			
		|||
	help
 | 
			
		||||
	  Support for Intel's IOP33X (XScale) family of processors.
 | 
			
		||||
 | 
			
		||||
config ARCH_IXP23XX
 | 
			
		||||
 	bool "IXP23XX-based"
 | 
			
		||||
	depends on MMU
 | 
			
		||||
	select CPU_XSC3
 | 
			
		||||
 	select PCI
 | 
			
		||||
	select ARCH_USES_GETTIMEOFFSET
 | 
			
		||||
	select NEED_MACH_IO_H
 | 
			
		||||
	select NEED_MACH_MEMORY_H
 | 
			
		||||
	help
 | 
			
		||||
	  Support for Intel's IXP23xx (XScale) family of processors.
 | 
			
		||||
 | 
			
		||||
config ARCH_IXP2000
 | 
			
		||||
	bool "IXP2400/2800-based"
 | 
			
		||||
	depends on MMU
 | 
			
		||||
	select CPU_XSCALE
 | 
			
		||||
	select PCI
 | 
			
		||||
	select ARCH_USES_GETTIMEOFFSET
 | 
			
		||||
	select NEED_MACH_IO_H
 | 
			
		||||
	select NEED_MACH_MEMORY_H
 | 
			
		||||
	help
 | 
			
		||||
	  Support for Intel's IXP2400/2800 (XScale) family of processors.
 | 
			
		||||
 | 
			
		||||
config ARCH_IXP4XX
 | 
			
		||||
	bool "IXP4xx-based"
 | 
			
		||||
	depends on MMU
 | 
			
		||||
| 
						 | 
				
			
			@ -1045,10 +1023,6 @@ source "arch/arm/mach-iop13xx/Kconfig"
 | 
			
		|||
 | 
			
		||||
source "arch/arm/mach-ixp4xx/Kconfig"
 | 
			
		||||
 | 
			
		||||
source "arch/arm/mach-ixp2000/Kconfig"
 | 
			
		||||
 | 
			
		||||
source "arch/arm/mach-ixp23xx/Kconfig"
 | 
			
		||||
 | 
			
		||||
source "arch/arm/mach-kirkwood/Kconfig"
 | 
			
		||||
 | 
			
		||||
source "arch/arm/mach-ks8695/Kconfig"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -149,8 +149,6 @@ machine-$(CONFIG_ARCH_INTEGRATOR)	:= integrator
 | 
			
		|||
machine-$(CONFIG_ARCH_IOP13XX)		:= iop13xx
 | 
			
		||||
machine-$(CONFIG_ARCH_IOP32X)		:= iop32x
 | 
			
		||||
machine-$(CONFIG_ARCH_IOP33X)		:= iop33x
 | 
			
		||||
machine-$(CONFIG_ARCH_IXP2000)		:= ixp2000
 | 
			
		||||
machine-$(CONFIG_ARCH_IXP23XX)		:= ixp23xx
 | 
			
		||||
machine-$(CONFIG_ARCH_IXP4XX)		:= ixp4xx
 | 
			
		||||
machine-$(CONFIG_ARCH_KIRKWOOD)		:= kirkwood
 | 
			
		||||
machine-$(CONFIG_ARCH_KS8695)		:= ks8695
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,10 +32,3 @@ __XScale_start:
 | 
			
		|||
		bic	r0, r0, #0x1000		@ clear Icache
 | 
			
		||||
		mcr	p15, 0, r0, c1, c0, 0
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXP2000
 | 
			
		||||
		mov	r1, #-1
 | 
			
		||||
		mov	r0, #0xd6000000
 | 
			
		||||
		str	r1, [r0, #0x14]
 | 
			
		||||
		str	r1, [r0, #0x18]
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,5 @@ obj-$(CONFIG_DMABOUNCE)		+= dmabounce.o
 | 
			
		|||
obj-$(CONFIG_SHARP_LOCOMO)	+= locomo.o
 | 
			
		||||
obj-$(CONFIG_SHARP_PARAM)	+= sharpsl_param.o
 | 
			
		||||
obj-$(CONFIG_SHARP_SCOOP)	+= scoop.o
 | 
			
		||||
obj-$(CONFIG_ARCH_IXP2000)	+= uengine.o
 | 
			
		||||
obj-$(CONFIG_ARCH_IXP23XX)	+= uengine.o
 | 
			
		||||
obj-$(CONFIG_PCI_HOST_ITE8152)  += it8152.o
 | 
			
		||||
obj-$(CONFIG_ARM_TIMER_SP804)	+= timer-sp.o
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,507 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Generic library functions for the microengines found on the Intel
 | 
			
		||||
 * IXP2000 series of network processors.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
 | 
			
		||||
 * Dedicated to Marija Kulikova.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Lesser General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2.1 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/slab.h>
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/string.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/hardware/uengine.h>
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_ARCH_IXP2000)
 | 
			
		||||
#define IXP_UENGINE_CSR_VIRT_BASE	IXP2000_UENGINE_CSR_VIRT_BASE
 | 
			
		||||
#define IXP_PRODUCT_ID			IXP2000_PRODUCT_ID
 | 
			
		||||
#define IXP_MISC_CONTROL		IXP2000_MISC_CONTROL
 | 
			
		||||
#define IXP_RESET1			IXP2000_RESET1
 | 
			
		||||
#else
 | 
			
		||||
#if defined(CONFIG_ARCH_IXP23XX)
 | 
			
		||||
#define IXP_UENGINE_CSR_VIRT_BASE	IXP23XX_UENGINE_CSR_VIRT_BASE
 | 
			
		||||
#define IXP_PRODUCT_ID			IXP23XX_PRODUCT_ID
 | 
			
		||||
#define IXP_MISC_CONTROL		IXP23XX_MISC_CONTROL
 | 
			
		||||
#define IXP_RESET1			IXP23XX_RESET1
 | 
			
		||||
#else
 | 
			
		||||
#error unknown platform
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define USTORE_ADDRESS			0x000
 | 
			
		||||
#define USTORE_DATA_LOWER		0x004
 | 
			
		||||
#define USTORE_DATA_UPPER		0x008
 | 
			
		||||
#define CTX_ENABLES			0x018
 | 
			
		||||
#define CC_ENABLE			0x01c
 | 
			
		||||
#define CSR_CTX_POINTER			0x020
 | 
			
		||||
#define INDIRECT_CTX_STS		0x040
 | 
			
		||||
#define ACTIVE_CTX_STS			0x044
 | 
			
		||||
#define INDIRECT_CTX_SIG_EVENTS		0x048
 | 
			
		||||
#define INDIRECT_CTX_WAKEUP_EVENTS	0x050
 | 
			
		||||
#define NN_PUT				0x080
 | 
			
		||||
#define NN_GET				0x084
 | 
			
		||||
#define TIMESTAMP_LOW			0x0c0
 | 
			
		||||
#define TIMESTAMP_HIGH			0x0c4
 | 
			
		||||
#define T_INDEX_BYTE_INDEX		0x0f4
 | 
			
		||||
#define LOCAL_CSR_STATUS		0x180
 | 
			
		||||
 | 
			
		||||
u32 ixp2000_uengine_mask;
 | 
			
		||||
 | 
			
		||||
static void *ixp2000_uengine_csr_area(int uengine)
 | 
			
		||||
{
 | 
			
		||||
	return ((void *)IXP_UENGINE_CSR_VIRT_BASE) + (uengine << 10);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * LOCAL_CSR_STATUS=1 after a read or write to a microengine's CSR
 | 
			
		||||
 * space means that the microengine we tried to access was also trying
 | 
			
		||||
 * to access its own CSR space on the same clock cycle as we did.  When
 | 
			
		||||
 * this happens, we lose the arbitration process by default, and the
 | 
			
		||||
 * read or write we tried to do was not actually performed, so we try
 | 
			
		||||
 * again until it succeeds.
 | 
			
		||||
 */
 | 
			
		||||
u32 ixp2000_uengine_csr_read(int uengine, int offset)
 | 
			
		||||
{
 | 
			
		||||
	void *uebase;
 | 
			
		||||
	u32 *local_csr_status;
 | 
			
		||||
	u32 *reg;
 | 
			
		||||
	u32 value;
 | 
			
		||||
 | 
			
		||||
	uebase = ixp2000_uengine_csr_area(uengine);
 | 
			
		||||
 | 
			
		||||
	local_csr_status = (u32 *)(uebase + LOCAL_CSR_STATUS);
 | 
			
		||||
	reg = (u32 *)(uebase + offset);
 | 
			
		||||
	do {
 | 
			
		||||
		value = ixp2000_reg_read(reg);
 | 
			
		||||
	} while (ixp2000_reg_read(local_csr_status) & 1);
 | 
			
		||||
 | 
			
		||||
	return value;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_csr_read);
 | 
			
		||||
 | 
			
		||||
void ixp2000_uengine_csr_write(int uengine, int offset, u32 value)
 | 
			
		||||
{
 | 
			
		||||
	void *uebase;
 | 
			
		||||
	u32 *local_csr_status;
 | 
			
		||||
	u32 *reg;
 | 
			
		||||
 | 
			
		||||
	uebase = ixp2000_uengine_csr_area(uengine);
 | 
			
		||||
 | 
			
		||||
	local_csr_status = (u32 *)(uebase + LOCAL_CSR_STATUS);
 | 
			
		||||
	reg = (u32 *)(uebase + offset);
 | 
			
		||||
	do {
 | 
			
		||||
		ixp2000_reg_write(reg, value);
 | 
			
		||||
	} while (ixp2000_reg_read(local_csr_status) & 1);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_csr_write);
 | 
			
		||||
 | 
			
		||||
void ixp2000_uengine_reset(u32 uengine_mask)
 | 
			
		||||
{
 | 
			
		||||
	u32 value;
 | 
			
		||||
 | 
			
		||||
	value = ixp2000_reg_read(IXP_RESET1) & ~ixp2000_uengine_mask;
 | 
			
		||||
 | 
			
		||||
	uengine_mask &= ixp2000_uengine_mask;
 | 
			
		||||
	ixp2000_reg_wrb(IXP_RESET1, value | uengine_mask);
 | 
			
		||||
	ixp2000_reg_wrb(IXP_RESET1, value);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_reset);
 | 
			
		||||
 | 
			
		||||
void ixp2000_uengine_set_mode(int uengine, u32 mode)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * CTL_STR_PAR_EN: unconditionally enable parity checking on
 | 
			
		||||
	 * control store.
 | 
			
		||||
	 */
 | 
			
		||||
	mode |= 0x10000000;
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, CTX_ENABLES, mode);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Enable updating of condition codes.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, CC_ENABLE, 0x00002000);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Initialise other per-microengine registers.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, NN_PUT, 0x00);
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, NN_GET, 0x00);
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, T_INDEX_BYTE_INDEX, 0);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_set_mode);
 | 
			
		||||
 | 
			
		||||
static int make_even_parity(u32 x)
 | 
			
		||||
{
 | 
			
		||||
	return hweight32(x) & 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ustore_write(int uengine, u64 insn)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * Generate even parity for top and bottom 20 bits.
 | 
			
		||||
	 */
 | 
			
		||||
	insn |= (u64)make_even_parity((insn >> 20) & 0x000fffff) << 41;
 | 
			
		||||
	insn |= (u64)make_even_parity(insn & 0x000fffff) << 40;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Write to microstore.  The second write auto-increments
 | 
			
		||||
	 * the USTORE_ADDRESS index register.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, USTORE_DATA_LOWER, (u32)insn);
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, USTORE_DATA_UPPER, (u32)(insn >> 32));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ixp2000_uengine_load_microcode(int uengine, u8 *ucode, int insns)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Start writing to microstore at address 0.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, USTORE_ADDRESS, 0x80000000);
 | 
			
		||||
	for (i = 0; i < insns; i++) {
 | 
			
		||||
		u64 insn;
 | 
			
		||||
 | 
			
		||||
		insn = (((u64)ucode[0]) << 32) |
 | 
			
		||||
			(((u64)ucode[1]) << 24) |
 | 
			
		||||
			(((u64)ucode[2]) << 16) |
 | 
			
		||||
			(((u64)ucode[3]) << 8) |
 | 
			
		||||
			((u64)ucode[4]);
 | 
			
		||||
		ucode += 5;
 | 
			
		||||
 | 
			
		||||
		ustore_write(uengine, insn);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
 	 * Pad with a few NOPs at the end (to avoid the microengine
 | 
			
		||||
	 * aborting as it prefetches beyond the last instruction), unless
 | 
			
		||||
	 * we run off the end of the instruction store first, at which
 | 
			
		||||
	 * point the address register will wrap back to zero.
 | 
			
		||||
	 */
 | 
			
		||||
	for (i = 0; i < 4; i++) {
 | 
			
		||||
		u32 addr;
 | 
			
		||||
 | 
			
		||||
		addr = ixp2000_uengine_csr_read(uengine, USTORE_ADDRESS);
 | 
			
		||||
		if (addr == 0x80000000)
 | 
			
		||||
			break;
 | 
			
		||||
		ustore_write(uengine, 0xf0000c0300ULL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * End programming.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, USTORE_ADDRESS, 0x00000000);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_load_microcode);
 | 
			
		||||
 | 
			
		||||
void ixp2000_uengine_init_context(int uengine, int context, int pc)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * Select the right context for indirect access.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, CSR_CTX_POINTER, context);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Initialise signal masks to immediately go to Ready state.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, INDIRECT_CTX_SIG_EVENTS, 1);
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, INDIRECT_CTX_WAKEUP_EVENTS, 1);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Set program counter.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, INDIRECT_CTX_STS, pc);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_init_context);
 | 
			
		||||
 | 
			
		||||
void ixp2000_uengine_start_contexts(int uengine, u8 ctx_mask)
 | 
			
		||||
{
 | 
			
		||||
	u32 mask;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Enable the specified context to go to Executing state.
 | 
			
		||||
	 */
 | 
			
		||||
	mask = ixp2000_uengine_csr_read(uengine, CTX_ENABLES);
 | 
			
		||||
	mask |= ctx_mask << 8;
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, CTX_ENABLES, mask);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_start_contexts);
 | 
			
		||||
 | 
			
		||||
void ixp2000_uengine_stop_contexts(int uengine, u8 ctx_mask)
 | 
			
		||||
{
 | 
			
		||||
	u32 mask;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Disable the Ready->Executing transition.  Note that this
 | 
			
		||||
	 * does not stop the context until it voluntarily yields.
 | 
			
		||||
	 */
 | 
			
		||||
	mask = ixp2000_uengine_csr_read(uengine, CTX_ENABLES);
 | 
			
		||||
	mask &= ~(ctx_mask << 8);
 | 
			
		||||
	ixp2000_uengine_csr_write(uengine, CTX_ENABLES, mask);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_stop_contexts);
 | 
			
		||||
 | 
			
		||||
static int check_ixp_type(struct ixp2000_uengine_code *c)
 | 
			
		||||
{
 | 
			
		||||
	u32 product_id;
 | 
			
		||||
	u32 rev;
 | 
			
		||||
 | 
			
		||||
	product_id = ixp2000_reg_read(IXP_PRODUCT_ID);
 | 
			
		||||
	if (((product_id >> 16) & 0x1f) != 0)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	switch ((product_id >> 8) & 0xff) {
 | 
			
		||||
#ifdef CONFIG_ARCH_IXP2000
 | 
			
		||||
	case 0:		/* IXP2800 */
 | 
			
		||||
		if (!(c->cpu_model_bitmask & 4))
 | 
			
		||||
			return 0;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case 1:		/* IXP2850 */
 | 
			
		||||
		if (!(c->cpu_model_bitmask & 8))
 | 
			
		||||
			return 0;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case 2:		/* IXP2400 */
 | 
			
		||||
		if (!(c->cpu_model_bitmask & 2))
 | 
			
		||||
			return 0;
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXP23XX
 | 
			
		||||
	case 4:		/* IXP23xx */
 | 
			
		||||
		if (!(c->cpu_model_bitmask & 0x3f0))
 | 
			
		||||
			return 0;
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rev = product_id & 0xff;
 | 
			
		||||
	if (rev < c->cpu_min_revision || rev > c->cpu_max_revision)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void generate_ucode(u8 *ucode, u32 *gpr_a, u32 *gpr_b)
 | 
			
		||||
{
 | 
			
		||||
	int offset;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	offset = 0;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < 128; i++) {
 | 
			
		||||
		u8 b3;
 | 
			
		||||
		u8 b2;
 | 
			
		||||
		u8 b1;
 | 
			
		||||
		u8 b0;
 | 
			
		||||
 | 
			
		||||
		b3 = (gpr_a[i] >> 24) & 0xff;
 | 
			
		||||
		b2 = (gpr_a[i] >> 16) & 0xff;
 | 
			
		||||
		b1 = (gpr_a[i] >> 8) & 0xff;
 | 
			
		||||
		b0 = gpr_a[i] & 0xff;
 | 
			
		||||
 | 
			
		||||
		/* immed[@ai, (b1 << 8) | b0] */
 | 
			
		||||
		/* 11110000 0000VVVV VVVV11VV VVVVVV00 1IIIIIII */
 | 
			
		||||
		ucode[offset++] = 0xf0;
 | 
			
		||||
		ucode[offset++] = (b1 >> 4);
 | 
			
		||||
		ucode[offset++] = (b1 << 4) | 0x0c | (b0 >> 6);
 | 
			
		||||
		ucode[offset++] = (b0 << 2);
 | 
			
		||||
		ucode[offset++] = 0x80 | i;
 | 
			
		||||
 | 
			
		||||
		/* immed_w1[@ai, (b3 << 8) | b2] */
 | 
			
		||||
		/* 11110100 0100VVVV VVVV11VV VVVVVV00 1IIIIIII */
 | 
			
		||||
		ucode[offset++] = 0xf4;
 | 
			
		||||
		ucode[offset++] = 0x40 | (b3 >> 4);
 | 
			
		||||
		ucode[offset++] = (b3 << 4) | 0x0c | (b2 >> 6);
 | 
			
		||||
		ucode[offset++] = (b2 << 2);
 | 
			
		||||
		ucode[offset++] = 0x80 | i;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < 128; i++) {
 | 
			
		||||
		u8 b3;
 | 
			
		||||
		u8 b2;
 | 
			
		||||
		u8 b1;
 | 
			
		||||
		u8 b0;
 | 
			
		||||
 | 
			
		||||
		b3 = (gpr_b[i] >> 24) & 0xff;
 | 
			
		||||
		b2 = (gpr_b[i] >> 16) & 0xff;
 | 
			
		||||
		b1 = (gpr_b[i] >> 8) & 0xff;
 | 
			
		||||
		b0 = gpr_b[i] & 0xff;
 | 
			
		||||
 | 
			
		||||
		/* immed[@bi, (b1 << 8) | b0] */
 | 
			
		||||
		/* 11110000 0000VVVV VVVV001I IIIIII11 VVVVVVVV */
 | 
			
		||||
		ucode[offset++] = 0xf0;
 | 
			
		||||
		ucode[offset++] = (b1 >> 4);
 | 
			
		||||
		ucode[offset++] = (b1 << 4) | 0x02 | (i >> 6);
 | 
			
		||||
		ucode[offset++] = (i << 2) | 0x03;
 | 
			
		||||
		ucode[offset++] = b0;
 | 
			
		||||
 | 
			
		||||
		/* immed_w1[@bi, (b3 << 8) | b2] */
 | 
			
		||||
		/* 11110100 0100VVVV VVVV001I IIIIII11 VVVVVVVV */
 | 
			
		||||
		ucode[offset++] = 0xf4;
 | 
			
		||||
		ucode[offset++] = 0x40 | (b3 >> 4);
 | 
			
		||||
		ucode[offset++] = (b3 << 4) | 0x02 | (i >> 6);
 | 
			
		||||
		ucode[offset++] = (i << 2) | 0x03;
 | 
			
		||||
		ucode[offset++] = b2;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* ctx_arb[kill] */
 | 
			
		||||
	ucode[offset++] = 0xe0;
 | 
			
		||||
	ucode[offset++] = 0x00;
 | 
			
		||||
	ucode[offset++] = 0x01;
 | 
			
		||||
	ucode[offset++] = 0x00;
 | 
			
		||||
	ucode[offset++] = 0x00;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int set_initial_registers(int uengine, struct ixp2000_uengine_code *c)
 | 
			
		||||
{
 | 
			
		||||
	int per_ctx_regs;
 | 
			
		||||
	u32 *gpr_a;
 | 
			
		||||
	u32 *gpr_b;
 | 
			
		||||
	u8 *ucode;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	gpr_a = kzalloc(128 * sizeof(u32), GFP_KERNEL);
 | 
			
		||||
	gpr_b = kzalloc(128 * sizeof(u32), GFP_KERNEL);
 | 
			
		||||
	ucode = kmalloc(513 * 5, GFP_KERNEL);
 | 
			
		||||
	if (gpr_a == NULL || gpr_b == NULL || ucode == NULL) {
 | 
			
		||||
		kfree(ucode);
 | 
			
		||||
		kfree(gpr_b);
 | 
			
		||||
		kfree(gpr_a);
 | 
			
		||||
		return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	per_ctx_regs = 16;
 | 
			
		||||
	if (c->uengine_parameters & IXP2000_UENGINE_4_CONTEXTS)
 | 
			
		||||
		per_ctx_regs = 32;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < 256; i++) {
 | 
			
		||||
		struct ixp2000_reg_value *r = c->initial_reg_values + i;
 | 
			
		||||
		u32 *bank;
 | 
			
		||||
		int inc;
 | 
			
		||||
		int j;
 | 
			
		||||
 | 
			
		||||
		if (r->reg == -1)
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		bank = (r->reg & 0x400) ? gpr_b : gpr_a;
 | 
			
		||||
		inc = (r->reg & 0x80) ? 128 : per_ctx_regs;
 | 
			
		||||
 | 
			
		||||
		j = r->reg & 0x7f;
 | 
			
		||||
		while (j < 128) {
 | 
			
		||||
			bank[j] = r->value;
 | 
			
		||||
			j += inc;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	generate_ucode(ucode, gpr_a, gpr_b);
 | 
			
		||||
	ixp2000_uengine_load_microcode(uengine, ucode, 513);
 | 
			
		||||
	ixp2000_uengine_init_context(uengine, 0, 0);
 | 
			
		||||
	ixp2000_uengine_start_contexts(uengine, 0x01);
 | 
			
		||||
	for (i = 0; i < 100; i++) {
 | 
			
		||||
		u32 status;
 | 
			
		||||
 | 
			
		||||
		status = ixp2000_uengine_csr_read(uengine, ACTIVE_CTX_STS);
 | 
			
		||||
		if (!(status & 0x80000000))
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	ixp2000_uengine_stop_contexts(uengine, 0x01);
 | 
			
		||||
 | 
			
		||||
	kfree(ucode);
 | 
			
		||||
	kfree(gpr_b);
 | 
			
		||||
	kfree(gpr_a);
 | 
			
		||||
 | 
			
		||||
	return !!(i == 100);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ixp2000_uengine_load(int uengine, struct ixp2000_uengine_code *c)
 | 
			
		||||
{
 | 
			
		||||
	int ctx;
 | 
			
		||||
 | 
			
		||||
	if (!check_ixp_type(c))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	if (!(ixp2000_uengine_mask & (1 << uengine)))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	ixp2000_uengine_reset(1 << uengine);
 | 
			
		||||
	ixp2000_uengine_set_mode(uengine, c->uengine_parameters);
 | 
			
		||||
	if (set_initial_registers(uengine, c))
 | 
			
		||||
		return 1;
 | 
			
		||||
	ixp2000_uengine_load_microcode(uengine, c->insns, c->num_insns);
 | 
			
		||||
 | 
			
		||||
	for (ctx = 0; ctx < 8; ctx++)
 | 
			
		||||
		ixp2000_uengine_init_context(uengine, ctx, 0);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(ixp2000_uengine_load);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int __init ixp2000_uengine_init(void)
 | 
			
		||||
{
 | 
			
		||||
	int uengine;
 | 
			
		||||
	u32 value;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Determine number of microengines present.
 | 
			
		||||
	 */
 | 
			
		||||
	switch ((ixp2000_reg_read(IXP_PRODUCT_ID) >> 8) & 0x1fff) {
 | 
			
		||||
#ifdef CONFIG_ARCH_IXP2000
 | 
			
		||||
	case 0:		/* IXP2800 */
 | 
			
		||||
	case 1:		/* IXP2850 */
 | 
			
		||||
		ixp2000_uengine_mask = 0x00ff00ff;
 | 
			
		||||
		break;
 | 
			
		||||
 | 
			
		||||
	case 2:		/* IXP2400 */
 | 
			
		||||
		ixp2000_uengine_mask = 0x000f000f;
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXP23XX
 | 
			
		||||
	case 4:		/* IXP23xx */
 | 
			
		||||
		ixp2000_uengine_mask = (*IXP23XX_EXP_CFG_FUSE >> 8) & 0xf;
 | 
			
		||||
		break;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		printk(KERN_INFO "Detected unknown IXP2000 model (%.8x)\n",
 | 
			
		||||
			(unsigned int)ixp2000_reg_read(IXP_PRODUCT_ID));
 | 
			
		||||
		ixp2000_uengine_mask = 0x00000000;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Reset microengines.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_uengine_reset(ixp2000_uengine_mask);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Synchronise timestamp counters across all microengines.
 | 
			
		||||
	 */
 | 
			
		||||
	value = ixp2000_reg_read(IXP_MISC_CONTROL);
 | 
			
		||||
	ixp2000_reg_wrb(IXP_MISC_CONTROL, value & ~0x80);
 | 
			
		||||
	for (uengine = 0; uengine < 32; uengine++) {
 | 
			
		||||
		if (ixp2000_uengine_mask & (1 << uengine)) {
 | 
			
		||||
			ixp2000_uengine_csr_write(uengine, TIMESTAMP_LOW, 0);
 | 
			
		||||
			ixp2000_uengine_csr_write(uengine, TIMESTAMP_HIGH, 0);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ixp2000_reg_wrb(IXP_MISC_CONTROL, value | 0x80);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
subsys_initcall(ixp2000_uengine_init);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,99 +0,0 @@
 | 
			
		|||
CONFIG_EXPERIMENTAL=y
 | 
			
		||||
CONFIG_SYSVIPC=y
 | 
			
		||||
CONFIG_BSD_PROCESS_ACCT=y
 | 
			
		||||
CONFIG_LOG_BUF_SHIFT=14
 | 
			
		||||
CONFIG_BLK_DEV_INITRD=y
 | 
			
		||||
CONFIG_EXPERT=y
 | 
			
		||||
# CONFIG_HOTPLUG is not set
 | 
			
		||||
CONFIG_SLAB=y
 | 
			
		||||
CONFIG_MODULES=y
 | 
			
		||||
CONFIG_MODULE_UNLOAD=y
 | 
			
		||||
CONFIG_ARCH_IXP2000=y
 | 
			
		||||
CONFIG_ARCH_ENP2611=y
 | 
			
		||||
CONFIG_ARCH_IXDP2400=y
 | 
			
		||||
CONFIG_ARCH_IXDP2800=y
 | 
			
		||||
CONFIG_ARCH_IXDP2401=y
 | 
			
		||||
CONFIG_ARCH_IXDP2801=y
 | 
			
		||||
# CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO is not set
 | 
			
		||||
# CONFIG_ARM_THUMB is not set
 | 
			
		||||
CONFIG_CPU_BIG_ENDIAN=y
 | 
			
		||||
CONFIG_ZBOOT_ROM_TEXT=0x0
 | 
			
		||||
CONFIG_ZBOOT_ROM_BSS=0x0
 | 
			
		||||
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0"
 | 
			
		||||
CONFIG_FPE_NWFPE=y
 | 
			
		||||
CONFIG_FPE_NWFPE_XP=y
 | 
			
		||||
CONFIG_NET=y
 | 
			
		||||
CONFIG_PACKET=y
 | 
			
		||||
CONFIG_UNIX=y
 | 
			
		||||
CONFIG_INET=y
 | 
			
		||||
CONFIG_IP_PNP=y
 | 
			
		||||
CONFIG_IP_PNP_DHCP=y
 | 
			
		||||
CONFIG_IP_PNP_BOOTP=y
 | 
			
		||||
CONFIG_SYN_COOKIES=y
 | 
			
		||||
CONFIG_IPV6=y
 | 
			
		||||
# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
 | 
			
		||||
# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 | 
			
		||||
# CONFIG_INET6_XFRM_MODE_BEET is not set
 | 
			
		||||
# CONFIG_IPV6_SIT is not set
 | 
			
		||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
 | 
			
		||||
CONFIG_MTD=y
 | 
			
		||||
CONFIG_MTD_PARTITIONS=y
 | 
			
		||||
CONFIG_MTD_REDBOOT_PARTS=y
 | 
			
		||||
CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
 | 
			
		||||
CONFIG_MTD_REDBOOT_PARTS_READONLY=y
 | 
			
		||||
CONFIG_MTD_CHAR=y
 | 
			
		||||
CONFIG_MTD_BLOCK=y
 | 
			
		||||
CONFIG_MTD_CFI=y
 | 
			
		||||
CONFIG_MTD_CFI_INTELEXT=y
 | 
			
		||||
CONFIG_MTD_COMPLEX_MAPPINGS=y
 | 
			
		||||
CONFIG_MTD_IXP2000=y
 | 
			
		||||
CONFIG_BLK_DEV_LOOP=y
 | 
			
		||||
CONFIG_BLK_DEV_NBD=y
 | 
			
		||||
CONFIG_BLK_DEV_RAM=y
 | 
			
		||||
CONFIG_BLK_DEV_RAM_SIZE=8192
 | 
			
		||||
CONFIG_EEPROM_LEGACY=y
 | 
			
		||||
CONFIG_NETDEVICES=y
 | 
			
		||||
CONFIG_DUMMY=y
 | 
			
		||||
CONFIG_NET_ETHERNET=y
 | 
			
		||||
CONFIG_NET_PCI=y
 | 
			
		||||
CONFIG_CS89x0=y
 | 
			
		||||
CONFIG_E100=y
 | 
			
		||||
CONFIG_ENP2611_MSF_NET=y
 | 
			
		||||
CONFIG_WAN=y
 | 
			
		||||
CONFIG_HDLC=y
 | 
			
		||||
CONFIG_HDLC_RAW=y
 | 
			
		||||
CONFIG_HDLC_CISCO=y
 | 
			
		||||
CONFIG_HDLC_FR=y
 | 
			
		||||
CONFIG_HDLC_PPP=y
 | 
			
		||||
CONFIG_DLCI=y
 | 
			
		||||
# CONFIG_INPUT_KEYBOARD is not set
 | 
			
		||||
# CONFIG_INPUT_MOUSE is not set
 | 
			
		||||
# CONFIG_SERIO is not set
 | 
			
		||||
# CONFIG_VT is not set
 | 
			
		||||
CONFIG_SERIAL_8250=y
 | 
			
		||||
CONFIG_SERIAL_8250_CONSOLE=y
 | 
			
		||||
CONFIG_SERIAL_8250_NR_UARTS=3
 | 
			
		||||
# CONFIG_HW_RANDOM is not set
 | 
			
		||||
CONFIG_I2C=y
 | 
			
		||||
CONFIG_I2C_CHARDEV=y
 | 
			
		||||
CONFIG_I2C_IXP2000=y
 | 
			
		||||
CONFIG_WATCHDOG=y
 | 
			
		||||
CONFIG_IXP2000_WATCHDOG=y
 | 
			
		||||
CONFIG_EXT2_FS=y
 | 
			
		||||
CONFIG_EXT2_FS_XATTR=y
 | 
			
		||||
CONFIG_EXT2_FS_POSIX_ACL=y
 | 
			
		||||
CONFIG_EXT3_FS=y
 | 
			
		||||
CONFIG_EXT3_FS_POSIX_ACL=y
 | 
			
		||||
CONFIG_INOTIFY=y
 | 
			
		||||
CONFIG_TMPFS=y
 | 
			
		||||
CONFIG_JFFS2_FS=y
 | 
			
		||||
CONFIG_NFS_FS=y
 | 
			
		||||
CONFIG_NFS_V3=y
 | 
			
		||||
CONFIG_ROOT_NFS=y
 | 
			
		||||
CONFIG_PARTITION_ADVANCED=y
 | 
			
		||||
CONFIG_MAGIC_SYSRQ=y
 | 
			
		||||
CONFIG_DEBUG_KERNEL=y
 | 
			
		||||
CONFIG_DEBUG_MUTEXES=y
 | 
			
		||||
CONFIG_DEBUG_USER=y
 | 
			
		||||
CONFIG_DEBUG_ERRORS=y
 | 
			
		||||
CONFIG_DEBUG_LL=y
 | 
			
		||||
| 
						 | 
				
			
			@ -1,105 +0,0 @@
 | 
			
		|||
CONFIG_EXPERIMENTAL=y
 | 
			
		||||
CONFIG_SYSVIPC=y
 | 
			
		||||
CONFIG_BSD_PROCESS_ACCT=y
 | 
			
		||||
CONFIG_LOG_BUF_SHIFT=14
 | 
			
		||||
CONFIG_BLK_DEV_INITRD=y
 | 
			
		||||
CONFIG_EXPERT=y
 | 
			
		||||
CONFIG_SLAB=y
 | 
			
		||||
CONFIG_MODULES=y
 | 
			
		||||
CONFIG_MODULE_UNLOAD=y
 | 
			
		||||
CONFIG_ARCH_IXP23XX=y
 | 
			
		||||
CONFIG_MACH_ESPRESSO=y
 | 
			
		||||
CONFIG_MACH_IXDP2351=y
 | 
			
		||||
CONFIG_MACH_ROADRUNNER=y
 | 
			
		||||
# CONFIG_ARM_THUMB is not set
 | 
			
		||||
CONFIG_CPU_BIG_ENDIAN=y
 | 
			
		||||
CONFIG_ZBOOT_ROM_TEXT=0x0
 | 
			
		||||
CONFIG_ZBOOT_ROM_BSS=0x0
 | 
			
		||||
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp"
 | 
			
		||||
CONFIG_FPE_NWFPE=y
 | 
			
		||||
CONFIG_FPE_NWFPE_XP=y
 | 
			
		||||
CONFIG_NET=y
 | 
			
		||||
CONFIG_PACKET=y
 | 
			
		||||
CONFIG_UNIX=y
 | 
			
		||||
CONFIG_INET=y
 | 
			
		||||
CONFIG_IP_PNP=y
 | 
			
		||||
CONFIG_IP_PNP_DHCP=y
 | 
			
		||||
CONFIG_IP_PNP_BOOTP=y
 | 
			
		||||
CONFIG_SYN_COOKIES=y
 | 
			
		||||
CONFIG_IPV6=y
 | 
			
		||||
# CONFIG_INET6_XFRM_MODE_TRANSPORT is not set
 | 
			
		||||
# CONFIG_INET6_XFRM_MODE_TUNNEL is not set
 | 
			
		||||
# CONFIG_INET6_XFRM_MODE_BEET is not set
 | 
			
		||||
# CONFIG_IPV6_SIT is not set
 | 
			
		||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
 | 
			
		||||
# CONFIG_FW_LOADER is not set
 | 
			
		||||
CONFIG_MTD=y
 | 
			
		||||
CONFIG_MTD_PARTITIONS=y
 | 
			
		||||
CONFIG_MTD_REDBOOT_PARTS=y
 | 
			
		||||
CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
 | 
			
		||||
CONFIG_MTD_REDBOOT_PARTS_READONLY=y
 | 
			
		||||
CONFIG_MTD_CHAR=y
 | 
			
		||||
CONFIG_MTD_BLOCK=y
 | 
			
		||||
CONFIG_MTD_CFI=y
 | 
			
		||||
CONFIG_MTD_CFI_INTELEXT=y
 | 
			
		||||
CONFIG_MTD_COMPLEX_MAPPINGS=y
 | 
			
		||||
CONFIG_MTD_PHYSMAP=y
 | 
			
		||||
CONFIG_BLK_DEV_LOOP=y
 | 
			
		||||
CONFIG_BLK_DEV_NBD=y
 | 
			
		||||
CONFIG_BLK_DEV_RAM=y
 | 
			
		||||
CONFIG_BLK_DEV_RAM_SIZE=8192
 | 
			
		||||
CONFIG_EEPROM_LEGACY=y
 | 
			
		||||
CONFIG_IDE=y
 | 
			
		||||
CONFIG_BLK_DEV_SIIMAGE=y
 | 
			
		||||
CONFIG_SCSI=y
 | 
			
		||||
CONFIG_BLK_DEV_SD=y
 | 
			
		||||
CONFIG_NETDEVICES=y
 | 
			
		||||
CONFIG_DUMMY=y
 | 
			
		||||
CONFIG_NET_ETHERNET=y
 | 
			
		||||
CONFIG_NET_PCI=y
 | 
			
		||||
CONFIG_E100=y
 | 
			
		||||
CONFIG_E1000=y
 | 
			
		||||
CONFIG_WAN=y
 | 
			
		||||
CONFIG_HDLC=y
 | 
			
		||||
CONFIG_HDLC_RAW=y
 | 
			
		||||
CONFIG_HDLC_CISCO=y
 | 
			
		||||
CONFIG_HDLC_FR=y
 | 
			
		||||
CONFIG_HDLC_PPP=y
 | 
			
		||||
CONFIG_DLCI=y
 | 
			
		||||
# CONFIG_INPUT_KEYBOARD is not set
 | 
			
		||||
# CONFIG_INPUT_MOUSE is not set
 | 
			
		||||
# CONFIG_SERIO is not set
 | 
			
		||||
# CONFIG_VT is not set
 | 
			
		||||
CONFIG_SERIAL_8250=y
 | 
			
		||||
CONFIG_SERIAL_8250_CONSOLE=y
 | 
			
		||||
# CONFIG_HW_RANDOM is not set
 | 
			
		||||
CONFIG_I2C=y
 | 
			
		||||
CONFIG_I2C_CHARDEV=y
 | 
			
		||||
CONFIG_WATCHDOG=y
 | 
			
		||||
# CONFIG_USB_HID is not set
 | 
			
		||||
CONFIG_USB=y
 | 
			
		||||
CONFIG_USB_MON=y
 | 
			
		||||
CONFIG_USB_EHCI_HCD=y
 | 
			
		||||
CONFIG_USB_OHCI_HCD=y
 | 
			
		||||
CONFIG_USB_UHCI_HCD=y
 | 
			
		||||
CONFIG_USB_STORAGE=y
 | 
			
		||||
CONFIG_EXT2_FS=y
 | 
			
		||||
CONFIG_EXT2_FS_XATTR=y
 | 
			
		||||
CONFIG_EXT2_FS_POSIX_ACL=y
 | 
			
		||||
CONFIG_EXT3_FS=y
 | 
			
		||||
CONFIG_EXT3_FS_POSIX_ACL=y
 | 
			
		||||
CONFIG_INOTIFY=y
 | 
			
		||||
CONFIG_MSDOS_FS=y
 | 
			
		||||
CONFIG_TMPFS=y
 | 
			
		||||
CONFIG_JFFS2_FS=y
 | 
			
		||||
CONFIG_NFS_FS=y
 | 
			
		||||
CONFIG_NFS_V3=y
 | 
			
		||||
CONFIG_ROOT_NFS=y
 | 
			
		||||
CONFIG_PARTITION_ADVANCED=y
 | 
			
		||||
CONFIG_NLS_CODEPAGE_437=y
 | 
			
		||||
CONFIG_MAGIC_SYSRQ=y
 | 
			
		||||
CONFIG_DEBUG_KERNEL=y
 | 
			
		||||
CONFIG_DEBUG_MUTEXES=y
 | 
			
		||||
CONFIG_DEBUG_USER=y
 | 
			
		||||
CONFIG_DEBUG_ERRORS=y
 | 
			
		||||
CONFIG_DEBUG_LL=y
 | 
			
		||||
| 
						 | 
				
			
			@ -1,62 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * Generic library functions for the microengines found on the Intel
 | 
			
		||||
 * IXP2000 series of network processors.
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
 | 
			
		||||
 * Dedicated to Marija Kulikova.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Lesser General Public License as
 | 
			
		||||
 * published by the Free Software Foundation; either version 2.1 of the
 | 
			
		||||
 * License, or (at your option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __IXP2000_UENGINE_H
 | 
			
		||||
#define __IXP2000_UENGINE_H
 | 
			
		||||
 | 
			
		||||
extern u32 ixp2000_uengine_mask;
 | 
			
		||||
 | 
			
		||||
struct ixp2000_uengine_code
 | 
			
		||||
{
 | 
			
		||||
	u32	cpu_model_bitmask;
 | 
			
		||||
	u8	cpu_min_revision;
 | 
			
		||||
	u8	cpu_max_revision;
 | 
			
		||||
 | 
			
		||||
	u32	uengine_parameters;
 | 
			
		||||
 | 
			
		||||
	struct ixp2000_reg_value {
 | 
			
		||||
		int	reg;
 | 
			
		||||
		u32	value;
 | 
			
		||||
	} *initial_reg_values;
 | 
			
		||||
 | 
			
		||||
	int	num_insns;
 | 
			
		||||
	u8	*insns;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
u32 ixp2000_uengine_csr_read(int uengine, int offset);
 | 
			
		||||
void ixp2000_uengine_csr_write(int uengine, int offset, u32 value);
 | 
			
		||||
void ixp2000_uengine_reset(u32 uengine_mask);
 | 
			
		||||
void ixp2000_uengine_set_mode(int uengine, u32 mode);
 | 
			
		||||
void ixp2000_uengine_load_microcode(int uengine, u8 *ucode, int insns);
 | 
			
		||||
void ixp2000_uengine_init_context(int uengine, int context, int pc);
 | 
			
		||||
void ixp2000_uengine_start_contexts(int uengine, u8 ctx_mask);
 | 
			
		||||
void ixp2000_uengine_stop_contexts(int uengine, u8 ctx_mask);
 | 
			
		||||
int ixp2000_uengine_load(int uengine, struct ixp2000_uengine_code *c);
 | 
			
		||||
 | 
			
		||||
#define IXP2000_UENGINE_8_CONTEXTS		0x00000000
 | 
			
		||||
#define IXP2000_UENGINE_4_CONTEXTS		0x80000000
 | 
			
		||||
#define IXP2000_UENGINE_PRN_UPDATE_EVERY	0x40000000
 | 
			
		||||
#define IXP2000_UENGINE_PRN_UPDATE_ON_ACCESS	0x00000000
 | 
			
		||||
#define IXP2000_UENGINE_NN_FROM_SELF		0x00100000
 | 
			
		||||
#define IXP2000_UENGINE_NN_FROM_PREVIOUS	0x00000000
 | 
			
		||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_3	0x000c0000
 | 
			
		||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_2	0x00080000
 | 
			
		||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_1	0x00040000
 | 
			
		||||
#define IXP2000_UENGINE_ASSERT_EMPTY_AT_0	0x00000000
 | 
			
		||||
#define IXP2000_UENGINE_LM_ADDR1_GLOBAL		0x00020000
 | 
			
		||||
#define IXP2000_UENGINE_LM_ADDR1_PER_CONTEXT	0x00000000
 | 
			
		||||
#define IXP2000_UENGINE_LM_ADDR0_GLOBAL		0x00010000
 | 
			
		||||
#define IXP2000_UENGINE_LM_ADDR0_PER_CONTEXT	0x00000000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,72 +0,0 @@
 | 
			
		|||
 | 
			
		||||
if ARCH_IXP2000
 | 
			
		||||
 | 
			
		||||
config ARCH_SUPPORTS_BIG_ENDIAN
 | 
			
		||||
	bool
 | 
			
		||||
	default y
 | 
			
		||||
 | 
			
		||||
menu "Intel IXP2400/2800 Implementation Options"
 | 
			
		||||
 | 
			
		||||
comment "IXP2400/2800 Platforms"
 | 
			
		||||
 | 
			
		||||
config ARCH_ENP2611
 | 
			
		||||
	bool "Support Radisys ENP-2611"
 | 
			
		||||
	help
 | 
			
		||||
	  Say 'Y' here if you want your kernel to support the Radisys
 | 
			
		||||
	  ENP2611 PCI network processing card. For more information on
 | 
			
		||||
	  this card, see <file:Documentation/arm/IXP2000>.
 | 
			
		||||
 | 
			
		||||
config ARCH_IXDP2400
 | 
			
		||||
	bool "Support Intel IXDP2400"
 | 
			
		||||
	help
 | 
			
		||||
	  Say 'Y' here if you want your kernel to support the Intel
 | 
			
		||||
	  IXDP2400 reference platform. For more information on
 | 
			
		||||
	  this platform, see <file:Documentation/arm/IXP2000>.
 | 
			
		||||
 | 
			
		||||
config ARCH_IXDP2800
 | 
			
		||||
	bool "Support Intel IXDP2800"
 | 
			
		||||
	help
 | 
			
		||||
	  Say 'Y' here if you want your kernel to support the Intel
 | 
			
		||||
	  IXDP2800 reference platform. For more information on
 | 
			
		||||
	  this platform, see <file:Documentation/arm/IXP2000>.
 | 
			
		||||
 | 
			
		||||
config ARCH_IXDP2X00
 | 
			
		||||
	bool
 | 
			
		||||
	depends on ARCH_IXDP2400 || ARCH_IXDP2800
 | 
			
		||||
	default y	
 | 
			
		||||
 | 
			
		||||
config ARCH_IXDP2401
 | 
			
		||||
	bool "Support Intel IXDP2401"
 | 
			
		||||
	help
 | 
			
		||||
	  Say 'Y' here if you want your kernel to support the Intel
 | 
			
		||||
	  IXDP2401 reference platform. For more information on
 | 
			
		||||
	  this platform, see <file:Documentation/arm/IXP2000>.
 | 
			
		||||
 | 
			
		||||
config ARCH_IXDP2801
 | 
			
		||||
	bool "Support Intel IXDP2801 and IXDP28x5"
 | 
			
		||||
	help
 | 
			
		||||
	  Say 'Y' here if you want your kernel to support the Intel
 | 
			
		||||
	  IXDP2801/2805/2855 reference platforms. For more information on
 | 
			
		||||
	  this platform, see <file:Documentation/arm/IXP2000>.
 | 
			
		||||
 | 
			
		||||
config MACH_IXDP28X5
 | 
			
		||||
	bool
 | 
			
		||||
	depends on ARCH_IXDP2801
 | 
			
		||||
	default y
 | 
			
		||||
 | 
			
		||||
config ARCH_IXDP2X01
 | 
			
		||||
	bool
 | 
			
		||||
	depends on ARCH_IXDP2401 || ARCH_IXDP2801
 | 
			
		||||
	default y	
 | 
			
		||||
 | 
			
		||||
config IXP2000_SUPPORT_BROKEN_PCI_IO
 | 
			
		||||
	bool "Support broken PCI I/O on older IXP2000s"
 | 
			
		||||
	default y
 | 
			
		||||
	help
 | 
			
		||||
	  Say 'N' here if you only intend to run your kernel on an
 | 
			
		||||
	  IXP2000 B0 or later model and do not need the PCI I/O
 | 
			
		||||
	  byteswap workaround.  Say 'Y' otherwise.
 | 
			
		||||
 | 
			
		||||
endmenu
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,14 +0,0 @@
 | 
			
		|||
#
 | 
			
		||||
# Makefile for the linux kernel.
 | 
			
		||||
#
 | 
			
		||||
obj-y			:= core.o pci.o
 | 
			
		||||
obj-m			:=
 | 
			
		||||
obj-n			:=
 | 
			
		||||
obj-			:=
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_ARCH_ENP2611)	+= enp2611.o
 | 
			
		||||
obj-$(CONFIG_ARCH_IXDP2400)	+= ixdp2400.o
 | 
			
		||||
obj-$(CONFIG_ARCH_IXDP2800)	+= ixdp2800.o
 | 
			
		||||
obj-$(CONFIG_ARCH_IXDP2X00)	+= ixdp2x00.o
 | 
			
		||||
obj-$(CONFIG_ARCH_IXDP2X01)	+= ixdp2x01.o
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,3 +0,0 @@
 | 
			
		|||
   zreladdr-y	+= 0x00008000
 | 
			
		||||
params_phys-y	:= 0x00000100
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,520 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/core.c
 | 
			
		||||
 *
 | 
			
		||||
 * Common routines used by all IXP2400/2800 based platforms.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2004 (C) MontaVista Software, Inc. 
 | 
			
		||||
 *
 | 
			
		||||
 * Based on work Copyright (C) 2002-2003 Intel Corporation
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 <linux/gpio.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/spinlock.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/irq.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/serial_8250.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/export.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/types.h>
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
#include <asm/memory.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/tlbflush.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/time.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
 | 
			
		||||
#include <mach/gpio-ixp2000.h>
 | 
			
		||||
 | 
			
		||||
static DEFINE_SPINLOCK(ixp2000_slowport_lock);
 | 
			
		||||
static unsigned long ixp2000_slowport_irq_flags;
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * Slowport access routines
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
void ixp2000_acquire_slowport(struct slowport_cfg *new_cfg, struct slowport_cfg *old_cfg)
 | 
			
		||||
{
 | 
			
		||||
	spin_lock_irqsave(&ixp2000_slowport_lock, ixp2000_slowport_irq_flags);
 | 
			
		||||
 | 
			
		||||
	old_cfg->CCR = *IXP2000_SLOWPORT_CCR;
 | 
			
		||||
	old_cfg->WTC = *IXP2000_SLOWPORT_WTC2;
 | 
			
		||||
	old_cfg->RTC = *IXP2000_SLOWPORT_RTC2;
 | 
			
		||||
	old_cfg->PCR = *IXP2000_SLOWPORT_PCR;
 | 
			
		||||
	old_cfg->ADC = *IXP2000_SLOWPORT_ADC;
 | 
			
		||||
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_CCR, new_cfg->CCR);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_WTC2, new_cfg->WTC);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_RTC2, new_cfg->RTC);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_PCR, new_cfg->PCR);
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_SLOWPORT_ADC, new_cfg->ADC);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ixp2000_release_slowport(struct slowport_cfg *old_cfg)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_CCR, old_cfg->CCR);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_WTC2, old_cfg->WTC);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_RTC2, old_cfg->RTC);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_SLOWPORT_PCR, old_cfg->PCR);
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_SLOWPORT_ADC, old_cfg->ADC);
 | 
			
		||||
 | 
			
		||||
	spin_unlock_irqrestore(&ixp2000_slowport_lock, 
 | 
			
		||||
					ixp2000_slowport_irq_flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * Chip specific mappings shared by all IXP2000 systems
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct map_desc ixp2000_io_desc[] __initdata = {
 | 
			
		||||
	{
 | 
			
		||||
		.virtual	= IXP2000_CAP_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_CAP_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_CAP_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_INTCTL_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_INTCTL_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_INTCTL_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_PCI_CREG_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_PCI_CREG_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_PCI_CREG_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_PCI_CSR_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_PCI_CSR_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_PCI_CSR_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_MSF_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_MSF_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_MSF_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_SCRATCH_RING_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_SCRATCH_RING_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_SCRATCH_RING_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_SRAM0_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_SRAM0_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_SRAM0_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_PCI_IO_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_PCI_IO_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_PCI_IO_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_PCI_CFG0_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_PCI_CFG0_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_PCI_CFG0_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXP2000_PCI_CFG1_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(IXP2000_PCI_CFG1_PHYS_BASE),
 | 
			
		||||
		.length		= IXP2000_PCI_CFG1_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixp2000_map_io(void)
 | 
			
		||||
{
 | 
			
		||||
	iotable_init(ixp2000_io_desc, ARRAY_SIZE(ixp2000_io_desc));
 | 
			
		||||
 | 
			
		||||
	/* Set slowport to 8-bit mode.  */
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_SLOWPORT_FRM, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * Serial port support for IXP2000
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct plat_serial8250_port ixp2000_serial_port[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.mapbase	= IXP2000_UART_PHYS_BASE,
 | 
			
		||||
		.membase	= (char *)(IXP2000_UART_VIRT_BASE + 3),
 | 
			
		||||
		.irq		= IRQ_IXP2000_UART,
 | 
			
		||||
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
 | 
			
		||||
		.iotype		= UPIO_MEM,
 | 
			
		||||
		.regshift	= 2,
 | 
			
		||||
		.uartclk	= 50000000,
 | 
			
		||||
	},
 | 
			
		||||
	{ },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixp2000_uart_resource = {
 | 
			
		||||
	.start		= IXP2000_UART_PHYS_BASE,
 | 
			
		||||
	.end		= IXP2000_UART_PHYS_BASE + 0x1f,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixp2000_serial_device = {
 | 
			
		||||
	.name		= "serial8250",
 | 
			
		||||
	.id		= PLAT8250_DEV_PLATFORM,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data		= ixp2000_serial_port,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &ixp2000_uart_resource,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixp2000_uart_init(void)
 | 
			
		||||
{
 | 
			
		||||
	platform_device_register(&ixp2000_serial_device);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * Timer-tick functions for IXP2000
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static unsigned ticks_per_jiffy;
 | 
			
		||||
static unsigned ticks_per_usec;
 | 
			
		||||
static unsigned next_jiffy_time;
 | 
			
		||||
static volatile unsigned long *missing_jiffy_timer_csr;
 | 
			
		||||
 | 
			
		||||
unsigned long ixp2000_gettimeoffset (void)
 | 
			
		||||
{
 | 
			
		||||
 	unsigned long offset;
 | 
			
		||||
 | 
			
		||||
	offset = next_jiffy_time - *missing_jiffy_timer_csr;
 | 
			
		||||
 | 
			
		||||
	return offset / ticks_per_usec;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static irqreturn_t ixp2000_timer_interrupt(int irq, void *dev_id)
 | 
			
		||||
{
 | 
			
		||||
	/* clear timer 1 */
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_T1_CLR, 1);
 | 
			
		||||
 | 
			
		||||
	while ((signed long)(next_jiffy_time - *missing_jiffy_timer_csr)
 | 
			
		||||
							>= ticks_per_jiffy) {
 | 
			
		||||
		timer_tick();
 | 
			
		||||
		next_jiffy_time -= ticks_per_jiffy;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return IRQ_HANDLED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irqaction ixp2000_timer_irq = {
 | 
			
		||||
	.name		= "IXP2000 Timer Tick",
 | 
			
		||||
	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
 | 
			
		||||
	.handler	= ixp2000_timer_interrupt,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixp2000_init_time(unsigned long tick_rate)
 | 
			
		||||
{
 | 
			
		||||
	ticks_per_jiffy = (tick_rate + HZ/2) / HZ;
 | 
			
		||||
	ticks_per_usec = tick_rate / 1000000;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * We use timer 1 as our timer interrupt.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_reg_write(IXP2000_T1_CLR, 0);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_T1_CLD, ticks_per_jiffy - 1);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_T1_CTL, (1 << 7));
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * We use a second timer as a monotonic counter for tracking
 | 
			
		||||
	 * missed jiffies.  The IXP2000 has four timers, but if we're
 | 
			
		||||
	 * on an A-step IXP2800, timer 2 and 3 don't work, so on those
 | 
			
		||||
	 * chips we use timer 4.  Timer 4 is the only timer that can
 | 
			
		||||
	 * be used for the watchdog, so we use timer 2 if we're on a
 | 
			
		||||
	 * non-buggy chip.
 | 
			
		||||
	 */
 | 
			
		||||
	if ((*IXP2000_PRODUCT_ID & 0x001ffef0) == 0x00000000) {
 | 
			
		||||
		printk(KERN_INFO "Enabling IXP2800 erratum #25 workaround\n");
 | 
			
		||||
 | 
			
		||||
		ixp2000_reg_write(IXP2000_T4_CLR, 0);
 | 
			
		||||
		ixp2000_reg_write(IXP2000_T4_CLD, -1);
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_T4_CTL, (1 << 7));
 | 
			
		||||
		missing_jiffy_timer_csr = IXP2000_T4_CSR;
 | 
			
		||||
	} else {
 | 
			
		||||
		ixp2000_reg_write(IXP2000_T2_CLR, 0);
 | 
			
		||||
		ixp2000_reg_write(IXP2000_T2_CLD, -1);
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_T2_CTL, (1 << 7));
 | 
			
		||||
		missing_jiffy_timer_csr = IXP2000_T2_CSR;
 | 
			
		||||
	}
 | 
			
		||||
 	next_jiffy_time = 0xffffffff;
 | 
			
		||||
 | 
			
		||||
	/* register for interrupt */
 | 
			
		||||
	setup_irq(IRQ_IXP2000_TIMER1, &ixp2000_timer_irq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * GPIO helpers
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static unsigned long GPIO_IRQ_falling_edge;
 | 
			
		||||
static unsigned long GPIO_IRQ_rising_edge;
 | 
			
		||||
static unsigned long GPIO_IRQ_level_low;
 | 
			
		||||
static unsigned long GPIO_IRQ_level_high;
 | 
			
		||||
 | 
			
		||||
static void update_gpio_int_csrs(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_FEDR, GPIO_IRQ_falling_edge);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_REDR, GPIO_IRQ_rising_edge);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_LSLR, GPIO_IRQ_level_low);
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_GPIO_LSHR, GPIO_IRQ_level_high);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpio_line_config(int line, int direction)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	local_irq_save(flags);
 | 
			
		||||
	if (direction == GPIO_OUT) {
 | 
			
		||||
		/* if it's an output, it ain't an interrupt anymore */
 | 
			
		||||
		GPIO_IRQ_falling_edge &= ~(1 << line);
 | 
			
		||||
		GPIO_IRQ_rising_edge &= ~(1 << line);
 | 
			
		||||
		GPIO_IRQ_level_low &= ~(1 << line);
 | 
			
		||||
		GPIO_IRQ_level_high &= ~(1 << line);
 | 
			
		||||
		update_gpio_int_csrs();
 | 
			
		||||
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_GPIO_PDSR, 1 << line);
 | 
			
		||||
	} else if (direction == GPIO_IN) {
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_GPIO_PDCR, 1 << line);
 | 
			
		||||
	}
 | 
			
		||||
	local_irq_restore(flags);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(gpio_line_config);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IRQ handling IXP2000
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static void ixp2000_GPIO_irq_handler(unsigned int irq, struct irq_desc *desc)
 | 
			
		||||
{                               
 | 
			
		||||
	int i;
 | 
			
		||||
	unsigned long status = *IXP2000_GPIO_INST;
 | 
			
		||||
		   
 | 
			
		||||
	for (i = 0; i <= 7; i++) {
 | 
			
		||||
		if (status & (1<<i)) {
 | 
			
		||||
			generic_handle_irq(i + IRQ_IXP2000_GPIO0);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ixp2000_GPIO_irq_type(struct irq_data *d, unsigned int type)
 | 
			
		||||
{
 | 
			
		||||
	int line = d->irq - IRQ_IXP2000_GPIO0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * First, configure this GPIO line as an input.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_PDCR, 1 << line);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Then, set the proper trigger type.
 | 
			
		||||
	 */
 | 
			
		||||
	if (type & IRQ_TYPE_EDGE_FALLING)
 | 
			
		||||
		GPIO_IRQ_falling_edge |= 1 << line;
 | 
			
		||||
	else
 | 
			
		||||
		GPIO_IRQ_falling_edge &= ~(1 << line);
 | 
			
		||||
	if (type & IRQ_TYPE_EDGE_RISING)
 | 
			
		||||
		GPIO_IRQ_rising_edge |= 1 << line;
 | 
			
		||||
	else
 | 
			
		||||
		GPIO_IRQ_rising_edge &= ~(1 << line);
 | 
			
		||||
	if (type & IRQ_TYPE_LEVEL_LOW)
 | 
			
		||||
		GPIO_IRQ_level_low |= 1 << line;
 | 
			
		||||
	else
 | 
			
		||||
		GPIO_IRQ_level_low &= ~(1 << line);
 | 
			
		||||
	if (type & IRQ_TYPE_LEVEL_HIGH)
 | 
			
		||||
		GPIO_IRQ_level_high |= 1 << line;
 | 
			
		||||
	else
 | 
			
		||||
		GPIO_IRQ_level_high &= ~(1 << line);
 | 
			
		||||
	update_gpio_int_csrs();
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp2000_GPIO_irq_mask_ack(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_INCR, (1 << (irq - IRQ_IXP2000_GPIO0)));
 | 
			
		||||
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_EDSR, (1 << (irq - IRQ_IXP2000_GPIO0)));
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_LDSR, (1 << (irq - IRQ_IXP2000_GPIO0)));
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_GPIO_INST, (1 << (irq - IRQ_IXP2000_GPIO0)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp2000_GPIO_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_GPIO_INCR, (1 << (irq - IRQ_IXP2000_GPIO0)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp2000_GPIO_irq_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_INSR, (1 << (irq - IRQ_IXP2000_GPIO0)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixp2000_GPIO_irq_chip = {
 | 
			
		||||
	.irq_ack	= ixp2000_GPIO_irq_mask_ack,
 | 
			
		||||
	.irq_mask	= ixp2000_GPIO_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixp2000_GPIO_irq_unmask,
 | 
			
		||||
	.irq_set_type	= ixp2000_GPIO_irq_type,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ixp2000_pci_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long temp = *IXP2000_PCI_XSCALE_INT_ENABLE;
 | 
			
		||||
	if (d->irq == IRQ_IXP2000_PCIA)
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_PCI_XSCALE_INT_ENABLE, (temp & ~(1 << 26)));
 | 
			
		||||
	else if (d->irq == IRQ_IXP2000_PCIB)
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_PCI_XSCALE_INT_ENABLE, (temp & ~(1 << 27)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp2000_pci_irq_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long temp = *IXP2000_PCI_XSCALE_INT_ENABLE;
 | 
			
		||||
	if (d->irq == IRQ_IXP2000_PCIA)
 | 
			
		||||
		ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, (temp | (1 << 26)));
 | 
			
		||||
	else if (d->irq == IRQ_IXP2000_PCIB)
 | 
			
		||||
		ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, (temp | (1 << 27)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Error interrupts. These are used extensively by the microengine drivers
 | 
			
		||||
 */
 | 
			
		||||
static void ixp2000_err_irq_handler(unsigned int irq, struct irq_desc *desc)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	unsigned long status = *IXP2000_IRQ_ERR_STATUS;
 | 
			
		||||
 | 
			
		||||
	for(i = 31; i >= 0; i--) {
 | 
			
		||||
		if(status & (1 << i)) {
 | 
			
		||||
			generic_handle_irq(IRQ_IXP2000_DRAM0_MIN_ERR + i);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp2000_err_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_IRQ_ERR_ENABLE_CLR,
 | 
			
		||||
			(1 << (d->irq - IRQ_IXP2000_DRAM0_MIN_ERR)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp2000_err_irq_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_IRQ_ERR_ENABLE_SET,
 | 
			
		||||
			(1 << (d->irq - IRQ_IXP2000_DRAM0_MIN_ERR)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixp2000_err_irq_chip = {
 | 
			
		||||
	.irq_ack	= ixp2000_err_irq_mask,
 | 
			
		||||
	.irq_mask	= ixp2000_err_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixp2000_err_irq_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixp2000_pci_irq_chip = {
 | 
			
		||||
	.irq_ack	= ixp2000_pci_irq_mask,
 | 
			
		||||
	.irq_mask	= ixp2000_pci_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixp2000_pci_irq_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ixp2000_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_IRQ_ENABLE_CLR, (1 << d->irq));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp2000_irq_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_IRQ_ENABLE_SET, (1 << d->irq));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixp2000_irq_chip = {
 | 
			
		||||
	.irq_ack	= ixp2000_irq_mask,
 | 
			
		||||
	.irq_mask	= ixp2000_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixp2000_irq_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixp2000_init_irq(void)
 | 
			
		||||
{
 | 
			
		||||
	int irq;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Mask all sources
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_reg_write(IXP2000_IRQ_ENABLE_CLR, 0xffffffff);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_FIQ_ENABLE_CLR, 0xffffffff);
 | 
			
		||||
 | 
			
		||||
	/* clear all GPIO edge/level detects */
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_REDR, 0);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_FEDR, 0);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_LSHR, 0);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_LSLR, 0);
 | 
			
		||||
	ixp2000_reg_write(IXP2000_GPIO_INCR, -1);
 | 
			
		||||
 | 
			
		||||
	/* clear PCI interrupt sources */
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_PCI_XSCALE_INT_ENABLE, 0);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Certain bits in the IRQ status register of the 
 | 
			
		||||
	 * IXP2000 are reserved. Instead of trying to map
 | 
			
		||||
	 * things non 1:1 from bit position to IRQ number,
 | 
			
		||||
	 * we mark the reserved IRQs as invalid. This makes
 | 
			
		||||
	 * our mask/unmask code much simpler.
 | 
			
		||||
	 */
 | 
			
		||||
	for (irq = IRQ_IXP2000_SOFT_INT; irq <= IRQ_IXP2000_THDB3; irq++) {
 | 
			
		||||
		if ((1 << irq) & IXP2000_VALID_IRQ_MASK) {
 | 
			
		||||
			irq_set_chip_and_handler(irq, &ixp2000_irq_chip,
 | 
			
		||||
						 handle_level_irq);
 | 
			
		||||
			set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
		} else set_irq_flags(irq, 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (irq = IRQ_IXP2000_DRAM0_MIN_ERR; irq <= IRQ_IXP2000_SP_INT; irq++) {
 | 
			
		||||
		if((1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR)) &
 | 
			
		||||
				IXP2000_VALID_ERR_IRQ_MASK) {
 | 
			
		||||
			irq_set_chip_and_handler(irq, &ixp2000_err_irq_chip,
 | 
			
		||||
						 handle_level_irq);
 | 
			
		||||
			set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
			set_irq_flags(irq, 0);
 | 
			
		||||
	}
 | 
			
		||||
	irq_set_chained_handler(IRQ_IXP2000_ERRSUM, ixp2000_err_irq_handler);
 | 
			
		||||
 | 
			
		||||
	for (irq = IRQ_IXP2000_GPIO0; irq <= IRQ_IXP2000_GPIO7; irq++) {
 | 
			
		||||
		irq_set_chip_and_handler(irq, &ixp2000_GPIO_irq_chip,
 | 
			
		||||
					 handle_level_irq);
 | 
			
		||||
		set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
	}
 | 
			
		||||
	irq_set_chained_handler(IRQ_IXP2000_GPIO, ixp2000_GPIO_irq_handler);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Enable PCI irqs.  The actual PCI[AB] decoding is done in
 | 
			
		||||
	 * entry-macro.S, so we don't need a chained handler for the
 | 
			
		||||
	 * PCI interrupt source.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_reg_write(IXP2000_IRQ_ENABLE_SET, (1 << IRQ_IXP2000_PCI));
 | 
			
		||||
	for (irq = IRQ_IXP2000_PCIA; irq <= IRQ_IXP2000_PCIB; irq++) {
 | 
			
		||||
		irq_set_chip_and_handler(irq, &ixp2000_pci_irq_chip,
 | 
			
		||||
					 handle_level_irq);
 | 
			
		||||
		set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ixp2000_restart(char mode, const char *cmd)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_wrb(IXP2000_RESET0, RSTALL);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,265 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/enp2611.c
 | 
			
		||||
 *
 | 
			
		||||
 * Radisys ENP-2611 support.
 | 
			
		||||
 *
 | 
			
		||||
 * Created 2004 by Lennert Buytenhek from the ixdp2x01 code.  The
 | 
			
		||||
 * original version carries the following notices:
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Andrzej Mialkowski <andrzej.mialkowski@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002-2003 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/serial_core.h>
 | 
			
		||||
#include <linux/platform_device.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/time.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
#include <asm/mach/flash.h>
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * ENP-2611 timer tick configuration
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static void __init enp2611_timer_init(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_init_time(50 * 1000 * 1000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct sys_timer enp2611_timer = {
 | 
			
		||||
	.init		= enp2611_timer_init,
 | 
			
		||||
	.offset		= ixp2000_gettimeoffset,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * ENP-2611 I/O
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct map_desc enp2611_io_desc[] __initdata = {
 | 
			
		||||
	{
 | 
			
		||||
		.virtual	= ENP2611_CALEB_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(ENP2611_CALEB_PHYS_BASE),
 | 
			
		||||
		.length		= ENP2611_CALEB_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= ENP2611_PM3386_0_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(ENP2611_PM3386_0_PHYS_BASE),
 | 
			
		||||
		.length		= ENP2611_PM3386_0_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= ENP2611_PM3386_1_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn(ENP2611_PM3386_1_PHYS_BASE),
 | 
			
		||||
		.length		= ENP2611_PM3386_1_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init enp2611_map_io(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_map_io();
 | 
			
		||||
	iotable_init(enp2611_io_desc, ARRAY_SIZE(enp2611_io_desc));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * ENP-2611 PCI
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static int enp2611_pci_setup(int nr, struct pci_sys_data *sys)
 | 
			
		||||
{
 | 
			
		||||
	sys->mem_offset = 0xe0000000;
 | 
			
		||||
	ixp2000_pci_setup(nr, sys);
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init enp2611_pci_preinit(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);
 | 
			
		||||
	ixp2000_pci_preinit();
 | 
			
		||||
	pcibios_setup("firmware");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int enp2611_pci_valid_device(struct pci_bus *bus,
 | 
			
		||||
						unsigned int devfn)
 | 
			
		||||
{
 | 
			
		||||
	/* The 82559 ethernet controller appears at both PCI:1:0:0 and
 | 
			
		||||
	 * PCI:1:2:0, so let's pretend the second one isn't there.
 | 
			
		||||
	 */
 | 
			
		||||
	if (bus->number == 0x01 && devfn == 0x10)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int enp2611_pci_read_config(struct pci_bus *bus, unsigned int devfn,
 | 
			
		||||
					int where, int size, u32 *value)
 | 
			
		||||
{
 | 
			
		||||
	if (enp2611_pci_valid_device(bus, devfn))
 | 
			
		||||
		return ixp2000_pci_read_config(bus, devfn, where, size, value);
 | 
			
		||||
 | 
			
		||||
	return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int enp2611_pci_write_config(struct pci_bus *bus, unsigned int devfn,
 | 
			
		||||
					int where, int size, u32 value)
 | 
			
		||||
{
 | 
			
		||||
	if (enp2611_pci_valid_device(bus, devfn))
 | 
			
		||||
		return ixp2000_pci_write_config(bus, devfn, where, size, value);
 | 
			
		||||
 | 
			
		||||
	return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct pci_ops enp2611_pci_ops = {
 | 
			
		||||
	.read   = enp2611_pci_read_config,
 | 
			
		||||
	.write  = enp2611_pci_write_config
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct pci_bus * __init enp2611_pci_scan_bus(int nr,
 | 
			
		||||
						struct pci_sys_data *sys)
 | 
			
		||||
{
 | 
			
		||||
	return pci_scan_root_bus(NULL, sys->busnr, &enp2611_pci_ops, sys,
 | 
			
		||||
				 &sys->resources);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __init enp2611_pci_map_irq(const struct pci_dev *dev, u8 slot,
 | 
			
		||||
	u8 pin)
 | 
			
		||||
{
 | 
			
		||||
	int irq;
 | 
			
		||||
 | 
			
		||||
	if (dev->bus->number == 0 && PCI_SLOT(dev->devfn) == 0) {
 | 
			
		||||
		/* IXP2400. */
 | 
			
		||||
		irq = IRQ_IXP2000_PCIA;
 | 
			
		||||
	} else if (dev->bus->number == 0 && PCI_SLOT(dev->devfn) == 1) {
 | 
			
		||||
		/* 21555 non-transparent bridge.  */
 | 
			
		||||
		irq = IRQ_IXP2000_PCIB;
 | 
			
		||||
	} else if (dev->bus->number == 0 && PCI_SLOT(dev->devfn) == 4) {
 | 
			
		||||
		/* PCI2050B transparent bridge.  */
 | 
			
		||||
		irq = -1;
 | 
			
		||||
	} else if (dev->bus->number == 1 && PCI_SLOT(dev->devfn) == 0) {
 | 
			
		||||
		/* 82559 ethernet.  */
 | 
			
		||||
		irq = IRQ_IXP2000_PCIA;
 | 
			
		||||
	} else if (dev->bus->number == 1 && PCI_SLOT(dev->devfn) == 1) {
 | 
			
		||||
		/* SPI-3 option board.  */
 | 
			
		||||
		irq = IRQ_IXP2000_PCIB;
 | 
			
		||||
	} else {
 | 
			
		||||
		printk(KERN_ERR "enp2611_pci_map_irq() called for unknown "
 | 
			
		||||
				"device PCI:%d:%d:%d\n", dev->bus->number,
 | 
			
		||||
				PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
 | 
			
		||||
		irq = -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return irq;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct hw_pci enp2611_pci __initdata = {
 | 
			
		||||
	.nr_controllers	= 1,
 | 
			
		||||
	.setup		= enp2611_pci_setup,
 | 
			
		||||
	.preinit	= enp2611_pci_preinit,
 | 
			
		||||
	.scan		= enp2611_pci_scan_bus,
 | 
			
		||||
	.map_irq	= enp2611_pci_map_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int __init enp2611_pci_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_enp2611())
 | 
			
		||||
		pci_common_init(&enp2611_pci);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
subsys_initcall(enp2611_pci_init);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * ENP-2611 Machine Initialization
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct flash_platform_data enp2611_flash_platform_data = {
 | 
			
		||||
	.map_name	= "cfi_probe",
 | 
			
		||||
	.width		= 1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct ixp2000_flash_data enp2611_flash_data = {
 | 
			
		||||
	.platform_data	= &enp2611_flash_platform_data,
 | 
			
		||||
	.nr_banks	= 1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource enp2611_flash_resource = {
 | 
			
		||||
	.start		= 0xc4000000,
 | 
			
		||||
	.end		= 0xc4000000 + 0x00ffffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device enp2611_flash = {
 | 
			
		||||
	.name		= "IXP2000-Flash",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data = &enp2611_flash_data,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &enp2611_flash_resource,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct ixp2000_i2c_pins enp2611_i2c_gpio_pins = {
 | 
			
		||||
	.sda_pin	= ENP2611_GPIO_SDA,
 | 
			
		||||
	.scl_pin	= ENP2611_GPIO_SCL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device enp2611_i2c_controller = {
 | 
			
		||||
	.name		= "IXP2000-I2C",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data = &enp2611_i2c_gpio_pins
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 0
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device *enp2611_devices[] __initdata = {
 | 
			
		||||
	&enp2611_flash,
 | 
			
		||||
	&enp2611_i2c_controller
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void __init enp2611_init_machine(void)
 | 
			
		||||
{
 | 
			
		||||
	platform_add_devices(enp2611_devices, ARRAY_SIZE(enp2611_devices));
 | 
			
		||||
	ixp2000_uart_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board")
 | 
			
		||||
	/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.map_io		= enp2611_map_io,
 | 
			
		||||
	.init_irq	= ixp2000_init_irq,
 | 
			
		||||
	.timer		= &enp2611_timer,
 | 
			
		||||
	.init_machine	= enp2611_init_machine,
 | 
			
		||||
	.restart	= ixp2000_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,25 +0,0 @@
 | 
			
		|||
/* arch/arm/mach-ixp2000/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, rp, rv, tmp
 | 
			
		||||
		mov	\rp, #0x00030000
 | 
			
		||||
#ifdef	__ARMEB__
 | 
			
		||||
		orr	\rp, \rp, #0x00000003
 | 
			
		||||
#endif
 | 
			
		||||
		orr	\rv, \rp, #0xfe000000	@ virtual base
 | 
			
		||||
		orr	\rv, \rv, #0x00f00000
 | 
			
		||||
		orr	\rp, \rp, #0xc0000000	@ Physical base
 | 
			
		||||
		.endm
 | 
			
		||||
 | 
			
		||||
#define UART_SHIFT	2
 | 
			
		||||
#include <asm/hardware/debug-8250.S>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,46 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/enp2611.h
 | 
			
		||||
 *
 | 
			
		||||
 * Register and other defines for Radisys ENP-2611
 | 
			
		||||
 *
 | 
			
		||||
 * Created 2004 by Lennert Buytenhek from the ixdp2x01 code.  The
 | 
			
		||||
 * original version carries the following notices:
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ENP2611_H
 | 
			
		||||
#define __ENP2611_H
 | 
			
		||||
 | 
			
		||||
#define ENP2611_CALEB_PHYS_BASE		0xc5000000
 | 
			
		||||
#define ENP2611_CALEB_VIRT_BASE		0xfe000000
 | 
			
		||||
#define ENP2611_CALEB_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define ENP2611_PM3386_0_PHYS_BASE	0xc6000000
 | 
			
		||||
#define ENP2611_PM3386_0_VIRT_BASE	0xfe100000
 | 
			
		||||
#define ENP2611_PM3386_0_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define ENP2611_PM3386_1_PHYS_BASE	0xc6400000
 | 
			
		||||
#define ENP2611_PM3386_1_VIRT_BASE	0xfe200000
 | 
			
		||||
#define ENP2611_PM3386_1_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define ENP2611_GPIO_SCL		7
 | 
			
		||||
#define ENP2611_GPIO_SDA		6
 | 
			
		||||
 | 
			
		||||
#define IRQ_ENP2611_THERMAL		IRQ_IXP2000_GPIO4
 | 
			
		||||
#define IRQ_ENP2611_OPTION_BOARD	IRQ_IXP2000_GPIO3
 | 
			
		||||
#define IRQ_ENP2611_CALEB		IRQ_IXP2000_GPIO2
 | 
			
		||||
#define IRQ_ENP2611_PM3386_1		IRQ_IXP2000_GPIO1
 | 
			
		||||
#define IRQ_ENP2611_PM3386_0		IRQ_IXP2000_GPIO0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,54 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/entry-macro.S
 | 
			
		||||
 *
 | 
			
		||||
 * Low-level IRQ helper macros for IXP2000-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/irqs.h>
 | 
			
		||||
 | 
			
		||||
		.macro  get_irqnr_preamble, base, tmp
 | 
			
		||||
		.endm
 | 
			
		||||
 | 
			
		||||
		.macro  get_irqnr_and_base, irqnr, irqstat, base, tmp
 | 
			
		||||
 | 
			
		||||
		mov	\irqnr, #0x0              @clear out irqnr as default
 | 
			
		||||
                mov	\base, #0xfe000000
 | 
			
		||||
		orr	\base, \base, #0x00e00000
 | 
			
		||||
		orr	\base, \base, #0x08
 | 
			
		||||
		ldr	\irqstat, [\base]         @ get interrupts
 | 
			
		||||
 | 
			
		||||
		cmp	\irqstat, #0
 | 
			
		||||
		beq	1001f
 | 
			
		||||
 | 
			
		||||
		clz     \irqnr, \irqstat
 | 
			
		||||
		mov     \base, #31
 | 
			
		||||
		subs    \irqnr, \base, \irqnr
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * We handle PCIA and PCIB here so we don't have an
 | 
			
		||||
		 * extra layer of code just to check these two bits.
 | 
			
		||||
		 */
 | 
			
		||||
		cmp	\irqnr, #IRQ_IXP2000_PCI
 | 
			
		||||
		bne	1001f
 | 
			
		||||
 | 
			
		||||
		mov	\base, #0xfe000000
 | 
			
		||||
		orr	\base, \base, #0x00c00000
 | 
			
		||||
		orr	\base, \base, #0x00000100
 | 
			
		||||
		orr	\base, \base, #0x00000058
 | 
			
		||||
		ldr	\irqstat, [\base]
 | 
			
		||||
 | 
			
		||||
		mov	\tmp, #(1<<26)
 | 
			
		||||
		tst	\irqstat, \tmp
 | 
			
		||||
		movne	\irqnr, #IRQ_IXP2000_PCIA
 | 
			
		||||
		bne	1001f
 | 
			
		||||
 | 
			
		||||
		mov	\tmp, #(1<<27)
 | 
			
		||||
		tst	\irqstat, \tmp
 | 
			
		||||
		movne	\irqnr, #IRQ_IXP2000_PCIB
 | 
			
		||||
 | 
			
		||||
1001:
 | 
			
		||||
		.endm
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,48 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/gpio.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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * 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.
 | 
			
		||||
 * 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)
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __ASM_ARCH_GPIO_H
 | 
			
		||||
#define __ASM_ARCH_GPIO_H
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
#define GPIO_IN				0
 | 
			
		||||
#define GPIO_OUT			1
 | 
			
		||||
 | 
			
		||||
#define IXP2000_GPIO_LOW		0
 | 
			
		||||
#define IXP2000_GPIO_HIGH		1
 | 
			
		||||
 | 
			
		||||
extern void gpio_line_config(int line, int direction);
 | 
			
		||||
 | 
			
		||||
static inline int gpio_line_get(int line)
 | 
			
		||||
{
 | 
			
		||||
	return (((*IXP2000_GPIO_PLR) >> line) & 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void gpio_line_set(int line, int value)
 | 
			
		||||
{
 | 
			
		||||
	if (value == IXP2000_GPIO_HIGH) {
 | 
			
		||||
		ixp2000_reg_write(IXP2000_GPIO_POSR, 1 << line);
 | 
			
		||||
	} else if (value == IXP2000_GPIO_LOW) {
 | 
			
		||||
		ixp2000_reg_write(IXP2000_GPIO_POCR, 1 << line);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* !__ASSEMBLY__ */
 | 
			
		||||
 | 
			
		||||
#endif /* ASM_ARCH_IXP2000_GPIO_H_ */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,36 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/hardware.h
 | 
			
		||||
 *
 | 
			
		||||
 * Hardware definitions for IXP2400/2800 based systems
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem M Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@mvista.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2001-2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASM_ARCH_HARDWARE_H__
 | 
			
		||||
#define __ASM_ARCH_HARDWARE_H__
 | 
			
		||||
 | 
			
		||||
#include "ixp2000-regs.h"	/* Chipset Registers */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Platform helper functions
 | 
			
		||||
 */
 | 
			
		||||
#include "platform.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Platform-specific bits
 | 
			
		||||
 */
 | 
			
		||||
#include "enp2611.h"		/* ENP-2611 */
 | 
			
		||||
#include "ixdp2x00.h"		/* IXDP2400/2800 */
 | 
			
		||||
#include "ixdp2x01.h"		/* IXDP2401/2801 */
 | 
			
		||||
 | 
			
		||||
#endif  /* _ASM_ARCH_HARDWARE_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,133 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/io.h
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem M Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002  Intel Corp.
 | 
			
		||||
 * Copyrgiht (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_ARCH_IO_H
 | 
			
		||||
#define __ASM_ARM_ARCH_IO_H
 | 
			
		||||
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
 | 
			
		||||
#define IO_SPACE_LIMIT		0xffffffff
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * The A? revisions of the IXP2000s assert byte lanes for PCI I/O
 | 
			
		||||
 * transactions the other way round (MEM transactions don't have this
 | 
			
		||||
 * issue), so if we want to support those models, we need to override
 | 
			
		||||
 * the standard I/O functions.
 | 
			
		||||
 *
 | 
			
		||||
 * B0 and later have a bit that can be set to 1 to get the proper
 | 
			
		||||
 * behavior for I/O transactions, which then allows us to use the
 | 
			
		||||
 * standard I/O functions.  This is what we do if the user does not
 | 
			
		||||
 * explicitly ask for support for pre-B0.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO
 | 
			
		||||
#define ___io(p)		((void __iomem *)((p)+IXP2000_PCI_IO_VIRT_BASE))
 | 
			
		||||
 | 
			
		||||
#define alignb(addr)		(void __iomem *)((unsigned long)(addr) ^ 3)
 | 
			
		||||
#define alignw(addr)		(void __iomem *)((unsigned long)(addr) ^ 2)
 | 
			
		||||
 | 
			
		||||
#define outb(v,p)		__raw_writeb((v),alignb(___io(p)))
 | 
			
		||||
#define outw(v,p)		__raw_writew((v),alignw(___io(p)))
 | 
			
		||||
#define outl(v,p)		__raw_writel((v),___io(p))
 | 
			
		||||
 | 
			
		||||
#define inb(p)		({ unsigned int __v = __raw_readb(alignb(___io(p))); __v; })
 | 
			
		||||
#define inw(p)		\
 | 
			
		||||
	({ unsigned int __v = (__raw_readw(alignw(___io(p)))); __v; })
 | 
			
		||||
#define inl(p)		\
 | 
			
		||||
	({ unsigned int __v = (__raw_readl(___io(p))); __v; })
 | 
			
		||||
 | 
			
		||||
#define outsb(p,d,l)		__raw_writesb(alignb(___io(p)),d,l)
 | 
			
		||||
#define outsw(p,d,l)		__raw_writesw(alignw(___io(p)),d,l)
 | 
			
		||||
#define outsl(p,d,l)		__raw_writesl(___io(p),d,l)
 | 
			
		||||
 | 
			
		||||
#define insb(p,d,l)		__raw_readsb(alignb(___io(p)),d,l)
 | 
			
		||||
#define insw(p,d,l)		__raw_readsw(alignw(___io(p)),d,l)
 | 
			
		||||
#define insl(p,d,l)		__raw_readsl(___io(p),d,l)
 | 
			
		||||
 | 
			
		||||
#define __is_io_address(p)	((((unsigned long)(p)) & ~(IXP2000_PCI_IO_SIZE - 1)) == IXP2000_PCI_IO_VIRT_BASE)
 | 
			
		||||
 | 
			
		||||
#define ioread8(p)						\
 | 
			
		||||
	({							\
 | 
			
		||||
		unsigned int __v;				\
 | 
			
		||||
								\
 | 
			
		||||
		if (__is_io_address(p)) {			\
 | 
			
		||||
			__v = __raw_readb(alignb(p));		\
 | 
			
		||||
		} else {					\
 | 
			
		||||
			__v = __raw_readb(p);			\
 | 
			
		||||
		}						\
 | 
			
		||||
								\
 | 
			
		||||
		__v;						\
 | 
			
		||||
	})							\
 | 
			
		||||
 | 
			
		||||
#define ioread16(p)						\
 | 
			
		||||
	({							\
 | 
			
		||||
		unsigned int __v;				\
 | 
			
		||||
								\
 | 
			
		||||
		if (__is_io_address(p)) {			\
 | 
			
		||||
			__v = __raw_readw(alignw(p));		\
 | 
			
		||||
		} else {					\
 | 
			
		||||
			__v = le16_to_cpu(__raw_readw(p));	\
 | 
			
		||||
		}						\
 | 
			
		||||
								\
 | 
			
		||||
		__v;						\
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
#define ioread32(p)						\
 | 
			
		||||
	({							\
 | 
			
		||||
		unsigned int __v;				\
 | 
			
		||||
								\
 | 
			
		||||
		if (__is_io_address(p)) {			\
 | 
			
		||||
			__v = __raw_readl(p);			\
 | 
			
		||||
		} else {					\
 | 
			
		||||
			__v = le32_to_cpu(__raw_readl(p));	\
 | 
			
		||||
		}						\
 | 
			
		||||
								\
 | 
			
		||||
		 __v;						\
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
#define iowrite8(v,p)						\
 | 
			
		||||
	({							\
 | 
			
		||||
		if (__is_io_address(p)) {			\
 | 
			
		||||
			__raw_writeb((v), alignb(p));		\
 | 
			
		||||
		} else {					\
 | 
			
		||||
			__raw_writeb((v), p);			\
 | 
			
		||||
		}						\
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
#define iowrite16(v,p)						\
 | 
			
		||||
	({							\
 | 
			
		||||
		if (__is_io_address(p)) {			\
 | 
			
		||||
			__raw_writew((v), alignw(p));		\
 | 
			
		||||
		} else {					\
 | 
			
		||||
			__raw_writew(cpu_to_le16(v), p);	\
 | 
			
		||||
		}						\
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
#define iowrite32(v,p)						\
 | 
			
		||||
	({							\
 | 
			
		||||
		if (__is_io_address(p)) {			\
 | 
			
		||||
			__raw_writel((v), p);			\
 | 
			
		||||
		} else {					\
 | 
			
		||||
			__raw_writel(cpu_to_le32(v), p);	\
 | 
			
		||||
		}						\
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
#define ioport_map(port, nr)	___io(port)
 | 
			
		||||
 | 
			
		||||
#define ioport_unmap(addr)
 | 
			
		||||
#else
 | 
			
		||||
#define __io(p)			((void __iomem *)((p)+IXP2000_PCI_IO_VIRT_BASE))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,207 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/irqs.h
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002 Intel Corp.
 | 
			
		||||
 * 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 _IRQS_H
 | 
			
		||||
#define _IRQS_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Do NOT add #ifdef MACHINE_FOO in here.
 | 
			
		||||
 * Simpy add your machine IRQs here and increase NR_IRQS if needed to
 | 
			
		||||
 * hold your machine's IRQ table.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Some interrupt numbers go unused b/c the IRQ mask/ummask/status
 | 
			
		||||
 * register has those bit reserved. We just mark those interrupts
 | 
			
		||||
 * as invalid and this allows us to do mask/unmask with a single
 | 
			
		||||
 * shift operation instead of having to map the IRQ number to
 | 
			
		||||
 * a HW IRQ number.
 | 
			
		||||
 */
 | 
			
		||||
#define	IRQ_IXP2000_SOFT_INT		0 /* soft interrupt */
 | 
			
		||||
#define	IRQ_IXP2000_ERRSUM		1 /* OR of all bits in ErrorStatus reg*/
 | 
			
		||||
#define	IRQ_IXP2000_UART		2
 | 
			
		||||
#define	IRQ_IXP2000_GPIO		3
 | 
			
		||||
#define	IRQ_IXP2000_TIMER1     		4
 | 
			
		||||
#define	IRQ_IXP2000_TIMER2     		5
 | 
			
		||||
#define	IRQ_IXP2000_TIMER3     		6
 | 
			
		||||
#define	IRQ_IXP2000_TIMER4     		7
 | 
			
		||||
#define	IRQ_IXP2000_PMU        		8               
 | 
			
		||||
#define	IRQ_IXP2000_SPF        		9  /* Slow port framer IRQ */
 | 
			
		||||
#define	IRQ_IXP2000_DMA1      		10
 | 
			
		||||
#define	IRQ_IXP2000_DMA2      		11
 | 
			
		||||
#define	IRQ_IXP2000_DMA3      		12
 | 
			
		||||
#define	IRQ_IXP2000_PCI_DOORBELL	13
 | 
			
		||||
#define	IRQ_IXP2000_ME_ATTN       	14 
 | 
			
		||||
#define	IRQ_IXP2000_PCI   		15 /* PCI INTA or INTB */
 | 
			
		||||
#define	IRQ_IXP2000_THDA0   		16 /* thread 0-31A */
 | 
			
		||||
#define	IRQ_IXP2000_THDA1  		17 /* thread 32-63A, IXP2800 only */
 | 
			
		||||
#define	IRQ_IXP2000_THDA2		18 /* thread 64-95A */
 | 
			
		||||
#define	IRQ_IXP2000_THDA3 		19 /* thread 96-127A, IXP2800 only */
 | 
			
		||||
#define	IRQ_IXP2000_THDB0		24 /* thread 0-31B */
 | 
			
		||||
#define	IRQ_IXP2000_THDB1		25 /* thread 32-63B, IXP2800 only */
 | 
			
		||||
#define	IRQ_IXP2000_THDB2		26 /* thread 64-95B */
 | 
			
		||||
#define	IRQ_IXP2000_THDB3		27 /* thread 96-127B, IXP2800 only */
 | 
			
		||||
 | 
			
		||||
/* define generic GPIOs */
 | 
			
		||||
#define IRQ_IXP2000_GPIO0		32
 | 
			
		||||
#define IRQ_IXP2000_GPIO1		33
 | 
			
		||||
#define IRQ_IXP2000_GPIO2		34
 | 
			
		||||
#define IRQ_IXP2000_GPIO3		35
 | 
			
		||||
#define IRQ_IXP2000_GPIO4		36
 | 
			
		||||
#define IRQ_IXP2000_GPIO5		37
 | 
			
		||||
#define IRQ_IXP2000_GPIO6		38
 | 
			
		||||
#define IRQ_IXP2000_GPIO7		39
 | 
			
		||||
 | 
			
		||||
/* split off the 2 PCI sources */
 | 
			
		||||
#define IRQ_IXP2000_PCIA		40
 | 
			
		||||
#define IRQ_IXP2000_PCIB		41
 | 
			
		||||
 | 
			
		||||
/* Int sources from IRQ_ERROR_STATUS */
 | 
			
		||||
#define IRQ_IXP2000_DRAM0_MIN_ERR	42
 | 
			
		||||
#define IRQ_IXP2000_DRAM0_MAJ_ERR	43
 | 
			
		||||
#define IRQ_IXP2000_DRAM1_MIN_ERR	44
 | 
			
		||||
#define IRQ_IXP2000_DRAM1_MAJ_ERR	45
 | 
			
		||||
#define IRQ_IXP2000_DRAM2_MIN_ERR	46
 | 
			
		||||
#define IRQ_IXP2000_DRAM2_MAJ_ERR	47
 | 
			
		||||
/* 48-57 reserved */
 | 
			
		||||
#define IRQ_IXP2000_SRAM0_ERR		58
 | 
			
		||||
#define IRQ_IXP2000_SRAM1_ERR		59
 | 
			
		||||
#define IRQ_IXP2000_SRAM2_ERR		60
 | 
			
		||||
#define IRQ_IXP2000_SRAM3_ERR		61
 | 
			
		||||
/* 62-65 reserved */
 | 
			
		||||
#define IRQ_IXP2000_MEDIA_ERR		66
 | 
			
		||||
#define IRQ_IXP2000_PCI_ERR			67
 | 
			
		||||
#define IRQ_IXP2000_SP_INT			68
 | 
			
		||||
 | 
			
		||||
#define NR_IXP2000_IRQS				69
 | 
			
		||||
 | 
			
		||||
#define	IXP2000_BOARD_IRQ(x)		(NR_IXP2000_IRQS + (x))
 | 
			
		||||
 | 
			
		||||
#define	IXP2000_BOARD_IRQ_MASK(irq)	(1 << (irq - NR_IXP2000_IRQS))	
 | 
			
		||||
 | 
			
		||||
#define IXP2000_ERR_IRQ_MASK(irq) ( 1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR))
 | 
			
		||||
#define IXP2000_VALID_ERR_IRQ_MASK (\
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_DRAM0_MIN_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_DRAM0_MAJ_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_DRAM1_MIN_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_DRAM1_MAJ_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_DRAM2_MIN_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_DRAM2_MAJ_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_SRAM0_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_SRAM1_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_SRAM2_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_SRAM3_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_MEDIA_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_PCI_ERR) | \
 | 
			
		||||
		IXP2000_ERR_IRQ_MASK(IRQ_IXP2000_SP_INT)	)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This allows for all the on-chip sources plus up to 32 CPLD based
 | 
			
		||||
 * IRQs. Should be more than enough.
 | 
			
		||||
 */
 | 
			
		||||
#define	IXP2000_BOARD_IRQS		32
 | 
			
		||||
#define NR_IRQS				(NR_IXP2000_IRQS + IXP2000_BOARD_IRQS)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * IXDP2400 specific IRQs
 | 
			
		||||
 */
 | 
			
		||||
#define	IRQ_IXDP2400_INGRESS_NPU	IXP2000_BOARD_IRQ(0) 
 | 
			
		||||
#define	IRQ_IXDP2400_ENET		IXP2000_BOARD_IRQ(1) 
 | 
			
		||||
#define	IRQ_IXDP2400_MEDIA_PCI		IXP2000_BOARD_IRQ(2) 
 | 
			
		||||
#define	IRQ_IXDP2400_MEDIA_SP		IXP2000_BOARD_IRQ(3) 
 | 
			
		||||
#define	IRQ_IXDP2400_SF_PCI		IXP2000_BOARD_IRQ(4) 
 | 
			
		||||
#define	IRQ_IXDP2400_SF_SP		IXP2000_BOARD_IRQ(5) 
 | 
			
		||||
#define	IRQ_IXDP2400_PMC		IXP2000_BOARD_IRQ(6) 
 | 
			
		||||
#define	IRQ_IXDP2400_TVM		IXP2000_BOARD_IRQ(7) 
 | 
			
		||||
 | 
			
		||||
#define	NR_IXDP2400_IRQS		((IRQ_IXDP2400_TVM)+1)  
 | 
			
		||||
#define	IXDP2400_NR_IRQS		NR_IXDP2400_IRQS - NR_IXP2000_IRQS
 | 
			
		||||
 | 
			
		||||
/* IXDP2800 specific IRQs */
 | 
			
		||||
#define IRQ_IXDP2800_EGRESS_ENET	IXP2000_BOARD_IRQ(0)
 | 
			
		||||
#define IRQ_IXDP2800_INGRESS_NPU	IXP2000_BOARD_IRQ(1)
 | 
			
		||||
#define IRQ_IXDP2800_PMC		IXP2000_BOARD_IRQ(2)
 | 
			
		||||
#define IRQ_IXDP2800_FABRIC_PCI		IXP2000_BOARD_IRQ(3)
 | 
			
		||||
#define IRQ_IXDP2800_FABRIC		IXP2000_BOARD_IRQ(4)
 | 
			
		||||
#define IRQ_IXDP2800_MEDIA		IXP2000_BOARD_IRQ(5)
 | 
			
		||||
 | 
			
		||||
#define	NR_IXDP2800_IRQS		((IRQ_IXDP2800_MEDIA)+1)
 | 
			
		||||
#define	IXDP2800_NR_IRQS		NR_IXDP2800_IRQS - NR_IXP2000_IRQS
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * IRQs on both IXDP2x01 boards
 | 
			
		||||
 */
 | 
			
		||||
#define IRQ_IXDP2X01_SPCI_DB_0		IXP2000_BOARD_IRQ(2)
 | 
			
		||||
#define IRQ_IXDP2X01_SPCI_DB_1		IXP2000_BOARD_IRQ(3)
 | 
			
		||||
#define IRQ_IXDP2X01_SPCI_PMC_INTA	IXP2000_BOARD_IRQ(4)
 | 
			
		||||
#define IRQ_IXDP2X01_SPCI_PMC_INTB	IXP2000_BOARD_IRQ(5)
 | 
			
		||||
#define IRQ_IXDP2X01_SPCI_PMC_INTC	IXP2000_BOARD_IRQ(6)
 | 
			
		||||
#define IRQ_IXDP2X01_SPCI_PMC_INTD	IXP2000_BOARD_IRQ(7)
 | 
			
		||||
#define IRQ_IXDP2X01_SPCI_FIC_INT	IXP2000_BOARD_IRQ(8)
 | 
			
		||||
#define IRQ_IXDP2X01_IPMI_FROM		IXP2000_BOARD_IRQ(16)
 | 
			
		||||
#define IRQ_IXDP2X01_125US		IXP2000_BOARD_IRQ(17)
 | 
			
		||||
#define IRQ_IXDP2X01_DB_0_ADD		IXP2000_BOARD_IRQ(18)
 | 
			
		||||
#define IRQ_IXDP2X01_DB_1_ADD		IXP2000_BOARD_IRQ(19)
 | 
			
		||||
#define IRQ_IXDP2X01_UART1		IXP2000_BOARD_IRQ(21)
 | 
			
		||||
#define IRQ_IXDP2X01_UART2		IXP2000_BOARD_IRQ(22)
 | 
			
		||||
#define IRQ_IXDP2X01_FIC_ADD_INT	IXP2000_BOARD_IRQ(24)
 | 
			
		||||
#define IRQ_IXDP2X01_CS8900		IXP2000_BOARD_IRQ(25)
 | 
			
		||||
#define IRQ_IXDP2X01_BBSRAM		IXP2000_BOARD_IRQ(26)
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_VALID_IRQ_MASK ( \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_SPCI_DB_0) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_SPCI_DB_1) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_SPCI_PMC_INTA) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_SPCI_PMC_INTB) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_SPCI_PMC_INTC) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_SPCI_PMC_INTD) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_SPCI_FIC_INT) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_IPMI_FROM) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_125US) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_DB_0_ADD) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_DB_1_ADD) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_UART1) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_UART2) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_FIC_ADD_INT) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_CS8900) | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2X01_BBSRAM) )
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * IXDP2401 specific IRQs
 | 
			
		||||
 */
 | 
			
		||||
#define IRQ_IXDP2401_INTA_82546		IXP2000_BOARD_IRQ(0)
 | 
			
		||||
#define IRQ_IXDP2401_INTB_82546		IXP2000_BOARD_IRQ(1)
 | 
			
		||||
 | 
			
		||||
#define	IXDP2401_VALID_IRQ_MASK ( \
 | 
			
		||||
		IXDP2X01_VALID_IRQ_MASK | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2401_INTA_82546) |\
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2401_INTB_82546))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP2801-specific IRQs
 | 
			
		||||
 */
 | 
			
		||||
#define IRQ_IXDP2801_RIV		IXP2000_BOARD_IRQ(0)
 | 
			
		||||
#define IRQ_IXDP2801_CNFG_MEDIA		IXP2000_BOARD_IRQ(27)
 | 
			
		||||
#define IRQ_IXDP2801_CLOCK_REF		IXP2000_BOARD_IRQ(28)
 | 
			
		||||
 | 
			
		||||
#define	IXDP2801_VALID_IRQ_MASK ( \
 | 
			
		||||
		IXDP2X01_VALID_IRQ_MASK | \
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2801_RIV) |\
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2801_CNFG_MEDIA) |\
 | 
			
		||||
		IXP2000_BOARD_IRQ_MASK(IRQ_IXDP2801_CLOCK_REF))
 | 
			
		||||
 | 
			
		||||
#define	NR_IXDP2X01_IRQS		((IRQ_IXDP2801_CLOCK_REF) + 1)
 | 
			
		||||
 | 
			
		||||
#endif /*_IRQS_H*/
 | 
			
		||||
| 
						 | 
				
			
			@ -1,92 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/ixdp2x00.h
 | 
			
		||||
 *
 | 
			
		||||
 * Register and other defines for IXDP2[48]00 platforms
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _IXDP2X00_H_
 | 
			
		||||
#define _IXDP2X00_H_
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * On board CPLD memory map
 | 
			
		||||
 */
 | 
			
		||||
#define IXDP2X00_PHYS_CPLD_BASE		0xc7000000
 | 
			
		||||
#define IXDP2X00_VIRT_CPLD_BASE		0xfe000000
 | 
			
		||||
#define IXDP2X00_CPLD_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define IXDP2X00_CPLD_REG(x)  	\
 | 
			
		||||
	(volatile unsigned long *)(IXDP2X00_VIRT_CPLD_BASE | x)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP2400 CPLD registers
 | 
			
		||||
 */
 | 
			
		||||
#define IXDP2400_CPLD_SYSLED		IXDP2X00_CPLD_REG(0x0)  
 | 
			
		||||
#define IXDP2400_CPLD_DISP_DATA		IXDP2X00_CPLD_REG(0x4)
 | 
			
		||||
#define IXDP2400_CPLD_CLOCK_SPEED	IXDP2X00_CPLD_REG(0x8)
 | 
			
		||||
#define IXDP2400_CPLD_INT_STAT		IXDP2X00_CPLD_REG(0xc)
 | 
			
		||||
#define IXDP2400_CPLD_REV		IXDP2X00_CPLD_REG(0x10)
 | 
			
		||||
#define IXDP2400_CPLD_SYS_CLK_M		IXDP2X00_CPLD_REG(0x14)
 | 
			
		||||
#define IXDP2400_CPLD_SYS_CLK_N		IXDP2X00_CPLD_REG(0x18)
 | 
			
		||||
#define IXDP2400_CPLD_INT_MASK		IXDP2X00_CPLD_REG(0x48)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP2800 CPLD registers
 | 
			
		||||
 */
 | 
			
		||||
#define IXDP2800_CPLD_INT_STAT		IXDP2X00_CPLD_REG(0x0)
 | 
			
		||||
#define IXDP2800_CPLD_INT_MASK		IXDP2X00_CPLD_REG(0x140)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define	IXDP2X00_GPIO_I2C_ENABLE	0x02
 | 
			
		||||
#define	IXDP2X00_GPIO_SCL		0x07
 | 
			
		||||
#define	IXDP2X00_GPIO_SDA		0x06
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PCI devfns for on-board devices. We need these to be able to
 | 
			
		||||
 * properly translate IRQs and for device removal.
 | 
			
		||||
 */
 | 
			
		||||
#define	IXDP2400_SLAVE_ENET_DEVFN	0x18	/* Bus 1 */
 | 
			
		||||
#define	IXDP2400_MASTER_ENET_DEVFN	0x20	/* Bus 1 */
 | 
			
		||||
#define	IXDP2400_MEDIA_DEVFN		0x28	/* Bus 1 */
 | 
			
		||||
#define	IXDP2400_SWITCH_FABRIC_DEVFN	0x30	/* Bus 1 */
 | 
			
		||||
 | 
			
		||||
#define	IXDP2800_SLAVE_ENET_DEVFN	0x20	/* Bus 1 */
 | 
			
		||||
#define	IXDP2800_MASTER_ENET_DEVFN	0x18	/* Bus 1 */
 | 
			
		||||
#define	IXDP2800_SWITCH_FABRIC_DEVFN	0x30	/* Bus 1 */
 | 
			
		||||
 | 
			
		||||
#define	IXDP2X00_P2P_DEVFN		0x20	/* Bus 0 */
 | 
			
		||||
#define	IXDP2X00_21555_DEVFN		0x30	/* Bus 0 */
 | 
			
		||||
#define IXDP2X00_SLAVE_NPU_DEVFN	0x28	/* Bus 1 */
 | 
			
		||||
#define	IXDP2X00_PMC_DEVFN		0x38	/* Bus 1 */
 | 
			
		||||
#define IXDP2X00_MASTER_NPU_DEVFN	0x38	/* Bus 1 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
/*
 | 
			
		||||
 * The master NPU is always PCI master.
 | 
			
		||||
 */
 | 
			
		||||
static inline unsigned int ixdp2x00_master_npu(void)
 | 
			
		||||
{
 | 
			
		||||
	return !!ixp2000_is_pcimaster();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Helper functions used by ixdp2400 and ixdp2800 specific code
 | 
			
		||||
 */
 | 
			
		||||
void ixdp2x00_init_irq(volatile unsigned long*, volatile unsigned long *, unsigned long);
 | 
			
		||||
void ixdp2x00_slave_pci_postinit(void);
 | 
			
		||||
void ixdp2x00_init_machine(void);
 | 
			
		||||
void ixdp2x00_map_io(void);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif /*_IXDP2X00_H_ */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,57 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/ixdp2x01.h
 | 
			
		||||
 *
 | 
			
		||||
 * Platform definitions for IXDP2X01 && IXDP2801 systems
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2004 (c) MontaVista Software, Inc. 
 | 
			
		||||
 *
 | 
			
		||||
 * Based on original code Copyright (c) 2002-2003 Intel Corporation
 | 
			
		||||
 * 
 | 
			
		||||
 * 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 __IXDP2X01_H__
 | 
			
		||||
#define __IXDP2X01_H__
 | 
			
		||||
 | 
			
		||||
#define	IXDP2X01_PHYS_CPLD_BASE		0xc6024000
 | 
			
		||||
#define	IXDP2X01_VIRT_CPLD_BASE		0xfe000000
 | 
			
		||||
#define	IXDP2X01_CPLD_REGION_SIZE	0x00100000
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_CPLD_VIRT_REG(reg) (volatile unsigned long*)(IXDP2X01_VIRT_CPLD_BASE | reg)
 | 
			
		||||
#define IXDP2X01_CPLD_PHYS_REG(reg) (IXDP2X01_PHYS_CPLD_BASE | reg)
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_UART1_VIRT_BASE	IXDP2X01_CPLD_VIRT_REG(0x40)
 | 
			
		||||
#define IXDP2X01_UART1_PHYS_BASE	IXDP2X01_CPLD_PHYS_REG(0x40)
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_UART2_VIRT_BASE	IXDP2X01_CPLD_VIRT_REG(0x60)
 | 
			
		||||
#define IXDP2X01_UART2_PHYS_BASE	IXDP2X01_CPLD_PHYS_REG(0x60)
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_CS8900_VIRT_BASE	IXDP2X01_CPLD_VIRT_REG(0x80)
 | 
			
		||||
#define IXDP2X01_CS8900_VIRT_END	(IXDP2X01_CS8900_VIRT_BASE + 16)
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_CPLD_RESET_REG         IXDP2X01_CPLD_VIRT_REG(0x00)
 | 
			
		||||
#define IXDP2X01_INT_MASK_SET_REG	IXDP2X01_CPLD_VIRT_REG(0x08)
 | 
			
		||||
#define IXDP2X01_INT_STAT_REG		IXDP2X01_CPLD_VIRT_REG(0x0C)
 | 
			
		||||
#define IXDP2X01_INT_RAW_REG		IXDP2X01_CPLD_VIRT_REG(0x10) 
 | 
			
		||||
#define IXDP2X01_INT_MASK_CLR_REG	IXDP2X01_INT_RAW_REG
 | 
			
		||||
#define IXDP2X01_INT_SIM_REG		IXDP2X01_CPLD_VIRT_REG(0x14)
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_CPLD_FLASH_REG		IXDP2X01_CPLD_VIRT_REG(0x20)
 | 
			
		||||
 | 
			
		||||
#define IXDP2X01_CPLD_FLASH_INTERN 	0x8000
 | 
			
		||||
#define IXDP2X01_CPLD_FLASH_BANK_MASK 	0xF
 | 
			
		||||
#define IXDP2X01_FLASH_WINDOW_BITS 	25
 | 
			
		||||
#define IXDP2X01_FLASH_WINDOW_SIZE 	(1 << IXDP2X01_FLASH_WINDOW_BITS)
 | 
			
		||||
#define IXDP2X01_FLASH_WINDOW_MASK 	(IXDP2X01_FLASH_WINDOW_SIZE - 1)
 | 
			
		||||
 | 
			
		||||
#define	IXDP2X01_UART_CLK		1843200
 | 
			
		||||
 | 
			
		||||
#define	IXDP2X01_GPIO_I2C_ENABLE	0x02
 | 
			
		||||
#define	IXDP2X01_GPIO_SCL		0x07
 | 
			
		||||
#define	IXDP2X01_GPIO_SDA		0x06
 | 
			
		||||
 | 
			
		||||
#endif /* __IXDP2x01_H__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,451 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/ixp2000-regs.h
 | 
			
		||||
 *
 | 
			
		||||
 * Chipset register definitions for IXP2400/2800 based systems.
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef _IXP2000_REGS_H_
 | 
			
		||||
#define _IXP2000_REGS_H_
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXP2000 linux memory map:
 | 
			
		||||
 *
 | 
			
		||||
 * virt		phys		size
 | 
			
		||||
 * fb000000	db000000	16M		PCI CFG1
 | 
			
		||||
 * fc000000	da000000	16M		PCI CFG0
 | 
			
		||||
 * fd000000	d8000000	16M		PCI I/O
 | 
			
		||||
 * fe[0-7]00000			8M		per-platform mappings
 | 
			
		||||
 * fe900000	80000000	1M		SRAM #0 (first MB)
 | 
			
		||||
 * fea00000	cb400000	1M		SCRATCH ring get/put
 | 
			
		||||
 * feb00000	c8000000	1M		MSF
 | 
			
		||||
 * fec00000	df000000	1M		PCI CSRs
 | 
			
		||||
 * fed00000	de000000	1M		PCI CREG
 | 
			
		||||
 * fee00000	d6000000	1M		INTCTL
 | 
			
		||||
 * fef00000	c0000000	1M		CAP
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * Static I/O regions.
 | 
			
		||||
 *
 | 
			
		||||
 * Most of the registers are clumped in 4K regions spread throughout
 | 
			
		||||
 * the 0xc0000000 -> 0xc0100000 address range, but we just map in
 | 
			
		||||
 * the whole range using a single 1 MB section instead of small
 | 
			
		||||
 * 4K pages.
 | 
			
		||||
 *
 | 
			
		||||
 * CAP stands for CSR Access Proxy.
 | 
			
		||||
 *
 | 
			
		||||
 * If you change the virtual address of this mapping, please propagate
 | 
			
		||||
 * the change to arch/arm/kernel/debug.S, which hardcodes the virtual
 | 
			
		||||
 * address of the UART located in this region.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define	IXP2000_CAP_PHYS_BASE		0xc0000000
 | 
			
		||||
#define	IXP2000_CAP_VIRT_BASE		0xfef00000
 | 
			
		||||
#define	IXP2000_CAP_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Addresses for specific on-chip peripherals.
 | 
			
		||||
 */
 | 
			
		||||
#define	IXP2000_SLOWPORT_CSR_VIRT_BASE	0xfef80000
 | 
			
		||||
#define	IXP2000_GLOBAL_REG_VIRT_BASE	0xfef04000
 | 
			
		||||
#define	IXP2000_UART_PHYS_BASE		0xc0030000
 | 
			
		||||
#define	IXP2000_UART_VIRT_BASE		0xfef30000
 | 
			
		||||
#define	IXP2000_TIMER_VIRT_BASE		0xfef20000
 | 
			
		||||
#define	IXP2000_UENGINE_CSR_VIRT_BASE	0xfef18000
 | 
			
		||||
#define	IXP2000_GPIO_VIRT_BASE		0xfef10000
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Devices outside of the 0xc0000000 -> 0xc0100000 range.  The virtual
 | 
			
		||||
 * addresses of the INTCTL and PCI_CSR mappings are hardcoded in
 | 
			
		||||
 * entry-macro.S, so if you ever change these please propagate
 | 
			
		||||
 * the change.
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_INTCTL_PHYS_BASE	0xd6000000
 | 
			
		||||
#define	IXP2000_INTCTL_VIRT_BASE	0xfee00000
 | 
			
		||||
#define	IXP2000_INTCTL_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCI_CREG_PHYS_BASE	0xde000000
 | 
			
		||||
#define	IXP2000_PCI_CREG_VIRT_BASE	0xfed00000
 | 
			
		||||
#define	IXP2000_PCI_CREG_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCI_CSR_PHYS_BASE	0xdf000000
 | 
			
		||||
#define	IXP2000_PCI_CSR_VIRT_BASE	0xfec00000
 | 
			
		||||
#define	IXP2000_PCI_CSR_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_MSF_PHYS_BASE		0xc8000000
 | 
			
		||||
#define IXP2000_MSF_VIRT_BASE		0xfeb00000
 | 
			
		||||
#define IXP2000_MSF_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_SCRATCH_RING_PHYS_BASE	0xcb400000
 | 
			
		||||
#define IXP2000_SCRATCH_RING_VIRT_BASE	0xfea00000
 | 
			
		||||
#define IXP2000_SCRATCH_RING_SIZE	0x00100000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_SRAM0_PHYS_BASE		0x80000000
 | 
			
		||||
#define IXP2000_SRAM0_VIRT_BASE		0xfe900000
 | 
			
		||||
#define IXP2000_SRAM0_SIZE		0x00100000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCI_IO_PHYS_BASE	0xd8000000
 | 
			
		||||
#define	IXP2000_PCI_IO_VIRT_BASE	0xfd000000
 | 
			
		||||
#define IXP2000_PCI_IO_SIZE     	0x01000000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCI_CFG0_PHYS_BASE	0xda000000
 | 
			
		||||
#define IXP2000_PCI_CFG0_VIRT_BASE	0xfc000000
 | 
			
		||||
#define IXP2000_PCI_CFG0_SIZE   	0x01000000
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCI_CFG1_PHYS_BASE	0xdb000000
 | 
			
		||||
#define IXP2000_PCI_CFG1_VIRT_BASE	0xfb000000
 | 
			
		||||
#define IXP2000_PCI_CFG1_SIZE		0x01000000
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
 * Timers
 | 
			
		||||
 */
 | 
			
		||||
#define	IXP2000_TIMER_REG(x)		((volatile unsigned long*)(IXP2000_TIMER_VIRT_BASE | (x)))
 | 
			
		||||
/* Timer control */
 | 
			
		||||
#define	IXP2000_T1_CTL			IXP2000_TIMER_REG(0x00)
 | 
			
		||||
#define	IXP2000_T2_CTL			IXP2000_TIMER_REG(0x04)
 | 
			
		||||
#define	IXP2000_T3_CTL			IXP2000_TIMER_REG(0x08)
 | 
			
		||||
#define	IXP2000_T4_CTL			IXP2000_TIMER_REG(0x0c)
 | 
			
		||||
/* Store initial value */
 | 
			
		||||
#define	IXP2000_T1_CLD			IXP2000_TIMER_REG(0x10)
 | 
			
		||||
#define	IXP2000_T2_CLD			IXP2000_TIMER_REG(0x14)
 | 
			
		||||
#define	IXP2000_T3_CLD			IXP2000_TIMER_REG(0x18)
 | 
			
		||||
#define	IXP2000_T4_CLD			IXP2000_TIMER_REG(0x1c)
 | 
			
		||||
/* Read current value */
 | 
			
		||||
#define	IXP2000_T1_CSR			IXP2000_TIMER_REG(0x20)
 | 
			
		||||
#define	IXP2000_T2_CSR			IXP2000_TIMER_REG(0x24)
 | 
			
		||||
#define	IXP2000_T3_CSR			IXP2000_TIMER_REG(0x28)
 | 
			
		||||
#define	IXP2000_T4_CSR			IXP2000_TIMER_REG(0x2c)
 | 
			
		||||
/* Clear associated timer interrupt */
 | 
			
		||||
#define	IXP2000_T1_CLR			IXP2000_TIMER_REG(0x30)
 | 
			
		||||
#define	IXP2000_T2_CLR			IXP2000_TIMER_REG(0x34)
 | 
			
		||||
#define	IXP2000_T3_CLR			IXP2000_TIMER_REG(0x38)
 | 
			
		||||
#define	IXP2000_T4_CLR			IXP2000_TIMER_REG(0x3c)
 | 
			
		||||
/* Timer watchdog enable for T4 */
 | 
			
		||||
#define	IXP2000_TWDE			IXP2000_TIMER_REG(0x40)
 | 
			
		||||
 | 
			
		||||
#define	WDT_ENABLE			0x00000001
 | 
			
		||||
#define	TIMER_DIVIDER_256		0x00000008
 | 
			
		||||
#define	TIMER_ENABLE			0x00000080
 | 
			
		||||
#define	IRQ_MASK_TIMER1         	(1 << 4)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interrupt controller registers
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_INTCTL_REG(x)		(volatile unsigned long*)(IXP2000_INTCTL_VIRT_BASE | (x))
 | 
			
		||||
#define IXP2000_IRQ_STATUS		IXP2000_INTCTL_REG(0x08)
 | 
			
		||||
#define IXP2000_IRQ_ENABLE		IXP2000_INTCTL_REG(0x10)
 | 
			
		||||
#define IXP2000_IRQ_ENABLE_SET		IXP2000_INTCTL_REG(0x10)
 | 
			
		||||
#define IXP2000_IRQ_ENABLE_CLR		IXP2000_INTCTL_REG(0x18)
 | 
			
		||||
#define IXP2000_FIQ_ENABLE_CLR		IXP2000_INTCTL_REG(0x14)
 | 
			
		||||
#define IXP2000_IRQ_ERR_STATUS		IXP2000_INTCTL_REG(0x24)
 | 
			
		||||
#define IXP2000_IRQ_ERR_ENABLE_SET	IXP2000_INTCTL_REG(0x2c)
 | 
			
		||||
#define IXP2000_FIQ_ERR_ENABLE_CLR	IXP2000_INTCTL_REG(0x30)
 | 
			
		||||
#define IXP2000_IRQ_ERR_ENABLE_CLR	IXP2000_INTCTL_REG(0x34)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_A_0	IXP2000_INTCTL_REG(0x60)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_A_1	IXP2000_INTCTL_REG(0x64)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_A_2	IXP2000_INTCTL_REG(0x68)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_A_3	IXP2000_INTCTL_REG(0x6c)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_B_0	IXP2000_INTCTL_REG(0x80)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_B_1	IXP2000_INTCTL_REG(0x84)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_B_2	IXP2000_INTCTL_REG(0x88)
 | 
			
		||||
#define IXP2000_IRQ_THD_RAW_STATUS_B_3	IXP2000_INTCTL_REG(0x8c)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_A_0	IXP2000_INTCTL_REG(0xe0)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_A_1	IXP2000_INTCTL_REG(0xe4)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_A_2	IXP2000_INTCTL_REG(0xe8)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_A_3	IXP2000_INTCTL_REG(0xec)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_B_0	IXP2000_INTCTL_REG(0x100)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_B_1	IXP2000_INTCTL_REG(0x104)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_B_2	IXP2000_INTCTL_REG(0x108)
 | 
			
		||||
#define IXP2000_IRQ_THD_STATUS_B_3	IXP2000_INTCTL_REG(0x10c)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_A_0	IXP2000_INTCTL_REG(0x160)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_A_1	IXP2000_INTCTL_REG(0x164)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_A_2	IXP2000_INTCTL_REG(0x168)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_A_3	IXP2000_INTCTL_REG(0x16c)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_B_0	IXP2000_INTCTL_REG(0x180)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_B_1	IXP2000_INTCTL_REG(0x184)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_B_2	IXP2000_INTCTL_REG(0x188)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_SET_B_3	IXP2000_INTCTL_REG(0x18c)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_A_0	IXP2000_INTCTL_REG(0x1e0)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_A_1	IXP2000_INTCTL_REG(0x1e4)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_A_2	IXP2000_INTCTL_REG(0x1e8)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_A_3	IXP2000_INTCTL_REG(0x1ec)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_B_0	IXP2000_INTCTL_REG(0x200)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_B_1	IXP2000_INTCTL_REG(0x204)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_B_2	IXP2000_INTCTL_REG(0x208)
 | 
			
		||||
#define IXP2000_IRQ_THD_ENABLE_CLEAR_B_3	IXP2000_INTCTL_REG(0x20c)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mask of valid IRQs in the 32-bit IRQ register. We use
 | 
			
		||||
 * this to mark certain IRQs as being invalid.
 | 
			
		||||
 */
 | 
			
		||||
#define	IXP2000_VALID_IRQ_MASK	0x0f0fffff
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PCI config register access from core
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_CREG(x)		(volatile unsigned long*)(IXP2000_PCI_CREG_VIRT_BASE | (x))
 | 
			
		||||
#define IXP2000_PCI_CMDSTAT 		IXP2000_PCI_CREG(0x04)
 | 
			
		||||
#define IXP2000_PCI_CSR_BAR		IXP2000_PCI_CREG(0x10)
 | 
			
		||||
#define IXP2000_PCI_SRAM_BAR		IXP2000_PCI_CREG(0x14)
 | 
			
		||||
#define IXP2000_PCI_SDRAM_BAR		IXP2000_PCI_CREG(0x18)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PCI CSRs
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_CSR(x)		(volatile unsigned long*)(IXP2000_PCI_CSR_VIRT_BASE | (x))
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PCI outbound interrupts
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_OUT_INT_STATUS	IXP2000_PCI_CSR(0x30)
 | 
			
		||||
#define IXP2000_PCI_OUT_INT_MASK	IXP2000_PCI_CSR(0x34)
 | 
			
		||||
/*
 | 
			
		||||
 * PCI communications
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_MAILBOX0		IXP2000_PCI_CSR(0x50)
 | 
			
		||||
#define IXP2000_PCI_MAILBOX1		IXP2000_PCI_CSR(0x54)
 | 
			
		||||
#define IXP2000_PCI_MAILBOX2		IXP2000_PCI_CSR(0x58)
 | 
			
		||||
#define IXP2000_PCI_MAILBOX3		IXP2000_PCI_CSR(0x5C)
 | 
			
		||||
#define IXP2000_XSCALE_DOORBELL		IXP2000_PCI_CSR(0x60)
 | 
			
		||||
#define IXP2000_XSCALE_DOORBELL_SETUP	IXP2000_PCI_CSR(0x64)
 | 
			
		||||
#define IXP2000_PCI_DOORBELL		IXP2000_PCI_CSR(0x70)
 | 
			
		||||
#define IXP2000_PCI_DOORBELL_SETUP	IXP2000_PCI_CSR(0x74)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * DMA engines
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_CH1_BYTE_CNT	IXP2000_PCI_CSR(0x80)
 | 
			
		||||
#define IXP2000_PCI_CH1_ADDR		IXP2000_PCI_CSR(0x84)
 | 
			
		||||
#define IXP2000_PCI_CH1_DRAM_ADDR	IXP2000_PCI_CSR(0x88)
 | 
			
		||||
#define IXP2000_PCI_CH1_DESC_PTR	IXP2000_PCI_CSR(0x8C)
 | 
			
		||||
#define IXP2000_PCI_CH1_CNTRL		IXP2000_PCI_CSR(0x90)
 | 
			
		||||
#define IXP2000_PCI_CH1_ME_PARAM	IXP2000_PCI_CSR(0x94)
 | 
			
		||||
#define IXP2000_PCI_CH2_BYTE_CNT	IXP2000_PCI_CSR(0xA0)
 | 
			
		||||
#define IXP2000_PCI_CH2_ADDR		IXP2000_PCI_CSR(0xA4)
 | 
			
		||||
#define IXP2000_PCI_CH2_DRAM_ADDR	IXP2000_PCI_CSR(0xA8)
 | 
			
		||||
#define IXP2000_PCI_CH2_DESC_PTR	IXP2000_PCI_CSR(0xAC)
 | 
			
		||||
#define IXP2000_PCI_CH2_CNTRL		IXP2000_PCI_CSR(0xB0)
 | 
			
		||||
#define IXP2000_PCI_CH2_ME_PARAM	IXP2000_PCI_CSR(0xB4)
 | 
			
		||||
#define IXP2000_PCI_CH3_BYTE_CNT	IXP2000_PCI_CSR(0xC0)
 | 
			
		||||
#define IXP2000_PCI_CH3_ADDR		IXP2000_PCI_CSR(0xC4)
 | 
			
		||||
#define IXP2000_PCI_CH3_DRAM_ADDR	IXP2000_PCI_CSR(0xC8)
 | 
			
		||||
#define IXP2000_PCI_CH3_DESC_PTR	IXP2000_PCI_CSR(0xCC)
 | 
			
		||||
#define IXP2000_PCI_CH3_CNTRL		IXP2000_PCI_CSR(0xD0)
 | 
			
		||||
#define IXP2000_PCI_CH3_ME_PARAM	IXP2000_PCI_CSR(0xD4)
 | 
			
		||||
#define IXP2000_DMA_INF_MODE		IXP2000_PCI_CSR(0xE0)
 | 
			
		||||
/*
 | 
			
		||||
 * Size masks for BARs
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_SRAM_BASE_ADDR_MASK	IXP2000_PCI_CSR(0xFC)
 | 
			
		||||
#define IXP2000_PCI_DRAM_BASE_ADDR_MASK	IXP2000_PCI_CSR(0x100)
 | 
			
		||||
/*
 | 
			
		||||
 * Control and uEngine related
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_CONTROL		IXP2000_PCI_CSR(0x13C)
 | 
			
		||||
#define IXP2000_PCI_ADDR_EXT		IXP2000_PCI_CSR(0x140)
 | 
			
		||||
#define IXP2000_PCI_ME_PUSH_STATUS	IXP2000_PCI_CSR(0x148)
 | 
			
		||||
#define IXP2000_PCI_ME_PUSH_EN		IXP2000_PCI_CSR(0x14C)
 | 
			
		||||
#define IXP2000_PCI_ERR_STATUS		IXP2000_PCI_CSR(0x150)
 | 
			
		||||
#define IXP2000_PCI_ERR_ENABLE		IXP2000_PCI_CSR(0x154)
 | 
			
		||||
/*
 | 
			
		||||
 * Inbound PCI interrupt control
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_PCI_XSCALE_INT_STATUS	IXP2000_PCI_CSR(0x158)
 | 
			
		||||
#define IXP2000_PCI_XSCALE_INT_ENABLE	IXP2000_PCI_CSR(0x15C)
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCICNTL_PNR		(1<<17)	/* PCI not Reset bit of PCI_CONTROL */
 | 
			
		||||
#define IXP2000_PCICNTL_PCF		(1<<28)	/* PCI Central function bit */
 | 
			
		||||
#define IXP2000_XSCALE_INT		(1<<1)	/* Interrupt from XScale to PCI */
 | 
			
		||||
 | 
			
		||||
/* These are from the IRQ register in the PCI ISR register */
 | 
			
		||||
#define PCI_CONTROL_BE_DEO		(1 << 22)	/* Big Endian Data Enable Out */
 | 
			
		||||
#define PCI_CONTROL_BE_DEI		(1 << 21)	/* Big Endian Data Enable In  */
 | 
			
		||||
#define PCI_CONTROL_BE_BEO		(1 << 20)	/* Big Endian Byte Enable Out */
 | 
			
		||||
#define PCI_CONTROL_BE_BEI		(1 << 19)	/* Big Endian Byte Enable In  */
 | 
			
		||||
#define PCI_CONTROL_IEE			(1 << 17)	/* I/O cycle Endian swap Enable */
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCI_RST_REL		(1 << 2)
 | 
			
		||||
#define CFG_RST_DIR			(*IXP2000_PCI_CONTROL & IXP2000_PCICNTL_PCF)
 | 
			
		||||
#define CFG_PCI_BOOT_HOST		(1 << 2)
 | 
			
		||||
#define CFG_BOOT_PROM			(1 << 1)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * SlowPort CSRs
 | 
			
		||||
 *
 | 
			
		||||
 * The slowport is used to access things like flash, SONET framer control
 | 
			
		||||
 * ports, slave microprocessors, CPLDs, and others of chip memory mapped
 | 
			
		||||
 * peripherals.
 | 
			
		||||
 */
 | 
			
		||||
#define	SLOWPORT_CSR(x)		(volatile unsigned long*)(IXP2000_SLOWPORT_CSR_VIRT_BASE | (x))
 | 
			
		||||
 | 
			
		||||
#define	IXP2000_SLOWPORT_CCR		SLOWPORT_CSR(0x00)
 | 
			
		||||
#define	IXP2000_SLOWPORT_WTC1		SLOWPORT_CSR(0x04)
 | 
			
		||||
#define	IXP2000_SLOWPORT_WTC2		SLOWPORT_CSR(0x08)
 | 
			
		||||
#define	IXP2000_SLOWPORT_RTC1		SLOWPORT_CSR(0x0c)
 | 
			
		||||
#define	IXP2000_SLOWPORT_RTC2		SLOWPORT_CSR(0x10)
 | 
			
		||||
#define	IXP2000_SLOWPORT_FSR		SLOWPORT_CSR(0x14)
 | 
			
		||||
#define	IXP2000_SLOWPORT_PCR		SLOWPORT_CSR(0x18)
 | 
			
		||||
#define	IXP2000_SLOWPORT_ADC		SLOWPORT_CSR(0x1C)
 | 
			
		||||
#define	IXP2000_SLOWPORT_FAC		SLOWPORT_CSR(0x20)
 | 
			
		||||
#define	IXP2000_SLOWPORT_FRM		SLOWPORT_CSR(0x24)
 | 
			
		||||
#define	IXP2000_SLOWPORT_FIN		SLOWPORT_CSR(0x28)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * CCR values.  
 | 
			
		||||
 * The CCR configures the clock division for the slowport interface.
 | 
			
		||||
 */
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_1		0x00
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_2		0x01
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_4		0x02
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_6		0x03
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_8		0x04
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_10		0x05
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_12		0x06
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_14		0x07
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_16		0x08
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_18		0x09
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_20		0x0a
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_22		0x0b
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_24		0x0c
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_26		0x0d
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_28		0x0e
 | 
			
		||||
#define	SLOWPORT_CCR_DIV_30		0x0f
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * PCR values.  PCR configure the mode of the interface.
 | 
			
		||||
 */
 | 
			
		||||
#define	SLOWPORT_MODE_FLASH		0x00
 | 
			
		||||
#define	SLOWPORT_MODE_LUCENT		0x01
 | 
			
		||||
#define	SLOWPORT_MODE_PMC_SIERRA	0x02
 | 
			
		||||
#define	SLOWPORT_MODE_INTEL_UP		0x03
 | 
			
		||||
#define	SLOWPORT_MODE_MOTOROLA_UP	0x04
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ADC values.  Defines data and address bus widths.
 | 
			
		||||
 */
 | 
			
		||||
#define	SLOWPORT_ADDR_WIDTH_8		0x00
 | 
			
		||||
#define	SLOWPORT_ADDR_WIDTH_16		0x01
 | 
			
		||||
#define	SLOWPORT_ADDR_WIDTH_24		0x02
 | 
			
		||||
#define	SLOWPORT_ADDR_WIDTH_32		0x03
 | 
			
		||||
#define	SLOWPORT_DATA_WIDTH_8		0x00
 | 
			
		||||
#define	SLOWPORT_DATA_WIDTH_16		0x10
 | 
			
		||||
#define	SLOWPORT_DATA_WIDTH_24		0x20
 | 
			
		||||
#define	SLOWPORT_DATA_WIDTH_32		0x30
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Masks and shifts for various fields in the WTC and RTC registers.
 | 
			
		||||
 */
 | 
			
		||||
#define	SLOWPORT_WRTC_MASK_HD		0x0003
 | 
			
		||||
#define	SLOWPORT_WRTC_MASK_PW		0x003c
 | 
			
		||||
#define	SLOWPORT_WRTC_MASK_SU		0x03c0
 | 
			
		||||
 | 
			
		||||
#define	SLOWPORT_WRTC_SHIFT_HD		0x00
 | 
			
		||||
#define	SLOWPORT_WRTC_SHIFT_SU		0x02
 | 
			
		||||
#define	SLOWPORT_WRTC_SHFIT_PW		0x06
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * GPIO registers & GPIO interface.
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_GPIO_REG(x)		((volatile unsigned long*)(IXP2000_GPIO_VIRT_BASE+(x)))
 | 
			
		||||
#define IXP2000_GPIO_PLR		IXP2000_GPIO_REG(0x00)
 | 
			
		||||
#define IXP2000_GPIO_PDPR		IXP2000_GPIO_REG(0x04)
 | 
			
		||||
#define IXP2000_GPIO_PDSR		IXP2000_GPIO_REG(0x08)
 | 
			
		||||
#define IXP2000_GPIO_PDCR		IXP2000_GPIO_REG(0x0c)
 | 
			
		||||
#define IXP2000_GPIO_POPR		IXP2000_GPIO_REG(0x10)
 | 
			
		||||
#define IXP2000_GPIO_POSR		IXP2000_GPIO_REG(0x14)
 | 
			
		||||
#define IXP2000_GPIO_POCR		IXP2000_GPIO_REG(0x18)
 | 
			
		||||
#define IXP2000_GPIO_REDR		IXP2000_GPIO_REG(0x1c)
 | 
			
		||||
#define IXP2000_GPIO_FEDR		IXP2000_GPIO_REG(0x20)
 | 
			
		||||
#define IXP2000_GPIO_EDSR		IXP2000_GPIO_REG(0x24)
 | 
			
		||||
#define IXP2000_GPIO_LSHR		IXP2000_GPIO_REG(0x28)
 | 
			
		||||
#define IXP2000_GPIO_LSLR		IXP2000_GPIO_REG(0x2c)
 | 
			
		||||
#define IXP2000_GPIO_LDSR		IXP2000_GPIO_REG(0x30)
 | 
			
		||||
#define IXP2000_GPIO_INER		IXP2000_GPIO_REG(0x34)
 | 
			
		||||
#define IXP2000_GPIO_INSR		IXP2000_GPIO_REG(0x38)
 | 
			
		||||
#define IXP2000_GPIO_INCR		IXP2000_GPIO_REG(0x3c)
 | 
			
		||||
#define IXP2000_GPIO_INST		IXP2000_GPIO_REG(0x40)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * "Global" registers...whatever that's supposed to mean.
 | 
			
		||||
 */
 | 
			
		||||
#define GLOBAL_REG_BASE			(IXP2000_GLOBAL_REG_VIRT_BASE + 0x0a00)
 | 
			
		||||
#define GLOBAL_REG(x)			(volatile unsigned long*)(GLOBAL_REG_BASE | (x))
 | 
			
		||||
 | 
			
		||||
#define IXP2000_MAJ_PROD_TYPE_MASK	0x001F0000
 | 
			
		||||
#define IXP2000_MAJ_PROD_TYPE_IXP2000	0x00000000
 | 
			
		||||
#define IXP2000_MIN_PROD_TYPE_MASK 	0x0000FF00
 | 
			
		||||
#define IXP2000_MIN_PROD_TYPE_IXP2400	0x00000200
 | 
			
		||||
#define IXP2000_MIN_PROD_TYPE_IXP2850	0x00000100
 | 
			
		||||
#define IXP2000_MIN_PROD_TYPE_IXP2800	0x00000000
 | 
			
		||||
#define IXP2000_MAJ_REV_MASK	      	0x000000F0
 | 
			
		||||
#define IXP2000_MIN_REV_MASK	      	0x0000000F
 | 
			
		||||
#define IXP2000_PROD_ID_MASK		0xFFFFFFFF
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PRODUCT_ID		GLOBAL_REG(0x00)
 | 
			
		||||
#define IXP2000_MISC_CONTROL		GLOBAL_REG(0x04)
 | 
			
		||||
#define IXP2000_MSF_CLK_CNTRL  		GLOBAL_REG(0x08)
 | 
			
		||||
#define IXP2000_RESET0      		GLOBAL_REG(0x0c)
 | 
			
		||||
#define IXP2000_RESET1      		GLOBAL_REG(0x10)
 | 
			
		||||
#define IXP2000_CCR            		GLOBAL_REG(0x14)
 | 
			
		||||
#define	IXP2000_STRAP_OPTIONS  		GLOBAL_REG(0x18)
 | 
			
		||||
 | 
			
		||||
#define	RSTALL				(1 << 16)
 | 
			
		||||
#define	WDT_RESET_ENABLE		0x01000000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * MSF registers.  The IXP2400 and IXP2800 have somewhat different MSF
 | 
			
		||||
 * units, but the registers that differ between the two don't overlap,
 | 
			
		||||
 * so we can have one register list for both.
 | 
			
		||||
 */
 | 
			
		||||
#define IXP2000_MSF_REG(x)			((volatile unsigned long*)(IXP2000_MSF_VIRT_BASE + (x)))
 | 
			
		||||
#define IXP2000_MSF_RX_CONTROL			IXP2000_MSF_REG(0x0000)
 | 
			
		||||
#define IXP2000_MSF_TX_CONTROL			IXP2000_MSF_REG(0x0004)
 | 
			
		||||
#define IXP2000_MSF_INTERRUPT_STATUS		IXP2000_MSF_REG(0x0008)
 | 
			
		||||
#define IXP2000_MSF_INTERRUPT_ENABLE		IXP2000_MSF_REG(0x000c)
 | 
			
		||||
#define IXP2000_MSF_CSIX_TYPE_MAP		IXP2000_MSF_REG(0x0010)
 | 
			
		||||
#define IXP2000_MSF_FC_EGRESS_STATUS		IXP2000_MSF_REG(0x0014)
 | 
			
		||||
#define IXP2000_MSF_FC_INGRESS_STATUS		IXP2000_MSF_REG(0x0018)
 | 
			
		||||
#define IXP2000_MSF_HWM_CONTROL			IXP2000_MSF_REG(0x0024)
 | 
			
		||||
#define IXP2000_MSF_FC_STATUS_OVERRIDE		IXP2000_MSF_REG(0x0028)
 | 
			
		||||
#define IXP2000_MSF_CLOCK_CONTROL		IXP2000_MSF_REG(0x002c)
 | 
			
		||||
#define IXP2000_MSF_RX_PORT_MAP			IXP2000_MSF_REG(0x0040)
 | 
			
		||||
#define IXP2000_MSF_RBUF_ELEMENT_DONE		IXP2000_MSF_REG(0x0044)
 | 
			
		||||
#define IXP2000_MSF_RX_MPHY_POLL_LIMIT		IXP2000_MSF_REG(0x0048)
 | 
			
		||||
#define IXP2000_MSF_RX_CALENDAR_LENGTH		IXP2000_MSF_REG(0x0048)
 | 
			
		||||
#define IXP2000_MSF_RX_THREAD_FREELIST_TIMEOUT_0	IXP2000_MSF_REG(0x0050)
 | 
			
		||||
#define IXP2000_MSF_RX_THREAD_FREELIST_TIMEOUT_1	IXP2000_MSF_REG(0x0054)
 | 
			
		||||
#define IXP2000_MSF_RX_THREAD_FREELIST_TIMEOUT_2	IXP2000_MSF_REG(0x0058)
 | 
			
		||||
#define IXP2000_MSF_TX_SEQUENCE_0		IXP2000_MSF_REG(0x0060)
 | 
			
		||||
#define IXP2000_MSF_TX_SEQUENCE_1		IXP2000_MSF_REG(0x0064)
 | 
			
		||||
#define IXP2000_MSF_TX_SEQUENCE_2		IXP2000_MSF_REG(0x0068)
 | 
			
		||||
#define IXP2000_MSF_TX_MPHY_POLL_LIMIT		IXP2000_MSF_REG(0x0070)
 | 
			
		||||
#define IXP2000_MSF_TX_CALENDAR_LENGTH		IXP2000_MSF_REG(0x0070)
 | 
			
		||||
#define IXP2000_MSF_RX_UP_CONTROL_0		IXP2000_MSF_REG(0x0080)
 | 
			
		||||
#define IXP2000_MSF_RX_UP_CONTROL_1		IXP2000_MSF_REG(0x0084)
 | 
			
		||||
#define IXP2000_MSF_RX_UP_CONTROL_2		IXP2000_MSF_REG(0x0088)
 | 
			
		||||
#define IXP2000_MSF_RX_UP_CONTROL_3		IXP2000_MSF_REG(0x008c)
 | 
			
		||||
#define IXP2000_MSF_TX_UP_CONTROL_0		IXP2000_MSF_REG(0x0090)
 | 
			
		||||
#define IXP2000_MSF_TX_UP_CONTROL_1		IXP2000_MSF_REG(0x0094)
 | 
			
		||||
#define IXP2000_MSF_TX_UP_CONTROL_2		IXP2000_MSF_REG(0x0098)
 | 
			
		||||
#define IXP2000_MSF_TX_UP_CONTROL_3		IXP2000_MSF_REG(0x009c)
 | 
			
		||||
#define IXP2000_MSF_TRAIN_DATA			IXP2000_MSF_REG(0x00a0)
 | 
			
		||||
#define IXP2000_MSF_TRAIN_CALENDAR		IXP2000_MSF_REG(0x00a4)
 | 
			
		||||
#define IXP2000_MSF_TRAIN_FLOW_CONTROL		IXP2000_MSF_REG(0x00a8)
 | 
			
		||||
#define IXP2000_MSF_TX_CALENDAR_0		IXP2000_MSF_REG(0x1000)
 | 
			
		||||
#define IXP2000_MSF_RX_PORT_CALENDAR_STATUS	IXP2000_MSF_REG(0x1400)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif				/* _IXP2000_H_ */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,31 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/memory.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASM_ARCH_MEMORY_H
 | 
			
		||||
#define __ASM_ARCH_MEMORY_H
 | 
			
		||||
 | 
			
		||||
#define PLAT_PHYS_OFFSET	UL(0x00000000)
 | 
			
		||||
 | 
			
		||||
#include <mach/ixp2000-regs.h>
 | 
			
		||||
 | 
			
		||||
#define IXP2000_PCI_SDRAM_OFFSET	(*IXP2000_PCI_SDRAM_BAR & 0xfffffff0)
 | 
			
		||||
 | 
			
		||||
#define __phys_to_bus(x)	((x) + (IXP2000_PCI_SDRAM_OFFSET - PHYS_OFFSET))
 | 
			
		||||
#define __bus_to_phys(x)	((x) - (IXP2000_PCI_SDRAM_OFFSET - PHYS_OFFSET))
 | 
			
		||||
 | 
			
		||||
#define __virt_to_bus(v)	__phys_to_bus(__virt_to_phys(v))
 | 
			
		||||
#define __bus_to_virt(b)	__phys_to_virt(__bus_to_phys(b))
 | 
			
		||||
#define __pfn_to_bus(p)		__phys_to_bus(__pfn_to_phys(p))
 | 
			
		||||
#define __bus_to_pfn(b)		__phys_to_pfn(__bus_to_phys(b))
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,153 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/platform.h
 | 
			
		||||
 *
 | 
			
		||||
 * Various bits of code used by platform-level code.
 | 
			
		||||
 *
 | 
			
		||||
 * 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 __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
static inline unsigned long ixp2000_reg_read(volatile void *reg)
 | 
			
		||||
{
 | 
			
		||||
	return *((volatile unsigned long *)reg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void ixp2000_reg_write(volatile void *reg, unsigned long val)
 | 
			
		||||
{
 | 
			
		||||
	*((volatile unsigned long *)reg) = val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * On the IXP2400, we can't use XCB=000 due to chip bugs.  We use
 | 
			
		||||
 * XCB=101 instead, but that makes all I/O accesses bufferable.  This
 | 
			
		||||
 * is not a problem in general, but we do have to be slightly more
 | 
			
		||||
 * careful because I/O writes are no longer automatically flushed out
 | 
			
		||||
 * of the write buffer.
 | 
			
		||||
 *
 | 
			
		||||
 * In cases where we want to make sure that a write has been flushed
 | 
			
		||||
 * out of the write buffer before we proceed, for example when masking
 | 
			
		||||
 * a device interrupt before re-enabling IRQs in CPSR, we can use this
 | 
			
		||||
 * function, ixp2000_reg_wrb, which performs a write, a readback, and
 | 
			
		||||
 * issues a dummy instruction dependent on the value of the readback
 | 
			
		||||
 * (mov rX, rX) to make sure that the readback has completed before we
 | 
			
		||||
 * continue.
 | 
			
		||||
 */
 | 
			
		||||
static inline void ixp2000_reg_wrb(volatile void *reg, unsigned long val)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long dummy;
 | 
			
		||||
 | 
			
		||||
	*((volatile unsigned long *)reg) = val;
 | 
			
		||||
 | 
			
		||||
	dummy = *((volatile unsigned long *)reg);
 | 
			
		||||
	__asm__ __volatile__("mov %0, %0" : "+r" (dummy));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Boards may multiplex different devices on the 2nd channel of 
 | 
			
		||||
 * the slowport interface that each need different configuration 
 | 
			
		||||
 * settings.  For example, the IXDP2400 uses channel 2 on the interface 
 | 
			
		||||
 * to access the CPLD, the switch fabric card, and the media card.  Each
 | 
			
		||||
 * one needs a different mode so drivers must save/restore the mode 
 | 
			
		||||
 * before and after each operation.  
 | 
			
		||||
 *
 | 
			
		||||
 * acquire_slowport(&your_config);
 | 
			
		||||
 * ...
 | 
			
		||||
 * do slowport operations
 | 
			
		||||
 * ...
 | 
			
		||||
 * release_slowport();
 | 
			
		||||
 *
 | 
			
		||||
 * Note that while you have the slowport, you are holding a spinlock,
 | 
			
		||||
 * so your code should be written as if you explicitly acquired a lock.
 | 
			
		||||
 *
 | 
			
		||||
 * The configuration only affects device 2 on the slowport, so the
 | 
			
		||||
 * MTD map driver does not acquire/release the slowport.  
 | 
			
		||||
 */
 | 
			
		||||
struct slowport_cfg {
 | 
			
		||||
	unsigned long CCR;	/* Clock divide */
 | 
			
		||||
	unsigned long WTC;	/* Write Timing Control */
 | 
			
		||||
	unsigned long RTC;	/* Read Timing Control */
 | 
			
		||||
	unsigned long PCR;	/* Protocol Control Register */
 | 
			
		||||
	unsigned long ADC;	/* Address/Data Width Control */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ixp2000_acquire_slowport(struct slowport_cfg *, struct slowport_cfg *);
 | 
			
		||||
void ixp2000_release_slowport(struct slowport_cfg *);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXP2400 A0/A1 and  IXP2800 A0/A1/A2 have broken slowport that requires
 | 
			
		||||
 * tweaking of addresses in the MTD driver.
 | 
			
		||||
 */
 | 
			
		||||
static inline unsigned ixp2000_has_broken_slowport(void)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long id = *IXP2000_PRODUCT_ID;
 | 
			
		||||
	unsigned long id_prod = id & (IXP2000_MAJ_PROD_TYPE_MASK |
 | 
			
		||||
				      IXP2000_MIN_PROD_TYPE_MASK);
 | 
			
		||||
	return (((id_prod ==
 | 
			
		||||
		  /* fixed in IXP2400-B0 */
 | 
			
		||||
		  (IXP2000_MAJ_PROD_TYPE_IXP2000 |
 | 
			
		||||
		   IXP2000_MIN_PROD_TYPE_IXP2400)) &&
 | 
			
		||||
		 ((id & IXP2000_MAJ_REV_MASK) == 0)) ||
 | 
			
		||||
		((id_prod ==
 | 
			
		||||
		  /* fixed in IXP2800-B0 */
 | 
			
		||||
		  (IXP2000_MAJ_PROD_TYPE_IXP2000 |
 | 
			
		||||
		   IXP2000_MIN_PROD_TYPE_IXP2800)) &&
 | 
			
		||||
		 ((id & IXP2000_MAJ_REV_MASK) == 0)) ||
 | 
			
		||||
		((id_prod ==
 | 
			
		||||
		  /* fixed in IXP2850-B0 */
 | 
			
		||||
		  (IXP2000_MAJ_PROD_TYPE_IXP2000 |
 | 
			
		||||
		   IXP2000_MIN_PROD_TYPE_IXP2850)) &&
 | 
			
		||||
		 ((id & IXP2000_MAJ_REV_MASK) == 0)));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned int ixp2000_has_flash(void)
 | 
			
		||||
{
 | 
			
		||||
	return ((*IXP2000_STRAP_OPTIONS) & (CFG_BOOT_PROM));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline unsigned int ixp2000_is_pcimaster(void)
 | 
			
		||||
{
 | 
			
		||||
	return ((*IXP2000_STRAP_OPTIONS) & (CFG_PCI_BOOT_HOST));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ixp2000_map_io(void);
 | 
			
		||||
void ixp2000_uart_init(void);
 | 
			
		||||
void ixp2000_init_irq(void);
 | 
			
		||||
void ixp2000_init_time(unsigned long);
 | 
			
		||||
void ixp2000_restart(char, const char *);
 | 
			
		||||
unsigned long ixp2000_gettimeoffset(void);
 | 
			
		||||
 | 
			
		||||
struct pci_sys_data;
 | 
			
		||||
 | 
			
		||||
u32 *ixp2000_pci_config_addr(unsigned int bus, unsigned int devfn, int where);
 | 
			
		||||
void ixp2000_pci_preinit(void);
 | 
			
		||||
int ixp2000_pci_setup(int, struct pci_sys_data*);
 | 
			
		||||
struct pci_bus* ixp2000_pci_scan_bus(int, struct pci_sys_data*);
 | 
			
		||||
int ixp2000_pci_read_config(struct pci_bus*, unsigned int, int, int, u32 *);
 | 
			
		||||
int ixp2000_pci_write_config(struct pci_bus*, unsigned int, int, int, u32);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Several of the IXP2000 systems have banked flash so we need to extend the
 | 
			
		||||
 * flash_platform_data structure with some private pointers
 | 
			
		||||
 */
 | 
			
		||||
struct ixp2000_flash_data {
 | 
			
		||||
	struct flash_platform_data *platform_data;
 | 
			
		||||
	int nr_banks;
 | 
			
		||||
	unsigned long (*bank_setup)(unsigned long);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct ixp2000_i2c_pins {
 | 
			
		||||
	unsigned long sda_pin;
 | 
			
		||||
	unsigned long scl_pin;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif /*  !__ASSEMBLY__ */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,13 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/timex.h
 | 
			
		||||
 *
 | 
			
		||||
 * IXP2000 architecture timex specifications
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Default clock is 50MHz APB, but platform code can override this
 | 
			
		||||
 */
 | 
			
		||||
#define CLOCK_TICK_RATE	50000000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,47 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/include/mach/uncompress.h
 | 
			
		||||
 *
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2002 Intel Corp.
 | 
			
		||||
 *
 | 
			
		||||
 *  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.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/serial_reg.h>
 | 
			
		||||
 | 
			
		||||
#define UART_BASE	0xc0030000
 | 
			
		||||
 | 
			
		||||
#define PHYS(x)          ((volatile unsigned long *)(UART_BASE + x))
 | 
			
		||||
 | 
			
		||||
#define UARTDR          PHYS(0x00)      /* Transmit reg dlab=0 */
 | 
			
		||||
#define UARTDLL         PHYS(0x00)      /* Divisor Latch reg dlab=1*/
 | 
			
		||||
#define UARTDLM         PHYS(0x04)      /* Divisor Latch reg dlab=1*/
 | 
			
		||||
#define UARTIER         PHYS(0x04)      /* Interrupt enable reg */
 | 
			
		||||
#define UARTFCR         PHYS(0x08)      /* FIFO control reg dlab =0*/
 | 
			
		||||
#define UARTLCR         PHYS(0x0c)      /* Control reg */
 | 
			
		||||
#define UARTSR          PHYS(0x14)      /* Status reg */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static inline void putc(int c)
 | 
			
		||||
{
 | 
			
		||||
	int j = 0x1000;
 | 
			
		||||
 | 
			
		||||
	while (--j && !(*UARTSR & UART_LSR_THRE))
 | 
			
		||||
		barrier();
 | 
			
		||||
 | 
			
		||||
	*UARTDR = c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void flush(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define arch_decomp_setup()
 | 
			
		||||
#define arch_decomp_wdog()
 | 
			
		||||
| 
						 | 
				
			
			@ -1,180 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/ixdp2400.c
 | 
			
		||||
 *
 | 
			
		||||
 * IXDP2400 platform support
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/device.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/time.h>
 | 
			
		||||
#include <asm/mach/flash.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2400 timer tick
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static void __init ixdp2400_timer_init(void)
 | 
			
		||||
{
 | 
			
		||||
	int numerator, denominator;
 | 
			
		||||
	int denom_array[] = {2, 4, 8, 16, 1, 2, 4, 8};
 | 
			
		||||
 | 
			
		||||
	numerator = (*(IXDP2400_CPLD_SYS_CLK_M) & 0xFF) *2;
 | 
			
		||||
	denominator = denom_array[(*(IXDP2400_CPLD_SYS_CLK_N) & 0x7)];
 | 
			
		||||
 | 
			
		||||
	ixp2000_init_time(((3125000 * numerator) / (denominator)) / 2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct sys_timer ixdp2400_timer = {
 | 
			
		||||
	.init		= ixdp2400_timer_init,
 | 
			
		||||
	.offset		= ixp2000_gettimeoffset,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2400 PCI
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
void __init ixdp2400_pci_preinit(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00100000);
 | 
			
		||||
	ixp2000_pci_preinit();
 | 
			
		||||
	pcibios_setup("firmware");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ixdp2400_pci_setup(int nr, struct pci_sys_data *sys)
 | 
			
		||||
{
 | 
			
		||||
	sys->mem_offset = 0xe0000000;
 | 
			
		||||
 | 
			
		||||
	ixp2000_pci_setup(nr, sys);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __init ixdp2400_pci_map_irq(const struct pci_dev *dev, u8 slot,
 | 
			
		||||
	u8 pin)
 | 
			
		||||
{
 | 
			
		||||
	if (ixdp2x00_master_npu()) {
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Root bus devices.  Slave NPU is only one with interrupt.
 | 
			
		||||
		 * Everything else, we just return -1 b/c nothing else
 | 
			
		||||
		 * on the root bus has interrupts.
 | 
			
		||||
		 */
 | 
			
		||||
		if(!dev->bus->self) {
 | 
			
		||||
			if(dev->devfn == IXDP2X00_SLAVE_NPU_DEVFN )
 | 
			
		||||
				return IRQ_IXDP2400_INGRESS_NPU;
 | 
			
		||||
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Bridge behind the PMC slot.
 | 
			
		||||
		 * NOTE: Only INTA from the PMC slot is routed. VERY BAD.
 | 
			
		||||
		 */
 | 
			
		||||
		if(dev->bus->self->devfn == IXDP2X00_PMC_DEVFN &&
 | 
			
		||||
			dev->bus->parent->self->devfn == IXDP2X00_P2P_DEVFN &&
 | 
			
		||||
			!dev->bus->parent->self->bus->parent)
 | 
			
		||||
				  return IRQ_IXDP2400_PMC;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Device behind the first bridge
 | 
			
		||||
		 */
 | 
			
		||||
		if(dev->bus->self->devfn == IXDP2X00_P2P_DEVFN) {
 | 
			
		||||
			switch(dev->devfn) {
 | 
			
		||||
				case IXDP2400_MASTER_ENET_DEVFN:	
 | 
			
		||||
					return IRQ_IXDP2400_ENET;	
 | 
			
		||||
			
 | 
			
		||||
				case IXDP2400_MEDIA_DEVFN:
 | 
			
		||||
					return IRQ_IXDP2400_MEDIA_PCI;
 | 
			
		||||
 | 
			
		||||
				case IXDP2400_SWITCH_FABRIC_DEVFN:
 | 
			
		||||
					return IRQ_IXDP2400_SF_PCI;
 | 
			
		||||
 | 
			
		||||
				case IXDP2X00_PMC_DEVFN:
 | 
			
		||||
					return IRQ_IXDP2400_PMC;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return -1;
 | 
			
		||||
	} else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void ixdp2400_pci_postinit(void)
 | 
			
		||||
{
 | 
			
		||||
	struct pci_dev *dev;
 | 
			
		||||
 | 
			
		||||
	if (ixdp2x00_master_npu()) {
 | 
			
		||||
		dev = pci_get_bus_and_slot(1, IXDP2400_SLAVE_ENET_DEVFN);
 | 
			
		||||
		pci_stop_and_remove_bus_device(dev);
 | 
			
		||||
		pci_dev_put(dev);
 | 
			
		||||
	} else {
 | 
			
		||||
		dev = pci_get_bus_and_slot(1, IXDP2400_MASTER_ENET_DEVFN);
 | 
			
		||||
		pci_stop_and_remove_bus_device(dev);
 | 
			
		||||
		pci_dev_put(dev);
 | 
			
		||||
 | 
			
		||||
		ixdp2x00_slave_pci_postinit();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct hw_pci ixdp2400_pci __initdata = {
 | 
			
		||||
	.nr_controllers	= 1,
 | 
			
		||||
	.setup		= ixdp2400_pci_setup,
 | 
			
		||||
	.preinit	= ixdp2400_pci_preinit,
 | 
			
		||||
	.postinit	= ixdp2400_pci_postinit,
 | 
			
		||||
	.scan		= ixp2000_pci_scan_bus,
 | 
			
		||||
	.map_irq	= ixdp2400_pci_map_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int __init ixdp2400_pci_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_ixdp2400())
 | 
			
		||||
		pci_common_init(&ixdp2400_pci);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
subsys_initcall(ixdp2400_pci_init);
 | 
			
		||||
 | 
			
		||||
void __init ixdp2400_init_irq(void)
 | 
			
		||||
{
 | 
			
		||||
	ixdp2x00_init_irq(IXDP2400_CPLD_INT_STAT, IXDP2400_CPLD_INT_MASK, IXDP2400_NR_IRQS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")
 | 
			
		||||
	/* Maintainer: MontaVista Software, Inc. */
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.map_io		= ixdp2x00_map_io,
 | 
			
		||||
	.init_irq	= ixdp2400_init_irq,
 | 
			
		||||
	.timer		= &ixdp2400_timer,
 | 
			
		||||
	.init_machine	= ixdp2x00_init_machine,
 | 
			
		||||
	.restart	= ixp2000_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,295 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/ixdp2800.c
 | 
			
		||||
 *
 | 
			
		||||
 * IXDP2800 platform support
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Jeffrey Daly <jeffrey.daly@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/device.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/time.h>
 | 
			
		||||
#include <asm/mach/flash.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2800 timer tick
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2800_timer_init(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_init_time(50000000);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct sys_timer ixdp2800_timer = {
 | 
			
		||||
	.init		= ixdp2800_timer_init,
 | 
			
		||||
	.offset		= ixp2000_gettimeoffset,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2800 PCI
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static void __init ixdp2800_slave_disable_pci_master(void)
 | 
			
		||||
{
 | 
			
		||||
	*IXP2000_PCI_CMDSTAT &= ~(PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2800_master_wait_for_slave(void)
 | 
			
		||||
{
 | 
			
		||||
	volatile u32 *addr;
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "IXDP2800: waiting for slave NPU to configure "
 | 
			
		||||
			 "its BAR sizes\n");
 | 
			
		||||
 | 
			
		||||
	addr = ixp2000_pci_config_addr(0, IXDP2X00_SLAVE_NPU_DEVFN,
 | 
			
		||||
					PCI_BASE_ADDRESS_1);
 | 
			
		||||
	do {
 | 
			
		||||
		*addr = 0xffffffff;
 | 
			
		||||
		cpu_relax();
 | 
			
		||||
	} while (*addr != 0xfe000008);
 | 
			
		||||
 | 
			
		||||
	addr = ixp2000_pci_config_addr(0, IXDP2X00_SLAVE_NPU_DEVFN,
 | 
			
		||||
					PCI_BASE_ADDRESS_2);
 | 
			
		||||
	do {
 | 
			
		||||
		*addr = 0xffffffff;
 | 
			
		||||
		cpu_relax();
 | 
			
		||||
	} while (*addr != 0xc0000008);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Configure the slave's SDRAM BAR by hand.
 | 
			
		||||
	 */
 | 
			
		||||
	*addr = 0x40000008;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2800_slave_wait_for_master_enable(void)
 | 
			
		||||
{
 | 
			
		||||
	printk(KERN_INFO "IXDP2800: waiting for master NPU to enable us\n");
 | 
			
		||||
 | 
			
		||||
	while ((*IXP2000_PCI_CMDSTAT & PCI_COMMAND_MASTER) == 0)
 | 
			
		||||
		cpu_relax();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init ixdp2800_pci_preinit(void)
 | 
			
		||||
{
 | 
			
		||||
	printk("ixdp2x00_pci_preinit called\n");
 | 
			
		||||
 | 
			
		||||
	*IXP2000_PCI_ADDR_EXT = 0x0001e000;
 | 
			
		||||
 | 
			
		||||
	if (!ixdp2x00_master_npu())
 | 
			
		||||
		ixdp2800_slave_disable_pci_master();
 | 
			
		||||
 | 
			
		||||
	*IXP2000_PCI_SRAM_BASE_ADDR_MASK = (0x2000000 - 1) & ~0x3ffff;
 | 
			
		||||
	*IXP2000_PCI_DRAM_BASE_ADDR_MASK = (0x40000000 - 1) & ~0xfffff;
 | 
			
		||||
 | 
			
		||||
	ixp2000_pci_preinit();
 | 
			
		||||
 | 
			
		||||
	if (ixdp2x00_master_npu()) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * Wait until the slave set its SRAM/SDRAM BAR sizes
 | 
			
		||||
		 * correctly before we proceed to scan and enumerate
 | 
			
		||||
		 * the bus.
 | 
			
		||||
		 */
 | 
			
		||||
		ixdp2800_master_wait_for_slave();
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * We configure the SDRAM BARs by hand because they
 | 
			
		||||
		 * are 1G and fall outside of the regular allocated
 | 
			
		||||
		 * PCI address space.
 | 
			
		||||
		 */
 | 
			
		||||
		*IXP2000_PCI_SDRAM_BAR = 0x00000008;
 | 
			
		||||
	} else {
 | 
			
		||||
		/*
 | 
			
		||||
		 * Wait for the master to complete scanning the bus
 | 
			
		||||
		 * and assigning resources before we proceed to scan
 | 
			
		||||
		 * the bus ourselves.  Set pci=firmware to honor the
 | 
			
		||||
		 * master's resource assignment.
 | 
			
		||||
		 */
 | 
			
		||||
		ixdp2800_slave_wait_for_master_enable();
 | 
			
		||||
		pcibios_setup("firmware");
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * We assign the SDRAM BARs for the two IXP2800 CPUs by hand, outside
 | 
			
		||||
 * of the regular PCI window, because there's only 512M of outbound PCI
 | 
			
		||||
 * memory window on each IXP, while we need 1G for each of the BARs.
 | 
			
		||||
 */
 | 
			
		||||
static void __devinit ixp2800_pci_fixup(struct pci_dev *dev)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_ixdp2800()) {
 | 
			
		||||
		dev->resource[2].start = 0;
 | 
			
		||||
		dev->resource[2].end   = 0;
 | 
			
		||||
		dev->resource[2].flags = 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IXP2800, ixp2800_pci_fixup);
 | 
			
		||||
 | 
			
		||||
static int __init ixdp2800_pci_setup(int nr, struct pci_sys_data *sys)
 | 
			
		||||
{
 | 
			
		||||
	sys->mem_offset = 0x00000000;
 | 
			
		||||
 | 
			
		||||
	ixp2000_pci_setup(nr, sys);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __init ixdp2800_pci_map_irq(const struct pci_dev *dev, u8 slot,
 | 
			
		||||
	u8 pin)
 | 
			
		||||
{
 | 
			
		||||
	if (ixdp2x00_master_npu()) {
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Root bus devices.  Slave NPU is only one with interrupt.
 | 
			
		||||
		 * Everything else, we just return -1 which is invalid.
 | 
			
		||||
		 */
 | 
			
		||||
		if(!dev->bus->self) {
 | 
			
		||||
			if(dev->devfn == IXDP2X00_SLAVE_NPU_DEVFN )
 | 
			
		||||
				return IRQ_IXDP2800_INGRESS_NPU;
 | 
			
		||||
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Bridge behind the PMC slot.
 | 
			
		||||
		 */
 | 
			
		||||
		if(dev->bus->self->devfn == IXDP2X00_PMC_DEVFN &&
 | 
			
		||||
			dev->bus->parent->self->devfn == IXDP2X00_P2P_DEVFN &&
 | 
			
		||||
			!dev->bus->parent->self->bus->parent)
 | 
			
		||||
				  return IRQ_IXDP2800_PMC;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Device behind the first bridge
 | 
			
		||||
		 */
 | 
			
		||||
		if(dev->bus->self->devfn == IXDP2X00_P2P_DEVFN) {
 | 
			
		||||
			switch(dev->devfn) {
 | 
			
		||||
				case IXDP2X00_PMC_DEVFN:
 | 
			
		||||
					return IRQ_IXDP2800_PMC;	
 | 
			
		||||
			
 | 
			
		||||
				case IXDP2800_MASTER_ENET_DEVFN:
 | 
			
		||||
					return IRQ_IXDP2800_EGRESS_ENET;
 | 
			
		||||
 | 
			
		||||
				case IXDP2800_SWITCH_FABRIC_DEVFN:
 | 
			
		||||
					return IRQ_IXDP2800_FABRIC;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return -1;
 | 
			
		||||
	} else return IRQ_IXP2000_PCIB; /* Slave NIC interrupt */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2800_master_enable_slave(void)
 | 
			
		||||
{
 | 
			
		||||
	volatile u32 *addr;
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "IXDP2800: enabling slave NPU\n");
 | 
			
		||||
 | 
			
		||||
	addr = (volatile u32 *)ixp2000_pci_config_addr(0,
 | 
			
		||||
					IXDP2X00_SLAVE_NPU_DEVFN,
 | 
			
		||||
					PCI_COMMAND);
 | 
			
		||||
 | 
			
		||||
	*addr |= PCI_COMMAND_MASTER;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2800_master_wait_for_slave_bus_scan(void)
 | 
			
		||||
{
 | 
			
		||||
	volatile u32 *addr;
 | 
			
		||||
 | 
			
		||||
	printk(KERN_INFO "IXDP2800: waiting for slave to finish bus scan\n");
 | 
			
		||||
 | 
			
		||||
	addr = (volatile u32 *)ixp2000_pci_config_addr(0,
 | 
			
		||||
					IXDP2X00_SLAVE_NPU_DEVFN,
 | 
			
		||||
					PCI_COMMAND);
 | 
			
		||||
	while ((*addr & PCI_COMMAND_MEMORY) == 0)
 | 
			
		||||
		cpu_relax();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2800_slave_signal_bus_scan_completion(void)
 | 
			
		||||
{
 | 
			
		||||
	printk(KERN_INFO "IXDP2800: bus scan done, signaling master\n");
 | 
			
		||||
	*IXP2000_PCI_CMDSTAT |= PCI_COMMAND_MEMORY;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2800_pci_postinit(void)
 | 
			
		||||
{
 | 
			
		||||
	if (!ixdp2x00_master_npu()) {
 | 
			
		||||
		ixdp2x00_slave_pci_postinit();
 | 
			
		||||
		ixdp2800_slave_signal_bus_scan_completion();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct __initdata hw_pci ixdp2800_pci __initdata = {
 | 
			
		||||
	.nr_controllers	= 1,
 | 
			
		||||
	.setup		= ixdp2800_pci_setup,
 | 
			
		||||
	.preinit	= ixdp2800_pci_preinit,
 | 
			
		||||
	.postinit	= ixdp2800_pci_postinit,
 | 
			
		||||
	.scan		= ixp2000_pci_scan_bus,
 | 
			
		||||
	.map_irq	= ixdp2800_pci_map_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int __init ixdp2800_pci_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_ixdp2800()) {
 | 
			
		||||
		struct pci_dev *dev;
 | 
			
		||||
 | 
			
		||||
		pci_common_init(&ixdp2800_pci);
 | 
			
		||||
		if (ixdp2x00_master_npu()) {
 | 
			
		||||
			dev = pci_get_bus_and_slot(1, IXDP2800_SLAVE_ENET_DEVFN);
 | 
			
		||||
			pci_stop_and_remove_bus_device(dev);
 | 
			
		||||
			pci_dev_put(dev);
 | 
			
		||||
 | 
			
		||||
			ixdp2800_master_enable_slave();
 | 
			
		||||
			ixdp2800_master_wait_for_slave_bus_scan();
 | 
			
		||||
		} else {
 | 
			
		||||
			dev = pci_get_bus_and_slot(1, IXDP2800_MASTER_ENET_DEVFN);
 | 
			
		||||
			pci_stop_and_remove_bus_device(dev);
 | 
			
		||||
			pci_dev_put(dev);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
subsys_initcall(ixdp2800_pci_init);
 | 
			
		||||
 | 
			
		||||
void __init ixdp2800_init_irq(void)
 | 
			
		||||
{
 | 
			
		||||
	ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2800_NR_IRQS);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform")
 | 
			
		||||
	/* Maintainer: MontaVista Software, Inc. */
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.map_io		= ixdp2x00_map_io,
 | 
			
		||||
	.init_irq	= ixdp2800_init_irq,
 | 
			
		||||
	.timer		= &ixdp2800_timer,
 | 
			
		||||
	.init_machine	= ixdp2x00_init_machine,
 | 
			
		||||
	.restart	= ixp2000_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,306 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/ixdp2x00.c
 | 
			
		||||
 *
 | 
			
		||||
 * Code common to IXDP2400 and IXDP2800 platforms.
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002 Intel Corp.
 | 
			
		||||
 * 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 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/mm.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/platform_device.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/time.h>
 | 
			
		||||
#include <asm/mach/flash.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
 | 
			
		||||
#include <mach/gpio-ixp2000.h>
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x00 IRQ Initialization
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static volatile unsigned long *board_irq_mask;
 | 
			
		||||
static volatile unsigned long *board_irq_stat;
 | 
			
		||||
static unsigned long board_irq_count;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXDP2400
 | 
			
		||||
/*
 | 
			
		||||
 * Slowport configuration for accessing CPLD registers on IXDP2x00
 | 
			
		||||
 */
 | 
			
		||||
static struct slowport_cfg slowport_cpld_cfg = {
 | 
			
		||||
	.CCR =	SLOWPORT_CCR_DIV_2,
 | 
			
		||||
	.WTC = 0x00000070,
 | 
			
		||||
	.RTC = 0x00000070,
 | 
			
		||||
	.PCR = SLOWPORT_MODE_FLASH,
 | 
			
		||||
	.ADC = SLOWPORT_ADDR_WIDTH_24 | SLOWPORT_DATA_WIDTH_8
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static void ixdp2x00_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long dummy;
 | 
			
		||||
	static struct slowport_cfg old_cfg;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * This is ugly in common code but really don't know
 | 
			
		||||
	 * of a better way to handle it. :(
 | 
			
		||||
	 */
 | 
			
		||||
#ifdef CONFIG_ARCH_IXDP2400
 | 
			
		||||
	if (machine_is_ixdp2400())
 | 
			
		||||
		ixp2000_acquire_slowport(&slowport_cpld_cfg, &old_cfg);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	dummy = *board_irq_mask;
 | 
			
		||||
	dummy |=  IXP2000_BOARD_IRQ_MASK(d->irq);
 | 
			
		||||
	ixp2000_reg_wrb(board_irq_mask, dummy);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXDP2400
 | 
			
		||||
	if (machine_is_ixdp2400())
 | 
			
		||||
		ixp2000_release_slowport(&old_cfg);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2x00_irq_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long dummy;
 | 
			
		||||
	static struct slowport_cfg old_cfg;
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXDP2400
 | 
			
		||||
	if (machine_is_ixdp2400())
 | 
			
		||||
		ixp2000_acquire_slowport(&slowport_cpld_cfg, &old_cfg);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	dummy = *board_irq_mask;
 | 
			
		||||
	dummy &=  ~IXP2000_BOARD_IRQ_MASK(d->irq);
 | 
			
		||||
	ixp2000_reg_wrb(board_irq_mask, dummy);
 | 
			
		||||
 | 
			
		||||
	if (machine_is_ixdp2400()) 
 | 
			
		||||
		ixp2000_release_slowport(&old_cfg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2x00_irq_handler(unsigned int irq, struct irq_desc *desc)
 | 
			
		||||
{
 | 
			
		||||
        volatile u32 ex_interrupt = 0;
 | 
			
		||||
	static struct slowport_cfg old_cfg;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_mask(&desc->irq_data);
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXDP2400
 | 
			
		||||
	if (machine_is_ixdp2400())
 | 
			
		||||
		ixp2000_acquire_slowport(&slowport_cpld_cfg, &old_cfg);
 | 
			
		||||
#endif
 | 
			
		||||
        ex_interrupt = *board_irq_stat & 0xff;
 | 
			
		||||
	if (machine_is_ixdp2400())
 | 
			
		||||
		ixp2000_release_slowport(&old_cfg);
 | 
			
		||||
 | 
			
		||||
	if(!ex_interrupt) {
 | 
			
		||||
		printk(KERN_ERR "Spurious IXDP2x00 CPLD interrupt!\n");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for(i = 0; i < board_irq_count; i++) {
 | 
			
		||||
		if(ex_interrupt & (1 << i))  {
 | 
			
		||||
			int cpld_irq = IXP2000_BOARD_IRQ(0) + i;
 | 
			
		||||
			generic_handle_irq(cpld_irq);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_unmask(&desc->irq_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixdp2x00_cpld_irq_chip = {
 | 
			
		||||
	.irq_ack	= ixdp2x00_irq_mask,
 | 
			
		||||
	.irq_mask	= ixdp2x00_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixdp2x00_irq_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixdp2x00_init_irq(volatile unsigned long *stat_reg, volatile unsigned long *mask_reg, unsigned long nr_of_irqs)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int irq;
 | 
			
		||||
 | 
			
		||||
	ixp2000_init_irq();
 | 
			
		||||
	
 | 
			
		||||
	if (!ixdp2x00_master_npu())
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	board_irq_stat = stat_reg;
 | 
			
		||||
	board_irq_mask = mask_reg;
 | 
			
		||||
	board_irq_count = nr_of_irqs;
 | 
			
		||||
 | 
			
		||||
	*board_irq_mask = 0xffffffff;
 | 
			
		||||
 | 
			
		||||
	for(irq = IXP2000_BOARD_IRQ(0); irq < IXP2000_BOARD_IRQ(board_irq_count); irq++) {
 | 
			
		||||
		irq_set_chip_and_handler(irq, &ixdp2x00_cpld_irq_chip,
 | 
			
		||||
					 handle_level_irq);
 | 
			
		||||
		set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Hook into PCI interrupt */
 | 
			
		||||
	irq_set_chained_handler(IRQ_IXP2000_PCIB, ixdp2x00_irq_handler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x00 memory map
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct map_desc ixdp2x00_io_desc __initdata = {
 | 
			
		||||
	.virtual	= IXDP2X00_VIRT_CPLD_BASE, 
 | 
			
		||||
	.pfn		= __phys_to_pfn(IXDP2X00_PHYS_CPLD_BASE),
 | 
			
		||||
	.length		= IXDP2X00_CPLD_SIZE,
 | 
			
		||||
	.type		= MT_DEVICE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixdp2x00_map_io(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_map_io();	
 | 
			
		||||
 | 
			
		||||
	iotable_init(&ixdp2x00_io_desc, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x00-common PCI init
 | 
			
		||||
 *
 | 
			
		||||
 * The IXDP2[48]00 has a horrid PCI bus layout. Basically the board 
 | 
			
		||||
 * contains two NPUs (ingress and egress) connected over PCI,  both running 
 | 
			
		||||
 * instances  of the kernel. So far so good. Peers on the PCI bus running 
 | 
			
		||||
 * Linux is a common design in telecom systems. The problem is that instead 
 | 
			
		||||
 * of all the devices being controlled by a single host, different
 | 
			
		||||
 * devices are controlled by different NPUs on the same bus, leading to
 | 
			
		||||
 * multiple hosts on the bus. The exact bus layout looks like:
 | 
			
		||||
 *
 | 
			
		||||
 *                   Bus 0
 | 
			
		||||
 *    Master NPU <-------------------+-------------------> Slave NPU
 | 
			
		||||
 *                                   |
 | 
			
		||||
 *                                   |
 | 
			
		||||
 *                                  P2P 
 | 
			
		||||
 *                                   |
 | 
			
		||||
 *
 | 
			
		||||
 *                  Bus 1            |
 | 
			
		||||
 *               <--+------+---------+---------+------+-->
 | 
			
		||||
 *                  |      |         |         |      |
 | 
			
		||||
 *                  |      |         |         |      |
 | 
			
		||||
 *             ... Dev    PMC       Media     Eth0   Eth1 ...
 | 
			
		||||
 *
 | 
			
		||||
 * The master controls all but Eth1, which is controlled by the
 | 
			
		||||
 * slave. What this means is that the both the master and the slave
 | 
			
		||||
 * have to scan the bus, but only one of them can enumerate the bus.
 | 
			
		||||
 * In addition, after the bus is scanned, each kernel must remove
 | 
			
		||||
 * the device(s) it does not control from the PCI dev list otherwise
 | 
			
		||||
 * a driver on each NPU will try to manage it and we will have horrible
 | 
			
		||||
 * conflicts. Oh..and the slave NPU needs to see the master NPU
 | 
			
		||||
 * for Intel's drivers to work properly. Closed source drivers...
 | 
			
		||||
 *
 | 
			
		||||
 * The way we deal with this is fairly simple but ugly:
 | 
			
		||||
 *
 | 
			
		||||
 * 1) Let master scan and enumerate the bus completely.
 | 
			
		||||
 * 2) Master deletes Eth1 from device list.
 | 
			
		||||
 * 3) Slave scans bus and then deletes all but Eth1 (Eth0 on slave)
 | 
			
		||||
 *    from device list.
 | 
			
		||||
 * 4) Find HW designers and LART them.
 | 
			
		||||
 *
 | 
			
		||||
 * The boards also do not do normal PCI IRQ routing, or any sort of 
 | 
			
		||||
 * sensical  swizzling, so we just need to check where on the  bus a
 | 
			
		||||
 * device sits and figure out to which CPLD pin the interrupt is routed.
 | 
			
		||||
 * See ixdp2[48]00.c files.
 | 
			
		||||
 *
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
void ixdp2x00_slave_pci_postinit(void)
 | 
			
		||||
{
 | 
			
		||||
	struct pci_dev *dev;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Remove PMC device is there is one
 | 
			
		||||
	 */
 | 
			
		||||
	if((dev = pci_get_bus_and_slot(1, IXDP2X00_PMC_DEVFN))) {
 | 
			
		||||
		pci_stop_and_remove_bus_device(dev);
 | 
			
		||||
		pci_dev_put(dev);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dev = pci_get_bus_and_slot(0, IXDP2X00_21555_DEVFN);
 | 
			
		||||
	pci_stop_and_remove_bus_device(dev);
 | 
			
		||||
	pci_dev_put(dev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**************************************************************************
 | 
			
		||||
 * IXDP2x00 Machine Setup
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct flash_platform_data ixdp2x00_platform_data = {
 | 
			
		||||
	.map_name	= "cfi_probe",
 | 
			
		||||
	.width		= 1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct ixp2000_flash_data ixdp2x00_flash_data = {
 | 
			
		||||
	.platform_data	= &ixdp2x00_platform_data,
 | 
			
		||||
	.nr_banks	= 1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixdp2x00_flash_resource = {
 | 
			
		||||
	.start		= 0xc4000000,
 | 
			
		||||
	.end		= 0xc4000000 + 0x00ffffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixdp2x00_flash = {
 | 
			
		||||
	.name		= "IXP2000-Flash",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data = &ixdp2x00_flash_data,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &ixdp2x00_flash_resource,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct ixp2000_i2c_pins ixdp2x00_i2c_gpio_pins = {
 | 
			
		||||
	.sda_pin	= IXDP2X00_GPIO_SDA,
 | 
			
		||||
	.scl_pin	= IXDP2X00_GPIO_SCL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixdp2x00_i2c_controller = {
 | 
			
		||||
	.name		= "IXP2000-I2C",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data = &ixdp2x00_i2c_gpio_pins,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 0
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device *ixdp2x00_devices[] __initdata = {
 | 
			
		||||
	&ixdp2x00_flash,
 | 
			
		||||
	&ixdp2x00_i2c_controller
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixdp2x00_init_machine(void)
 | 
			
		||||
{
 | 
			
		||||
	gpio_line_set(IXDP2X00_GPIO_I2C_ENABLE, 1);
 | 
			
		||||
	gpio_line_config(IXDP2X00_GPIO_I2C_ENABLE, GPIO_OUT);
 | 
			
		||||
 | 
			
		||||
	platform_add_devices(ixdp2x00_devices, ARRAY_SIZE(ixdp2x00_devices));
 | 
			
		||||
	ixp2000_uart_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,483 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/ixdp2x01.c
 | 
			
		||||
 *
 | 
			
		||||
 * Code common to Intel IXDP2401 and IXDP2801 platforms
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Andrzej Mialkowski <andrzej.mialkowski@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002-2003 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/serial_core.h>
 | 
			
		||||
#include <linux/platform_device.h>
 | 
			
		||||
#include <linux/serial_8250.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/page.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/time.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
#include <asm/mach/flash.h>
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x01 IRQ Handling
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static void ixdp2x01_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_wrb(IXDP2X01_INT_MASK_SET_REG,
 | 
			
		||||
				IXP2000_BOARD_IRQ_MASK(d->irq));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2x01_irq_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXDP2X01_INT_MASK_CLR_REG,
 | 
			
		||||
				IXP2000_BOARD_IRQ_MASK(d->irq));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static u32 valid_irq_mask;
 | 
			
		||||
 | 
			
		||||
static void ixdp2x01_irq_handler(unsigned int irq, struct irq_desc *desc)
 | 
			
		||||
{
 | 
			
		||||
	u32 ex_interrupt;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_mask(&desc->irq_data);
 | 
			
		||||
 | 
			
		||||
	ex_interrupt = *IXDP2X01_INT_STAT_REG & valid_irq_mask;
 | 
			
		||||
 | 
			
		||||
	if (!ex_interrupt) {
 | 
			
		||||
		printk(KERN_ERR "Spurious IXDP2X01 CPLD interrupt!\n");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < IXP2000_BOARD_IRQS; i++) {
 | 
			
		||||
		if (ex_interrupt & (1 << i)) {
 | 
			
		||||
			int cpld_irq = IXP2000_BOARD_IRQ(0) + i;
 | 
			
		||||
			generic_handle_irq(cpld_irq);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_unmask(&desc->irq_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixdp2x01_irq_chip = {
 | 
			
		||||
	.irq_mask	= ixdp2x01_irq_mask,
 | 
			
		||||
	.irq_ack	= ixdp2x01_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixdp2x01_irq_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * We only do anything if we are the master NPU on the board.
 | 
			
		||||
 * The slave NPU only has the ethernet chip going directly to
 | 
			
		||||
 * the PCIB interrupt input.
 | 
			
		||||
 */
 | 
			
		||||
void __init ixdp2x01_init_irq(void)
 | 
			
		||||
{
 | 
			
		||||
	int irq = 0;
 | 
			
		||||
 | 
			
		||||
	/* initialize chip specific interrupts */
 | 
			
		||||
	ixp2000_init_irq();
 | 
			
		||||
 | 
			
		||||
	if (machine_is_ixdp2401())
 | 
			
		||||
		valid_irq_mask = IXDP2401_VALID_IRQ_MASK;
 | 
			
		||||
	else
 | 
			
		||||
		valid_irq_mask = IXDP2801_VALID_IRQ_MASK;
 | 
			
		||||
 | 
			
		||||
	/* Mask all interrupts from CPLD, disable simulation */
 | 
			
		||||
	ixp2000_reg_write(IXDP2X01_INT_MASK_SET_REG, 0xffffffff);
 | 
			
		||||
	ixp2000_reg_wrb(IXDP2X01_INT_SIM_REG, 0);
 | 
			
		||||
 | 
			
		||||
	for (irq = NR_IXP2000_IRQS; irq < NR_IXDP2X01_IRQS; irq++) {
 | 
			
		||||
		if (irq & valid_irq_mask) {
 | 
			
		||||
			irq_set_chip_and_handler(irq, &ixdp2x01_irq_chip,
 | 
			
		||||
						 handle_level_irq);
 | 
			
		||||
			set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
		} else {
 | 
			
		||||
			set_irq_flags(irq, 0);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Hook into PCI interrupts */
 | 
			
		||||
	irq_set_chained_handler(IRQ_IXP2000_PCIB, ixdp2x01_irq_handler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x01 memory map
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct map_desc ixdp2x01_io_desc __initdata = {
 | 
			
		||||
	.virtual	= IXDP2X01_VIRT_CPLD_BASE, 
 | 
			
		||||
	.pfn		= __phys_to_pfn(IXDP2X01_PHYS_CPLD_BASE),
 | 
			
		||||
	.length		= IXDP2X01_CPLD_REGION_SIZE,
 | 
			
		||||
	.type		= MT_DEVICE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2x01_map_io(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_map_io();
 | 
			
		||||
	iotable_init(&ixdp2x01_io_desc, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x01 serial ports
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct plat_serial8250_port ixdp2x01_serial_port1[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.mapbase	= (unsigned long)IXDP2X01_UART1_PHYS_BASE,
 | 
			
		||||
		.membase	= (char *)IXDP2X01_UART1_VIRT_BASE,
 | 
			
		||||
		.irq		= IRQ_IXDP2X01_UART1,
 | 
			
		||||
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
 | 
			
		||||
		.iotype		= UPIO_MEM32,
 | 
			
		||||
		.regshift	= 2,
 | 
			
		||||
		.uartclk	= IXDP2X01_UART_CLK,
 | 
			
		||||
	},
 | 
			
		||||
	{ }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixdp2x01_uart_resource1 = {
 | 
			
		||||
	.start		= IXDP2X01_UART1_PHYS_BASE,
 | 
			
		||||
	.end		= IXDP2X01_UART1_PHYS_BASE + 0xffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixdp2x01_serial_device1 = {
 | 
			
		||||
	.name		= "serial8250",
 | 
			
		||||
	.id		= PLAT8250_DEV_PLATFORM1,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data		= ixdp2x01_serial_port1,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &ixdp2x01_uart_resource1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct plat_serial8250_port ixdp2x01_serial_port2[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.mapbase	= (unsigned long)IXDP2X01_UART2_PHYS_BASE,
 | 
			
		||||
		.membase	= (char *)IXDP2X01_UART2_VIRT_BASE,
 | 
			
		||||
		.irq		= IRQ_IXDP2X01_UART2,
 | 
			
		||||
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
 | 
			
		||||
		.iotype		= UPIO_MEM32,
 | 
			
		||||
		.regshift	= 2,
 | 
			
		||||
		.uartclk	= IXDP2X01_UART_CLK,
 | 
			
		||||
	}, 
 | 
			
		||||
	{ }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixdp2x01_uart_resource2 = {
 | 
			
		||||
	.start		= IXDP2X01_UART2_PHYS_BASE,
 | 
			
		||||
	.end		= IXDP2X01_UART2_PHYS_BASE + 0xffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixdp2x01_serial_device2 = {
 | 
			
		||||
	.name		= "serial8250",
 | 
			
		||||
	.id		= PLAT8250_DEV_PLATFORM2,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data		= ixdp2x01_serial_port2,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &ixdp2x01_uart_resource2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ixdp2x01_uart_init(void)
 | 
			
		||||
{
 | 
			
		||||
	platform_device_register(&ixdp2x01_serial_device1);
 | 
			
		||||
	platform_device_register(&ixdp2x01_serial_device2);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x01 timer tick configuration
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static unsigned int ixdp2x01_clock;
 | 
			
		||||
 | 
			
		||||
static int __init ixdp2x01_clock_setup(char *str)
 | 
			
		||||
{
 | 
			
		||||
	ixdp2x01_clock = simple_strtoul(str, NULL, 10);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__setup("ixdp2x01_clock=", ixdp2x01_clock_setup);
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2x01_timer_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (!ixdp2x01_clock)
 | 
			
		||||
		ixdp2x01_clock = 50000000;
 | 
			
		||||
 | 
			
		||||
	ixp2000_init_time(ixdp2x01_clock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct sys_timer ixdp2x01_timer = {
 | 
			
		||||
	.init		= ixdp2x01_timer_init,
 | 
			
		||||
	.offset		= ixp2000_gettimeoffset,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x01 PCI
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
void __init ixdp2x01_pci_preinit(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_write(IXP2000_PCI_ADDR_EXT, 0x00000000);
 | 
			
		||||
	ixp2000_pci_preinit();
 | 
			
		||||
	pcibios_setup("firmware");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define DEVPIN(dev, pin) ((pin) | ((dev) << 3))
 | 
			
		||||
 | 
			
		||||
static int __init ixdp2x01_pci_map_irq(const struct pci_dev *dev, u8 slot,
 | 
			
		||||
	u8 pin)
 | 
			
		||||
{
 | 
			
		||||
	u8 bus = dev->bus->number;
 | 
			
		||||
	u32 devpin = DEVPIN(PCI_SLOT(dev->devfn), pin);
 | 
			
		||||
	struct pci_bus *tmp_bus = dev->bus;
 | 
			
		||||
 | 
			
		||||
	/* Primary bus, no interrupts here */
 | 
			
		||||
	if (bus == 0) {
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Lookup first leaf in bus tree */
 | 
			
		||||
	while ((tmp_bus->parent != NULL) && (tmp_bus->parent->parent != NULL)) {
 | 
			
		||||
		tmp_bus = tmp_bus->parent;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* Select between known bridges */
 | 
			
		||||
	switch (tmp_bus->self->devfn | (tmp_bus->self->bus->number << 8)) {
 | 
			
		||||
	/* Device is located after first MB bridge */
 | 
			
		||||
	case 0x0008:
 | 
			
		||||
		if (tmp_bus == dev->bus) {
 | 
			
		||||
			/* Device is located directly after first MB bridge */
 | 
			
		||||
			switch (devpin) {
 | 
			
		||||
			case DEVPIN(1, 1):	/* Onboard 82546 ch 0 */
 | 
			
		||||
				if (machine_is_ixdp2401())
 | 
			
		||||
					return IRQ_IXDP2401_INTA_82546;
 | 
			
		||||
				return -1;
 | 
			
		||||
			case DEVPIN(1, 2):	/* Onboard 82546 ch 1 */
 | 
			
		||||
				if (machine_is_ixdp2401())
 | 
			
		||||
					return IRQ_IXDP2401_INTB_82546;
 | 
			
		||||
				return -1;
 | 
			
		||||
			case DEVPIN(0, 1):	/* PMC INTA# */
 | 
			
		||||
				return IRQ_IXDP2X01_SPCI_PMC_INTA;
 | 
			
		||||
			case DEVPIN(0, 2):	/* PMC INTB# */
 | 
			
		||||
				return IRQ_IXDP2X01_SPCI_PMC_INTB;
 | 
			
		||||
			case DEVPIN(0, 3):	/* PMC INTC# */
 | 
			
		||||
				return IRQ_IXDP2X01_SPCI_PMC_INTC;
 | 
			
		||||
			case DEVPIN(0, 4):	/* PMC INTD# */
 | 
			
		||||
				return IRQ_IXDP2X01_SPCI_PMC_INTD;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case 0x0010:
 | 
			
		||||
		if (tmp_bus == dev->bus) {
 | 
			
		||||
			/* Device is located directly after second MB bridge */
 | 
			
		||||
			/* Secondary bus of second bridge */
 | 
			
		||||
			switch (devpin) {
 | 
			
		||||
			case DEVPIN(0, 1):	/* DB#0 */
 | 
			
		||||
				return IRQ_IXDP2X01_SPCI_DB_0;
 | 
			
		||||
			case DEVPIN(1, 1):	/* DB#1 */
 | 
			
		||||
				return IRQ_IXDP2X01_SPCI_DB_1;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Device is located indirectly after second MB bridge */
 | 
			
		||||
			/* Not supported now */
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int ixdp2x01_pci_setup(int nr, struct pci_sys_data *sys)
 | 
			
		||||
{
 | 
			
		||||
	sys->mem_offset = 0xe0000000;
 | 
			
		||||
 | 
			
		||||
	if (machine_is_ixdp2801() || machine_is_ixdp28x5())
 | 
			
		||||
		sys->mem_offset -= ((*IXP2000_PCI_ADDR_EXT & 0xE000) << 16);
 | 
			
		||||
 | 
			
		||||
	return ixp2000_pci_setup(nr, sys);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct hw_pci ixdp2x01_pci __initdata = {
 | 
			
		||||
	.nr_controllers	= 1,
 | 
			
		||||
	.setup		= ixdp2x01_pci_setup,
 | 
			
		||||
	.preinit	= ixdp2x01_pci_preinit,
 | 
			
		||||
	.scan		= ixp2000_pci_scan_bus,
 | 
			
		||||
	.map_irq	= ixdp2x01_pci_map_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int __init ixdp2x01_pci_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_ixdp2401() || machine_is_ixdp2801() ||\
 | 
			
		||||
		machine_is_ixdp28x5())
 | 
			
		||||
		pci_common_init(&ixdp2x01_pci);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
subsys_initcall(ixdp2x01_pci_init);
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXDP2x01 Machine Initialization
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct flash_platform_data ixdp2x01_flash_platform_data = {
 | 
			
		||||
	.map_name	= "cfi_probe",
 | 
			
		||||
	.width		= 1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static unsigned long ixdp2x01_flash_bank_setup(unsigned long ofs)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_wrb(IXDP2X01_CPLD_FLASH_REG,
 | 
			
		||||
		((ofs >> IXDP2X01_FLASH_WINDOW_BITS) | IXDP2X01_CPLD_FLASH_INTERN));
 | 
			
		||||
	return (ofs & IXDP2X01_FLASH_WINDOW_MASK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct ixp2000_flash_data ixdp2x01_flash_data = {
 | 
			
		||||
	.platform_data	= &ixdp2x01_flash_platform_data,
 | 
			
		||||
	.bank_setup	= ixdp2x01_flash_bank_setup
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixdp2x01_flash_resource = {
 | 
			
		||||
	.start		= 0xc4000000,
 | 
			
		||||
	.end		= 0xc4000000 + 0x01ffffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixdp2x01_flash = {
 | 
			
		||||
	.name		= "IXP2000-Flash",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data = &ixdp2x01_flash_data,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &ixdp2x01_flash_resource,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct ixp2000_i2c_pins ixdp2x01_i2c_gpio_pins = {
 | 
			
		||||
	.sda_pin	= IXDP2X01_GPIO_SDA,
 | 
			
		||||
	.scl_pin	= IXDP2X01_GPIO_SCL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixdp2x01_i2c_controller = {
 | 
			
		||||
	.name		= "IXP2000-I2C",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data = &ixdp2x01_i2c_gpio_pins,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 0
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device *ixdp2x01_devices[] __initdata = {
 | 
			
		||||
	&ixdp2x01_flash,
 | 
			
		||||
	&ixdp2x01_i2c_controller
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2x01_init_machine(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp2000_reg_wrb(IXDP2X01_CPLD_FLASH_REG,
 | 
			
		||||
		(IXDP2X01_CPLD_FLASH_BANK_MASK | IXDP2X01_CPLD_FLASH_INTERN));
 | 
			
		||||
	
 | 
			
		||||
	ixdp2x01_flash_data.nr_banks =
 | 
			
		||||
		((*IXDP2X01_CPLD_FLASH_REG & IXDP2X01_CPLD_FLASH_BANK_MASK) + 1);
 | 
			
		||||
 | 
			
		||||
	platform_add_devices(ixdp2x01_devices, ARRAY_SIZE(ixdp2x01_devices));
 | 
			
		||||
	ixp2000_uart_init();
 | 
			
		||||
	ixdp2x01_uart_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2401_restart(char mode, const char *cmd)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * Reset flash banking register so that we are pointing at
 | 
			
		||||
	 * RedBoot bank.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_reg_write(IXDP2X01_CPLD_FLASH_REG,
 | 
			
		||||
				((0 >> IXDP2X01_FLASH_WINDOW_BITS)
 | 
			
		||||
					| IXDP2X01_CPLD_FLASH_INTERN));
 | 
			
		||||
	ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0xffffffff);
 | 
			
		||||
 | 
			
		||||
	ixp2000_restart(mode, cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp280x_restart(char mode, const char *cmd)
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * On IXDP2801 we need to write this magic sequence to the CPLD
 | 
			
		||||
	 * to cause a complete reset of the CPU and all external devices
 | 
			
		||||
	 * and move the flash bank register back to 0.
 | 
			
		||||
	 */
 | 
			
		||||
	unsigned long reset_reg = *IXDP2X01_CPLD_RESET_REG;
 | 
			
		||||
 | 
			
		||||
	reset_reg = 0x55AA0000 | (reset_reg & 0x0000FFFF);
 | 
			
		||||
	ixp2000_reg_write(IXDP2X01_CPLD_RESET_REG, reset_reg);
 | 
			
		||||
	ixp2000_reg_wrb(IXDP2X01_CPLD_RESET_REG, 0x80000000);
 | 
			
		||||
 | 
			
		||||
	ixp2000_restart(mode, cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXDP2401
 | 
			
		||||
MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform")
 | 
			
		||||
	/* Maintainer: MontaVista Software, Inc. */
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.map_io		= ixdp2x01_map_io,
 | 
			
		||||
	.init_irq	= ixdp2x01_init_irq,
 | 
			
		||||
	.timer		= &ixdp2x01_timer,
 | 
			
		||||
	.init_machine	= ixdp2x01_init_machine,
 | 
			
		||||
	.restart	= ixdp2401_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef CONFIG_ARCH_IXDP2801
 | 
			
		||||
MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform")
 | 
			
		||||
	/* Maintainer: MontaVista Software, Inc. */
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.map_io		= ixdp2x01_map_io,
 | 
			
		||||
	.init_irq	= ixdp2x01_init_irq,
 | 
			
		||||
	.timer		= &ixdp2x01_timer,
 | 
			
		||||
	.init_machine	= ixdp2x01_init_machine,
 | 
			
		||||
	.restart	= ixdp280x_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP28x5 is basically an IXDP2801 with a different CPU but Intel
 | 
			
		||||
 * changed the machine ID in the bootloader
 | 
			
		||||
 */
 | 
			
		||||
MACHINE_START(IXDP28X5, "Intel IXDP2805/2855 Development Platform")
 | 
			
		||||
	/* Maintainer: MontaVista Software, Inc. */
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.map_io		= ixdp2x01_map_io,
 | 
			
		||||
	.init_irq	= ixdp2x01_init_irq,
 | 
			
		||||
	.timer		= &ixdp2x01_timer,
 | 
			
		||||
	.init_machine	= ixdp2x01_init_machine,
 | 
			
		||||
	.restart	= ixdp280x_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,252 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp2000/pci.c
 | 
			
		||||
 *
 | 
			
		||||
 * PCI routines for IXDP2400/IXDP2800 boards
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintained by: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2002 Intel Corp.
 | 
			
		||||
 * 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 as published by the
 | 
			
		||||
 *  Free Software Foundation;  either version 2 of the  License, or (at your
 | 
			
		||||
 *  option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
 | 
			
		||||
static volatile int pci_master_aborts = 0;
 | 
			
		||||
 | 
			
		||||
static int clear_master_aborts(void);
 | 
			
		||||
 | 
			
		||||
u32 *
 | 
			
		||||
ixp2000_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
 | 
			
		||||
{
 | 
			
		||||
	u32 *paddress;
 | 
			
		||||
 | 
			
		||||
	if (PCI_SLOT(devfn) > 7)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	/* Must be dword aligned */
 | 
			
		||||
	where &= ~3;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * For top bus, generate type 0, else type 1
 | 
			
		||||
	 */
 | 
			
		||||
	if (!bus_nr) {
 | 
			
		||||
		/* only bits[23:16] are used for IDSEL */
 | 
			
		||||
		paddress = (u32 *) (IXP2000_PCI_CFG0_VIRT_BASE
 | 
			
		||||
				    | (1 << (PCI_SLOT(devfn) + 16))
 | 
			
		||||
				    | (PCI_FUNC(devfn) << 8) | where);
 | 
			
		||||
	} else {
 | 
			
		||||
		paddress = (u32 *) (IXP2000_PCI_CFG1_VIRT_BASE 
 | 
			
		||||
				    | (bus_nr << 16)
 | 
			
		||||
				    | (PCI_SLOT(devfn) << 11)
 | 
			
		||||
				    | (PCI_FUNC(devfn) << 8) | where);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return paddress;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mask table, bits to mask for quantity of size 1, 2 or 4 bytes.
 | 
			
		||||
 * 0 and 3 are not valid indexes...
 | 
			
		||||
 */
 | 
			
		||||
static u32 bytemask[] = {
 | 
			
		||||
	/*0*/	0,
 | 
			
		||||
	/*1*/	0xff,
 | 
			
		||||
	/*2*/	0xffff,
 | 
			
		||||
	/*3*/	0,
 | 
			
		||||
	/*4*/	0xffffffff,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int ixp2000_pci_read_config(struct pci_bus *bus, unsigned int devfn, int where,
 | 
			
		||||
				int size, u32 *value)
 | 
			
		||||
{
 | 
			
		||||
	u32 n;
 | 
			
		||||
	u32 *addr;
 | 
			
		||||
 | 
			
		||||
	n = where % 4;
 | 
			
		||||
 | 
			
		||||
	addr = ixp2000_pci_config_addr(bus->number, devfn, where);
 | 
			
		||||
	if (!addr)
 | 
			
		||||
		return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
 | 
			
		||||
	pci_master_aborts = 0;
 | 
			
		||||
	*value = (*addr >> (8*n)) & bytemask[size];
 | 
			
		||||
	if (pci_master_aborts) {
 | 
			
		||||
		pci_master_aborts = 0;
 | 
			
		||||
		*value = 0xffffffff;
 | 
			
		||||
		return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return PCIBIOS_SUCCESSFUL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * We don't do error checks by calling clear_master_aborts() b/c the
 | 
			
		||||
 * assumption is that the caller did a read first to make sure a device
 | 
			
		||||
 * exists.
 | 
			
		||||
 */
 | 
			
		||||
int ixp2000_pci_write_config(struct pci_bus *bus, unsigned int devfn, int where,
 | 
			
		||||
				int size, u32 value)
 | 
			
		||||
{
 | 
			
		||||
	u32 mask;
 | 
			
		||||
	u32 *addr;
 | 
			
		||||
	u32 temp;
 | 
			
		||||
 | 
			
		||||
	mask = ~(bytemask[size] << ((where % 0x4) * 8));
 | 
			
		||||
	addr = ixp2000_pci_config_addr(bus->number, devfn, where);
 | 
			
		||||
	if (!addr)
 | 
			
		||||
		return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
	temp = (u32) (value) << ((where % 0x4) * 8);
 | 
			
		||||
	*addr = (*addr & mask) | temp;
 | 
			
		||||
 | 
			
		||||
	clear_master_aborts();
 | 
			
		||||
 | 
			
		||||
	return PCIBIOS_SUCCESSFUL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static struct pci_ops ixp2000_pci_ops = {
 | 
			
		||||
	.read	= ixp2000_pci_read_config,
 | 
			
		||||
	.write	= ixp2000_pci_write_config
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct pci_bus *ixp2000_pci_scan_bus(int nr, struct pci_sys_data *sysdata)
 | 
			
		||||
{
 | 
			
		||||
	return pci_scan_root_bus(NULL, sysdata->busnr, &ixp2000_pci_ops,
 | 
			
		||||
				 sysdata, &sysdata->resources);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int ixp2000_pci_abort_handler(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	volatile u32 temp;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	pci_master_aborts = 1;
 | 
			
		||||
 | 
			
		||||
	local_irq_save(flags);
 | 
			
		||||
	temp = *(IXP2000_PCI_CONTROL);
 | 
			
		||||
	if (temp & ((1 << 8) | (1 << 5))) {
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_PCI_CONTROL, temp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	temp = *(IXP2000_PCI_CMDSTAT);
 | 
			
		||||
	if (temp & (1 << 29)) {
 | 
			
		||||
		while (temp & (1 << 29)) {	
 | 
			
		||||
			ixp2000_reg_write(IXP2000_PCI_CMDSTAT, temp);
 | 
			
		||||
			temp = *(IXP2000_PCI_CMDSTAT);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	local_irq_restore(flags);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If it was an imprecise abort, then we need to correct the
 | 
			
		||||
	 * return address to be _after_ the instruction.
 | 
			
		||||
	 */
 | 
			
		||||
	if (fsr & (1 << 10))
 | 
			
		||||
		regs->ARM_pc += 4;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
clear_master_aborts(void)
 | 
			
		||||
{
 | 
			
		||||
	volatile u32 temp;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	local_irq_save(flags);
 | 
			
		||||
	temp = *(IXP2000_PCI_CONTROL);
 | 
			
		||||
	if (temp & ((1 << 8) | (1 << 5))) {
 | 
			
		||||
		ixp2000_reg_wrb(IXP2000_PCI_CONTROL, temp);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	temp = *(IXP2000_PCI_CMDSTAT);
 | 
			
		||||
	if (temp & (1 << 29)) {
 | 
			
		||||
		while (temp & (1 << 29)) {
 | 
			
		||||
			ixp2000_reg_write(IXP2000_PCI_CMDSTAT, temp);
 | 
			
		||||
			temp = *(IXP2000_PCI_CMDSTAT);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	local_irq_restore(flags);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init
 | 
			
		||||
ixp2000_pci_preinit(void)
 | 
			
		||||
{
 | 
			
		||||
	pci_set_flags(0);
 | 
			
		||||
 | 
			
		||||
	pcibios_min_io = 0;
 | 
			
		||||
	pcibios_min_mem = 0;
 | 
			
		||||
 | 
			
		||||
#ifndef CONFIG_IXP2000_SUPPORT_BROKEN_PCI_IO
 | 
			
		||||
	/*
 | 
			
		||||
	 * Configure the PCI unit to properly byteswap I/O transactions,
 | 
			
		||||
	 * and verify that it worked.
 | 
			
		||||
	 */
 | 
			
		||||
	ixp2000_reg_write(IXP2000_PCI_CONTROL,
 | 
			
		||||
			  (*IXP2000_PCI_CONTROL | PCI_CONTROL_IEE));
 | 
			
		||||
 | 
			
		||||
	if ((*IXP2000_PCI_CONTROL & PCI_CONTROL_IEE) == 0)
 | 
			
		||||
		panic("IXP2000: PCI I/O is broken on this ixp model, and "
 | 
			
		||||
			"the needed workaround has not been configured in");
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	hook_fault_code(16+6, ixp2000_pci_abort_handler, SIGBUS, 0,
 | 
			
		||||
				"PCI config cycle to non-existent device");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXP2000 systems often have large resource requirements, so we just
 | 
			
		||||
 * use our own resource space.
 | 
			
		||||
 */
 | 
			
		||||
static struct resource ixp2000_pci_mem_space = {
 | 
			
		||||
	.start	= 0xe0000000,
 | 
			
		||||
	.end	= 0xffffffff,
 | 
			
		||||
	.flags	= IORESOURCE_MEM,
 | 
			
		||||
	.name	= "PCI Mem Space"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixp2000_pci_io_space = {
 | 
			
		||||
	.start	= 0x00010000,
 | 
			
		||||
	.end	= 0x0001ffff,
 | 
			
		||||
	.flags	= IORESOURCE_IO,
 | 
			
		||||
	.name	= "PCI I/O Space"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int ixp2000_pci_setup(int nr, struct pci_sys_data *sys)
 | 
			
		||||
{
 | 
			
		||||
	if (nr >= 1)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	pci_add_resource_offset(&sys->resources,
 | 
			
		||||
				&ixp2000_pci_io_space, sys->io_offset);
 | 
			
		||||
	pci_add_resource_offset(&sys->resources,
 | 
			
		||||
				&ixp2000_pci_mem_space, sys->mem_offset);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1,25 +0,0 @@
 | 
			
		|||
if ARCH_IXP23XX
 | 
			
		||||
 | 
			
		||||
config ARCH_SUPPORTS_BIG_ENDIAN
 | 
			
		||||
	bool
 | 
			
		||||
	default y
 | 
			
		||||
 | 
			
		||||
menu "Intel IXP23xx Implementation Options"
 | 
			
		||||
 | 
			
		||||
comment "IXP23xx Platforms"
 | 
			
		||||
 | 
			
		||||
config MACH_ESPRESSO
 | 
			
		||||
	bool "Support IP Fabrics Double Espresso platform"
 | 
			
		||||
	help
 | 
			
		||||
 | 
			
		||||
config MACH_IXDP2351
 | 
			
		||||
	bool "Support Intel IXDP2351 platform"
 | 
			
		||||
	help
 | 
			
		||||
 | 
			
		||||
config MACH_ROADRUNNER
 | 
			
		||||
	bool "Support ADI RoadRunner platform"
 | 
			
		||||
	help
 | 
			
		||||
 | 
			
		||||
endmenu
 | 
			
		||||
 | 
			
		||||
endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,11 +0,0 @@
 | 
			
		|||
#
 | 
			
		||||
# Makefile for the linux kernel.
 | 
			
		||||
#
 | 
			
		||||
obj-y			:= core.o pci.o
 | 
			
		||||
obj-m			:=
 | 
			
		||||
obj-n			:=
 | 
			
		||||
obj-			:=
 | 
			
		||||
 | 
			
		||||
obj-$(CONFIG_MACH_ESPRESSO)	+= espresso.o
 | 
			
		||||
obj-$(CONFIG_MACH_IXDP2351)	+= ixdp2351.o
 | 
			
		||||
obj-$(CONFIG_MACH_ROADRUNNER)	+= roadrunner.o
 | 
			
		||||
| 
						 | 
				
			
			@ -1,2 +0,0 @@
 | 
			
		|||
   zreladdr-y	+= 0x00008000
 | 
			
		||||
params_phys-y	:= 0x00000100
 | 
			
		||||
| 
						 | 
				
			
			@ -1,455 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/core.c
 | 
			
		||||
 *
 | 
			
		||||
 * Core routines for IXP23xx chips
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2005 (c) MontaVista Software, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * Based on 2.4 code Copyright 2004 (c) Intel Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/spinlock.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/serial_8250.h>
 | 
			
		||||
#include <linux/serial_core.h>
 | 
			
		||||
#include <linux/device.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/time.h>
 | 
			
		||||
#include <linux/timex.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/types.h>
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
#include <asm/memory.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/tlbflush.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
#include <asm/system_misc.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/time.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * Chip specific mappings shared by all IXP23xx systems
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct map_desc ixp23xx_io_desc[] __initdata = {
 | 
			
		||||
	{ /* XSI-CPP CSRs */
 | 
			
		||||
	 	.virtual	= IXP23XX_XSI2CPP_CSR_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_XSI2CPP_CSR_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_XSI2CPP_CSR_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* Expansion Bus Config */
 | 
			
		||||
	 	.virtual	= IXP23XX_EXP_CFG_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_EXP_CFG_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_EXP_CFG_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* UART, Interrupt ctrl, GPIO, timers, NPEs, MACS,.... */
 | 
			
		||||
	 	.virtual	= IXP23XX_PERIPHERAL_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_PERIPHERAL_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_PERIPHERAL_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* CAP CSRs */
 | 
			
		||||
	 	.virtual	= IXP23XX_CAP_CSR_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_CAP_CSR_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_CAP_CSR_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* MSF CSRs */
 | 
			
		||||
	 	.virtual	= IXP23XX_MSF_CSR_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_MSF_CSR_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_MSF_CSR_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* PCI I/O Space */
 | 
			
		||||
	 	.virtual	= IXP23XX_PCI_IO_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_PCI_IO_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_PCI_IO_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* PCI Config Space */
 | 
			
		||||
	 	.virtual	= IXP23XX_PCI_CFG_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_PCI_CFG_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_PCI_CFG_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* PCI local CFG CSRs */
 | 
			
		||||
	 	.virtual	= IXP23XX_PCI_CREG_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_PCI_CREG_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_PCI_CREG_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}, { /* PCI MEM Space */
 | 
			
		||||
	 	.virtual	= IXP23XX_PCI_MEM_VIRT,
 | 
			
		||||
	 	.pfn		= __phys_to_pfn(IXP23XX_PCI_MEM_PHYS),
 | 
			
		||||
	 	.length		= IXP23XX_PCI_MEM_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE,
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixp23xx_map_io(void)
 | 
			
		||||
{
 | 
			
		||||
	iotable_init(ixp23xx_io_desc, ARRAY_SIZE(ixp23xx_io_desc));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/***************************************************************************
 | 
			
		||||
 * IXP23xx Interrupt Handling
 | 
			
		||||
 ***************************************************************************/
 | 
			
		||||
enum ixp23xx_irq_type {
 | 
			
		||||
	IXP23XX_IRQ_LEVEL, IXP23XX_IRQ_EDGE
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ixp23xx_config_irq(unsigned int, enum ixp23xx_irq_type);
 | 
			
		||||
 | 
			
		||||
static int ixp23xx_irq_set_type(struct irq_data *d, unsigned int type)
 | 
			
		||||
{
 | 
			
		||||
	int line = d->irq - IRQ_IXP23XX_GPIO6 + 6;
 | 
			
		||||
	u32 int_style;
 | 
			
		||||
	enum ixp23xx_irq_type irq_type;
 | 
			
		||||
	volatile u32 *int_reg;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Only GPIOs 6-15 are wired to interrupts on IXP23xx
 | 
			
		||||
	 */
 | 
			
		||||
	if (line < 6 || line > 15)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	switch (type) {
 | 
			
		||||
	case IRQ_TYPE_EDGE_BOTH:
 | 
			
		||||
		int_style = IXP23XX_GPIO_STYLE_TRANSITIONAL;
 | 
			
		||||
		irq_type = IXP23XX_IRQ_EDGE;
 | 
			
		||||
		break;
 | 
			
		||||
	case IRQ_TYPE_EDGE_RISING:
 | 
			
		||||
		int_style = IXP23XX_GPIO_STYLE_RISING_EDGE;
 | 
			
		||||
		irq_type = IXP23XX_IRQ_EDGE;
 | 
			
		||||
		break;
 | 
			
		||||
	case IRQ_TYPE_EDGE_FALLING:
 | 
			
		||||
		int_style = IXP23XX_GPIO_STYLE_FALLING_EDGE;
 | 
			
		||||
		irq_type = IXP23XX_IRQ_EDGE;
 | 
			
		||||
		break;
 | 
			
		||||
	case IRQ_TYPE_LEVEL_HIGH:
 | 
			
		||||
		int_style = IXP23XX_GPIO_STYLE_ACTIVE_HIGH;
 | 
			
		||||
		irq_type = IXP23XX_IRQ_LEVEL;
 | 
			
		||||
		break;
 | 
			
		||||
	case IRQ_TYPE_LEVEL_LOW:
 | 
			
		||||
		int_style = IXP23XX_GPIO_STYLE_ACTIVE_LOW;
 | 
			
		||||
		irq_type = IXP23XX_IRQ_LEVEL;
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ixp23xx_config_irq(d->irq, irq_type);
 | 
			
		||||
 | 
			
		||||
	if (line >= 8) {	/* pins 8-15 */
 | 
			
		||||
		line -= 8;
 | 
			
		||||
		int_reg = (volatile u32 *)IXP23XX_GPIO_GPIT2R;
 | 
			
		||||
	} else {		/* pins 0-7 */
 | 
			
		||||
		int_reg = (volatile u32 *)IXP23XX_GPIO_GPIT1R;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Clear pending interrupts
 | 
			
		||||
	 */
 | 
			
		||||
	*IXP23XX_GPIO_GPISR = (1 << line);
 | 
			
		||||
 | 
			
		||||
	/* Clear the style for the appropriate pin */
 | 
			
		||||
	*int_reg &= ~(IXP23XX_GPIO_STYLE_MASK <<
 | 
			
		||||
			(line * IXP23XX_GPIO_STYLE_SIZE));
 | 
			
		||||
 | 
			
		||||
	/* Set the new style */
 | 
			
		||||
	*int_reg |= (int_style << (line * IXP23XX_GPIO_STYLE_SIZE));
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp23xx_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	volatile unsigned long *intr_reg;
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	if (irq >= 56)
 | 
			
		||||
		irq += 8;
 | 
			
		||||
 | 
			
		||||
	intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
 | 
			
		||||
	*intr_reg &= ~(1 << (irq % 32));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp23xx_irq_ack(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	int line = d->irq - IRQ_IXP23XX_GPIO6 + 6;
 | 
			
		||||
 | 
			
		||||
	if ((line < 6) || (line > 15))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	*IXP23XX_GPIO_GPISR = (1 << line);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Level triggered interrupts on GPIO lines can only be cleared when the
 | 
			
		||||
 * interrupt condition disappears.
 | 
			
		||||
 */
 | 
			
		||||
static void ixp23xx_irq_level_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	volatile unsigned long *intr_reg;
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	ixp23xx_irq_ack(d);
 | 
			
		||||
 | 
			
		||||
	if (irq >= 56)
 | 
			
		||||
		irq += 8;
 | 
			
		||||
 | 
			
		||||
	intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
 | 
			
		||||
	*intr_reg |= (1 << (irq % 32));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp23xx_irq_edge_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	volatile unsigned long *intr_reg;
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	if (irq >= 56)
 | 
			
		||||
		irq += 8;
 | 
			
		||||
 | 
			
		||||
	intr_reg = IXP23XX_INTR_EN1 + (irq / 32);
 | 
			
		||||
	*intr_reg |= (1 << (irq % 32));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixp23xx_irq_level_chip = {
 | 
			
		||||
	.irq_ack	= ixp23xx_irq_mask,
 | 
			
		||||
	.irq_mask	= ixp23xx_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixp23xx_irq_level_unmask,
 | 
			
		||||
	.irq_set_type	= ixp23xx_irq_set_type
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixp23xx_irq_edge_chip = {
 | 
			
		||||
	.irq_ack	= ixp23xx_irq_ack,
 | 
			
		||||
	.irq_mask	= ixp23xx_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixp23xx_irq_edge_unmask,
 | 
			
		||||
	.irq_set_type	= ixp23xx_irq_set_type
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ixp23xx_pci_irq_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	*IXP23XX_PCI_XSCALE_INT_ENABLE &= ~(1 << (IRQ_IXP23XX_INTA + 27 - irq));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixp23xx_pci_irq_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	unsigned int irq = d->irq;
 | 
			
		||||
 | 
			
		||||
	*IXP23XX_PCI_XSCALE_INT_ENABLE |= (1 << (IRQ_IXP23XX_INTA + 27 - irq));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * TODO: Should this just be done at ASM level?
 | 
			
		||||
 */
 | 
			
		||||
static void pci_handler(unsigned int irq, struct irq_desc *desc)
 | 
			
		||||
{
 | 
			
		||||
	u32 pci_interrupt;
 | 
			
		||||
	unsigned int irqno;
 | 
			
		||||
 | 
			
		||||
	pci_interrupt = *IXP23XX_PCI_XSCALE_INT_STATUS;
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_ack(&desc->irq_data);
 | 
			
		||||
 | 
			
		||||
	/* See which PCI_INTA, or PCI_INTB interrupted */
 | 
			
		||||
	if (pci_interrupt & (1 << 26)) {
 | 
			
		||||
		irqno = IRQ_IXP23XX_INTB;
 | 
			
		||||
	} else if (pci_interrupt & (1 << 27)) {
 | 
			
		||||
		irqno = IRQ_IXP23XX_INTA;
 | 
			
		||||
	} else {
 | 
			
		||||
		BUG();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	generic_handle_irq(irqno);
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_unmask(&desc->irq_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixp23xx_pci_irq_chip = {
 | 
			
		||||
	.irq_ack	= ixp23xx_pci_irq_mask,
 | 
			
		||||
	.irq_mask	= ixp23xx_pci_irq_mask,
 | 
			
		||||
	.irq_unmask	= ixp23xx_pci_irq_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ixp23xx_config_irq(unsigned int irq, enum ixp23xx_irq_type type)
 | 
			
		||||
{
 | 
			
		||||
	switch (type) {
 | 
			
		||||
	case IXP23XX_IRQ_LEVEL:
 | 
			
		||||
		irq_set_chip_and_handler(irq, &ixp23xx_irq_level_chip,
 | 
			
		||||
					 handle_level_irq);
 | 
			
		||||
		break;
 | 
			
		||||
	case IXP23XX_IRQ_EDGE:
 | 
			
		||||
		irq_set_chip_and_handler(irq, &ixp23xx_irq_edge_chip,
 | 
			
		||||
					 handle_edge_irq);
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
	set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init ixp23xx_init_irq(void)
 | 
			
		||||
{
 | 
			
		||||
	int irq;
 | 
			
		||||
 | 
			
		||||
	/* Route everything to IRQ */
 | 
			
		||||
	*IXP23XX_INTR_SEL1 = 0x0;
 | 
			
		||||
	*IXP23XX_INTR_SEL2 = 0x0;
 | 
			
		||||
	*IXP23XX_INTR_SEL3 = 0x0;
 | 
			
		||||
	*IXP23XX_INTR_SEL4 = 0x0;
 | 
			
		||||
 | 
			
		||||
	/* Mask all sources */
 | 
			
		||||
	*IXP23XX_INTR_EN1 = 0x0;
 | 
			
		||||
	*IXP23XX_INTR_EN2 = 0x0;
 | 
			
		||||
	*IXP23XX_INTR_EN3 = 0x0;
 | 
			
		||||
	*IXP23XX_INTR_EN4 = 0x0;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Configure all IRQs for level-sensitive operation
 | 
			
		||||
	 */
 | 
			
		||||
	for (irq = 0; irq <= NUM_IXP23XX_RAW_IRQS; irq++) {
 | 
			
		||||
		ixp23xx_config_irq(irq, IXP23XX_IRQ_LEVEL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (irq = IRQ_IXP23XX_INTA; irq <= IRQ_IXP23XX_INTB; irq++) {
 | 
			
		||||
		irq_set_chip_and_handler(irq, &ixp23xx_pci_irq_chip,
 | 
			
		||||
					 handle_level_irq);
 | 
			
		||||
		set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	irq_set_chained_handler(IRQ_IXP23XX_PCI_INT_RPH, pci_handler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * Timer-tick functions for IXP23xx
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
#define CLOCK_TICKS_PER_USEC	(CLOCK_TICK_RATE / USEC_PER_SEC)
 | 
			
		||||
 | 
			
		||||
static unsigned long next_jiffy_time;
 | 
			
		||||
 | 
			
		||||
static unsigned long
 | 
			
		||||
ixp23xx_gettimeoffset(void)
 | 
			
		||||
{
 | 
			
		||||
	unsigned long elapsed;
 | 
			
		||||
 | 
			
		||||
	elapsed = *IXP23XX_TIMER_CONT - (next_jiffy_time - LATCH);
 | 
			
		||||
 | 
			
		||||
	return elapsed / CLOCK_TICKS_PER_USEC;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static irqreturn_t
 | 
			
		||||
ixp23xx_timer_interrupt(int irq, void *dev_id)
 | 
			
		||||
{
 | 
			
		||||
	/* Clear Pending Interrupt by writing '1' to it */
 | 
			
		||||
	*IXP23XX_TIMER_STATUS = IXP23XX_TIMER1_INT_PEND;
 | 
			
		||||
	while ((signed long)(*IXP23XX_TIMER_CONT - next_jiffy_time) >= LATCH) {
 | 
			
		||||
		timer_tick();
 | 
			
		||||
		next_jiffy_time += LATCH;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return IRQ_HANDLED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irqaction ixp23xx_timer_irq = {
 | 
			
		||||
	.name		= "IXP23xx Timer Tick",
 | 
			
		||||
	.handler	= ixp23xx_timer_interrupt,
 | 
			
		||||
	.flags		= IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixp23xx_init_timer(void)
 | 
			
		||||
{
 | 
			
		||||
	/* Clear Pending Interrupt by writing '1' to it */
 | 
			
		||||
	*IXP23XX_TIMER_STATUS = IXP23XX_TIMER1_INT_PEND;
 | 
			
		||||
 | 
			
		||||
	/* Setup the Timer counter value */
 | 
			
		||||
	*IXP23XX_TIMER1_RELOAD =
 | 
			
		||||
		(LATCH & ~IXP23XX_TIMER_RELOAD_MASK) | IXP23XX_TIMER_ENABLE;
 | 
			
		||||
 | 
			
		||||
	*IXP23XX_TIMER_CONT = 0;
 | 
			
		||||
	next_jiffy_time = LATCH;
 | 
			
		||||
 | 
			
		||||
	/* Connect the interrupt handler and enable the interrupt */
 | 
			
		||||
	setup_irq(IRQ_IXP23XX_TIMER1, &ixp23xx_timer_irq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct sys_timer ixp23xx_timer = {
 | 
			
		||||
	.init		= ixp23xx_init_timer,
 | 
			
		||||
	.offset		= ixp23xx_gettimeoffset,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*************************************************************************
 | 
			
		||||
 * IXP23xx Platform Initialization
 | 
			
		||||
 *************************************************************************/
 | 
			
		||||
static struct resource ixp23xx_uart_resources[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.start		= IXP23XX_UART1_PHYS,
 | 
			
		||||
		.end		= IXP23XX_UART1_PHYS + 0x0fff,
 | 
			
		||||
		.flags		= IORESOURCE_MEM
 | 
			
		||||
	}, {
 | 
			
		||||
		.start		= IXP23XX_UART2_PHYS,
 | 
			
		||||
		.end		= IXP23XX_UART2_PHYS + 0x0fff,
 | 
			
		||||
		.flags		= IORESOURCE_MEM
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct plat_serial8250_port ixp23xx_uart_data[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.mapbase	= IXP23XX_UART1_PHYS,
 | 
			
		||||
		.membase	= (char *)(IXP23XX_UART1_VIRT + 3),
 | 
			
		||||
		.irq		= IRQ_IXP23XX_UART1,
 | 
			
		||||
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
 | 
			
		||||
		.iotype		= UPIO_MEM,
 | 
			
		||||
		.regshift	= 2,
 | 
			
		||||
		.uartclk	= IXP23XX_UART_XTAL,
 | 
			
		||||
	}, {
 | 
			
		||||
		.mapbase	= IXP23XX_UART2_PHYS,
 | 
			
		||||
		.membase	= (char *)(IXP23XX_UART2_VIRT + 3),
 | 
			
		||||
		.irq		= IRQ_IXP23XX_UART2,
 | 
			
		||||
		.flags		= UPF_BOOT_AUTOCONF | UPF_SKIP_TEST,
 | 
			
		||||
		.iotype		= UPIO_MEM,
 | 
			
		||||
		.regshift	= 2,
 | 
			
		||||
		.uartclk	= IXP23XX_UART_XTAL,
 | 
			
		||||
	},
 | 
			
		||||
	{ },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixp23xx_uart = {
 | 
			
		||||
	.name			= "serial8250",
 | 
			
		||||
	.id			= 0,
 | 
			
		||||
	.dev.platform_data	= ixp23xx_uart_data,
 | 
			
		||||
	.num_resources		= 2,
 | 
			
		||||
	.resource		= ixp23xx_uart_resources,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device *ixp23xx_devices[] __initdata = {
 | 
			
		||||
	&ixp23xx_uart,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixp23xx_sys_init(void)
 | 
			
		||||
{
 | 
			
		||||
	/* by default, the idle code is disabled */
 | 
			
		||||
	disable_hlt();
 | 
			
		||||
 | 
			
		||||
	*IXP23XX_EXP_UNIT_FUSE |= 0xf;
 | 
			
		||||
	platform_add_devices(ixp23xx_devices, ARRAY_SIZE(ixp23xx_devices));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ixp23xx_restart(char mode, const char *cmd)
 | 
			
		||||
{
 | 
			
		||||
	/* Use on-chip reset capability */
 | 
			
		||||
	*IXP23XX_RESET0 |= IXP23XX_RST_ALL;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,93 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/espresso.c
 | 
			
		||||
 *
 | 
			
		||||
 * Double Espresso-specific routines
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Lennert Buytenhek <buytenh@wantstofly.org>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/spinlock.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/serial_8250.h>
 | 
			
		||||
#include <linux/serial_core.h>
 | 
			
		||||
#include <linux/device.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/mtd/physmap.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/types.h>
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
#include <asm/memory.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/tlbflush.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
 | 
			
		||||
static int __init espresso_pci_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_espresso())
 | 
			
		||||
		ixp23xx_pci_slave_init();
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
};
 | 
			
		||||
subsys_initcall(espresso_pci_init);
 | 
			
		||||
 | 
			
		||||
static struct physmap_flash_data espresso_flash_data = {
 | 
			
		||||
	.width		= 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource espresso_flash_resource = {
 | 
			
		||||
	.start		= 0x90000000,
 | 
			
		||||
	.end		= 0x91ffffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device espresso_flash = {
 | 
			
		||||
	.name		= "physmap-flash",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data	= &espresso_flash_data,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &espresso_flash_resource,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void __init espresso_init(void)
 | 
			
		||||
{
 | 
			
		||||
	platform_device_register(&espresso_flash);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Mark flash as writeable.
 | 
			
		||||
	 */
 | 
			
		||||
	IXP23XX_EXP_CS0[0] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
	IXP23XX_EXP_CS0[1] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
 | 
			
		||||
	ixp23xx_sys_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MACHINE_START(ESPRESSO, "IP Fabrics Double Espresso")
 | 
			
		||||
	/* Maintainer: Lennert Buytenhek */
 | 
			
		||||
	.map_io		= ixp23xx_map_io,
 | 
			
		||||
	.init_irq	= ixp23xx_init_irq,
 | 
			
		||||
	.timer		= &ixp23xx_timer,
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.init_machine	= espresso_init,
 | 
			
		||||
	.restart	= ixp23xx_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
| 
						 | 
				
			
			@ -1,25 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/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.
 | 
			
		||||
 */
 | 
			
		||||
#include <mach/ixp23xx.h>
 | 
			
		||||
 | 
			
		||||
		.macro	addruart, rp, rv, tmp
 | 
			
		||||
		ldr	\rp, =IXP23XX_PERIPHERAL_PHYS 	@ physical
 | 
			
		||||
		ldr	\rv, =IXP23XX_PERIPHERAL_VIRT	@ virtual
 | 
			
		||||
#ifdef __ARMEB__
 | 
			
		||||
		orr	\rp, \rp, #0x00000003
 | 
			
		||||
		orr	\rv, \rv, #0x00000003
 | 
			
		||||
#endif
 | 
			
		||||
		.endm
 | 
			
		||||
 | 
			
		||||
#define UART_SHIFT	2
 | 
			
		||||
#include <asm/hardware/debug-8250.S>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,31 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/entry-macro.S
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
		.macro  get_irqnr_preamble, base, tmp
 | 
			
		||||
		.endm
 | 
			
		||||
 | 
			
		||||
		.macro	get_irqnr_and_base, irqnr, irqstat, base, tmp
 | 
			
		||||
		ldr	\irqnr, =(IXP23XX_INTC_VIRT + IXP23XX_INTR_IRQ_ENC_ST_OFFSET)
 | 
			
		||||
		ldr	\irqnr, [\irqnr]	@ get interrupt number
 | 
			
		||||
		cmp	\irqnr, #0x0		@ spurious interrupt ?
 | 
			
		||||
		movne	\irqnr, \irqnr, lsr #2	@ skip unwanted low order bits
 | 
			
		||||
		subne	\irqnr, \irqnr, #1	@ convert to 0 based
 | 
			
		||||
 | 
			
		||||
#if 0
 | 
			
		||||
		cmp	\irqnr, #IRQ_IXP23XX_PCI_INT_RPH
 | 
			
		||||
		bne	1001f
 | 
			
		||||
		mov	\irqnr, #IRQ_IXP23XX_INTA
 | 
			
		||||
 | 
			
		||||
		ldr	\irqnr, =0xf5000030
 | 
			
		||||
 | 
			
		||||
		mov	\tmp, #(1<<26)
 | 
			
		||||
		tst	\irqnr, \tmp
 | 
			
		||||
		movne	\irqnr, #IRQ_IXP23XX_INTB
 | 
			
		||||
 | 
			
		||||
		mov	\tmp, #(1<<27)
 | 
			
		||||
		tst	\irqnr, \tmp
 | 
			
		||||
		movne	\irqnr, #IRQ_IXP23XX_INTA
 | 
			
		||||
1001:
 | 
			
		||||
#endif
 | 
			
		||||
		.endm
 | 
			
		||||
| 
						 | 
				
			
			@ -1,32 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/hardware.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002-2004 Intel Corporation.
 | 
			
		||||
 * Copyricht (C) 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Hardware definitions for IXP23XX based systems
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASM_ARCH_HARDWARE_H
 | 
			
		||||
#define __ASM_ARCH_HARDWARE_H
 | 
			
		||||
 | 
			
		||||
/* PCI IO info */
 | 
			
		||||
 | 
			
		||||
#include "ixp23xx.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Platform helper functions
 | 
			
		||||
 */
 | 
			
		||||
#include "platform.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Platform-specific headers
 | 
			
		||||
 */
 | 
			
		||||
#include "ixdp2351.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,22 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/io.h
 | 
			
		||||
 *
 | 
			
		||||
 * Original Author: Naeem M Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2003-2005 Intel Corp.
 | 
			
		||||
 * Copyright (C) 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_ARCH_IO_H
 | 
			
		||||
#define __ASM_ARCH_IO_H
 | 
			
		||||
 | 
			
		||||
#define IO_SPACE_LIMIT 0xffffffff
 | 
			
		||||
 | 
			
		||||
#define __io(p)		((void __iomem*)((p) + IXP23XX_PCI_IO_VIRT))
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,223 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/irqs.h
 | 
			
		||||
 *
 | 
			
		||||
 * IRQ definitions for IXP23XX based systems
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2003-2004 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASM_ARCH_IRQS_H
 | 
			
		||||
#define __ASM_ARCH_IRQS_H
 | 
			
		||||
 | 
			
		||||
#define NR_IXP23XX_IRQS			IRQ_IXP23XX_INTB+1
 | 
			
		||||
#define IRQ_IXP23XX_EXTIRQS		NR_IXP23XX_IRQS
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define IRQ_IXP23XX_DBG0		0	/* Debug/Execution/MBox */
 | 
			
		||||
#define IRQ_IXP23XX_DBG1		1	/* Debug/Execution/MBox */
 | 
			
		||||
#define IRQ_IXP23XX_NPE_TRG		2	/* npe_trigger */
 | 
			
		||||
#define IRQ_IXP23XX_TIMER1		3	/* Timer[0] */
 | 
			
		||||
#define IRQ_IXP23XX_TIMER2		4	/* Timer[1] */
 | 
			
		||||
#define IRQ_IXP23XX_TIMESTAMP		5	/* Timer[2], Time-stamp */
 | 
			
		||||
#define IRQ_IXP23XX_WDOG		6	/* Time[3], Watchdog Timer */
 | 
			
		||||
#define IRQ_IXP23XX_PCI_DBELL		7	/* PCI Doorbell */
 | 
			
		||||
#define IRQ_IXP23XX_PCI_DMA1		8	/* PCI DMA Channel 1 */
 | 
			
		||||
#define IRQ_IXP23XX_PCI_DMA2		9	/* PCI DMA Channel 2 */
 | 
			
		||||
#define IRQ_IXP23XX_PCI_DMA3		10	/* PCI DMA Channel 3 */
 | 
			
		||||
#define IRQ_IXP23XX_PCI_INT_RPH		11	/* pcxg_pci_int_rph */
 | 
			
		||||
#define IRQ_IXP23XX_CPP_PMU		12	/* xpxg_pm_int_rpl */
 | 
			
		||||
#define IRQ_IXP23XX_SWINT0		13	/* S/W Interrupt0 */
 | 
			
		||||
#define IRQ_IXP23XX_SWINT1		14	/* S/W Interrupt1 */
 | 
			
		||||
#define IRQ_IXP23XX_UART2		15	/* UART1 Interrupt */
 | 
			
		||||
#define IRQ_IXP23XX_UART1		16	/* UART0 Interrupt */
 | 
			
		||||
#define IRQ_IXP23XX_XSI_PMU_ROLLOVER	17	/* AHB Performance M. Unit counter rollover */
 | 
			
		||||
#define IRQ_IXP23XX_XSI_AHB_PM0		18	/* intr_pm_o */
 | 
			
		||||
#define IRQ_IXP23XX_XSI_AHB_ECE0	19	/* intr_ece_o */
 | 
			
		||||
#define IRQ_IXP23XX_XSI_AHB_GASKET	20	/* gas_intr_o */
 | 
			
		||||
#define IRQ_IXP23XX_XSI_CPP		21	/* xsi2cpp_int */
 | 
			
		||||
#define IRQ_IXP23XX_CPP_XSI		22	/* cpp2xsi_int */
 | 
			
		||||
#define IRQ_IXP23XX_ME_ATTN0		23	/* ME_ATTN */
 | 
			
		||||
#define IRQ_IXP23XX_ME_ATTN1		24	/* ME_ATTN */
 | 
			
		||||
#define IRQ_IXP23XX_ME_ATTN2		25	/* ME_ATTN */
 | 
			
		||||
#define IRQ_IXP23XX_ME_ATTN3		26	/* ME_ATTN */
 | 
			
		||||
#define IRQ_IXP23XX_PCI_ERR_RPH		27	/* PCXG_PCI_ERR_RPH */
 | 
			
		||||
#define IRQ_IXP23XX_D0XG_ECC_CORR	28	/* D0XG_DRAM_ECC_CORR */
 | 
			
		||||
#define IRQ_IXP23XX_D0XG_ECC_UNCORR	29	/* D0XG_DRAM_ECC_UNCORR */
 | 
			
		||||
#define IRQ_IXP23XX_SRAM_ERR1		30	/* SRAM1_ERR */
 | 
			
		||||
#define IRQ_IXP23XX_SRAM_ERR0		31	/* SRAM0_ERR */
 | 
			
		||||
#define IRQ_IXP23XX_MEDIA_ERR		32	/* MEDIA_ERR */
 | 
			
		||||
#define IRQ_IXP23XX_STH_DRAM_ECC_MAJ	33	/* STH_DRAM0_ECC_MAJ */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO6		34	/* GPIO0 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO7		35	/* GPIO1 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO8		36	/* GPIO2 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO9		37	/* GPIO3 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO10		38	/* GPIO4 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO11		39	/* GPIO5 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO12		40	/* GPIO6 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO13		41	/* GPIO7 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO14		42	/* GPIO8 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_GPIO15		43	/* GPIO9 interrupts */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING0		44	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING1		45	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING2		46	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING3		47	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING4		48	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING5		49	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING6		50	/* SHAC RING Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING7		51	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING8		52	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING9		53	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING10		54	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_SHAC_RING11		55	/* SHAC Ring Full */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A0_ME0	56	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A1_ME0	57	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A2_ME0	58	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A3_ME0	59	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A4_ME0	60	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A5_ME0	61	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A6_ME0	62	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A7_ME0	63	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A8_ME1	64	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A9_ME1	65	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A10_ME1	66	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A11_ME1	67	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A12_ME1	68	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A13_ME1	69	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A14_ME1	70	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A15_ME1	71	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A16_ME2	72	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A17_ME2	73	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A18_ME2	74	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A19_ME2	75	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A20_ME2	76	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A21_ME2	77	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A22_ME2	78	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A23_ME2	79	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A24_ME3	80	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A25_ME3	81	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A26_ME3	82	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A27_ME3	83	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A28_ME3	84	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A29_ME3	85	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A30_ME3	86	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_A31_ME3	87	/* ME_THREAD_A */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B0_ME0	88	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B1_ME0	89	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B2_ME0	90	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B3_ME0	91	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B4_ME0	92	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B5_ME0	93	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B6_ME0	94	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B7_ME0	95	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B8_ME1	96	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B9_ME1	97	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B10_ME1	98	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B11_ME1	99	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B12_ME1	100	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B13_ME1	101	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B14_ME1	102	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B15_ME1	103	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B16_ME2	104	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B17_ME2	105	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B18_ME2	106	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B19_ME2	107	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B20_ME2	108	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B21_ME2	109	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B22_ME2	110	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B23_ME2	111	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B24_ME3	112	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B25_ME3	113	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B26_ME3	114	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B27_ME3	115	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B28_ME3	116	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B29_ME3	117	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B30_ME3	118	/* ME_THREAD_B */
 | 
			
		||||
#define IRQ_IXP23XX_ME_THREAD_B31_ME3	119	/* ME_THREAD_B */
 | 
			
		||||
 | 
			
		||||
#define NUM_IXP23XX_RAW_IRQS		120
 | 
			
		||||
 | 
			
		||||
#define IRQ_IXP23XX_INTA		120	/* Indirect pcxg_pci_int_rph */
 | 
			
		||||
#define IRQ_IXP23XX_INTB		121	/* Indirect pcxg_pci_int_rph */
 | 
			
		||||
 | 
			
		||||
#define NR_IXP23XX_IRQ			(IRQ_IXP23XX_INTB + 1)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * We default to 32 per-board IRQs. Increase this number if you need
 | 
			
		||||
 * more, but keep it realistic.
 | 
			
		||||
 */
 | 
			
		||||
#define NR_IXP23XX_MACH_IRQS 		32
 | 
			
		||||
 | 
			
		||||
#define NR_IRQS				(NR_IXP23XX_IRQS + NR_IXP23XX_MACH_IRQS)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_MACH_IRQ(irq) 		(NR_IXP23XX_IRQ + (irq))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP2351-specific interrupts
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * External PCI interrupts signaled through INTB
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define IXDP2351_INTB_IRQ_BASE 		0
 | 
			
		||||
#define IRQ_IXDP2351_INTA_82546		IXP23XX_MACH_IRQ(0)
 | 
			
		||||
#define IRQ_IXDP2351_INTB_82546		IXP23XX_MACH_IRQ(1)
 | 
			
		||||
#define IRQ_IXDP2351_SPCI_DB_0		IXP23XX_MACH_IRQ(2)
 | 
			
		||||
#define IRQ_IXDP2351_SPCI_DB_1		IXP23XX_MACH_IRQ(3)
 | 
			
		||||
#define IRQ_IXDP2351_SPCI_PMC_INTA	IXP23XX_MACH_IRQ(4)
 | 
			
		||||
#define IRQ_IXDP2351_SPCI_PMC_INTB	IXP23XX_MACH_IRQ(5)
 | 
			
		||||
#define IRQ_IXDP2351_SPCI_PMC_INTC	IXP23XX_MACH_IRQ(6)
 | 
			
		||||
#define IRQ_IXDP2351_SPCI_PMC_INTD	IXP23XX_MACH_IRQ(7)
 | 
			
		||||
#define IRQ_IXDP2351_SPCI_FIC		IXP23XX_MACH_IRQ(8)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_INTB_IRQ_BIT(irq)	(irq - IXP23XX_MACH_IRQ(0))
 | 
			
		||||
#define IXDP2351_INTB_IRQ_MASK(irq)	(1 << IXDP2351_INTB_IRQ_BIT(irq))
 | 
			
		||||
#define IXDP2351_INTB_IRQ_VALID		0x01FF
 | 
			
		||||
#define IXDP2351_INTB_IRQ_NUM 		16
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Other external interrupts signaled through INTA
 | 
			
		||||
 */
 | 
			
		||||
#define IXDP2351_INTA_IRQ_BASE 		16
 | 
			
		||||
#define IRQ_IXDP2351_IPMI_FROM		IXP23XX_MACH_IRQ(16)
 | 
			
		||||
#define IRQ_IXDP2351_125US		IXP23XX_MACH_IRQ(17)
 | 
			
		||||
#define IRQ_IXDP2351_DB_0_ADD		IXP23XX_MACH_IRQ(18)
 | 
			
		||||
#define IRQ_IXDP2351_DB_1_ADD		IXP23XX_MACH_IRQ(19)
 | 
			
		||||
#define IRQ_IXDP2351_DEBUG1		IXP23XX_MACH_IRQ(20)
 | 
			
		||||
#define IRQ_IXDP2351_ADD_UART		IXP23XX_MACH_IRQ(21)
 | 
			
		||||
#define IRQ_IXDP2351_FIC_ADD		IXP23XX_MACH_IRQ(24)
 | 
			
		||||
#define IRQ_IXDP2351_CS8900		IXP23XX_MACH_IRQ(25)
 | 
			
		||||
#define IRQ_IXDP2351_BBSRAM		IXP23XX_MACH_IRQ(26)
 | 
			
		||||
#define IRQ_IXDP2351_CONFIG_MEDIA	IXP23XX_MACH_IRQ(27)
 | 
			
		||||
#define IRQ_IXDP2351_CLOCK_REF		IXP23XX_MACH_IRQ(28)
 | 
			
		||||
#define IRQ_IXDP2351_A10_NP		IXP23XX_MACH_IRQ(29)
 | 
			
		||||
#define IRQ_IXDP2351_A11_NP		IXP23XX_MACH_IRQ(30)
 | 
			
		||||
#define IRQ_IXDP2351_DEBUG_NP		IXP23XX_MACH_IRQ(31)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_INTA_IRQ_BIT(irq) 	(irq - IXP23XX_MACH_IRQ(16))
 | 
			
		||||
#define IXDP2351_INTA_IRQ_MASK(irq) 	(1 << IXDP2351_INTA_IRQ_BIT(irq))
 | 
			
		||||
#define IXDP2351_INTA_IRQ_VALID 	0xFF3F
 | 
			
		||||
#define IXDP2351_INTA_IRQ_NUM 		16
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * ADI RoadRunner IRQs
 | 
			
		||||
 */
 | 
			
		||||
#define IRQ_ROADRUNNER_PCI_INTA 	IRQ_IXP23XX_INTA
 | 
			
		||||
#define IRQ_ROADRUNNER_PCI_INTB 	IRQ_IXP23XX_INTB
 | 
			
		||||
#define IRQ_ROADRUNNER_PCI_INTC 	IRQ_IXP23XX_GPIO11
 | 
			
		||||
#define IRQ_ROADRUNNER_PCI_INTD 	IRQ_IXP23XX_GPIO12
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Put new board definitions here
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,89 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/ixdp2351.h
 | 
			
		||||
 *
 | 
			
		||||
 * Register and other defines for IXDP2351
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2002-2004 Intel Corp.
 | 
			
		||||
 * Copytight (c) 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 as published by the
 | 
			
		||||
 * Free Software Foundation; either version 2 of the License, or (at your
 | 
			
		||||
 * option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASM_ARCH_IXDP2351_H
 | 
			
		||||
#define __ASM_ARCH_IXDP2351_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * NP module memory map
 | 
			
		||||
 */
 | 
			
		||||
#define IXDP2351_NP_PHYS_BASE		(IXP23XX_EXP_BUS_CS4_BASE)
 | 
			
		||||
#define IXDP2351_NP_PHYS_SIZE		0x00100000
 | 
			
		||||
#define IXDP2351_NP_VIRT_BASE		0xeff00000
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_VIRT_CS8900_BASE	(IXDP2351_NP_VIRT_BASE)
 | 
			
		||||
#define IXDP2351_VIRT_CS8900_END	(IXDP2351_VIRT_CS8900_BASE + 16)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_VIRT_NP_CPLD_BASE 	(IXP23XX_EXP_BUS_CS4_BASE_VIRT + 0x00010000)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_NP_CPLD_REG(reg) ((volatile u16 *)(IXDP2351_VIRT_NP_CPLD_BASE + reg))
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_NP_CPLD_RESET1_REG	IXDP2351_NP_CPLD_REG(0x00)
 | 
			
		||||
#define IXDP2351_NP_CPLD_LED_REG	IXDP2351_NP_CPLD_REG(0x02)
 | 
			
		||||
#define IXDP2351_NP_CPLD_VERSION_REG	IXDP2351_NP_CPLD_REG(0x04)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Base board module memory map
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_BB_BASE_PHYS		(IXP23XX_EXP_BUS_CS5_BASE)
 | 
			
		||||
#define IXDP2351_BB_SIZE		0x01000000
 | 
			
		||||
#define IXDP2351_BB_BASE_VIRT		(0xee000000)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_BB_AREA_BASE(offset)	(IXDP2351_BB_BASE_VIRT + offset)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_VIRT_NVRAM_BASE	IXDP2351_BB_AREA_BASE(0x0)
 | 
			
		||||
#define IXDP2351_NVRAM_SIZE		(0x20000)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_VIRT_MB_IXF1104_BASE	IXDP2351_BB_AREA_BASE(0x00020000)
 | 
			
		||||
#define IXDP2351_VIRT_ADD_UART_BASE	IXDP2351_BB_AREA_BASE(0x000240C0)
 | 
			
		||||
#define IXDP2351_VIRT_FIC_BASE		IXDP2351_BB_AREA_BASE(0x00200000)
 | 
			
		||||
#define IXDP2351_VIRT_DB0_BASE		IXDP2351_BB_AREA_BASE(0x00400000)
 | 
			
		||||
#define IXDP2351_VIRT_DB1_BASE		IXDP2351_BB_AREA_BASE(0x00600000)
 | 
			
		||||
#define IXDP2351_VIRT_CPLD_BASE		IXDP2351_BB_AREA_BASE(0x00024000)
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * On board CPLD registers
 | 
			
		||||
 */
 | 
			
		||||
#define IXDP2351_CPLD_BB_REG(reg) ((volatile u16 *)(IXDP2351_VIRT_CPLD_BASE + reg))
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_CPLD_RESET0_REG	IXDP2351_CPLD_BB_REG(0x00)
 | 
			
		||||
#define IXDP2351_CPLD_RESET1_REG	IXDP2351_CPLD_BB_REG(0x04)
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_CPLD_RESET1_MAGIC 	0x55AA
 | 
			
		||||
#define IXDP2351_CPLD_RESET1_ENABLE 	0x8000
 | 
			
		||||
 | 
			
		||||
#define IXDP2351_CPLD_FPGA_CONFIG_REG	IXDP2351_CPLD_BB_REG(0x08)
 | 
			
		||||
#define IXDP2351_CPLD_INTB_MASK_SET_REG	IXDP2351_CPLD_BB_REG(0x10)
 | 
			
		||||
#define IXDP2351_CPLD_INTA_MASK_SET_REG	IXDP2351_CPLD_BB_REG(0x14)
 | 
			
		||||
#define IXDP2351_CPLD_INTB_STAT_REG	IXDP2351_CPLD_BB_REG(0x18)
 | 
			
		||||
#define IXDP2351_CPLD_INTA_STAT_REG	IXDP2351_CPLD_BB_REG(0x1C)
 | 
			
		||||
#define IXDP2351_CPLD_INTB_RAW_REG	IXDP2351_CPLD_BB_REG(0x20)	/* read */
 | 
			
		||||
#define IXDP2351_CPLD_INTA_RAW_REG	IXDP2351_CPLD_BB_REG(0x24)	/* read */
 | 
			
		||||
#define IXDP2351_CPLD_INTB_MASK_CLR_REG	IXDP2351_CPLD_INTB_RAW_REG	/* write */
 | 
			
		||||
#define IXDP2351_CPLD_INTA_MASK_CLR_REG	IXDP2351_CPLD_INTA_RAW_REG	/* write */
 | 
			
		||||
#define IXDP2351_CPLD_INTB_SIM_REG	IXDP2351_CPLD_BB_REG(0x28)
 | 
			
		||||
#define IXDP2351_CPLD_INTA_SIM_REG	IXDP2351_CPLD_BB_REG(0x2C)
 | 
			
		||||
	/* Interrupt bits are defined in irqs.h */
 | 
			
		||||
#define IXDP2351_CPLD_BB_GBE0_REG	IXDP2351_CPLD_BB_REG(0x30)
 | 
			
		||||
#define IXDP2351_CPLD_BB_GBE1_REG	IXDP2351_CPLD_BB_REG(0x34)
 | 
			
		||||
 | 
			
		||||
/* #define IXDP2351_CPLD_BB_MISC_REG	IXDP2351_CPLD_REG(0x1C) */
 | 
			
		||||
/* #define IXDP2351_CPLD_BB_MISC_REV_MASK	0xFF		*/
 | 
			
		||||
/* #define IXDP2351_CPLD_BB_GDXCS0_REG	IXDP2351_CPLD_REG(0x24) */
 | 
			
		||||
/* #define IXDP2351_CPLD_BB_GDXCS1_REG	IXDP2351_CPLD_REG(0x28) */
 | 
			
		||||
/* #define IXDP2351_CPLD_BB_CLOCK_REG	IXDP2351_CPLD_REG(0x04) */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,298 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/ixp23xx.h
 | 
			
		||||
 *
 | 
			
		||||
 * Register definitions for IXP23XX
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2003-2005 Intel Corporation.
 | 
			
		||||
 * Copyright (C) 2005 MontaVista Software, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * Maintainer: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * 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_IXP23XX_H
 | 
			
		||||
#define __ASM_ARCH_IXP23XX_H
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXP2300 linux memory map:
 | 
			
		||||
 *
 | 
			
		||||
 * virt		phys		size
 | 
			
		||||
 * fffd0000	a0000000	64K		XSI2CPP_CSR
 | 
			
		||||
 * fffc0000	c4000000	4K		EXP_CFG
 | 
			
		||||
 * fff00000	c8000000	64K		PERIPHERAL
 | 
			
		||||
 * fe000000	1c0000000	16M		CAP_CSR
 | 
			
		||||
 * fd000000	1c8000000	16M		MSF_CSR
 | 
			
		||||
 * fb000000			16M		---
 | 
			
		||||
 * fa000000	1d8000000	32M		PCI_IO
 | 
			
		||||
 * f8000000	1da000000	32M		PCI_CFG
 | 
			
		||||
 * f6000000	1de000000	32M		PCI_CREG
 | 
			
		||||
 * f4000000			32M		---
 | 
			
		||||
 * f0000000	1e0000000	64M		PCI_MEM
 | 
			
		||||
 * e[c-f]000000					per-platform mappings
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Static mappings.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_XSI2CPP_CSR_PHYS	0xa0000000
 | 
			
		||||
#define IXP23XX_XSI2CPP_CSR_VIRT	0xfffd0000
 | 
			
		||||
#define IXP23XX_XSI2CPP_CSR_SIZE	0x00010000
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_EXP_CFG_PHYS		0xc4000000
 | 
			
		||||
#define IXP23XX_EXP_CFG_VIRT		0xfffc0000
 | 
			
		||||
#define IXP23XX_EXP_CFG_SIZE		0x00001000
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_PERIPHERAL_PHYS		0xc8000000
 | 
			
		||||
#define IXP23XX_PERIPHERAL_VIRT		0xfff00000
 | 
			
		||||
#define IXP23XX_PERIPHERAL_SIZE		0x00010000
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_CAP_CSR_PHYS		0x1c0000000ULL
 | 
			
		||||
#define IXP23XX_CAP_CSR_VIRT		0xfe000000
 | 
			
		||||
#define IXP23XX_CAP_CSR_SIZE		0x01000000
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_MSF_CSR_PHYS		0x1c8000000ULL
 | 
			
		||||
#define IXP23XX_MSF_CSR_VIRT		0xfd000000
 | 
			
		||||
#define IXP23XX_MSF_CSR_SIZE		0x01000000
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_PCI_IO_PHYS		0x1d8000000ULL
 | 
			
		||||
#define IXP23XX_PCI_IO_VIRT		0xfa000000
 | 
			
		||||
#define IXP23XX_PCI_IO_SIZE		0x02000000
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_PCI_CFG_PHYS		0x1da000000ULL
 | 
			
		||||
#define IXP23XX_PCI_CFG_VIRT		0xf8000000
 | 
			
		||||
#define IXP23XX_PCI_CFG_SIZE		0x02000000
 | 
			
		||||
#define IXP23XX_PCI_CFG0_VIRT		IXP23XX_PCI_CFG_VIRT
 | 
			
		||||
#define IXP23XX_PCI_CFG1_VIRT		(IXP23XX_PCI_CFG_VIRT + 0x01000000)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_PCI_CREG_PHYS		0x1de000000ULL
 | 
			
		||||
#define IXP23XX_PCI_CREG_VIRT		0xf6000000
 | 
			
		||||
#define IXP23XX_PCI_CREG_SIZE		0x02000000
 | 
			
		||||
#define IXP23XX_PCI_CSR_VIRT		(IXP23XX_PCI_CREG_VIRT + 0x01000000)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_PCI_MEM_START		0xe0000000
 | 
			
		||||
#define IXP23XX_PCI_MEM_PHYS		0x1e0000000ULL
 | 
			
		||||
#define IXP23XX_PCI_MEM_VIRT		0xf0000000
 | 
			
		||||
#define IXP23XX_PCI_MEM_SIZE		0x04000000
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * XSI2CPP CSRs.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_XSI2CPP_REG(x)		((volatile unsigned long *)(IXP23XX_XSI2CPP_CSR_VIRT + (x)))
 | 
			
		||||
#define IXP23XX_CPP2XSI_CURR_XFER_REG3	IXP23XX_XSI2CPP_REG(0xf8)
 | 
			
		||||
#define IXP23XX_CPP2XSI_ADDR_31		(1 << 19)
 | 
			
		||||
#define IXP23XX_CPP2XSI_PSH_OFF		(1 << 20)
 | 
			
		||||
#define IXP23XX_CPP2XSI_COH_OFF		(1 << 21)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Expansion Bus Config.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_EXP_CFG_REG(x)		((volatile unsigned long *)(IXP23XX_EXP_CFG_VIRT + (x)))
 | 
			
		||||
#define IXP23XX_EXP_CS0			IXP23XX_EXP_CFG_REG(0x00)
 | 
			
		||||
#define IXP23XX_EXP_CS1			IXP23XX_EXP_CFG_REG(0x04)
 | 
			
		||||
#define IXP23XX_EXP_CS2			IXP23XX_EXP_CFG_REG(0x08)
 | 
			
		||||
#define IXP23XX_EXP_CS3			IXP23XX_EXP_CFG_REG(0x0c)
 | 
			
		||||
#define IXP23XX_EXP_CS4			IXP23XX_EXP_CFG_REG(0x10)
 | 
			
		||||
#define IXP23XX_EXP_CS5			IXP23XX_EXP_CFG_REG(0x14)
 | 
			
		||||
#define IXP23XX_EXP_CS6			IXP23XX_EXP_CFG_REG(0x18)
 | 
			
		||||
#define IXP23XX_EXP_CS7			IXP23XX_EXP_CFG_REG(0x1c)
 | 
			
		||||
#define IXP23XX_FLASH_WRITABLE		(0x2)
 | 
			
		||||
#define IXP23XX_FLASH_BUS8		(0x1)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_EXP_CFG0		IXP23XX_EXP_CFG_REG(0x20)
 | 
			
		||||
#define IXP23XX_EXP_CFG1		IXP23XX_EXP_CFG_REG(0x24)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_MEM_MAP		(1 << 31)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_XSCALE_SPEED_SEL 	(3 << 22)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_XSCALE_SPEED_EN	(1 << 21)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_CPP_SPEED_SEL		(3 << 19)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_CPP_SPEED_EN		(1 << 18)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_PCI_SWIN		(3 << 16)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_PCI_DWIN		(3 << 14)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_PCI33_MODE		(1 << 13)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_QDR_SPEED_SEL		(1 << 12)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_CPP_DIV_SEL		(1 << 5)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_XSI_NOT_PRES		(1 << 4)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_PROM_BOOT		(1 << 3)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_PCI_ARB		(1 << 2)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_PCI_HOST		(1 << 1)
 | 
			
		||||
#define IXP23XX_EXP_CFG0_FLASH_WIDTH		(1 << 0)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_EXP_UNIT_FUSE		IXP23XX_EXP_CFG_REG(0x28)
 | 
			
		||||
#define IXP23XX_EXP_MSF_MUX		IXP23XX_EXP_CFG_REG(0x30)
 | 
			
		||||
#define IXP23XX_EXP_CFG_FUSE		IXP23XX_EXP_CFG_REG(0x34)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_EXP_BUS_PHYS		0x90000000
 | 
			
		||||
#define IXP23XX_EXP_BUS_WINDOW_SIZE	0x01000000
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS0_BASE	(IXP23XX_EXP_BUS_PHYS + 0x00000000)
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS1_BASE	(IXP23XX_EXP_BUS_PHYS + 0x01000000)
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS2_BASE	(IXP23XX_EXP_BUS_PHYS + 0x02000000)
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS3_BASE	(IXP23XX_EXP_BUS_PHYS + 0x03000000)
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS4_BASE	(IXP23XX_EXP_BUS_PHYS + 0x04000000)
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS5_BASE	(IXP23XX_EXP_BUS_PHYS + 0x05000000)
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS6_BASE	(IXP23XX_EXP_BUS_PHYS + 0x06000000)
 | 
			
		||||
#define IXP23XX_EXP_BUS_CS7_BASE	(IXP23XX_EXP_BUS_PHYS + 0x07000000)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Peripherals.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_UART1_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x0000)
 | 
			
		||||
#define IXP23XX_UART2_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x1000)
 | 
			
		||||
#define IXP23XX_PMU_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x2000)
 | 
			
		||||
#define IXP23XX_INTC_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x3000)
 | 
			
		||||
#define IXP23XX_GPIO_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x4000)
 | 
			
		||||
#define IXP23XX_TIMER_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x5000)
 | 
			
		||||
#define IXP23XX_NPE0_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x6000)
 | 
			
		||||
#define IXP23XX_DSR_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x7000)
 | 
			
		||||
#define IXP23XX_NPE1_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x8000)
 | 
			
		||||
#define IXP23XX_ETH0_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0x9000)
 | 
			
		||||
#define IXP23XX_ETH1_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0xA000)
 | 
			
		||||
#define IXP23XX_GIG0_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0xB000)
 | 
			
		||||
#define IXP23XX_GIG1_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0xC000)
 | 
			
		||||
#define IXP23XX_DDRS_VIRT		(IXP23XX_PERIPHERAL_VIRT + 0xD000)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_UART1_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x0000)
 | 
			
		||||
#define IXP23XX_UART2_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x1000)
 | 
			
		||||
#define IXP23XX_PMU_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x2000)
 | 
			
		||||
#define IXP23XX_INTC_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x3000)
 | 
			
		||||
#define IXP23XX_GPIO_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x4000)
 | 
			
		||||
#define IXP23XX_TIMER_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x5000)
 | 
			
		||||
#define IXP23XX_NPE0_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x6000)
 | 
			
		||||
#define IXP23XX_DSR_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x7000)
 | 
			
		||||
#define IXP23XX_NPE1_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x8000)
 | 
			
		||||
#define IXP23XX_ETH0_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0x9000)
 | 
			
		||||
#define IXP23XX_ETH1_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0xA000)
 | 
			
		||||
#define IXP23XX_GIG0_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0xB000)
 | 
			
		||||
#define IXP23XX_GIG1_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0xC000)
 | 
			
		||||
#define IXP23XX_DDRS_PHYS		(IXP23XX_PERIPHERAL_PHYS + 0xD000)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Interrupt controller.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_INTC_REG(x)		 ((volatile unsigned long *)(IXP23XX_INTC_VIRT + (x)))
 | 
			
		||||
#define IXP23XX_INTR_ST1		IXP23XX_INTC_REG(0x00)
 | 
			
		||||
#define IXP23XX_INTR_ST2		IXP23XX_INTC_REG(0x04)
 | 
			
		||||
#define IXP23XX_INTR_ST3		IXP23XX_INTC_REG(0x08)
 | 
			
		||||
#define IXP23XX_INTR_ST4		IXP23XX_INTC_REG(0x0c)
 | 
			
		||||
#define IXP23XX_INTR_EN1		IXP23XX_INTC_REG(0x10)
 | 
			
		||||
#define IXP23XX_INTR_EN2		IXP23XX_INTC_REG(0x14)
 | 
			
		||||
#define IXP23XX_INTR_EN3		IXP23XX_INTC_REG(0x18)
 | 
			
		||||
#define IXP23XX_INTR_EN4		IXP23XX_INTC_REG(0x1c)
 | 
			
		||||
#define IXP23XX_INTR_SEL1		IXP23XX_INTC_REG(0x20)
 | 
			
		||||
#define IXP23XX_INTR_SEL2		IXP23XX_INTC_REG(0x24)
 | 
			
		||||
#define IXP23XX_INTR_SEL3		IXP23XX_INTC_REG(0x28)
 | 
			
		||||
#define IXP23XX_INTR_SEL4		IXP23XX_INTC_REG(0x2c)
 | 
			
		||||
#define IXP23XX_INTR_IRQ_ST1		IXP23XX_INTC_REG(0x30)
 | 
			
		||||
#define IXP23XX_INTR_IRQ_ST2		IXP23XX_INTC_REG(0x34)
 | 
			
		||||
#define IXP23XX_INTR_IRQ_ST3		IXP23XX_INTC_REG(0x38)
 | 
			
		||||
#define IXP23XX_INTR_IRQ_ST4		IXP23XX_INTC_REG(0x3c)
 | 
			
		||||
#define IXP23XX_INTR_IRQ_ENC_ST_OFFSET	0x54
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * GPIO.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_GPIO_REG(x)		((volatile unsigned long *)(IXP23XX_GPIO_VIRT + (x)))
 | 
			
		||||
#define IXP23XX_GPIO_GPOUTR		IXP23XX_GPIO_REG(0x00)
 | 
			
		||||
#define IXP23XX_GPIO_GPOER		IXP23XX_GPIO_REG(0x04)
 | 
			
		||||
#define IXP23XX_GPIO_GPINR		IXP23XX_GPIO_REG(0x08)
 | 
			
		||||
#define IXP23XX_GPIO_GPISR		IXP23XX_GPIO_REG(0x0c)
 | 
			
		||||
#define IXP23XX_GPIO_GPIT1R		IXP23XX_GPIO_REG(0x10)
 | 
			
		||||
#define IXP23XX_GPIO_GPIT2R		IXP23XX_GPIO_REG(0x14)
 | 
			
		||||
#define IXP23XX_GPIO_GPCLKR		IXP23XX_GPIO_REG(0x18)
 | 
			
		||||
#define IXP23XX_GPIO_GPDBSELR 		IXP23XX_GPIO_REG(0x1c)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_GPIO_STYLE_MASK		0x7
 | 
			
		||||
#define IXP23XX_GPIO_STYLE_ACTIVE_HIGH	0x0
 | 
			
		||||
#define IXP23XX_GPIO_STYLE_ACTIVE_LOW	0x1
 | 
			
		||||
#define IXP23XX_GPIO_STYLE_RISING_EDGE	0x2
 | 
			
		||||
#define IXP23XX_GPIO_STYLE_FALLING_EDGE	0x3
 | 
			
		||||
#define IXP23XX_GPIO_STYLE_TRANSITIONAL	0x4
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_GPIO_STYLE_SIZE		3
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * Timer.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_TIMER_REG(x)		((volatile unsigned long *)(IXP23XX_TIMER_VIRT + (x)))
 | 
			
		||||
#define IXP23XX_TIMER_CONT		IXP23XX_TIMER_REG(0x00)
 | 
			
		||||
#define IXP23XX_TIMER1_TIMESTAMP	IXP23XX_TIMER_REG(0x04)
 | 
			
		||||
#define IXP23XX_TIMER1_RELOAD		IXP23XX_TIMER_REG(0x08)
 | 
			
		||||
#define IXP23XX_TIMER2_TIMESTAMP	IXP23XX_TIMER_REG(0x0c)
 | 
			
		||||
#define IXP23XX_TIMER2_RELOAD		IXP23XX_TIMER_REG(0x10)
 | 
			
		||||
#define IXP23XX_TIMER_WDOG		IXP23XX_TIMER_REG(0x14)
 | 
			
		||||
#define IXP23XX_TIMER_WDOG_EN		IXP23XX_TIMER_REG(0x18)
 | 
			
		||||
#define IXP23XX_TIMER_WDOG_KEY		IXP23XX_TIMER_REG(0x1c)
 | 
			
		||||
#define IXP23XX_TIMER_WDOG_KEY_MAGIC	0x482e
 | 
			
		||||
#define IXP23XX_TIMER_STATUS		IXP23XX_TIMER_REG(0x20)
 | 
			
		||||
#define IXP23XX_TIMER_SOFT_RESET	IXP23XX_TIMER_REG(0x24)
 | 
			
		||||
#define IXP23XX_TIMER_SOFT_RESET_EN	IXP23XX_TIMER_REG(0x28)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_TIMER_ENABLE		(1 << 0)
 | 
			
		||||
#define IXP23XX_TIMER_ONE_SHOT		(1 << 1)
 | 
			
		||||
/* Low order bits of reload value ignored */
 | 
			
		||||
#define IXP23XX_TIMER_RELOAD_MASK	(0x3)
 | 
			
		||||
#define IXP23XX_TIMER_DISABLED		(0x0)
 | 
			
		||||
#define IXP23XX_TIMER1_INT_PEND		(1 << 0)
 | 
			
		||||
#define IXP23XX_TIMER2_INT_PEND		(1 << 1)
 | 
			
		||||
#define IXP23XX_TIMER_STATUS_TS_PEND	(1 << 2)
 | 
			
		||||
#define IXP23XX_TIMER_STATUS_WDOG_PEND	(1 << 3)
 | 
			
		||||
#define IXP23XX_TIMER_STATUS_WARM_RESET	(1 << 4)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * CAP CSRs.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_GLOBAL_REG(x)		((volatile unsigned long *)(IXP23XX_CAP_CSR_VIRT + 0x4a00 + (x)))
 | 
			
		||||
#define IXP23XX_PRODUCT_ID		IXP23XX_GLOBAL_REG(0x00)
 | 
			
		||||
#define IXP23XX_MISC_CONTROL		IXP23XX_GLOBAL_REG(0x04)
 | 
			
		||||
#define IXP23XX_MSF_CLK_CNTRL		IXP23XX_GLOBAL_REG(0x08)
 | 
			
		||||
#define IXP23XX_RESET0			IXP23XX_GLOBAL_REG(0x0c)
 | 
			
		||||
#define IXP23XX_RESET1			IXP23XX_GLOBAL_REG(0x10)
 | 
			
		||||
#define IXP23XX_STRAP_OPTIONS		IXP23XX_GLOBAL_REG(0x18)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_ENABLE_WATCHDOG		(1 << 24)
 | 
			
		||||
#define IXP23XX_SHPC_INIT_COMP		(1 << 21)
 | 
			
		||||
#define IXP23XX_RST_ALL			(1 << 16)
 | 
			
		||||
#define IXP23XX_RESET_PCI		(1 << 2)
 | 
			
		||||
#define IXP23XX_PCI_UNIT_RESET		(1 << 1)
 | 
			
		||||
#define IXP23XX_XSCALE_RESET		(1 << 0)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_UENGINE_CSR_VIRT_BASE	(IXP23XX_CAP_CSR_VIRT + 0x18000)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
 * PCI CSRs.
 | 
			
		||||
 ****************************************************************************/
 | 
			
		||||
#define IXP23XX_PCI_CREG(x)		((volatile unsigned long *)(IXP23XX_PCI_CREG_VIRT + (x)))
 | 
			
		||||
#define IXP23XX_PCI_CMDSTAT		IXP23XX_PCI_CREG(0x04)
 | 
			
		||||
#define IXP23XX_PCI_SRAM_BAR		IXP23XX_PCI_CREG(0x14)
 | 
			
		||||
#define IXP23XX_PCI_SDRAM_BAR		IXP23XX_PCI_CREG(0x18)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_PCI_CSR(x)		((volatile unsigned long *)(IXP23XX_PCI_CREG_VIRT + 0x01000000 + (x)))
 | 
			
		||||
#define IXP23XX_PCI_OUT_INT_STATUS	IXP23XX_PCI_CSR(0x0030)
 | 
			
		||||
#define IXP23XX_PCI_OUT_INT_MASK	IXP23XX_PCI_CSR(0x0034)
 | 
			
		||||
#define IXP23XX_PCI_SRAM_BASE_ADDR_MASK IXP23XX_PCI_CSR(0x00fc)
 | 
			
		||||
#define IXP23XX_PCI_DRAM_BASE_ADDR_MASK IXP23XX_PCI_CSR(0x0100)
 | 
			
		||||
#define IXP23XX_PCI_CONTROL		IXP23XX_PCI_CSR(0x013c)
 | 
			
		||||
#define IXP23XX_PCI_ADDR_EXT		IXP23XX_PCI_CSR(0x0140)
 | 
			
		||||
#define IXP23XX_PCI_ME_PUSH_STATUS	IXP23XX_PCI_CSR(0x0148)
 | 
			
		||||
#define IXP23XX_PCI_ME_PUSH_EN		IXP23XX_PCI_CSR(0x014c)
 | 
			
		||||
#define IXP23XX_PCI_ERR_STATUS		IXP23XX_PCI_CSR(0x0150)
 | 
			
		||||
#define IXP23XX_PCI_ERROR_STATUS	IXP23XX_PCI_CSR(0x0150)
 | 
			
		||||
#define IXP23XX_PCI_ERR_ENABLE		IXP23XX_PCI_CSR(0x0154)
 | 
			
		||||
#define IXP23XX_PCI_XSCALE_INT_STATUS	IXP23XX_PCI_CSR(0x0158)
 | 
			
		||||
#define IXP23XX_PCI_XSCALE_INT_ENABLE	IXP23XX_PCI_CSR(0x015c)
 | 
			
		||||
#define IXP23XX_PCI_CPP_ADDR_BITS	IXP23XX_PCI_CSR(0x0160)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,34 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/memory.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2003-2004 Intel Corp.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify it
 | 
			
		||||
 * under the terms of the GNU General Public License as published by the
 | 
			
		||||
 * Free Software Foundation; either version 2 of the License, or (at your
 | 
			
		||||
 * option) any later version.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASM_ARCH_MEMORY_H
 | 
			
		||||
#define __ASM_ARCH_MEMORY_H
 | 
			
		||||
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Physical DRAM offset.
 | 
			
		||||
 */
 | 
			
		||||
#define PLAT_PHYS_OFFSET		(0x00000000)
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_PCI_SDRAM_OFFSET (*((volatile int *)IXP23XX_PCI_SDRAM_BAR) & 0xfffffff0)
 | 
			
		||||
 | 
			
		||||
#define __phys_to_bus(x)	((x) + (IXP23XX_PCI_SDRAM_OFFSET - PHYS_OFFSET))
 | 
			
		||||
#define __bus_to_phys(x)	((x) - (IXP23XX_PCI_SDRAM_OFFSET - PHYS_OFFSET))
 | 
			
		||||
 | 
			
		||||
#define __virt_to_bus(v)	__phys_to_bus(__virt_to_phys(v))
 | 
			
		||||
#define __bus_to_virt(b)	__phys_to_virt(__bus_to_phys(b))
 | 
			
		||||
#define __pfn_to_bus(p)		__phys_to_bus(__pfn_to_phys(p))
 | 
			
		||||
#define __bus_to_pfn(b)		__phys_to_pfn(__bus_to_phys(b))
 | 
			
		||||
 | 
			
		||||
#define arch_is_coherent()	1
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,58 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/platform.h
 | 
			
		||||
 *
 | 
			
		||||
 * Various bits of code used by platform-level code.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2005 (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 __ASSEMBLY__
 | 
			
		||||
 | 
			
		||||
static inline unsigned long ixp2000_reg_read(volatile void *reg)
 | 
			
		||||
{
 | 
			
		||||
	return *((volatile unsigned long *)reg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void ixp2000_reg_write(volatile void *reg, unsigned long val)
 | 
			
		||||
{
 | 
			
		||||
	*((volatile unsigned long *)reg) = val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void ixp2000_reg_wrb(volatile void *reg, unsigned long val)
 | 
			
		||||
{
 | 
			
		||||
	*((volatile unsigned long *)reg) = val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct pci_sys_data;
 | 
			
		||||
 | 
			
		||||
void ixp23xx_map_io(void);
 | 
			
		||||
void ixp23xx_init_irq(void);
 | 
			
		||||
void ixp23xx_sys_init(void);
 | 
			
		||||
void ixp23xx_restart(char, const char *);
 | 
			
		||||
int ixp23xx_pci_setup(int, struct pci_sys_data *);
 | 
			
		||||
void ixp23xx_pci_preinit(void);
 | 
			
		||||
struct pci_bus *ixp23xx_pci_scan_bus(int, struct pci_sys_data*);
 | 
			
		||||
void ixp23xx_pci_slave_init(void);
 | 
			
		||||
 | 
			
		||||
extern struct sys_timer ixp23xx_timer;
 | 
			
		||||
 | 
			
		||||
#define IXP23XX_UART_XTAL		14745600
 | 
			
		||||
 | 
			
		||||
#ifndef __ASSEMBLY__
 | 
			
		||||
/*
 | 
			
		||||
 * Is system memory on the XSI or CPP bus?
 | 
			
		||||
 */
 | 
			
		||||
static inline unsigned ixp23xx_cpp_boot(void)
 | 
			
		||||
{
 | 
			
		||||
	return (*IXP23XX_EXP_CFG0 & IXP23XX_EXP_CFG0_XSI_NOT_PRES);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,3 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/time.h
 | 
			
		||||
 */
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/timex.h
 | 
			
		||||
 *
 | 
			
		||||
 * XScale architecture timex specifications
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define CLOCK_TICK_RATE 75000000
 | 
			
		||||
| 
						 | 
				
			
			@ -1,40 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/include/mach/uncompress.h
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2002-2004 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ASM_ARCH_UNCOMPRESS_H
 | 
			
		||||
#define __ASM_ARCH_UNCOMPRESS_H
 | 
			
		||||
 | 
			
		||||
#include <mach/ixp23xx.h>
 | 
			
		||||
#include <linux/serial_reg.h>
 | 
			
		||||
 | 
			
		||||
#define UART_BASE	((volatile u32 *)IXP23XX_UART1_PHYS)
 | 
			
		||||
 | 
			
		||||
static inline void putc(char c)
 | 
			
		||||
{
 | 
			
		||||
	int j;
 | 
			
		||||
 | 
			
		||||
	for (j = 0; j < 0x1000; j++) {
 | 
			
		||||
		if (UART_BASE[UART_LSR] & UART_LSR_THRE)
 | 
			
		||||
			break;
 | 
			
		||||
		barrier();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	UART_BASE[UART_TX] = c;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline void flush(void)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define arch_decomp_setup()
 | 
			
		||||
#define arch_decomp_wdog()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -1,347 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/ixdp2351.c
 | 
			
		||||
 *
 | 
			
		||||
 * IXDP2351 board-specific routines
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2005 (c) MontaVista Software, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * Based on 2.4 code Copyright 2004 (c) Intel Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/spinlock.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/irq.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/serial_8250.h>
 | 
			
		||||
#include <linux/serial_core.h>
 | 
			
		||||
#include <linux/device.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/mtd/physmap.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/types.h>
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
#include <asm/memory.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
#include <asm/tlbflush.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP2351 Interrupt Handling
 | 
			
		||||
 */
 | 
			
		||||
static void ixdp2351_inta_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	*IXDP2351_CPLD_INTA_MASK_SET_REG = IXDP2351_INTA_IRQ_MASK(d->irq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2351_inta_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	*IXDP2351_CPLD_INTA_MASK_CLR_REG = IXDP2351_INTA_IRQ_MASK(d->irq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2351_inta_handler(unsigned int irq, struct irq_desc *desc)
 | 
			
		||||
{
 | 
			
		||||
	u16 ex_interrupt =
 | 
			
		||||
		*IXDP2351_CPLD_INTA_STAT_REG & IXDP2351_INTA_IRQ_VALID;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_mask(&desc->irq_data);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < IXDP2351_INTA_IRQ_NUM; i++) {
 | 
			
		||||
		if (ex_interrupt & (1 << i)) {
 | 
			
		||||
			int cpld_irq =
 | 
			
		||||
				IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE + i);
 | 
			
		||||
			generic_handle_irq(cpld_irq);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_unmask(&desc->irq_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixdp2351_inta_chip = {
 | 
			
		||||
	.irq_ack	= ixdp2351_inta_mask,
 | 
			
		||||
	.irq_mask	= ixdp2351_inta_mask,
 | 
			
		||||
	.irq_unmask	= ixdp2351_inta_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void ixdp2351_intb_mask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	*IXDP2351_CPLD_INTB_MASK_SET_REG = IXDP2351_INTB_IRQ_MASK(d->irq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2351_intb_unmask(struct irq_data *d)
 | 
			
		||||
{
 | 
			
		||||
	*IXDP2351_CPLD_INTB_MASK_CLR_REG = IXDP2351_INTB_IRQ_MASK(d->irq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2351_intb_handler(unsigned int irq, struct irq_desc *desc)
 | 
			
		||||
{
 | 
			
		||||
	u16 ex_interrupt =
 | 
			
		||||
		*IXDP2351_CPLD_INTB_STAT_REG & IXDP2351_INTB_IRQ_VALID;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_ack(&desc->irq_data);
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < IXDP2351_INTB_IRQ_NUM; i++) {
 | 
			
		||||
		if (ex_interrupt & (1 << i)) {
 | 
			
		||||
			int cpld_irq =
 | 
			
		||||
				IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE + i);
 | 
			
		||||
			generic_handle_irq(cpld_irq);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	desc->irq_data.chip->irq_unmask(&desc->irq_data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct irq_chip ixdp2351_intb_chip = {
 | 
			
		||||
	.irq_ack	= ixdp2351_intb_mask,
 | 
			
		||||
	.irq_mask	= ixdp2351_intb_mask,
 | 
			
		||||
	.irq_unmask	= ixdp2351_intb_unmask
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void __init ixdp2351_init_irq(void)
 | 
			
		||||
{
 | 
			
		||||
	int irq;
 | 
			
		||||
 | 
			
		||||
	/* Mask all interrupts from CPLD, disable simulation */
 | 
			
		||||
	*IXDP2351_CPLD_INTA_MASK_SET_REG = (u16) -1;
 | 
			
		||||
	*IXDP2351_CPLD_INTB_MASK_SET_REG = (u16) -1;
 | 
			
		||||
	*IXDP2351_CPLD_INTA_SIM_REG = 0;
 | 
			
		||||
	*IXDP2351_CPLD_INTB_SIM_REG = 0;
 | 
			
		||||
 | 
			
		||||
	ixp23xx_init_irq();
 | 
			
		||||
 | 
			
		||||
	for (irq = IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE);
 | 
			
		||||
	     irq <
 | 
			
		||||
	     IXP23XX_MACH_IRQ(IXDP2351_INTA_IRQ_BASE + IXDP2351_INTA_IRQ_NUM);
 | 
			
		||||
	     irq++) {
 | 
			
		||||
		if (IXDP2351_INTA_IRQ_MASK(irq) & IXDP2351_INTA_IRQ_VALID) {
 | 
			
		||||
			set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
			irq_set_chip_and_handler(irq, &ixdp2351_inta_chip,
 | 
			
		||||
						 handle_level_irq);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (irq = IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE);
 | 
			
		||||
	     irq <
 | 
			
		||||
	     IXP23XX_MACH_IRQ(IXDP2351_INTB_IRQ_BASE + IXDP2351_INTB_IRQ_NUM);
 | 
			
		||||
	     irq++) {
 | 
			
		||||
		if (IXDP2351_INTB_IRQ_MASK(irq) & IXDP2351_INTB_IRQ_VALID) {
 | 
			
		||||
			set_irq_flags(irq, IRQF_VALID);
 | 
			
		||||
			irq_set_chip_and_handler(irq, &ixdp2351_intb_chip,
 | 
			
		||||
						 handle_level_irq);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	irq_set_chained_handler(IRQ_IXP23XX_INTA, ixdp2351_inta_handler);
 | 
			
		||||
	irq_set_chained_handler(IRQ_IXP23XX_INTB, ixdp2351_intb_handler);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP2351 PCI
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * This board does not do normal PCI IRQ routing, or any
 | 
			
		||||
 * sort of swizzling, so we just need to check where on the
 | 
			
		||||
 * bus the device is and figure out what CPLD pin it is
 | 
			
		||||
 * being routed to.
 | 
			
		||||
 */
 | 
			
		||||
#define DEVPIN(dev, pin) ((pin) | ((dev) << 3))
 | 
			
		||||
 | 
			
		||||
static int __init ixdp2351_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
 | 
			
		||||
{
 | 
			
		||||
	u8 bus = dev->bus->number;
 | 
			
		||||
	u32 devpin = DEVPIN(PCI_SLOT(dev->devfn), pin);
 | 
			
		||||
	struct pci_bus *tmp_bus = dev->bus;
 | 
			
		||||
 | 
			
		||||
	/* Primary bus, no interrupts here */
 | 
			
		||||
	if (!bus)
 | 
			
		||||
		return -1;
 | 
			
		||||
 | 
			
		||||
	/* Lookup first leaf in bus tree */
 | 
			
		||||
	while ((tmp_bus->parent != NULL) && (tmp_bus->parent->parent != NULL))
 | 
			
		||||
		tmp_bus = tmp_bus->parent;
 | 
			
		||||
 | 
			
		||||
	/* Select between known bridges */
 | 
			
		||||
	switch (tmp_bus->self->devfn | (tmp_bus->self->bus->number << 8)) {
 | 
			
		||||
		/* Device is located after first bridge */
 | 
			
		||||
	case 0x0008:
 | 
			
		||||
		if (tmp_bus == dev->bus) {
 | 
			
		||||
			/* Device is located directy after first bridge */
 | 
			
		||||
			switch (devpin) {
 | 
			
		||||
				/* Onboard 82546 */
 | 
			
		||||
			case DEVPIN(1, 1):	/* Onboard 82546 ch 0 */
 | 
			
		||||
				return IRQ_IXDP2351_INTA_82546;
 | 
			
		||||
			case DEVPIN(1, 2):	/* Onboard 82546 ch 1 */
 | 
			
		||||
				return IRQ_IXDP2351_INTB_82546;
 | 
			
		||||
				/* PMC SLOT */
 | 
			
		||||
			case DEVPIN(0, 1):	/* PMCP INTA# */
 | 
			
		||||
			case DEVPIN(2, 4):	/* PMCS INTD# */
 | 
			
		||||
				return IRQ_IXDP2351_SPCI_PMC_INTA;
 | 
			
		||||
			case DEVPIN(0, 2):	/* PMCP INTB# */
 | 
			
		||||
			case DEVPIN(2, 1):	/* PMCS INTA# */
 | 
			
		||||
				return IRQ_IXDP2351_SPCI_PMC_INTB;
 | 
			
		||||
			case DEVPIN(0, 3):	/* PMCP INTC# */
 | 
			
		||||
			case DEVPIN(2, 2):	/* PMCS INTB# */
 | 
			
		||||
				return IRQ_IXDP2351_SPCI_PMC_INTC;
 | 
			
		||||
			case DEVPIN(0, 4):	/* PMCP INTD# */
 | 
			
		||||
			case DEVPIN(2, 3):	/* PMCS INTC# */
 | 
			
		||||
				return IRQ_IXDP2351_SPCI_PMC_INTD;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Device is located indirectly after first bridge */
 | 
			
		||||
			/* Not supported now */
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case 0x0010:
 | 
			
		||||
		if (tmp_bus == dev->bus) {
 | 
			
		||||
			/* Device is located directy after second bridge */
 | 
			
		||||
			/* Secondary bus of second bridge */
 | 
			
		||||
			switch (devpin) {
 | 
			
		||||
			case DEVPIN(0, 1):	/* DB#0 */
 | 
			
		||||
			case DEVPIN(0, 2):
 | 
			
		||||
			case DEVPIN(0, 3):
 | 
			
		||||
			case DEVPIN(0, 4):
 | 
			
		||||
				return IRQ_IXDP2351_SPCI_DB_0;
 | 
			
		||||
			case DEVPIN(1, 1):	/* DB#1 */
 | 
			
		||||
			case DEVPIN(1, 2):
 | 
			
		||||
			case DEVPIN(1, 3):
 | 
			
		||||
			case DEVPIN(1, 4):
 | 
			
		||||
				return IRQ_IXDP2351_SPCI_DB_1;
 | 
			
		||||
			case DEVPIN(2, 1):	/* FIC1 */
 | 
			
		||||
			case DEVPIN(2, 2):
 | 
			
		||||
			case DEVPIN(2, 3):
 | 
			
		||||
			case DEVPIN(2, 4):
 | 
			
		||||
			case DEVPIN(3, 1):	/* FIC2 */
 | 
			
		||||
			case DEVPIN(3, 2):
 | 
			
		||||
			case DEVPIN(3, 3):
 | 
			
		||||
			case DEVPIN(3, 4):
 | 
			
		||||
				return IRQ_IXDP2351_SPCI_FIC;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Device is located indirectly after second bridge */
 | 
			
		||||
			/* Not supported now */
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct hw_pci ixdp2351_pci __initdata = {
 | 
			
		||||
	.nr_controllers	= 1,
 | 
			
		||||
	.preinit	= ixp23xx_pci_preinit,
 | 
			
		||||
	.setup		= ixp23xx_pci_setup,
 | 
			
		||||
	.scan		= ixp23xx_pci_scan_bus,
 | 
			
		||||
	.map_irq	= ixdp2351_map_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int __init ixdp2351_pci_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_ixdp2351())
 | 
			
		||||
		pci_common_init(&ixdp2351_pci);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
subsys_initcall(ixdp2351_pci_init);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXDP2351 Static Mapped I/O
 | 
			
		||||
 */
 | 
			
		||||
static struct map_desc ixdp2351_io_desc[] __initdata = {
 | 
			
		||||
	{
 | 
			
		||||
		.virtual	= IXDP2351_NP_VIRT_BASE,
 | 
			
		||||
		.pfn		= __phys_to_pfn((u64)IXDP2351_NP_PHYS_BASE),
 | 
			
		||||
		.length		= IXDP2351_NP_PHYS_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE
 | 
			
		||||
	}, {
 | 
			
		||||
		.virtual	= IXDP2351_BB_BASE_VIRT,
 | 
			
		||||
		.pfn		= __phys_to_pfn((u64)IXDP2351_BB_BASE_PHYS),
 | 
			
		||||
		.length		= IXDP2351_BB_SIZE,
 | 
			
		||||
		.type		= MT_DEVICE
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2351_map_io(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp23xx_map_io();
 | 
			
		||||
	iotable_init(ixdp2351_io_desc, ARRAY_SIZE(ixdp2351_io_desc));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct physmap_flash_data ixdp2351_flash_data = {
 | 
			
		||||
	.width		= 1,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixdp2351_flash_resource = {
 | 
			
		||||
	.start		= 0x90000000,
 | 
			
		||||
	.end		= 0x93ffffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device ixdp2351_flash = {
 | 
			
		||||
	.name		= "physmap-flash",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data	= &ixdp2351_flash_data,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &ixdp2351_flash_resource,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void __init ixdp2351_init(void)
 | 
			
		||||
{
 | 
			
		||||
	platform_device_register(&ixdp2351_flash);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Mark flash as writeable
 | 
			
		||||
	 */
 | 
			
		||||
	IXP23XX_EXP_CS0[0] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
	IXP23XX_EXP_CS0[1] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
	IXP23XX_EXP_CS0[2] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
	IXP23XX_EXP_CS0[3] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
 | 
			
		||||
	ixp23xx_sys_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ixdp2351_restart(char mode, const char *cmd)
 | 
			
		||||
{
 | 
			
		||||
	/* First try machine specific support */
 | 
			
		||||
 | 
			
		||||
	*IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_MAGIC;
 | 
			
		||||
	(void) *IXDP2351_CPLD_RESET1_REG;
 | 
			
		||||
	*IXDP2351_CPLD_RESET1_REG = IXDP2351_CPLD_RESET1_ENABLE;
 | 
			
		||||
 | 
			
		||||
	ixp23xx_restart(mode, cmd);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MACHINE_START(IXDP2351, "Intel IXDP2351 Development Platform")
 | 
			
		||||
	/* Maintainer: MontaVista Software, Inc. */
 | 
			
		||||
	.map_io		= ixdp2351_map_io,
 | 
			
		||||
	.init_irq	= ixdp2351_init_irq,
 | 
			
		||||
	.timer		= &ixp23xx_timer,
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.init_machine	= ixdp2351_init,
 | 
			
		||||
	.restart	= ixdp2351_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
| 
						 | 
				
			
			@ -1,294 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/pci.c
 | 
			
		||||
 *
 | 
			
		||||
 * PCI routines for IXP23XX based systems
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (c) 2005 MontaVista Software, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * based on original code:
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Naeem Afzal <naeem.m.afzal@intel.com>
 | 
			
		||||
 * Copyright 2002-2005 Intel Corp.
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/sizes.h>
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
 | 
			
		||||
extern int (*external_fault) (unsigned long, struct pt_regs *);
 | 
			
		||||
 | 
			
		||||
static volatile int pci_master_aborts = 0;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
#define DBG(x...)	printk(x)
 | 
			
		||||
#else
 | 
			
		||||
#define DBG(x...)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
int clear_master_aborts(void);
 | 
			
		||||
 | 
			
		||||
static u32
 | 
			
		||||
*ixp23xx_pci_config_addr(unsigned int bus_nr, unsigned int devfn, int where)
 | 
			
		||||
{
 | 
			
		||||
	u32 *paddress;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Must be dword aligned
 | 
			
		||||
	 */
 | 
			
		||||
	where &= ~3;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * For top bus, generate type 0, else type 1
 | 
			
		||||
	 */
 | 
			
		||||
	if (!bus_nr) {
 | 
			
		||||
		if (PCI_SLOT(devfn) >= 8)
 | 
			
		||||
			return 0;
 | 
			
		||||
 | 
			
		||||
		paddress = (u32 *) (IXP23XX_PCI_CFG0_VIRT
 | 
			
		||||
				    | (1 << (PCI_SLOT(devfn) + 16))
 | 
			
		||||
				    | (PCI_FUNC(devfn) << 8) | where);
 | 
			
		||||
	} else {
 | 
			
		||||
		paddress = (u32 *) (IXP23XX_PCI_CFG1_VIRT
 | 
			
		||||
				    | (bus_nr << 16)
 | 
			
		||||
				    | (PCI_SLOT(devfn) << 11)
 | 
			
		||||
				    | (PCI_FUNC(devfn) << 8) | where);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return paddress;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Mask table, bits to mask for quantity of size 1, 2 or 4 bytes.
 | 
			
		||||
 * 0 and 3 are not valid indexes...
 | 
			
		||||
 */
 | 
			
		||||
static u32 bytemask[] = {
 | 
			
		||||
	/*0*/	0,
 | 
			
		||||
	/*1*/	0xff,
 | 
			
		||||
	/*2*/	0xffff,
 | 
			
		||||
	/*3*/	0,
 | 
			
		||||
	/*4*/	0xffffffff,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int ixp23xx_pci_read_config(struct pci_bus *bus, unsigned int devfn,
 | 
			
		||||
				int where, int size, u32 *value)
 | 
			
		||||
{
 | 
			
		||||
	u32 n;
 | 
			
		||||
	u32 *addr;
 | 
			
		||||
 | 
			
		||||
	n = where % 4;
 | 
			
		||||
 | 
			
		||||
	DBG("In config_read(%d) %d from dev %d:%d:%d\n", size, where,
 | 
			
		||||
		bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));
 | 
			
		||||
 | 
			
		||||
	addr = ixp23xx_pci_config_addr(bus->number, devfn, where);
 | 
			
		||||
	if (!addr)
 | 
			
		||||
		return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
 | 
			
		||||
	pci_master_aborts = 0;
 | 
			
		||||
	*value = (*addr >> (8*n)) & bytemask[size];
 | 
			
		||||
	if (pci_master_aborts) {
 | 
			
		||||
			pci_master_aborts = 0;
 | 
			
		||||
			*value = 0xffffffff;
 | 
			
		||||
			return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	return PCIBIOS_SUCCESSFUL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * We don't do error checking on the address for writes.
 | 
			
		||||
 * It's assumed that the user checked for the device existing first
 | 
			
		||||
 * by doing a read first.
 | 
			
		||||
 */
 | 
			
		||||
static int ixp23xx_pci_write_config(struct pci_bus *bus, unsigned int devfn,
 | 
			
		||||
					int where, int size, u32 value)
 | 
			
		||||
{
 | 
			
		||||
	u32 mask;
 | 
			
		||||
	u32 *addr;
 | 
			
		||||
	u32 temp;
 | 
			
		||||
 | 
			
		||||
	mask = ~(bytemask[size] << ((where % 0x4) * 8));
 | 
			
		||||
	addr = ixp23xx_pci_config_addr(bus->number, devfn, where);
 | 
			
		||||
	if (!addr)
 | 
			
		||||
		return PCIBIOS_DEVICE_NOT_FOUND;
 | 
			
		||||
	temp = (u32) (value) << ((where % 0x4) * 8);
 | 
			
		||||
	*addr = (*addr & mask) | temp;
 | 
			
		||||
 | 
			
		||||
	clear_master_aborts();
 | 
			
		||||
 | 
			
		||||
	return PCIBIOS_SUCCESSFUL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct pci_ops ixp23xx_pci_ops = {
 | 
			
		||||
	.read	= ixp23xx_pci_read_config,
 | 
			
		||||
	.write	= ixp23xx_pci_write_config,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct pci_bus *ixp23xx_pci_scan_bus(int nr, struct pci_sys_data *sysdata)
 | 
			
		||||
{
 | 
			
		||||
	return pci_scan_root_bus(NULL, sysdata->busnr, &ixp23xx_pci_ops,
 | 
			
		||||
				 sysdata, &sysdata->resources);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ixp23xx_pci_abort_handler(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 | 
			
		||||
{
 | 
			
		||||
	volatile unsigned long temp;
 | 
			
		||||
	unsigned long flags;
 | 
			
		||||
 | 
			
		||||
	pci_master_aborts = 1;
 | 
			
		||||
 | 
			
		||||
	local_irq_save(flags);
 | 
			
		||||
	temp = *IXP23XX_PCI_CONTROL;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * master abort and cmd tgt err
 | 
			
		||||
	 */
 | 
			
		||||
	if (temp & ((1 << 8) | (1 << 5)))
 | 
			
		||||
		*IXP23XX_PCI_CONTROL = temp;
 | 
			
		||||
 | 
			
		||||
	temp = *IXP23XX_PCI_CMDSTAT;
 | 
			
		||||
 | 
			
		||||
	if (temp & (1 << 29))
 | 
			
		||||
		*IXP23XX_PCI_CMDSTAT = temp;
 | 
			
		||||
	local_irq_restore(flags);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * If it was an imprecise abort, then we need to correct the
 | 
			
		||||
	 * return address to be _after_ the instruction.
 | 
			
		||||
	 */
 | 
			
		||||
	if (fsr & (1 << 10))
 | 
			
		||||
		regs->ARM_pc += 4;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int clear_master_aborts(void)
 | 
			
		||||
{
 | 
			
		||||
	volatile u32 temp;
 | 
			
		||||
 | 
			
		||||
	temp = *IXP23XX_PCI_CONTROL;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * master abort and cmd tgt err
 | 
			
		||||
	 */
 | 
			
		||||
	if (temp & ((1 << 8) | (1 << 5)))
 | 
			
		||||
		*IXP23XX_PCI_CONTROL = temp;
 | 
			
		||||
 | 
			
		||||
	temp = *IXP23XX_PCI_CMDSTAT;
 | 
			
		||||
 | 
			
		||||
	if (temp & (1 << 29))
 | 
			
		||||
		*IXP23XX_PCI_CMDSTAT = temp;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init ixp23xx_pci_common_init(void)
 | 
			
		||||
{
 | 
			
		||||
#ifdef __ARMEB__
 | 
			
		||||
	*IXP23XX_PCI_CONTROL |= 0x20000;	/* set I/O swapping */
 | 
			
		||||
#endif
 | 
			
		||||
	/*
 | 
			
		||||
	 * ADDR_31 needs to be clear for PCI memory access to CPP memory
 | 
			
		||||
	 */
 | 
			
		||||
	*IXP23XX_CPP2XSI_CURR_XFER_REG3 &= ~IXP23XX_CPP2XSI_ADDR_31;
 | 
			
		||||
	*IXP23XX_CPP2XSI_CURR_XFER_REG3 |= IXP23XX_CPP2XSI_PSH_OFF;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Select correct memory for PCI inbound transactions
 | 
			
		||||
	 */
 | 
			
		||||
	if (ixp23xx_cpp_boot()) {
 | 
			
		||||
		*IXP23XX_PCI_CPP_ADDR_BITS &= ~(1 << 1);
 | 
			
		||||
	} else {
 | 
			
		||||
		*IXP23XX_PCI_CPP_ADDR_BITS |= (1 << 1);
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Enable coherency on A2 silicon.
 | 
			
		||||
		 */
 | 
			
		||||
		if (arch_is_coherent())
 | 
			
		||||
			*IXP23XX_CPP2XSI_CURR_XFER_REG3 &= ~IXP23XX_CPP2XSI_COH_OFF;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init ixp23xx_pci_preinit(void)
 | 
			
		||||
{
 | 
			
		||||
	pcibios_min_io = 0;
 | 
			
		||||
	pcibios_min_mem = 0xe0000000;
 | 
			
		||||
 | 
			
		||||
	pci_set_flags(0);
 | 
			
		||||
 | 
			
		||||
	ixp23xx_pci_common_init();
 | 
			
		||||
 | 
			
		||||
	hook_fault_code(16+6, ixp23xx_pci_abort_handler, SIGBUS, 0,
 | 
			
		||||
			"PCI config cycle to non-existent device");
 | 
			
		||||
 | 
			
		||||
	*IXP23XX_PCI_ADDR_EXT = 0x0000e000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Prevent PCI layer from seeing the inbound host-bridge resources
 | 
			
		||||
 */
 | 
			
		||||
static void __devinit pci_fixup_ixp23xx(struct pci_dev *dev)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	dev->class &= 0xff;
 | 
			
		||||
	dev->class |= PCI_CLASS_BRIDGE_HOST << 8;
 | 
			
		||||
	for (i = 0; i < PCI_NUM_RESOURCES; i++) {
 | 
			
		||||
		dev->resource[i].start = 0;
 | 
			
		||||
		dev->resource[i].end   = 0;
 | 
			
		||||
		dev->resource[i].flags = 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x9002, pci_fixup_ixp23xx);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * IXP2300 systems often have large resource requirements, so we just
 | 
			
		||||
 * use our own resource space.
 | 
			
		||||
 */
 | 
			
		||||
static struct resource ixp23xx_pci_mem_space = {
 | 
			
		||||
	.start	= IXP23XX_PCI_MEM_START,
 | 
			
		||||
	.end	= IXP23XX_PCI_MEM_START + IXP23XX_PCI_MEM_SIZE - 1,
 | 
			
		||||
	.flags	= IORESOURCE_MEM,
 | 
			
		||||
	.name	= "PCI Mem Space"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource ixp23xx_pci_io_space = {
 | 
			
		||||
	.start	= 0x00000100,
 | 
			
		||||
	.end	= 0x01ffffff,
 | 
			
		||||
	.flags	= IORESOURCE_IO,
 | 
			
		||||
	.name	= "PCI I/O Space"
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int ixp23xx_pci_setup(int nr, struct pci_sys_data *sys)
 | 
			
		||||
{
 | 
			
		||||
	if (nr >= 1)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	pci_add_resource_offset(&sys->resources,
 | 
			
		||||
				&ixp23xx_pci_io_space, sys->io_offset);
 | 
			
		||||
	pci_add_resource_offset(&sys->resources,
 | 
			
		||||
				&ixp23xx_pci_mem_space, sys->mem_offset);
 | 
			
		||||
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void __init ixp23xx_pci_slave_init(void)
 | 
			
		||||
{
 | 
			
		||||
	ixp23xx_pci_common_init();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,180 +0,0 @@
 | 
			
		|||
/*
 | 
			
		||||
 * arch/arm/mach-ixp23xx/roadrunner.c
 | 
			
		||||
 *
 | 
			
		||||
 * RoadRunner board-specific routines
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Deepak Saxena <dsaxena@plexity.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright 2005 (c) MontaVista Software, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * Based on 2.4 code Copyright 2005 (c) ADI Engineering Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <linux/kernel.h>
 | 
			
		||||
#include <linux/init.h>
 | 
			
		||||
#include <linux/spinlock.h>
 | 
			
		||||
#include <linux/sched.h>
 | 
			
		||||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/serial.h>
 | 
			
		||||
#include <linux/tty.h>
 | 
			
		||||
#include <linux/bitops.h>
 | 
			
		||||
#include <linux/ioport.h>
 | 
			
		||||
#include <linux/serial_8250.h>
 | 
			
		||||
#include <linux/serial_core.h>
 | 
			
		||||
#include <linux/device.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
#include <linux/pci.h>
 | 
			
		||||
#include <linux/mtd/physmap.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/types.h>
 | 
			
		||||
#include <asm/setup.h>
 | 
			
		||||
#include <asm/memory.h>
 | 
			
		||||
#include <mach/hardware.h>
 | 
			
		||||
#include <asm/mach-types.h>
 | 
			
		||||
#include <asm/irq.h>
 | 
			
		||||
#include <asm/tlbflush.h>
 | 
			
		||||
#include <asm/pgtable.h>
 | 
			
		||||
 | 
			
		||||
#include <asm/mach/map.h>
 | 
			
		||||
#include <asm/mach/irq.h>
 | 
			
		||||
#include <asm/mach/arch.h>
 | 
			
		||||
#include <asm/mach/pci.h>
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Interrupt mapping
 | 
			
		||||
 */
 | 
			
		||||
#define INTA		IRQ_ROADRUNNER_PCI_INTA
 | 
			
		||||
#define INTB		IRQ_ROADRUNNER_PCI_INTB
 | 
			
		||||
#define INTC		IRQ_ROADRUNNER_PCI_INTC
 | 
			
		||||
#define INTD		IRQ_ROADRUNNER_PCI_INTD
 | 
			
		||||
 | 
			
		||||
#define INTC_PIN	IXP23XX_GPIO_PIN_11
 | 
			
		||||
#define INTD_PIN	IXP23XX_GPIO_PIN_12
 | 
			
		||||
 | 
			
		||||
static int __init roadrunner_map_irq(const struct pci_dev *dev, u8 idsel,
 | 
			
		||||
	u8 pin)
 | 
			
		||||
{
 | 
			
		||||
	static int pci_card_slot_irq[] = {INTB, INTC, INTD, INTA};
 | 
			
		||||
	static int pmc_card_slot_irq[] = {INTA, INTB, INTC, INTD};
 | 
			
		||||
	static int usb_irq[] = {INTB, INTC, INTD, -1};
 | 
			
		||||
	static int mini_pci_1_irq[] = {INTB, INTC, -1, -1};
 | 
			
		||||
	static int mini_pci_2_irq[] = {INTC, INTD, -1, -1};
 | 
			
		||||
 | 
			
		||||
	switch(dev->bus->number) {
 | 
			
		||||
		case 0:
 | 
			
		||||
			switch(dev->devfn) {
 | 
			
		||||
			case 0x0: // PCI-PCI bridge
 | 
			
		||||
				break;
 | 
			
		||||
			case 0x8: // PCI Card Slot
 | 
			
		||||
				return pci_card_slot_irq[pin - 1];
 | 
			
		||||
			case 0x10: // PMC Slot
 | 
			
		||||
				return pmc_card_slot_irq[pin - 1];
 | 
			
		||||
			case 0x18: // PMC Slot Secondary Agent
 | 
			
		||||
				break;
 | 
			
		||||
			case 0x20: // IXP Processor
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				return NO_IRQ;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		case 1:
 | 
			
		||||
			switch(dev->devfn) {
 | 
			
		||||
			case 0x0: // IDE Controller
 | 
			
		||||
				return (pin == 1) ? INTC : -1;
 | 
			
		||||
			case 0x8: // USB fun 0
 | 
			
		||||
			case 0x9: // USB fun 1
 | 
			
		||||
			case 0xa: // USB fun 2
 | 
			
		||||
				return usb_irq[pin - 1];
 | 
			
		||||
			case 0x10: // Mini PCI 1
 | 
			
		||||
				return mini_pci_1_irq[pin-1];
 | 
			
		||||
			case 0x18: // Mini PCI 2
 | 
			
		||||
				return mini_pci_2_irq[pin-1];
 | 
			
		||||
			case 0x20: // MEM slot
 | 
			
		||||
				return (pin == 1) ? INTA : -1;
 | 
			
		||||
			default:
 | 
			
		||||
				return NO_IRQ;
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
 | 
			
		||||
		default:
 | 
			
		||||
			return NO_IRQ;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return NO_IRQ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __init roadrunner_pci_preinit(void)
 | 
			
		||||
{
 | 
			
		||||
	irq_set_irq_type(IRQ_ROADRUNNER_PCI_INTC, IRQ_TYPE_LEVEL_LOW);
 | 
			
		||||
	irq_set_irq_type(IRQ_ROADRUNNER_PCI_INTD, IRQ_TYPE_LEVEL_LOW);
 | 
			
		||||
 | 
			
		||||
	ixp23xx_pci_preinit();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct hw_pci roadrunner_pci __initdata = {
 | 
			
		||||
	.nr_controllers	= 1,
 | 
			
		||||
	.preinit	= roadrunner_pci_preinit,
 | 
			
		||||
	.setup		= ixp23xx_pci_setup,
 | 
			
		||||
	.scan		= ixp23xx_pci_scan_bus,
 | 
			
		||||
	.map_irq	= roadrunner_map_irq,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int __init roadrunner_pci_init(void)
 | 
			
		||||
{
 | 
			
		||||
	if (machine_is_roadrunner())
 | 
			
		||||
		pci_common_init(&roadrunner_pci);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
subsys_initcall(roadrunner_pci_init);
 | 
			
		||||
 | 
			
		||||
static struct physmap_flash_data roadrunner_flash_data = {
 | 
			
		||||
	.width		= 2,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct resource roadrunner_flash_resource = {
 | 
			
		||||
	.start		= 0x90000000,
 | 
			
		||||
	.end		= 0x93ffffff,
 | 
			
		||||
	.flags		= IORESOURCE_MEM,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct platform_device roadrunner_flash = {
 | 
			
		||||
	.name		= "physmap-flash",
 | 
			
		||||
	.id		= 0,
 | 
			
		||||
	.dev		= {
 | 
			
		||||
		.platform_data	= &roadrunner_flash_data,
 | 
			
		||||
	},
 | 
			
		||||
	.num_resources	= 1,
 | 
			
		||||
	.resource	= &roadrunner_flash_resource,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void __init roadrunner_init(void)
 | 
			
		||||
{
 | 
			
		||||
	platform_device_register(&roadrunner_flash);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Mark flash as writeable
 | 
			
		||||
	 */
 | 
			
		||||
	IXP23XX_EXP_CS0[0] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
	IXP23XX_EXP_CS0[1] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
	IXP23XX_EXP_CS0[2] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
	IXP23XX_EXP_CS0[3] |= IXP23XX_FLASH_WRITABLE;
 | 
			
		||||
 | 
			
		||||
	ixp23xx_sys_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MACHINE_START(ROADRUNNER, "ADI Engineering RoadRunner Development Platform")
 | 
			
		||||
	/* Maintainer: Deepak Saxena */
 | 
			
		||||
	.map_io		= ixp23xx_map_io,
 | 
			
		||||
	.init_irq	= ixp23xx_init_irq,
 | 
			
		||||
	.timer		= &ixp23xx_timer,
 | 
			
		||||
	.atag_offset	= 0x100,
 | 
			
		||||
	.init_machine	= roadrunner_init,
 | 
			
		||||
	.restart	= ixp23xx_restart,
 | 
			
		||||
MACHINE_END
 | 
			
		||||
		Loading…
	
		Reference in a new issue