MIPS: Alchemy: rename directory
authorRalf Baechle <ralf@linux-mips.org>
Tue, 16 Sep 2008 17:12:16 +0000 (19:12 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Sat, 11 Oct 2008 15:18:50 +0000 (16:18 +0100)
It's more than the au1000 these days.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
106 files changed:
arch/mips/Kconfig
arch/mips/Makefile
arch/mips/alchemy/Kconfig [new file with mode: 0644]
arch/mips/alchemy/common/Makefile [new file with mode: 0644]
arch/mips/alchemy/common/au1xxx_irqmap.c [new file with mode: 0644]
arch/mips/alchemy/common/clocks.c [new file with mode: 0644]
arch/mips/alchemy/common/cputable.c [new file with mode: 0644]
arch/mips/alchemy/common/dbdma.c [new file with mode: 0644]
arch/mips/alchemy/common/dma.c [new file with mode: 0644]
arch/mips/alchemy/common/gpio.c [new file with mode: 0644]
arch/mips/alchemy/common/irq.c [new file with mode: 0644]
arch/mips/alchemy/common/pci.c [new file with mode: 0644]
arch/mips/alchemy/common/platform.c [new file with mode: 0644]
arch/mips/alchemy/common/power.c [new file with mode: 0644]
arch/mips/alchemy/common/prom.c [new file with mode: 0644]
arch/mips/alchemy/common/puts.c [new file with mode: 0644]
arch/mips/alchemy/common/reset.c [new file with mode: 0644]
arch/mips/alchemy/common/setup.c [new file with mode: 0644]
arch/mips/alchemy/common/sleeper.S [new file with mode: 0644]
arch/mips/alchemy/common/time.c [new file with mode: 0644]
arch/mips/alchemy/db1x00/Makefile [new file with mode: 0644]
arch/mips/alchemy/db1x00/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/db1x00/init.c [new file with mode: 0644]
arch/mips/alchemy/db1x00/irqmap.c [new file with mode: 0644]
arch/mips/alchemy/mtx-1/Makefile [new file with mode: 0644]
arch/mips/alchemy/mtx-1/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/mtx-1/init.c [new file with mode: 0644]
arch/mips/alchemy/mtx-1/irqmap.c [new file with mode: 0644]
arch/mips/alchemy/mtx-1/platform.c [new file with mode: 0644]
arch/mips/alchemy/pb1000/Makefile [new file with mode: 0644]
arch/mips/alchemy/pb1000/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/pb1000/init.c [new file with mode: 0644]
arch/mips/alchemy/pb1000/irqmap.c [new file with mode: 0644]
arch/mips/alchemy/pb1100/Makefile [new file with mode: 0644]
arch/mips/alchemy/pb1100/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/pb1100/init.c [new file with mode: 0644]
arch/mips/alchemy/pb1100/irqmap.c [new file with mode: 0644]
arch/mips/alchemy/pb1200/Makefile [new file with mode: 0644]
arch/mips/alchemy/pb1200/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/pb1200/init.c [new file with mode: 0644]
arch/mips/alchemy/pb1200/irqmap.c [new file with mode: 0644]
arch/mips/alchemy/pb1200/platform.c [new file with mode: 0644]
arch/mips/alchemy/pb1500/Makefile [new file with mode: 0644]
arch/mips/alchemy/pb1500/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/pb1500/init.c [new file with mode: 0644]
arch/mips/alchemy/pb1500/irqmap.c [new file with mode: 0644]
arch/mips/alchemy/pb1550/Makefile [new file with mode: 0644]
arch/mips/alchemy/pb1550/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/pb1550/init.c [new file with mode: 0644]
arch/mips/alchemy/pb1550/irqmap.c [new file with mode: 0644]
arch/mips/alchemy/xxs1500/Makefile [new file with mode: 0644]
arch/mips/alchemy/xxs1500/board_setup.c [new file with mode: 0644]
arch/mips/alchemy/xxs1500/init.c [new file with mode: 0644]
arch/mips/alchemy/xxs1500/irqmap.c [new file with mode: 0644]
arch/mips/au1000/Kconfig [deleted file]
arch/mips/au1000/common/Makefile [deleted file]
arch/mips/au1000/common/au1xxx_irqmap.c [deleted file]
arch/mips/au1000/common/clocks.c [deleted file]
arch/mips/au1000/common/cputable.c [deleted file]
arch/mips/au1000/common/dbdma.c [deleted file]
arch/mips/au1000/common/dma.c [deleted file]
arch/mips/au1000/common/gpio.c [deleted file]
arch/mips/au1000/common/irq.c [deleted file]
arch/mips/au1000/common/pci.c [deleted file]
arch/mips/au1000/common/platform.c [deleted file]
arch/mips/au1000/common/power.c [deleted file]
arch/mips/au1000/common/prom.c [deleted file]
arch/mips/au1000/common/puts.c [deleted file]
arch/mips/au1000/common/reset.c [deleted file]
arch/mips/au1000/common/setup.c [deleted file]
arch/mips/au1000/common/sleeper.S [deleted file]
arch/mips/au1000/common/time.c [deleted file]
arch/mips/au1000/db1x00/Makefile [deleted file]
arch/mips/au1000/db1x00/board_setup.c [deleted file]
arch/mips/au1000/db1x00/init.c [deleted file]
arch/mips/au1000/db1x00/irqmap.c [deleted file]
arch/mips/au1000/mtx-1/Makefile [deleted file]
arch/mips/au1000/mtx-1/board_setup.c [deleted file]
arch/mips/au1000/mtx-1/init.c [deleted file]
arch/mips/au1000/mtx-1/irqmap.c [deleted file]
arch/mips/au1000/mtx-1/platform.c [deleted file]
arch/mips/au1000/pb1000/Makefile [deleted file]
arch/mips/au1000/pb1000/board_setup.c [deleted file]
arch/mips/au1000/pb1000/init.c [deleted file]
arch/mips/au1000/pb1000/irqmap.c [deleted file]
arch/mips/au1000/pb1100/Makefile [deleted file]
arch/mips/au1000/pb1100/board_setup.c [deleted file]
arch/mips/au1000/pb1100/init.c [deleted file]
arch/mips/au1000/pb1100/irqmap.c [deleted file]
arch/mips/au1000/pb1200/Makefile [deleted file]
arch/mips/au1000/pb1200/board_setup.c [deleted file]
arch/mips/au1000/pb1200/init.c [deleted file]
arch/mips/au1000/pb1200/irqmap.c [deleted file]
arch/mips/au1000/pb1200/platform.c [deleted file]
arch/mips/au1000/pb1500/Makefile [deleted file]
arch/mips/au1000/pb1500/board_setup.c [deleted file]
arch/mips/au1000/pb1500/init.c [deleted file]
arch/mips/au1000/pb1500/irqmap.c [deleted file]
arch/mips/au1000/pb1550/Makefile [deleted file]
arch/mips/au1000/pb1550/board_setup.c [deleted file]
arch/mips/au1000/pb1550/init.c [deleted file]
arch/mips/au1000/pb1550/irqmap.c [deleted file]
arch/mips/au1000/xxs1500/Makefile [deleted file]
arch/mips/au1000/xxs1500/board_setup.c [deleted file]
arch/mips/au1000/xxs1500/init.c [deleted file]
arch/mips/au1000/xxs1500/irqmap.c [deleted file]

index 00a23a11849278934f70c2e62b117540e6737a3d..c15416c2e89d241dce8ccf9154b5775a76ad3941 100644 (file)
@@ -598,7 +598,7 @@ config WR_PPMC
 
 endchoice
 
-source "arch/mips/au1000/Kconfig"
+source "arch/mips/alchemy/Kconfig"
 source "arch/mips/basler/excite/Kconfig"
 source "arch/mips/jazz/Kconfig"
 source "arch/mips/lasat/Kconfig"
index 87f67228e3094888a6a01971051946bd2e0e8cb2..4401a0c1278c9a9fc3dbde34b11ede7237853fb5 100644 (file)
@@ -176,103 +176,103 @@ load-$(CONFIG_MACH_JAZZ)        += 0xffffffff80080000
 #
 # Common Alchemy Au1x00 stuff
 #
-core-$(CONFIG_SOC_AU1X00)      += arch/mips/au1000/common/
+core-$(CONFIG_SOC_AU1X00)      += arch/mips/alchemy/common/
 cflags-$(CONFIG_SOC_AU1X00)    += -Iinclude/asm-mips/mach-au1x00
 
 #
 # AMD Alchemy Pb1000 eval board
 #
-libs-$(CONFIG_MIPS_PB1000)     += arch/mips/au1000/pb1000/
+libs-$(CONFIG_MIPS_PB1000)     += arch/mips/alchemy/pb1000/
 cflags-$(CONFIG_MIPS_PB1000)   += -Iinclude/asm-mips/mach-pb1x00
 load-$(CONFIG_MIPS_PB1000)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Pb1100 eval board
 #
-libs-$(CONFIG_MIPS_PB1100)     += arch/mips/au1000/pb1100/
+libs-$(CONFIG_MIPS_PB1100)     += arch/mips/alchemy/pb1100/
 cflags-$(CONFIG_MIPS_PB1100)   += -Iinclude/asm-mips/mach-pb1x00
 load-$(CONFIG_MIPS_PB1100)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Pb1500 eval board
 #
-libs-$(CONFIG_MIPS_PB1500)     += arch/mips/au1000/pb1500/
+libs-$(CONFIG_MIPS_PB1500)     += arch/mips/alchemy/pb1500/
 cflags-$(CONFIG_MIPS_PB1500)   += -Iinclude/asm-mips/mach-pb1x00
 load-$(CONFIG_MIPS_PB1500)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Pb1550 eval board
 #
-libs-$(CONFIG_MIPS_PB1550)     += arch/mips/au1000/pb1550/
+libs-$(CONFIG_MIPS_PB1550)     += arch/mips/alchemy/pb1550/
 cflags-$(CONFIG_MIPS_PB1550)   += -Iinclude/asm-mips/mach-pb1x00
 load-$(CONFIG_MIPS_PB1550)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Pb1200 eval board
 #
-libs-$(CONFIG_MIPS_PB1200)     += arch/mips/au1000/pb1200/
+libs-$(CONFIG_MIPS_PB1200)     += arch/mips/alchemy/pb1200/
 cflags-$(CONFIG_MIPS_PB1200)   += -Iinclude/asm-mips/mach-pb1x00
 load-$(CONFIG_MIPS_PB1200)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Db1000 eval board
 #
-libs-$(CONFIG_MIPS_DB1000)     += arch/mips/au1000/db1x00/
+libs-$(CONFIG_MIPS_DB1000)     += arch/mips/alchemy/db1x00/
 cflags-$(CONFIG_MIPS_DB1000)   += -Iinclude/asm-mips/mach-db1x00
 load-$(CONFIG_MIPS_DB1000)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Db1100 eval board
 #
-libs-$(CONFIG_MIPS_DB1100)     += arch/mips/au1000/db1x00/
+libs-$(CONFIG_MIPS_DB1100)     += arch/mips/alchemy/db1x00/
 cflags-$(CONFIG_MIPS_DB1100)   += -Iinclude/asm-mips/mach-db1x00
 load-$(CONFIG_MIPS_DB1100)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Db1500 eval board
 #
-libs-$(CONFIG_MIPS_DB1500)     += arch/mips/au1000/db1x00/
+libs-$(CONFIG_MIPS_DB1500)     += arch/mips/alchemy/db1x00/
 cflags-$(CONFIG_MIPS_DB1500)   += -Iinclude/asm-mips/mach-db1x00
 load-$(CONFIG_MIPS_DB1500)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Db1550 eval board
 #
-libs-$(CONFIG_MIPS_DB1550)     += arch/mips/au1000/db1x00/
+libs-$(CONFIG_MIPS_DB1550)     += arch/mips/alchemy/db1x00/
 cflags-$(CONFIG_MIPS_DB1550)   += -Iinclude/asm-mips/mach-db1x00
 load-$(CONFIG_MIPS_DB1550)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Db1200 eval board
 #
-libs-$(CONFIG_MIPS_DB1200)     += arch/mips/au1000/pb1200/
+libs-$(CONFIG_MIPS_DB1200)     += arch/mips/alchemy/pb1200/
 cflags-$(CONFIG_MIPS_DB1200)   += -Iinclude/asm-mips/mach-db1x00
 load-$(CONFIG_MIPS_DB1200)     += 0xffffffff80100000
 
 #
 # AMD Alchemy Bosporus eval board
 #
-libs-$(CONFIG_MIPS_BOSPORUS)   += arch/mips/au1000/db1x00/
+libs-$(CONFIG_MIPS_BOSPORUS)   += arch/mips/alchemy/db1x00/
 cflags-$(CONFIG_MIPS_BOSPORUS) += -Iinclude/asm-mips/mach-db1x00
 load-$(CONFIG_MIPS_BOSPORUS)   += 0xffffffff80100000
 
 #
 # AMD Alchemy Mirage eval board
 #
-libs-$(CONFIG_MIPS_MIRAGE)     += arch/mips/au1000/db1x00/
+libs-$(CONFIG_MIPS_MIRAGE)     += arch/mips/alchemy/db1x00/
 cflags-$(CONFIG_MIPS_MIRAGE)   += -Iinclude/asm-mips/mach-db1x00
 load-$(CONFIG_MIPS_MIRAGE)     += 0xffffffff80100000
 
 #
 # 4G-Systems eval board
 #
-libs-$(CONFIG_MIPS_MTX1)       += arch/mips/au1000/mtx-1/
+libs-$(CONFIG_MIPS_MTX1)       += arch/mips/alchemy/mtx-1/
 load-$(CONFIG_MIPS_MTX1)       += 0xffffffff80100000
 
 #
 # MyCable eval board
 #
-libs-$(CONFIG_MIPS_XXS1500)    += arch/mips/au1000/xxs1500/
+libs-$(CONFIG_MIPS_XXS1500)    += arch/mips/alchemy/xxs1500/
 load-$(CONFIG_MIPS_XXS1500)    += 0xffffffff80100000
 
 #
diff --git a/arch/mips/alchemy/Kconfig b/arch/mips/alchemy/Kconfig
new file mode 100644 (file)
index 0000000..e4a057d
--- /dev/null
@@ -0,0 +1,136 @@
+choice
+       prompt "Machine type"
+       depends on MACH_ALCHEMY
+       default MIPS_DB1000
+
+config MIPS_MTX1
+       bool "4G Systems MTX-1 board"
+       select DMA_NONCOHERENT
+       select HW_HAS_PCI
+       select SOC_AU1500
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_BOSPORUS
+       bool "Alchemy Bosporus board"
+       select SOC_AU1500
+       select DMA_NONCOHERENT
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_DB1000
+       bool "Alchemy DB1000 board"
+       select SOC_AU1000
+       select DMA_NONCOHERENT
+       select HW_HAS_PCI
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_DB1100
+       bool "Alchemy DB1100 board"
+       select SOC_AU1100
+       select DMA_NONCOHERENT
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_DB1200
+       bool "Alchemy DB1200 board"
+       select SOC_AU1200
+       select DMA_COHERENT
+       select MIPS_DISABLE_OBSOLETE_IDE
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_DB1500
+       bool "Alchemy DB1500 board"
+       select SOC_AU1500
+       select DMA_NONCOHERENT
+       select HW_HAS_PCI
+       select MIPS_DISABLE_OBSOLETE_IDE
+       select SYS_SUPPORTS_BIG_ENDIAN
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_DB1550
+       bool "Alchemy DB1550 board"
+       select SOC_AU1550
+       select HW_HAS_PCI
+       select DMA_NONCOHERENT
+       select MIPS_DISABLE_OBSOLETE_IDE
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_MIRAGE
+       bool "Alchemy Mirage board"
+       select DMA_NONCOHERENT
+       select SOC_AU1500
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_PB1000
+       bool "Alchemy PB1000 board"
+       select SOC_AU1000
+       select DMA_NONCOHERENT
+       select HW_HAS_PCI
+       select SWAP_IO_SPACE
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_PB1100
+       bool "Alchemy PB1100 board"
+       select SOC_AU1100
+       select DMA_NONCOHERENT
+       select HW_HAS_PCI
+       select SWAP_IO_SPACE
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_PB1200
+       bool "Alchemy PB1200 board"
+       select SOC_AU1200
+       select DMA_NONCOHERENT
+       select MIPS_DISABLE_OBSOLETE_IDE
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_PB1500
+       bool "Alchemy PB1500 board"
+       select SOC_AU1500
+       select DMA_NONCOHERENT
+       select HW_HAS_PCI
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_PB1550
+       bool "Alchemy PB1550 board"
+       select SOC_AU1550
+       select DMA_NONCOHERENT
+       select HW_HAS_PCI
+       select MIPS_DISABLE_OBSOLETE_IDE
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+config MIPS_XXS1500
+       bool "MyCable XXS1500 board"
+       select DMA_NONCOHERENT
+       select SOC_AU1500
+       select SYS_SUPPORTS_LITTLE_ENDIAN
+
+endchoice
+
+config SOC_AU1000
+       bool
+       select SOC_AU1X00
+
+config SOC_AU1100
+       bool
+       select SOC_AU1X00
+
+config SOC_AU1500
+       bool
+       select SOC_AU1X00
+
+config SOC_AU1550
+       bool
+       select SOC_AU1X00
+
+config SOC_AU1200
+       bool
+       select SOC_AU1X00
+
+config SOC_AU1X00
+       bool
+       select 64BIT_PHYS_ADDR
+       select CEVT_R4K
+       select CSRC_R4K
+       select IRQ_CPU
+       select SYS_HAS_CPU_MIPS32_R1
+       select SYS_SUPPORTS_32BIT_KERNEL
+       select SYS_SUPPORTS_APM_EMULATION
diff --git a/arch/mips/alchemy/common/Makefile b/arch/mips/alchemy/common/Makefile
new file mode 100644 (file)
index 0000000..df48fd6
--- /dev/null
@@ -0,0 +1,14 @@
+#
+#  Copyright 2000, 2008 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#
+# Makefile for the Alchemy Au1xx0 CPUs, generic files.
+#
+
+obj-y += prom.o irq.o puts.o time.o reset.o \
+       au1xxx_irqmap.o clocks.o platform.o power.o setup.o \
+       sleeper.o cputable.o dma.o dbdma.o gpio.o
+
+obj-$(CONFIG_PCI)              += pci.o
+
+EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/alchemy/common/au1xxx_irqmap.c b/arch/mips/alchemy/common/au1xxx_irqmap.c
new file mode 100644 (file)
index 0000000..c7ca159
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xxx processor specific IRQ tables
+ *
+ * Copyright 2004 Embedded Edge, LLC
+ *     dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <au1000.h>
+
+/* The IC0 interrupt table.  This is processor, rather than
+ * board dependent, so no reason to keep this info in the board
+ * dependent files.
+ *
+ * Careful if you change match 2 request!
+ * The interrupt handler is called directly from the low level dispatch code.
+ */
+struct au1xxx_irqmap __initdata au1xxx_ic0_map[] = {
+
+#if defined(CONFIG_SOC_AU1000)
+       { AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_UART2_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
+
+#elif defined(CONFIG_SOC_AU1500)
+
+       { AU1500_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1500_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1500_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
+
+#elif defined(CONFIG_SOC_AU1100)
+
+       { AU1100_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1100_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1100_SD_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1100_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1100_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       /* { AU1000_GPIO215_208_INT, INTC_INT_HIGH_LEVEL, 0 }, */
+       { AU1100_LCD_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
+
+#elif defined(CONFIG_SOC_AU1550)
+
+       { AU1550_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
+       { AU1550_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
+       { AU1550_DDMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_CRYPTO_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
+       { AU1550_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
+       { AU1550_PCI_RST_INT, INTC_INT_LOW_LEVEL, 0 },
+       { AU1550_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_PSC0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_PSC1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_PSC2_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_PSC3_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1550_NAND_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1550_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1550_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
+       { AU1550_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1550_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+
+#elif defined(CONFIG_SOC_AU1200)
+
+       { AU1200_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_SWT_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1200_SD_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_DDMA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_MAE_BE_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_MAE_FE_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_PSC0_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_PSC1_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_AES_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_CAMERA_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
+       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1200_NAND_INT, INTC_INT_RISE_EDGE, 0 },
+       { AU1200_USB_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_LCD_INT, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1200_MAE_BOTH_INT, INTC_INT_HIGH_LEVEL, 0 },
+
+#else
+#error "Error: Unknown Alchemy SOC"
+#endif
+
+};
+
+int __initdata au1xxx_ic0_nr_irqs = ARRAY_SIZE(au1xxx_ic0_map);
diff --git a/arch/mips/alchemy/common/clocks.c b/arch/mips/alchemy/common/clocks.c
new file mode 100644 (file)
index 0000000..043429d
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Simple Au1xx0 clocks routines.
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <asm/mach-au1x00/au1000.h>
+
+static unsigned int au1x00_clock; /*  Hz */
+static unsigned int lcd_clock;    /* KHz */
+static unsigned long uart_baud_base;
+
+/*
+ * Set the au1000_clock
+ */
+void set_au1x00_speed(unsigned int new_freq)
+{
+       au1x00_clock = new_freq;
+}
+
+unsigned int get_au1x00_speed(void)
+{
+       return au1x00_clock;
+}
+EXPORT_SYMBOL(get_au1x00_speed);
+
+/*
+ * The UART baud base is not known at compile time ... if
+ * we want to be able to use the same code on different
+ * speed CPUs.
+ */
+unsigned long get_au1x00_uart_baud_base(void)
+{
+       return uart_baud_base;
+}
+
+void set_au1x00_uart_baud_base(unsigned long new_baud_base)
+{
+       uart_baud_base = new_baud_base;
+}
+
+/*
+ * Calculate the Au1x00's LCD clock based on the current
+ * cpu clock and the system bus clock, and try to keep it
+ * below 40 MHz (the Pb1000 board can lock-up if the LCD
+ * clock is over 40 MHz).
+ */
+void set_au1x00_lcd_clock(void)
+{
+       unsigned int static_cfg0;
+       unsigned int sys_busclk = (get_au1x00_speed() / 1000) /
+                                 ((int)(au_readl(SYS_POWERCTRL) & 0x03) + 2);
+
+       static_cfg0 = au_readl(MEM_STCFG0);
+
+       if (static_cfg0 & (1 << 11))
+               lcd_clock = sys_busclk / 5; /* note: BCLK switching fails with D5 */
+       else
+               lcd_clock = sys_busclk / 4;
+
+       if (lcd_clock > 50000) /* Epson MAX */
+               printk(KERN_WARNING "warning: LCD clock too high (%u KHz)\n",
+                                   lcd_clock);
+}
+
+unsigned int get_au1x00_lcd_clock(void)
+{
+       return lcd_clock;
+}
+EXPORT_SYMBOL(get_au1x00_lcd_clock);
diff --git a/arch/mips/alchemy/common/cputable.c b/arch/mips/alchemy/common/cputable.c
new file mode 100644 (file)
index 0000000..ba6430b
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ *  arch/mips/au1000/common/cputable.c
+ *
+ *  Copyright (C) 2004 Dan Malek (dan@embeddededge.com)
+ *     Copied from PowerPC and updated for Alchemy Au1xxx processors.
+ *
+ *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
+ *
+ *  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 <asm/mach-au1x00/au1000.h>
+
+struct cpu_spec *cur_cpu_spec[NR_CPUS];
+
+/* With some thought, we can probably use the mask to reduce the
+ * size of the table.
+ */
+struct cpu_spec cpu_specs[] = {
+       { 0xffffffff, 0x00030100, "Au1000 DA", 1, 0, 1 },
+       { 0xffffffff, 0x00030201, "Au1000 HA", 1, 0, 1 },
+       { 0xffffffff, 0x00030202, "Au1000 HB", 1, 0, 1 },
+       { 0xffffffff, 0x00030203, "Au1000 HC", 1, 1, 0 },
+       { 0xffffffff, 0x00030204, "Au1000 HD", 1, 1, 0 },
+       { 0xffffffff, 0x01030200, "Au1500 AB", 1, 1, 0 },
+       { 0xffffffff, 0x01030201, "Au1500 AC", 0, 1, 0 },
+       { 0xffffffff, 0x01030202, "Au1500 AD", 0, 1, 0 },
+       { 0xffffffff, 0x02030200, "Au1100 AB", 1, 1, 0 },
+       { 0xffffffff, 0x02030201, "Au1100 BA", 1, 1, 0 },
+       { 0xffffffff, 0x02030202, "Au1100 BC", 1, 1, 0 },
+       { 0xffffffff, 0x02030203, "Au1100 BD", 0, 1, 0 },
+       { 0xffffffff, 0x02030204, "Au1100 BE", 0, 1, 0 },
+       { 0xffffffff, 0x03030200, "Au1550 AA", 0, 1, 0 },
+       { 0xffffffff, 0x04030200, "Au1200 AB", 0, 0, 0 },
+       { 0xffffffff, 0x04030201, "Au1200 AC", 1, 0, 0 },
+       { 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0, 0 }
+};
+
+void set_cpuspec(void)
+{
+       struct  cpu_spec *sp;
+       u32     prid;
+
+       prid = read_c0_prid();
+       sp = cpu_specs;
+       while ((prid & sp->prid_mask) != sp->prid_value)
+               sp++;
+       cur_cpu_spec[0] = sp;
+}
diff --git a/arch/mips/alchemy/common/dbdma.c b/arch/mips/alchemy/common/dbdma.c
new file mode 100644 (file)
index 0000000..601ee91
--- /dev/null
@@ -0,0 +1,978 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *      The Descriptor Based DMA channel manager that first appeared
+ *     on the Au1550.  I started with dma.c, but I think all that is
+ *     left is this initial comment :-)
+ *
+ * Copyright 2004 Embedded Edge, LLC
+ *     dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+#include <linux/module.h>
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1xxx_dbdma.h>
+
+#if defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200)
+
+/*
+ * The Descriptor Based DMA supports up to 16 channels.
+ *
+ * There are 32 devices defined. We keep an internal structure
+ * of devices using these channels, along with additional
+ * information.
+ *
+ * We allocate the descriptors and allow access to them through various
+ * functions.  The drivers allocate the data buffers and assign them
+ * to the descriptors.
+ */
+static DEFINE_SPINLOCK(au1xxx_dbdma_spin_lock);
+
+/* I couldn't find a macro that did this... */
+#define ALIGN_ADDR(x, a)       ((((u32)(x)) + (a-1)) & ~(a-1))
+
+static dbdma_global_t *dbdma_gptr = (dbdma_global_t *)DDMA_GLOBAL_BASE;
+static int dbdma_initialized;
+static void au1xxx_dbdma_init(void);
+
+static dbdev_tab_t dbdev_tab[] = {
+#ifdef CONFIG_SOC_AU1550
+       /* UARTS */
+       { DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8, 0x11100004, 0, 0 },
+       { DSCR_CMD0_UART0_RX, DEV_FLAGS_IN, 0, 8, 0x11100000, 0, 0 },
+       { DSCR_CMD0_UART3_TX, DEV_FLAGS_OUT, 0, 8, 0x11400004, 0, 0 },
+       { DSCR_CMD0_UART3_RX, DEV_FLAGS_IN, 0, 8, 0x11400000, 0, 0 },
+
+       /* EXT DMA */
+       { DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_DMA_REQ2, 0, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_DMA_REQ3, 0, 0, 0, 0x00000000, 0, 0 },
+
+       /* USB DEV */
+       { DSCR_CMD0_USBDEV_RX0, DEV_FLAGS_IN, 4, 8, 0x10200000, 0, 0 },
+       { DSCR_CMD0_USBDEV_TX0, DEV_FLAGS_OUT, 4, 8, 0x10200004, 0, 0 },
+       { DSCR_CMD0_USBDEV_TX1, DEV_FLAGS_OUT, 4, 8, 0x10200008, 0, 0 },
+       { DSCR_CMD0_USBDEV_TX2, DEV_FLAGS_OUT, 4, 8, 0x1020000c, 0, 0 },
+       { DSCR_CMD0_USBDEV_RX3, DEV_FLAGS_IN, 4, 8, 0x10200010, 0, 0 },
+       { DSCR_CMD0_USBDEV_RX4, DEV_FLAGS_IN, 4, 8, 0x10200014, 0, 0 },
+
+       /* PSC 0 */
+       { DSCR_CMD0_PSC0_TX, DEV_FLAGS_OUT, 0, 0, 0x11a0001c, 0, 0 },
+       { DSCR_CMD0_PSC0_RX, DEV_FLAGS_IN, 0, 0, 0x11a0001c, 0, 0 },
+
+       /* PSC 1 */
+       { DSCR_CMD0_PSC1_TX, DEV_FLAGS_OUT, 0, 0, 0x11b0001c, 0, 0 },
+       { DSCR_CMD0_PSC1_RX, DEV_FLAGS_IN, 0, 0, 0x11b0001c, 0, 0 },
+
+       /* PSC 2 */
+       { DSCR_CMD0_PSC2_TX, DEV_FLAGS_OUT, 0, 0, 0x10a0001c, 0, 0 },
+       { DSCR_CMD0_PSC2_RX, DEV_FLAGS_IN, 0, 0, 0x10a0001c, 0, 0 },
+
+       /* PSC 3 */
+       { DSCR_CMD0_PSC3_TX, DEV_FLAGS_OUT, 0, 0, 0x10b0001c, 0, 0 },
+       { DSCR_CMD0_PSC3_RX, DEV_FLAGS_IN, 0, 0, 0x10b0001c, 0, 0 },
+
+       { DSCR_CMD0_PCI_WRITE, 0, 0, 0, 0x00000000, 0, 0 },     /* PCI */
+       { DSCR_CMD0_NAND_FLASH, 0, 0, 0, 0x00000000, 0, 0 },    /* NAND */
+
+       /* MAC 0 */
+       { DSCR_CMD0_MAC0_RX, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_MAC0_TX, DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
+
+       /* MAC 1 */
+       { DSCR_CMD0_MAC1_RX, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_MAC1_TX, DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
+
+#endif /* CONFIG_SOC_AU1550 */
+
+#ifdef CONFIG_SOC_AU1200
+       { DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8, 0x11100004, 0, 0 },
+       { DSCR_CMD0_UART0_RX, DEV_FLAGS_IN, 0, 8, 0x11100000, 0, 0 },
+       { DSCR_CMD0_UART1_TX, DEV_FLAGS_OUT, 0, 8, 0x11200004, 0, 0 },
+       { DSCR_CMD0_UART1_RX, DEV_FLAGS_IN, 0, 8, 0x11200000, 0, 0 },
+
+       { DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
+
+       { DSCR_CMD0_MAE_BE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_MAE_FE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_MAE_BOTH, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_LCD, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+
+       { DSCR_CMD0_SDMS_TX0, DEV_FLAGS_OUT, 4, 8, 0x10600000, 0, 0 },
+       { DSCR_CMD0_SDMS_RX0, DEV_FLAGS_IN, 4, 8, 0x10600004, 0, 0 },
+       { DSCR_CMD0_SDMS_TX1, DEV_FLAGS_OUT, 4, 8, 0x10680000, 0, 0 },
+       { DSCR_CMD0_SDMS_RX1, DEV_FLAGS_IN, 4, 8, 0x10680004, 0, 0 },
+
+       { DSCR_CMD0_AES_RX, DEV_FLAGS_IN , 4, 32, 0x10300008, 0, 0 },
+       { DSCR_CMD0_AES_TX, DEV_FLAGS_OUT, 4, 32, 0x10300004, 0, 0 },
+
+       { DSCR_CMD0_PSC0_TX, DEV_FLAGS_OUT, 0, 16, 0x11a0001c, 0, 0 },
+       { DSCR_CMD0_PSC0_RX, DEV_FLAGS_IN, 0, 16, 0x11a0001c, 0, 0 },
+       { DSCR_CMD0_PSC0_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+
+       { DSCR_CMD0_PSC1_TX, DEV_FLAGS_OUT, 0, 16, 0x11b0001c, 0, 0 },
+       { DSCR_CMD0_PSC1_RX, DEV_FLAGS_IN, 0, 16, 0x11b0001c, 0, 0 },
+       { DSCR_CMD0_PSC1_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+
+       { DSCR_CMD0_CIM_RXA, DEV_FLAGS_IN, 0, 32, 0x14004020, 0, 0 },
+       { DSCR_CMD0_CIM_RXB, DEV_FLAGS_IN, 0, 32, 0x14004040, 0, 0 },
+       { DSCR_CMD0_CIM_RXC, DEV_FLAGS_IN, 0, 32, 0x14004060, 0, 0 },
+       { DSCR_CMD0_CIM_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+
+       { DSCR_CMD0_NAND_FLASH, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
+
+#endif /* CONFIG_SOC_AU1200 */
+
+       { DSCR_CMD0_THROTTLE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+       { DSCR_CMD0_ALWAYS, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
+
+       /* Provide 16 user definable device types */
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+       { ~0, 0, 0, 0, 0, 0, 0 },
+};
+
+#define DBDEV_TAB_SIZE ARRAY_SIZE(dbdev_tab)
+
+static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS];
+
+static dbdev_tab_t *find_dbdev_id(u32 id)
+{
+       int i;
+       dbdev_tab_t *p;
+       for (i = 0; i < DBDEV_TAB_SIZE; ++i) {
+               p = &dbdev_tab[i];
+               if (p->dev_id == id)
+                       return p;
+       }
+       return NULL;
+}
+
+void *au1xxx_ddma_get_nextptr_virt(au1x_ddma_desc_t *dp)
+{
+       return phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+}
+EXPORT_SYMBOL(au1xxx_ddma_get_nextptr_virt);
+
+u32 au1xxx_ddma_add_device(dbdev_tab_t *dev)
+{
+       u32 ret = 0;
+       dbdev_tab_t *p;
+       static u16 new_id = 0x1000;
+
+       p = find_dbdev_id(~0);
+       if (NULL != p) {
+               memcpy(p, dev, sizeof(dbdev_tab_t));
+               p->dev_id = DSCR_DEV2CUSTOM_ID(new_id, dev->dev_id);
+               ret = p->dev_id;
+               new_id++;
+#if 0
+               printk(KERN_DEBUG "add_device: id:%x flags:%x padd:%x\n",
+                                 p->dev_id, p->dev_flags, p->dev_physaddr);
+#endif
+       }
+
+       return ret;
+}
+EXPORT_SYMBOL(au1xxx_ddma_add_device);
+
+void au1xxx_ddma_del_device(u32 devid)
+{
+       dbdev_tab_t *p = find_dbdev_id(devid);
+
+       if (p != NULL) {
+               memset(p, 0, sizeof(dbdev_tab_t));
+               p->dev_id = ~0;
+       }
+}
+EXPORT_SYMBOL(au1xxx_ddma_del_device);
+
+/* Allocate a channel and return a non-zero descriptor if successful. */
+u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
+       void (*callback)(int, void *), void *callparam)
+{
+       unsigned long   flags;
+       u32             used, chan, rv;
+       u32             dcp;
+       int             i;
+       dbdev_tab_t     *stp, *dtp;
+       chan_tab_t      *ctp;
+       au1x_dma_chan_t *cp;
+
+       /*
+        * We do the intialization on the first channel allocation.
+        * We have to wait because of the interrupt handler initialization
+        * which can't be done successfully during board set up.
+        */
+       if (!dbdma_initialized)
+               au1xxx_dbdma_init();
+       dbdma_initialized = 1;
+
+       stp = find_dbdev_id(srcid);
+       if (stp == NULL)
+               return 0;
+       dtp = find_dbdev_id(destid);
+       if (dtp == NULL)
+               return 0;
+
+       used = 0;
+       rv = 0;
+
+       /* Check to see if we can get both channels. */
+       spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
+       if (!(stp->dev_flags & DEV_FLAGS_INUSE) ||
+            (stp->dev_flags & DEV_FLAGS_ANYUSE)) {
+               /* Got source */
+               stp->dev_flags |= DEV_FLAGS_INUSE;
+               if (!(dtp->dev_flags & DEV_FLAGS_INUSE) ||
+                    (dtp->dev_flags & DEV_FLAGS_ANYUSE)) {
+                       /* Got destination */
+                       dtp->dev_flags |= DEV_FLAGS_INUSE;
+               } else {
+                       /* Can't get dest.  Release src. */
+                       stp->dev_flags &= ~DEV_FLAGS_INUSE;
+                       used++;
+               }
+       } else
+               used++;
+       spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
+
+       if (!used) {
+               /* Let's see if we can allocate a channel for it. */
+               ctp = NULL;
+               chan = 0;
+               spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
+               for (i = 0; i < NUM_DBDMA_CHANS; i++)
+                       if (chan_tab_ptr[i] == NULL) {
+                               /*
+                                * If kmalloc fails, it is caught below same
+                                * as a channel not available.
+                                */
+                               ctp = kmalloc(sizeof(chan_tab_t), GFP_ATOMIC);
+                               chan_tab_ptr[i] = ctp;
+                               break;
+                       }
+               spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
+
+               if (ctp != NULL) {
+                       memset(ctp, 0, sizeof(chan_tab_t));
+                       ctp->chan_index = chan = i;
+                       dcp = DDMA_CHANNEL_BASE;
+                       dcp += (0x0100 * chan);
+                       ctp->chan_ptr = (au1x_dma_chan_t *)dcp;
+                       cp = (au1x_dma_chan_t *)dcp;
+                       ctp->chan_src = stp;
+                       ctp->chan_dest = dtp;
+                       ctp->chan_callback = callback;
+                       ctp->chan_callparam = callparam;
+
+                       /* Initialize channel configuration. */
+                       i = 0;
+                       if (stp->dev_intlevel)
+                               i |= DDMA_CFG_SED;
+                       if (stp->dev_intpolarity)
+                               i |= DDMA_CFG_SP;
+                       if (dtp->dev_intlevel)
+                               i |= DDMA_CFG_DED;
+                       if (dtp->dev_intpolarity)
+                               i |= DDMA_CFG_DP;
+                       if ((stp->dev_flags & DEV_FLAGS_SYNC) ||
+                               (dtp->dev_flags & DEV_FLAGS_SYNC))
+                                       i |= DDMA_CFG_SYNC;
+                       cp->ddma_cfg = i;
+                       au_sync();
+
+                       /* Return a non-zero value that can be used to
+                        * find the channel information in subsequent
+                        * operations.
+                        */
+                       rv = (u32)(&chan_tab_ptr[chan]);
+               } else {
+                       /* Release devices */
+                       stp->dev_flags &= ~DEV_FLAGS_INUSE;
+                       dtp->dev_flags &= ~DEV_FLAGS_INUSE;
+               }
+       }
+       return rv;
+}
+EXPORT_SYMBOL(au1xxx_dbdma_chan_alloc);
+
+/*
+ * Set the device width if source or destination is a FIFO.
+ * Should be 8, 16, or 32 bits.
+ */
+u32 au1xxx_dbdma_set_devwidth(u32 chanid, int bits)
+{
+       u32             rv;
+       chan_tab_t      *ctp;
+       dbdev_tab_t     *stp, *dtp;
+
+       ctp = *((chan_tab_t **)chanid);
+       stp = ctp->chan_src;
+       dtp = ctp->chan_dest;
+       rv = 0;
+
+       if (stp->dev_flags & DEV_FLAGS_IN) {    /* Source in fifo */
+               rv = stp->dev_devwidth;
+               stp->dev_devwidth = bits;
+       }
+       if (dtp->dev_flags & DEV_FLAGS_OUT) {   /* Destination out fifo */
+               rv = dtp->dev_devwidth;
+               dtp->dev_devwidth = bits;
+       }
+
+       return rv;
+}
+EXPORT_SYMBOL(au1xxx_dbdma_set_devwidth);
+
+/* Allocate a descriptor ring, initializing as much as possible. */
+u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries)
+{
+       int                     i;
+       u32                     desc_base, srcid, destid;
+       u32                     cmd0, cmd1, src1, dest1;
+       u32                     src0, dest0;
+       chan_tab_t              *ctp;
+       dbdev_tab_t             *stp, *dtp;
+       au1x_ddma_desc_t        *dp;
+
+       /*
+        * I guess we could check this to be within the
+        * range of the table......
+        */
+       ctp = *((chan_tab_t **)chanid);
+       stp = ctp->chan_src;
+       dtp = ctp->chan_dest;
+
+       /*
+        * The descriptors must be 32-byte aligned.  There is a
+        * possibility the allocation will give us such an address,
+        * and if we try that first we are likely to not waste larger
+        * slabs of memory.
+        */
+       desc_base = (u32)kmalloc(entries * sizeof(au1x_ddma_desc_t),
+                                GFP_KERNEL|GFP_DMA);
+       if (desc_base == 0)
+               return 0;
+
+       if (desc_base & 0x1f) {
+               /*
+                * Lost....do it again, allocate extra, and round
+                * the address base.
+                */
+               kfree((const void *)desc_base);
+               i = entries * sizeof(au1x_ddma_desc_t);
+               i += (sizeof(au1x_ddma_desc_t) - 1);
+               desc_base = (u32)kmalloc(i, GFP_KERNEL|GFP_DMA);
+               if (desc_base == 0)
+                       return 0;
+
+               desc_base = ALIGN_ADDR(desc_base, sizeof(au1x_ddma_desc_t));
+       }
+       dp = (au1x_ddma_desc_t *)desc_base;
+
+       /* Keep track of the base descriptor. */
+       ctp->chan_desc_base = dp;
+
+       /* Initialize the rings with as much information as we know. */
+       srcid = stp->dev_id;
+       destid = dtp->dev_id;
+
+       cmd0 = cmd1 = src1 = dest1 = 0;
+       src0 = dest0 = 0;
+
+       cmd0 |= DSCR_CMD0_SID(srcid);
+       cmd0 |= DSCR_CMD0_DID(destid);
+       cmd0 |= DSCR_CMD0_IE | DSCR_CMD0_CV;
+       cmd0 |= DSCR_CMD0_ST(DSCR_CMD0_ST_NOCHANGE);
+
+       /* Is it mem to mem transfer? */
+       if (((DSCR_CUSTOM2DEV_ID(srcid) == DSCR_CMD0_THROTTLE) ||
+            (DSCR_CUSTOM2DEV_ID(srcid) == DSCR_CMD0_ALWAYS)) &&
+           ((DSCR_CUSTOM2DEV_ID(destid) == DSCR_CMD0_THROTTLE) ||
+            (DSCR_CUSTOM2DEV_ID(destid) == DSCR_CMD0_ALWAYS)))
+               cmd0 |= DSCR_CMD0_MEM;
+
+       switch (stp->dev_devwidth) {
+       case 8:
+               cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_BYTE);
+               break;
+       case 16:
+               cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_HALFWORD);
+               break;
+       case 32:
+       default:
+               cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_WORD);
+               break;
+       }
+
+       switch (dtp->dev_devwidth) {
+       case 8:
+               cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_BYTE);
+               break;
+       case 16:
+               cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_HALFWORD);
+               break;
+       case 32:
+       default:
+               cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_WORD);
+               break;
+       }
+
+       /*
+        * If the device is marked as an in/out FIFO, ensure it is
+        * set non-coherent.
+        */
+       if (stp->dev_flags & DEV_FLAGS_IN)
+               cmd0 |= DSCR_CMD0_SN;           /* Source in FIFO */
+       if (dtp->dev_flags & DEV_FLAGS_OUT)
+               cmd0 |= DSCR_CMD0_DN;           /* Destination out FIFO */
+
+       /*
+        * Set up source1.  For now, assume no stride and increment.
+        * A channel attribute update can change this later.
+        */
+       switch (stp->dev_tsize) {
+       case 1:
+               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE1);
+               break;
+       case 2:
+               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE2);
+               break;
+       case 4:
+               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE4);
+               break;
+       case 8:
+       default:
+               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE8);
+               break;
+       }
+
+       /* If source input is FIFO, set static address. */
+       if (stp->dev_flags & DEV_FLAGS_IN) {
+               if (stp->dev_flags & DEV_FLAGS_BURSTABLE)
+                       src1 |= DSCR_SRC1_SAM(DSCR_xAM_BURST);
+               else
+                       src1 |= DSCR_SRC1_SAM(DSCR_xAM_STATIC);
+       }
+
+       if (stp->dev_physaddr)
+               src0 = stp->dev_physaddr;
+
+       /*
+        * Set up dest1.  For now, assume no stride and increment.
+        * A channel attribute update can change this later.
+        */
+       switch (dtp->dev_tsize) {
+       case 1:
+               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE1);
+               break;
+       case 2:
+               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE2);
+               break;
+       case 4:
+               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE4);
+               break;
+       case 8:
+       default:
+               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE8);
+               break;
+       }
+
+       /* If destination output is FIFO, set static address. */
+       if (dtp->dev_flags & DEV_FLAGS_OUT) {
+               if (dtp->dev_flags & DEV_FLAGS_BURSTABLE)
+                       dest1 |= DSCR_DEST1_DAM(DSCR_xAM_BURST);
+               else
+                       dest1 |= DSCR_DEST1_DAM(DSCR_xAM_STATIC);
+       }
+
+       if (dtp->dev_physaddr)
+               dest0 = dtp->dev_physaddr;
+
+#if 0
+               printk(KERN_DEBUG "did:%x sid:%x cmd0:%x cmd1:%x source0:%x "
+                                 "source1:%x dest0:%x dest1:%x\n",
+                                 dtp->dev_id, stp->dev_id, cmd0, cmd1, src0,
+                                 src1, dest0, dest1);
+#endif
+       for (i = 0; i < entries; i++) {
+               dp->dscr_cmd0 = cmd0;
+               dp->dscr_cmd1 = cmd1;
+               dp->dscr_source0 = src0;
+               dp->dscr_source1 = src1;
+               dp->dscr_dest0 = dest0;
+               dp->dscr_dest1 = dest1;
+               dp->dscr_stat = 0;
+               dp->sw_context = 0;
+               dp->sw_status = 0;
+               dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(dp + 1));
+               dp++;
+       }
+
+       /* Make last descrptor point to the first. */
+       dp--;
+       dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(ctp->chan_desc_base));
+       ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
+
+       return (u32)ctp->chan_desc_base;
+}
+EXPORT_SYMBOL(au1xxx_dbdma_ring_alloc);
+
+/*
+ * Put a source buffer into the DMA ring.
+ * This updates the source pointer and byte count.  Normally used
+ * for memory to fifo transfers.
+ */
+u32 _au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags)
+{
+       chan_tab_t              *ctp;
+       au1x_ddma_desc_t        *dp;
+
+       /*
+        * I guess we could check this to be within the
+        * range of the table......
+        */
+       ctp = *(chan_tab_t **)chanid;
+
+       /*
+        * We should have multiple callers for a particular channel,
+        * an interrupt doesn't affect this pointer nor the descriptor,
+        * so no locking should be needed.
+        */
+       dp = ctp->put_ptr;
+
+       /*
+        * If the descriptor is valid, we are way ahead of the DMA
+        * engine, so just return an error condition.
+        */
+       if (dp->dscr_cmd0 & DSCR_CMD0_V)
+               return 0;
+
+       /* Load up buffer address and byte count. */
+       dp->dscr_source0 = virt_to_phys(buf);
+       dp->dscr_cmd1 = nbytes;
+       /* Check flags */
+       if (flags & DDMA_FLAGS_IE)
+               dp->dscr_cmd0 |= DSCR_CMD0_IE;
+       if (flags & DDMA_FLAGS_NOIE)
+               dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
+
+       /*
+        * There is an errata on the Au1200/Au1550 parts that could result
+        * in "stale" data being DMA'ed. It has to do with the snoop logic on
+        * the cache eviction buffer.  DMA_NONCOHERENT is on by default for
+        * these parts. If it is fixed in the future, these dma_cache_inv will
+        * just be nothing more than empty macros. See io.h.
+        */
+       dma_cache_wback_inv((unsigned long)buf, nbytes);
+       dp->dscr_cmd0 |= DSCR_CMD0_V;   /* Let it rip */
+       au_sync();
+       dma_cache_wback_inv((unsigned long)dp, sizeof(dp));
+       ctp->chan_ptr->ddma_dbell = 0;
+
+       /* Get next descriptor pointer. */
+       ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+       /* Return something non-zero. */
+       return nbytes;
+}
+EXPORT_SYMBOL(_au1xxx_dbdma_put_source);
+
+/* Put a destination buffer into the DMA ring.
+ * This updates the destination pointer and byte count.  Normally used
+ * to place an empty buffer into the ring for fifo to memory transfers.
+ */
+u32
+_au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags)
+{
+       chan_tab_t              *ctp;
+       au1x_ddma_desc_t        *dp;
+
+       /* I guess we could check this to be within the
+        * range of the table......
+        */
+       ctp = *((chan_tab_t **)chanid);
+
+       /* We should have multiple callers for a particular channel,
+        * an interrupt doesn't affect this pointer nor the descriptor,
+        * so no locking should be needed.
+        */
+       dp = ctp->put_ptr;
+
+       /* If the descriptor is valid, we are way ahead of the DMA
+        * engine, so just return an error condition.
+        */
+       if (dp->dscr_cmd0 & DSCR_CMD0_V)
+               return 0;
+
+       /* Load up buffer address and byte count */
+
+       /* Check flags  */
+       if (flags & DDMA_FLAGS_IE)
+               dp->dscr_cmd0 |= DSCR_CMD0_IE;
+       if (flags & DDMA_FLAGS_NOIE)
+               dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
+
+       dp->dscr_dest0 = virt_to_phys(buf);
+       dp->dscr_cmd1 = nbytes;
+#if 0
+       printk(KERN_DEBUG "cmd0:%x cmd1:%x source0:%x source1:%x dest0:%x dest1:%x\n",
+                         dp->dscr_cmd0, dp->dscr_cmd1, dp->dscr_source0,
+                         dp->dscr_source1, dp->dscr_dest0, dp->dscr_dest1);
+#endif
+       /*
+        * There is an errata on the Au1200/Au1550 parts that could result in
+        * "stale" data being DMA'ed. It has to do with the snoop logic on the
+        * cache eviction buffer.  DMA_NONCOHERENT is on by default for these
+        * parts. If it is fixed in the future, these dma_cache_inv will just
+        * be nothing more than empty macros. See io.h.
+        */
+       dma_cache_inv((unsigned long)buf, nbytes);
+       dp->dscr_cmd0 |= DSCR_CMD0_V;   /* Let it rip */
+       au_sync();
+       dma_cache_wback_inv((unsigned long)dp, sizeof(dp));
+       ctp->chan_ptr->ddma_dbell = 0;
+
+       /* Get next descriptor pointer. */
+       ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+       /* Return something non-zero. */
+       return nbytes;
+}
+EXPORT_SYMBOL(_au1xxx_dbdma_put_dest);
+
+/*
+ * Get a destination buffer into the DMA ring.
+ * Normally used to get a full buffer from the ring during fifo
+ * to memory transfers.  This does not set the valid bit, you will
+ * have to put another destination buffer to keep the DMA going.
+ */
+u32 au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes)
+{
+       chan_tab_t              *ctp;
+       au1x_ddma_desc_t        *dp;
+       u32                     rv;
+
+       /*
+        * I guess we could check this to be within the
+        * range of the table......
+        */
+       ctp = *((chan_tab_t **)chanid);
+
+       /*
+        * We should have multiple callers for a particular channel,
+        * an interrupt doesn't affect this pointer nor the descriptor,
+        * so no locking should be needed.
+        */
+       dp = ctp->get_ptr;
+
+       /*
+        * If the descriptor is valid, we are way ahead of the DMA
+        * engine, so just return an error condition.
+        */
+       if (dp->dscr_cmd0 & DSCR_CMD0_V)
+               return 0;
+
+       /* Return buffer address and byte count. */
+       *buf = (void *)(phys_to_virt(dp->dscr_dest0));
+       *nbytes = dp->dscr_cmd1;
+       rv = dp->dscr_stat;
+
+       /* Get next descriptor pointer. */
+       ctp->get_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+       /* Return something non-zero. */
+       return rv;
+}
+EXPORT_SYMBOL_GPL(au1xxx_dbdma_get_dest);
+
+void au1xxx_dbdma_stop(u32 chanid)
+{
+       chan_tab_t      *ctp;
+       au1x_dma_chan_t *cp;
+       int halt_timeout = 0;
+
+       ctp = *((chan_tab_t **)chanid);
+
+       cp = ctp->chan_ptr;
+       cp->ddma_cfg &= ~DDMA_CFG_EN;   /* Disable channel */
+       au_sync();
+       while (!(cp->ddma_stat & DDMA_STAT_H)) {
+               udelay(1);
+               halt_timeout++;
+               if (halt_timeout > 100) {
+                       printk(KERN_WARNING "warning: DMA channel won't halt\n");
+                       break;
+               }
+       }
+       /* clear current desc valid and doorbell */
+       cp->ddma_stat |= (DDMA_STAT_DB | DDMA_STAT_V);
+       au_sync();
+}
+EXPORT_SYMBOL(au1xxx_dbdma_stop);
+
+/*
+ * Start using the current descriptor pointer.  If the DBDMA encounters
+ * a non-valid descriptor, it will stop.  In this case, we can just
+ * continue by adding a buffer to the list and starting again.
+ */
+void au1xxx_dbdma_start(u32 chanid)
+{
+       chan_tab_t      *ctp;
+       au1x_dma_chan_t *cp;
+
+       ctp = *((chan_tab_t **)chanid);
+       cp = ctp->chan_ptr;
+       cp->ddma_desptr = virt_to_phys(ctp->cur_ptr);
+       cp->ddma_cfg |= DDMA_CFG_EN;    /* Enable channel */
+       au_sync();
+       cp->ddma_dbell = 0;
+       au_sync();
+}
+EXPORT_SYMBOL(au1xxx_dbdma_start);
+
+void au1xxx_dbdma_reset(u32 chanid)
+{
+       chan_tab_t              *ctp;
+       au1x_ddma_desc_t        *dp;
+
+       au1xxx_dbdma_stop(chanid);
+
+       ctp = *((chan_tab_t **)chanid);
+       ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
+
+       /* Run through the descriptors and reset the valid indicator. */
+       dp = ctp->chan_desc_base;
+
+       do {
+               dp->dscr_cmd0 &= ~DSCR_CMD0_V;
+               /*
+                * Reset our software status -- this is used to determine
+                * if a descriptor is in use by upper level software. Since
+                * posting can reset 'V' bit.
+                */
+               dp->sw_status = 0;
+               dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+       } while (dp != ctp->chan_desc_base);
+}
+EXPORT_SYMBOL(au1xxx_dbdma_reset);
+
+u32 au1xxx_get_dma_residue(u32 chanid)
+{
+       chan_tab_t      *ctp;
+       au1x_dma_chan_t *cp;
+       u32             rv;
+
+       ctp = *((chan_tab_t **)chanid);
+       cp = ctp->chan_ptr;
+
+       /* This is only valid if the channel is stopped. */
+       rv = cp->ddma_bytecnt;
+       au_sync();
+
+       return rv;
+}
+EXPORT_SYMBOL_GPL(au1xxx_get_dma_residue);
+
+void au1xxx_dbdma_chan_free(u32 chanid)
+{
+       chan_tab_t      *ctp;
+       dbdev_tab_t     *stp, *dtp;
+
+       ctp = *((chan_tab_t **)chanid);
+       stp = ctp->chan_src;
+       dtp = ctp->chan_dest;
+
+       au1xxx_dbdma_stop(chanid);
+
+       kfree((void *)ctp->chan_desc_base);
+
+       stp->dev_flags &= ~DEV_FLAGS_INUSE;
+       dtp->dev_flags &= ~DEV_FLAGS_INUSE;
+       chan_tab_ptr[ctp->chan_index] = NULL;
+
+       kfree(ctp);
+}
+EXPORT_SYMBOL(au1xxx_dbdma_chan_free);
+
+static irqreturn_t dbdma_interrupt(int irq, void *dev_id)
+{
+       u32 intstat;
+       u32 chan_index;
+       chan_tab_t              *ctp;
+       au1x_ddma_desc_t        *dp;
+       au1x_dma_chan_t *cp;
+
+       intstat = dbdma_gptr->ddma_intstat;
+       au_sync();
+       chan_index = __ffs(intstat);
+
+       ctp = chan_tab_ptr[chan_index];
+       cp = ctp->chan_ptr;
+       dp = ctp->cur_ptr;
+
+       /* Reset interrupt. */
+       cp->ddma_irq = 0;
+       au_sync();
+
+       if (ctp->chan_callback)
+               ctp->chan_callback(irq, ctp->chan_callparam);
+
+       ctp->cur_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+       return IRQ_RETVAL(1);
+}
+
+static void au1xxx_dbdma_init(void)
+{
+       int irq_nr;
+
+       dbdma_gptr->ddma_config = 0;
+       dbdma_gptr->ddma_throttle = 0;
+       dbdma_gptr->ddma_inten = 0xffff;
+       au_sync();
+
+#if defined(CONFIG_SOC_AU1550)
+       irq_nr = AU1550_DDMA_INT;
+#elif defined(CONFIG_SOC_AU1200)
+       irq_nr = AU1200_DDMA_INT;
+#else
+       #error Unknown Au1x00 SOC
+#endif
+
+       if (request_irq(irq_nr, dbdma_interrupt, IRQF_DISABLED,
+                       "Au1xxx dbdma", (void *)dbdma_gptr))
+               printk(KERN_ERR "Can't get 1550 dbdma irq");
+}
+
+void au1xxx_dbdma_dump(u32 chanid)
+{
+       chan_tab_t       *ctp;
+       au1x_ddma_desc_t *dp;
+       dbdev_tab_t      *stp, *dtp;
+       au1x_dma_chan_t  *cp;
+       u32 i            = 0;
+
+       ctp = *((chan_tab_t **)chanid);
+       stp = ctp->chan_src;
+       dtp = ctp->chan_dest;
+       cp = ctp->chan_ptr;
+
+       printk(KERN_DEBUG "Chan %x, stp %x (dev %d)  dtp %x (dev %d) \n",
+                         (u32)ctp, (u32)stp, stp - dbdev_tab, (u32)dtp,
+                         dtp - dbdev_tab);
+       printk(KERN_DEBUG "desc base %x, get %x, put %x, cur %x\n",
+                         (u32)(ctp->chan_desc_base), (u32)(ctp->get_ptr),
+                         (u32)(ctp->put_ptr), (u32)(ctp->cur_ptr));
+
+       printk(KERN_DEBUG "dbdma chan %x\n", (u32)cp);
+       printk(KERN_DEBUG "cfg %08x, desptr %08x, statptr %08x\n",
+                         cp->ddma_cfg, cp->ddma_desptr, cp->ddma_statptr);
+       printk(KERN_DEBUG "dbell %08x, irq %08x, stat %08x, bytecnt %08x\n",
+                         cp->ddma_dbell, cp->ddma_irq, cp->ddma_stat,
+                         cp->ddma_bytecnt);
+
+       /* Run through the descriptors */
+       dp = ctp->chan_desc_base;
+
+       do {
+               printk(KERN_DEBUG "Dp[%d]= %08x, cmd0 %08x, cmd1 %08x\n",
+                                 i++, (u32)dp, dp->dscr_cmd0, dp->dscr_cmd1);
+               printk(KERN_DEBUG "src0 %08x, src1 %08x, dest0 %08x, dest1 %08x\n",
+                                 dp->dscr_source0, dp->dscr_source1,
+                                 dp->dscr_dest0, dp->dscr_dest1);
+               printk(KERN_DEBUG "stat %08x, nxtptr %08x\n",
+                                 dp->dscr_stat, dp->dscr_nxtptr);
+               dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+       } while (dp != ctp->chan_desc_base);
+}
+
+/* Put a descriptor into the DMA ring.
+ * This updates the source/destination pointers and byte count.
+ */
+u32 au1xxx_dbdma_put_dscr(u32 chanid, au1x_ddma_desc_t *dscr)
+{
+       chan_tab_t *ctp;
+       au1x_ddma_desc_t *dp;
+       u32 nbytes = 0;
+
+       /*
+        * I guess we could check this to be within the
+        * range of the table......
+        */
+       ctp = *((chan_tab_t **)chanid);
+
+       /*
+        * We should have multiple callers for a particular channel,
+        * an interrupt doesn't affect this pointer nor the descriptor,
+        * so no locking should be needed.
+        */
+       dp = ctp->put_ptr;
+
+       /*
+        * If the descriptor is valid, we are way ahead of the DMA
+        * engine, so just return an error condition.
+        */
+       if (dp->dscr_cmd0 & DSCR_CMD0_V)
+               return 0;
+
+       /* Load up buffer addresses and byte count. */
+       dp->dscr_dest0 = dscr->dscr_dest0;
+       dp->dscr_source0 = dscr->dscr_source0;
+       dp->dscr_dest1 = dscr->dscr_dest1;
+       dp->dscr_source1 = dscr->dscr_source1;
+       dp->dscr_cmd1 = dscr->dscr_cmd1;
+       nbytes = dscr->dscr_cmd1;
+       /* Allow the caller to specifiy if an interrupt is generated */
+       dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
+       dp->dscr_cmd0 |= dscr->dscr_cmd0 | DSCR_CMD0_V;
+       ctp->chan_ptr->ddma_dbell = 0;
+
+       /* Get next descriptor pointer. */
+       ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
+
+       /* Return something non-zero. */
+       return nbytes;
+}
+
+#endif /* defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200) */
diff --git a/arch/mips/alchemy/common/dma.c b/arch/mips/alchemy/common/dma.c
new file mode 100644 (file)
index 0000000..d6fbda2
--- /dev/null
@@ -0,0 +1,238 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *      A DMA channel allocator for Au1x00. API is modeled loosely off of
+ *      linux/kernel/dma.c.
+ *
+ * Copyright 2000, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-au1x00/au1000_dma.h>
+
+#if defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1500) || \
+    defined(CONFIG_SOC_AU1100)
+/*
+ * A note on resource allocation:
+ *
+ * All drivers needing DMA channels, should allocate and release them
+ * through the public routines `request_dma()' and `free_dma()'.
+ *
+ * In order to avoid problems, all processes should allocate resources in
+ * the same sequence and release them in the reverse order.
+ *
+ * So, when allocating DMAs and IRQs, first allocate the DMA, then the IRQ.
+ * When releasing them, first release the IRQ, then release the DMA. The
+ * main reason for this order is that, if you are requesting the DMA buffer
+ * done interrupt, you won't know the irq number until the DMA channel is
+ * returned from request_dma.
+ */
+
+DEFINE_SPINLOCK(au1000_dma_spin_lock);
+
+struct dma_chan au1000_dma_table[NUM_AU1000_DMA_CHANNELS] = {
+      {.dev_id = -1,},
+      {.dev_id = -1,},
+      {.dev_id = -1,},
+      {.dev_id = -1,},
+      {.dev_id = -1,},
+      {.dev_id = -1,},
+      {.dev_id = -1,},
+      {.dev_id = -1,}
+};
+EXPORT_SYMBOL(au1000_dma_table);
+
+/* Device FIFO addresses and default DMA modes */
+static const struct dma_dev {
+       unsigned int fifo_addr;
+       unsigned int dma_mode;
+} dma_dev_table[DMA_NUM_DEV] = {
+       {UART0_ADDR + UART_TX, 0},
+       {UART0_ADDR + UART_RX, 0},
+       {0, 0},
+       {0, 0},
+       {AC97C_DATA, DMA_DW16 },          /* coherent */
+       {AC97C_DATA, DMA_DR | DMA_DW16 }, /* coherent */
+       {UART3_ADDR + UART_TX, DMA_DW8 | DMA_NC},
+       {UART3_ADDR + UART_RX, DMA_DR | DMA_DW8 | DMA_NC},
+       {USBD_EP0RD, DMA_DR | DMA_DW8 | DMA_NC},
+       {USBD_EP0WR, DMA_DW8 | DMA_NC},
+       {USBD_EP2WR, DMA_DW8 | DMA_NC},
+       {USBD_EP3WR, DMA_DW8 | DMA_NC},
+       {USBD_EP4RD, DMA_DR | DMA_DW8 | DMA_NC},
+       {USBD_EP5RD, DMA_DR | DMA_DW8 | DMA_NC},
+       {I2S_DATA, DMA_DW32 | DMA_NC},
+       {I2S_DATA, DMA_DR | DMA_DW32 | DMA_NC}
+};
+
+int au1000_dma_read_proc(char *buf, char **start, off_t fpos,
+                        int length, int *eof, void *data)
+{
+       int i, len = 0;
+       struct dma_chan *chan;
+
+       for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) {
+               chan = get_dma_chan(i);
+               if (chan != NULL)
+                       len += sprintf(buf + len, "%2d: %s\n",
+                                      i, chan->dev_str);
+       }
+
+       if (fpos >= len) {
+               *start = buf;
+               *eof = 1;
+               return 0;
+       }
+       *start = buf + fpos;
+       len -= fpos;
+       if (len > length)
+               return length;
+       *eof = 1;
+       return len;
+}
+
+/* Device FIFO addresses and default DMA modes - 2nd bank */
+static const struct dma_dev dma_dev_table_bank2[DMA_NUM_DEV_BANK2] = {
+       { SD0_XMIT_FIFO, DMA_DS | DMA_DW8 },            /* coherent */
+       { SD0_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8 },   /* coherent */
+       { SD1_XMIT_FIFO, DMA_DS | DMA_DW8 },            /* coherent */
+       { SD1_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8 }    /* coherent */
+};
+
+void dump_au1000_dma_channel(unsigned int dmanr)
+{
+       struct dma_chan *chan;
+
+       if (dmanr >= NUM_AU1000_DMA_CHANNELS)
+               return;
+       chan = &au1000_dma_table[dmanr];
+
+       printk(KERN_INFO "Au1000 DMA%d Register Dump:\n", dmanr);
+       printk(KERN_INFO "  mode = 0x%08x\n",
+              au_readl(chan->io + DMA_MODE_SET));
+       printk(KERN_INFO "  addr = 0x%08x\n",
+              au_readl(chan->io + DMA_PERIPHERAL_ADDR));
+       printk(KERN_INFO "  start0 = 0x%08x\n",
+              au_readl(chan->io + DMA_BUFFER0_START));
+       printk(KERN_INFO "  start1 = 0x%08x\n",
+              au_readl(chan->io + DMA_BUFFER1_START));
+       printk(KERN_INFO "  count0 = 0x%08x\n",
+              au_readl(chan->io + DMA_BUFFER0_COUNT));
+       printk(KERN_INFO "  count1 = 0x%08x\n",
+              au_readl(chan->io + DMA_BUFFER1_COUNT));
+}
+
+/*
+ * Finds a free channel, and binds the requested device to it.
+ * Returns the allocated channel number, or negative on error.
+ * Requests the DMA done IRQ if irqhandler != NULL.
+ */
+int request_au1000_dma(int dev_id, const char *dev_str,
+                      irq_handler_t irqhandler,
+                      unsigned long irqflags,
+                      void *irq_dev_id)
+{
+       struct dma_chan *chan;
+       const struct dma_dev *dev;
+       int i, ret;
+
+#if defined(CONFIG_SOC_AU1100)
+       if (dev_id < 0 || dev_id >= (DMA_NUM_DEV + DMA_NUM_DEV_BANK2))
+               return -EINVAL;
+#else
+       if (dev_id < 0 || dev_id >= DMA_NUM_DEV)
+               return -EINVAL;
+#endif
+
+       for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++)
+               if (au1000_dma_table[i].dev_id < 0)
+                       break;
+
+       if (i == NUM_AU1000_DMA_CHANNELS)
+               return -ENODEV;
+
+       chan = &au1000_dma_table[i];
+
+       if (dev_id >= DMA_NUM_DEV) {
+               dev_id -= DMA_NUM_DEV;
+               dev = &dma_dev_table_bank2[dev_id];
+       } else
+               dev = &dma_dev_table[dev_id];
+
+       if (irqhandler) {
+               chan->irq = AU1000_DMA_INT_BASE + i;
+               chan->irq_dev = irq_dev_id;
+               ret = request_irq(chan->irq, irqhandler, irqflags, dev_str,
+                                 chan->irq_dev);
+               if (ret) {
+                       chan->irq = 0;
+                       chan->irq_dev = NULL;
+                       return ret;
+               }
+       } else {
+               chan->irq = 0;
+               chan->irq_dev = NULL;
+       }
+
+       /* fill it in */
+       chan->io = DMA_CHANNEL_BASE + i * DMA_CHANNEL_LEN;
+       chan->dev_id = dev_id;
+       chan->dev_str = dev_str;
+       chan->fifo_addr = dev->fifo_addr;
+       chan->mode = dev->dma_mode;
+
+       /* initialize the channel before returning */
+       init_dma(i);
+
+       return i;
+}
+EXPORT_SYMBOL(request_au1000_dma);
+
+void free_au1000_dma(unsigned int dmanr)
+{
+       struct dma_chan *chan = get_dma_chan(dmanr);
+
+       if (!chan) {
+               printk(KERN_ERR "Error trying to free DMA%d\n", dmanr);
+               return;
+       }
+
+       disable_dma(dmanr);
+       if (chan->irq)
+               free_irq(chan->irq, chan->irq_dev);
+
+       chan->irq = 0;
+       chan->irq_dev = NULL;
+       chan->dev_id = -1;
+}
+EXPORT_SYMBOL(free_au1000_dma);
+
+#endif /* AU1000 AU1500 AU1100 */
diff --git a/arch/mips/alchemy/common/gpio.c b/arch/mips/alchemy/common/gpio.c
new file mode 100644 (file)
index 0000000..e660ddd
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ *  Copyright (C) 2007, OpenWrt.org, Florian Fainelli <florian@openwrt.org>
+ *     Architecture specific GPIO support
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *  Notes :
+ *     au1000 SoC have only one GPIO line : GPIO1
+ *     others have a second one : GPIO2
+ */
+
+#include <linux/module.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/gpio.h>
+
+#define gpio1 sys
+#if !defined(CONFIG_SOC_AU1000)
+
+static struct au1x00_gpio2 *const gpio2 = (struct au1x00_gpio2 *) GPIO2_BASE;
+#define GPIO2_OUTPUT_ENABLE_MASK       0x00010000
+
+static int au1xxx_gpio2_read(unsigned gpio)
+{
+       gpio -= AU1XXX_GPIO_BASE;
+       return ((gpio2->pinstate >> gpio) & 0x01);
+}
+
+static void au1xxx_gpio2_write(unsigned gpio, int value)
+{
+       gpio -= AU1XXX_GPIO_BASE;
+
+       gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << gpio) | ((!!value) << gpio);
+}
+
+static int au1xxx_gpio2_direction_input(unsigned gpio)
+{
+       gpio -= AU1XXX_GPIO_BASE;
+       gpio2->dir &= ~(0x01 << gpio);
+       return 0;
+}
+
+static int au1xxx_gpio2_direction_output(unsigned gpio, int value)
+{
+       gpio -= AU1XXX_GPIO_BASE;
+       gpio2->dir |= 0x01 << gpio;
+       gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << gpio) | ((!!value) << gpio);
+       return 0;
+}
+
+#endif /* !defined(CONFIG_SOC_AU1000) */
+
+static int au1xxx_gpio1_read(unsigned gpio)
+{
+       return (gpio1->pinstaterd >> gpio) & 0x01;
+}
+
+static void au1xxx_gpio1_write(unsigned gpio, int value)
+{
+       if (value)
+               gpio1->outputset = (0x01 << gpio);
+       else
+               /* Output a zero */
+               gpio1->outputclr = (0x01 << gpio);
+}
+
+static int au1xxx_gpio1_direction_input(unsigned gpio)
+{
+       gpio1->pininputen = (0x01 << gpio);
+       return 0;
+}
+
+static int au1xxx_gpio1_direction_output(unsigned gpio, int value)
+{
+       gpio1->trioutclr = (0x01 & gpio);
+       au1xxx_gpio1_write(gpio, value);
+       return 0;
+}
+
+int au1xxx_gpio_get_value(unsigned gpio)
+{
+       if (gpio >= AU1XXX_GPIO_BASE)
+#if defined(CONFIG_SOC_AU1000)
+               return 0;
+#else
+               return au1xxx_gpio2_read(gpio);
+#endif
+       else
+               return au1xxx_gpio1_read(gpio);
+}
+EXPORT_SYMBOL(au1xxx_gpio_get_value);
+
+void au1xxx_gpio_set_value(unsigned gpio, int value)
+{
+       if (gpio >= AU1XXX_GPIO_BASE)
+#if defined(CONFIG_SOC_AU1000)
+               ;
+#else
+               au1xxx_gpio2_write(gpio, value);
+#endif
+       else
+               au1xxx_gpio1_write(gpio, value);
+}
+EXPORT_SYMBOL(au1xxx_gpio_set_value);
+
+int au1xxx_gpio_direction_input(unsigned gpio)
+{
+       if (gpio >= AU1XXX_GPIO_BASE)
+#if defined(CONFIG_SOC_AU1000)
+               return -ENODEV;
+#else
+               return au1xxx_gpio2_direction_input(gpio);
+#endif
+
+       return au1xxx_gpio1_direction_input(gpio);
+}
+EXPORT_SYMBOL(au1xxx_gpio_direction_input);
+
+int au1xxx_gpio_direction_output(unsigned gpio, int value)
+{
+       if (gpio >= AU1XXX_GPIO_BASE)
+#if defined(CONFIG_SOC_AU1000)
+               return -ENODEV;
+#else
+               return au1xxx_gpio2_direction_output(gpio, value);
+#endif
+
+       return au1xxx_gpio1_direction_output(gpio, value);
+}
+EXPORT_SYMBOL(au1xxx_gpio_direction_output);
diff --git a/arch/mips/alchemy/common/irq.c b/arch/mips/alchemy/common/irq.c
new file mode 100644 (file)
index 0000000..40c6cec
--- /dev/null
@@ -0,0 +1,596 @@
+/*
+ * Copyright 2001, 2007-2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ * Copyright (C) 2007 Ralf Baechle (ralf@linux-mips.org)
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+#include <linux/bitops.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+
+#include <asm/irq_cpu.h>
+#include <asm/mipsregs.h>
+#include <asm/mach-au1x00/au1000.h>
+#ifdef CONFIG_MIPS_PB1000
+#include <asm/mach-pb1x00/pb1000.h>
+#endif
+
+#define EXT_INTC0_REQ0 2 /* IP 2 */
+#define EXT_INTC0_REQ1 3 /* IP 3 */
+#define EXT_INTC1_REQ0 4 /* IP 4 */
+#define EXT_INTC1_REQ1 5 /* IP 5 */
+#define MIPS_TIMER_IP  7 /* IP 7 */
+
+void (*board_init_irq)(void) __initdata = NULL;
+
+static DEFINE_SPINLOCK(irq_lock);
+
+#ifdef CONFIG_PM
+
+/*
+ * Save/restore the interrupt controller state.
+ * Called from the save/restore core registers as part of the
+ * au_sleep function in power.c.....maybe I should just pm_register()
+ * them instead?
+ */
+static unsigned int    sleep_intctl_config0[2];
+static unsigned int    sleep_intctl_config1[2];
+static unsigned int    sleep_intctl_config2[2];
+static unsigned int    sleep_intctl_src[2];
+static unsigned int    sleep_intctl_assign[2];
+static unsigned int    sleep_intctl_wake[2];
+static unsigned int    sleep_intctl_mask[2];
+
+void save_au1xxx_intctl(void)
+{
+       sleep_intctl_config0[0] = au_readl(IC0_CFG0RD);
+       sleep_intctl_config1[0] = au_readl(IC0_CFG1RD);
+       sleep_intctl_config2[0] = au_readl(IC0_CFG2RD);
+       sleep_intctl_src[0] = au_readl(IC0_SRCRD);
+       sleep_intctl_assign[0] = au_readl(IC0_ASSIGNRD);
+       sleep_intctl_wake[0] = au_readl(IC0_WAKERD);
+       sleep_intctl_mask[0] = au_readl(IC0_MASKRD);
+
+       sleep_intctl_config0[1] = au_readl(IC1_CFG0RD);
+       sleep_intctl_config1[1] = au_readl(IC1_CFG1RD);
+       sleep_intctl_config2[1] = au_readl(IC1_CFG2RD);
+       sleep_intctl_src[1] = au_readl(IC1_SRCRD);
+       sleep_intctl_assign[1] = au_readl(IC1_ASSIGNRD);
+       sleep_intctl_wake[1] = au_readl(IC1_WAKERD);
+       sleep_intctl_mask[1] = au_readl(IC1_MASKRD);
+}
+
+/*
+ * For most restore operations, we clear the entire register and
+ * then set the bits we found during the save.
+ */
+void restore_au1xxx_intctl(void)
+{
+       au_writel(0xffffffff, IC0_MASKCLR); au_sync();
+
+       au_writel(0xffffffff, IC0_CFG0CLR); au_sync();
+       au_writel(sleep_intctl_config0[0], IC0_CFG0SET); au_sync();
+       au_writel(0xffffffff, IC0_CFG1CLR); au_sync();
+       au_writel(sleep_intctl_config1[0], IC0_CFG1SET); au_sync();
+       au_writel(0xffffffff, IC0_CFG2CLR); au_sync();
+       au_writel(sleep_intctl_config2[0], IC0_CFG2SET); au_sync();
+       au_writel(0xffffffff, IC0_SRCCLR); au_sync();
+       au_writel(sleep_intctl_src[0], IC0_SRCSET); au_sync();
+       au_writel(0xffffffff, IC0_ASSIGNCLR); au_sync();
+       au_writel(sleep_intctl_assign[0], IC0_ASSIGNSET); au_sync();
+       au_writel(0xffffffff, IC0_WAKECLR); au_sync();
+       au_writel(sleep_intctl_wake[0], IC0_WAKESET); au_sync();
+       au_writel(0xffffffff, IC0_RISINGCLR); au_sync();
+       au_writel(0xffffffff, IC0_FALLINGCLR); au_sync();
+       au_writel(0x00000000, IC0_TESTBIT); au_sync();
+
+       au_writel(0xffffffff, IC1_MASKCLR); au_sync();
+
+       au_writel(0xffffffff, IC1_CFG0CLR); au_sync();
+       au_writel(sleep_intctl_config0[1], IC1_CFG0SET); au_sync();
+       au_writel(0xffffffff, IC1_CFG1CLR); au_sync();
+       au_writel(sleep_intctl_config1[1], IC1_CFG1SET); au_sync();
+       au_writel(0xffffffff, IC1_CFG2CLR); au_sync();
+       au_writel(sleep_intctl_config2[1], IC1_CFG2SET); au_sync();
+       au_writel(0xffffffff, IC1_SRCCLR); au_sync();
+       au_writel(sleep_intctl_src[1], IC1_SRCSET); au_sync();
+       au_writel(0xffffffff, IC1_ASSIGNCLR); au_sync();
+       au_writel(sleep_intctl_assign[1], IC1_ASSIGNSET); au_sync();
+       au_writel(0xffffffff, IC1_WAKECLR); au_sync();
+       au_writel(sleep_intctl_wake[1], IC1_WAKESET); au_sync();
+       au_writel(0xffffffff, IC1_RISINGCLR); au_sync();
+       au_writel(0xffffffff, IC1_FALLINGCLR); au_sync();
+       au_writel(0x00000000, IC1_TESTBIT); au_sync();
+
+       au_writel(sleep_intctl_mask[1], IC1_MASKSET); au_sync();
+
+       au_writel(sleep_intctl_mask[0], IC0_MASKSET); au_sync();
+}
+#endif /* CONFIG_PM */
+
+
+inline void local_enable_irq(unsigned int irq_nr)
+{
+       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
+
+       if (bit >= 32) {
+               au_writel(1 << (bit - 32), IC1_MASKSET);
+               au_writel(1 << (bit - 32), IC1_WAKESET);
+       } else {
+               au_writel(1 << bit, IC0_MASKSET);
+               au_writel(1 << bit, IC0_WAKESET);
+       }
+       au_sync();
+}
+
+
+inline void local_disable_irq(unsigned int irq_nr)
+{
+       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
+
+       if (bit >= 32) {
+               au_writel(1 << (bit - 32), IC1_MASKCLR);
+               au_writel(1 << (bit - 32), IC1_WAKECLR);
+       } else {
+               au_writel(1 << bit, IC0_MASKCLR);
+               au_writel(1 << bit, IC0_WAKECLR);
+       }
+       au_sync();
+}
+
+
+static inline void mask_and_ack_rise_edge_irq(unsigned int irq_nr)
+{
+       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
+
+       if (bit >= 32) {
+               au_writel(1 << (bit - 32), IC1_RISINGCLR);
+               au_writel(1 << (bit - 32), IC1_MASKCLR);
+       } else {
+               au_writel(1 << bit, IC0_RISINGCLR);
+               au_writel(1 << bit, IC0_MASKCLR);
+       }
+       au_sync();
+}
+
+
+static inline void mask_and_ack_fall_edge_irq(unsigned int irq_nr)
+{
+       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
+
+       if (bit >= 32) {
+               au_writel(1 << (bit - 32), IC1_FALLINGCLR);
+               au_writel(1 << (bit - 32), IC1_MASKCLR);
+       } else {
+               au_writel(1 << bit, IC0_FALLINGCLR);
+               au_writel(1 << bit, IC0_MASKCLR);
+       }
+       au_sync();
+}
+
+
+static inline void mask_and_ack_either_edge_irq(unsigned int irq_nr)
+{
+       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
+
+       /*
+        * This may assume that we don't get interrupts from
+        * both edges at once, or if we do, that we don't care.
+        */
+       if (bit >= 32) {
+               au_writel(1 << (bit - 32), IC1_FALLINGCLR);
+               au_writel(1 << (bit - 32), IC1_RISINGCLR);
+               au_writel(1 << (bit - 32), IC1_MASKCLR);
+       } else {
+               au_writel(1 << bit, IC0_FALLINGCLR);
+               au_writel(1 << bit, IC0_RISINGCLR);
+               au_writel(1 << bit, IC0_MASKCLR);
+       }
+       au_sync();
+}
+
+static inline void mask_and_ack_level_irq(unsigned int irq_nr)
+{
+       local_disable_irq(irq_nr);
+       au_sync();
+#if defined(CONFIG_MIPS_PB1000)
+       if (irq_nr == AU1000_GPIO_15) {
+               au_writel(0x8000, PB1000_MDR); /* ack int */
+               au_sync();
+       }
+#endif
+}
+
+static void end_irq(unsigned int irq_nr)
+{
+       if (!(irq_desc[irq_nr].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
+               local_enable_irq(irq_nr);
+
+#if defined(CONFIG_MIPS_PB1000)
+       if (irq_nr == AU1000_GPIO_15) {
+               au_writel(0x4000, PB1000_MDR); /* enable int */
+               au_sync();
+       }
+#endif
+}
+
+unsigned long save_local_and_disable(int controller)
+{
+       int i;
+       unsigned long flags, mask;
+
+       spin_lock_irqsave(&irq_lock, flags);
+       if (controller) {
+               mask = au_readl(IC1_MASKSET);
+               for (i = 32; i < 64; i++)
+                       local_disable_irq(i);
+       } else {
+               mask = au_readl(IC0_MASKSET);
+               for (i = 0; i < 32; i++)
+                       local_disable_irq(i);
+       }
+       spin_unlock_irqrestore(&irq_lock, flags);
+
+       return mask;
+}
+
+void restore_local_and_enable(int controller, unsigned long mask)
+{
+       int i;
+       unsigned long flags, new_mask;
+
+       spin_lock_irqsave(&irq_lock, flags);
+       for (i = 0; i < 32; i++)
+               if (mask & (1 << i)) {
+                       if (controller)
+                               local_enable_irq(i + 32);
+                       else
+                               local_enable_irq(i);
+               }
+
+       if (controller)
+               new_mask = au_readl(IC1_MASKSET);
+       else
+               new_mask = au_readl(IC0_MASKSET);
+
+       spin_unlock_irqrestore(&irq_lock, flags);
+}
+
+
+static struct irq_chip rise_edge_irq_type = {
+       .name           = "Au1000 Rise Edge",
+       .ack            = mask_and_ack_rise_edge_irq,
+       .mask           = local_disable_irq,
+       .mask_ack       = mask_and_ack_rise_edge_irq,
+       .unmask         = local_enable_irq,
+       .end            = end_irq,
+};
+
+static struct irq_chip fall_edge_irq_type = {
+       .name           = "Au1000 Fall Edge",
+       .ack            = mask_and_ack_fall_edge_irq,
+       .mask           = local_disable_irq,
+       .mask_ack       = mask_and_ack_fall_edge_irq,
+       .unmask         = local_enable_irq,
+       .end            = end_irq,
+};
+
+static struct irq_chip either_edge_irq_type = {
+       .name           = "Au1000 Rise or Fall Edge",
+       .ack            = mask_and_ack_either_edge_irq,
+       .mask           = local_disable_irq,
+       .mask_ack       = mask_and_ack_either_edge_irq,
+       .unmask         = local_enable_irq,
+       .end            = end_irq,
+};
+
+static struct irq_chip level_irq_type = {
+       .name           = "Au1000 Level",
+       .ack            = mask_and_ack_level_irq,
+       .mask           = local_disable_irq,
+       .mask_ack       = mask_and_ack_level_irq,
+       .unmask         = local_enable_irq,
+       .end            = end_irq,
+};
+
+static void __init setup_local_irq(unsigned int irq_nr, int type, int int_req)
+{
+       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
+
+       if (irq_nr > AU1000_MAX_INTR)
+               return;
+
+       /* Config2[n], Config1[n], Config0[n] */
+       if (bit >= 32) {
+               switch (type) {
+               case INTC_INT_RISE_EDGE: /* 0:0:1 */
+                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG0SET);
+                       set_irq_chip(irq_nr, &rise_edge_irq_type);
+                       break;
+               case INTC_INT_FALL_EDGE: /* 0:1:0 */
+                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG1SET);
+                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
+                       set_irq_chip(irq_nr, &fall_edge_irq_type);
+                       break;
+               case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
+                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG1SET);
+                       au_writel(1 << (bit - 32), IC1_CFG0SET);
+                       set_irq_chip(irq_nr, &either_edge_irq_type);
+                       break;
+               case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
+                       au_writel(1 << (bit - 32), IC1_CFG2SET);
+                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG0SET);
+                       set_irq_chip(irq_nr, &level_irq_type);
+                       break;
+               case INTC_INT_LOW_LEVEL: /* 1:1:0 */
+                       au_writel(1 << (bit - 32), IC1_CFG2SET);
+                       au_writel(1 << (bit - 32), IC1_CFG1SET);
+                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
+                       set_irq_chip(irq_nr, &level_irq_type);
+                       break;
+               case INTC_INT_DISABLED: /* 0:0:0 */
+                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
+                       break;
+               default: /* disable the interrupt */
+                       printk(KERN_WARNING "unexpected int type %d (irq %d)\n",
+                              type, irq_nr);
+                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
+                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
+                       return;
+               }
+               if (int_req) /* assign to interrupt request 1 */
+                       au_writel(1 << (bit - 32), IC1_ASSIGNCLR);
+               else         /* assign to interrupt request 0 */
+                       au_writel(1 << (bit - 32), IC1_ASSIGNSET);
+               au_writel(1 << (bit - 32), IC1_SRCSET);
+               au_writel(1 << (bit - 32), IC1_MASKCLR);
+               au_writel(1 << (bit - 32), IC1_WAKECLR);
+       } else {
+               switch (type) {
+               case INTC_INT_RISE_EDGE: /* 0:0:1 */
+                       au_writel(1 << bit, IC0_CFG2CLR);
+                       au_writel(1 << bit, IC0_CFG1CLR);
+                       au_writel(1 << bit, IC0_CFG0SET);
+                       set_irq_chip(irq_nr, &rise_edge_irq_type);
+                       break;
+               case INTC_INT_FALL_EDGE: /* 0:1:0 */
+                       au_writel(1 << bit, IC0_CFG2CLR);
+                       au_writel(1 << bit, IC0_CFG1SET);
+                       au_writel(1 << bit, IC0_CFG0CLR);
+                       set_irq_chip(irq_nr, &fall_edge_irq_type);
+                       break;
+               case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
+                       au_writel(1 << bit, IC0_CFG2CLR);
+                       au_writel(1 << bit, IC0_CFG1SET);
+                       au_writel(1 << bit, IC0_CFG0SET);
+                       set_irq_chip(irq_nr, &either_edge_irq_type);
+                       break;
+               case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
+                       au_writel(1 << bit, IC0_CFG2SET);
+                       au_writel(1 << bit, IC0_CFG1CLR);
+                       au_writel(1 << bit, IC0_CFG0SET);
+                       set_irq_chip(irq_nr, &level_irq_type);
+                       break;
+               case INTC_INT_LOW_LEVEL: /* 1:1:0 */
+                       au_writel(1 << bit, IC0_CFG2SET);
+                       au_writel(1 << bit, IC0_CFG1SET);
+                       au_writel(1 << bit, IC0_CFG0CLR);
+                       set_irq_chip(irq_nr, &level_irq_type);
+                       break;
+               case INTC_INT_DISABLED: /* 0:0:0 */
+                       au_writel(1 << bit, IC0_CFG0CLR);
+                       au_writel(1 << bit, IC0_CFG1CLR);
+                       au_writel(1 << bit, IC0_CFG2CLR);
+                       break;
+               default: /* disable the interrupt */
+                       printk(KERN_WARNING "unexpected int type %d (irq %d)\n",
+                              type, irq_nr);
+                       au_writel(1 << bit, IC0_CFG0CLR);
+                       au_writel(1 << bit, IC0_CFG1CLR);
+                       au_writel(1 << bit, IC0_CFG2CLR);
+                       return;
+               }
+               if (int_req) /* assign to interrupt request 1 */
+                       au_writel(1 << bit, IC0_ASSIGNCLR);
+               else         /* assign to interrupt request 0 */
+                       au_writel(1 << bit, IC0_ASSIGNSET);
+               au_writel(1 << bit, IC0_SRCSET);
+               au_writel(1 << bit, IC0_MASKCLR);
+               au_writel(1 << bit, IC0_WAKECLR);
+       }
+       au_sync();
+}
+
+/*
+ * Interrupts are nested. Even if an interrupt handler is registered
+ * as "fast", we might get another interrupt before we return from
+ * intcX_reqX_irqdispatch().
+ */
+
+static void intc0_req0_irqdispatch(void)
+{
+       static unsigned long intc0_req0;
+       unsigned int bit;
+
+       intc0_req0 |= au_readl(IC0_REQ0INT);
+
+       if (!intc0_req0)
+               return;
+
+#ifdef AU1000_USB_DEV_REQ_INT
+       /*
+        * Because of the tight timing of SETUP token to reply
+        * transactions, the USB devices-side packet complete
+        * interrupt needs the highest priority.
+        */
+       if ((intc0_req0 & (1 << AU1000_USB_DEV_REQ_INT))) {
+               intc0_req0 &= ~(1 << AU1000_USB_DEV_REQ_INT);
+               do_IRQ(AU1000_USB_DEV_REQ_INT);
+               return;
+       }
+#endif
+       bit = __ffs(intc0_req0);
+       intc0_req0 &= ~(1 << bit);
+       do_IRQ(AU1000_INTC0_INT_BASE + bit);
+}
+
+
+static void intc0_req1_irqdispatch(void)
+{
+       static unsigned long intc0_req1;
+       unsigned int bit;
+
+       intc0_req1 |= au_readl(IC0_REQ1INT);
+
+       if (!intc0_req1)
+               return;
+
+       bit = __ffs(intc0_req1);
+       intc0_req1 &= ~(1 << bit);
+       do_IRQ(AU1000_INTC0_INT_BASE + bit);
+}
+
+
+/*
+ * Interrupt Controller 1:
+ * interrupts 32 - 63
+ */
+static void intc1_req0_irqdispatch(void)
+{
+       static unsigned long intc1_req0;
+       unsigned int bit;
+
+       intc1_req0 |= au_readl(IC1_REQ0INT);
+
+       if (!intc1_req0)
+               return;
+
+       bit = __ffs(intc1_req0);
+       intc1_req0 &= ~(1 << bit);
+       do_IRQ(AU1000_INTC1_INT_BASE + bit);
+}
+
+
+static void intc1_req1_irqdispatch(void)
+{
+       static unsigned long intc1_req1;
+       unsigned int bit;
+
+       intc1_req1 |= au_readl(IC1_REQ1INT);
+
+       if (!intc1_req1)
+               return;
+
+       bit = __ffs(intc1_req1);
+       intc1_req1 &= ~(1 << bit);
+       do_IRQ(AU1000_INTC1_INT_BASE + bit);
+}
+
+asmlinkage void plat_irq_dispatch(void)
+{
+       unsigned int pending = read_c0_status() & read_c0_cause();
+
+       if (pending & CAUSEF_IP7)
+               do_IRQ(MIPS_CPU_IRQ_BASE + 7);
+       else if (pending & CAUSEF_IP2)
+               intc0_req0_irqdispatch();
+       else if (pending & CAUSEF_IP3)
+               intc0_req1_irqdispatch();
+       else if (pending & CAUSEF_IP4)
+               intc1_req0_irqdispatch();
+       else if (pending  & CAUSEF_IP5)
+               intc1_req1_irqdispatch();
+       else
+               spurious_interrupt();
+}
+
+void __init arch_init_irq(void)
+{
+       int i;
+       struct au1xxx_irqmap *imp;
+       extern struct au1xxx_irqmap au1xxx_irq_map[];
+       extern struct au1xxx_irqmap au1xxx_ic0_map[];
+       extern int au1xxx_nr_irqs;
+       extern int au1xxx_ic0_nr_irqs;
+
+       /*
+        * Initialize interrupt controllers to a safe state.
+        */
+       au_writel(0xffffffff, IC0_CFG0CLR);
+       au_writel(0xffffffff, IC0_CFG1CLR);
+       au_writel(0xffffffff, IC0_CFG2CLR);
+       au_writel(0xffffffff, IC0_MASKCLR);
+       au_writel(0xffffffff, IC0_ASSIGNSET);
+       au_writel(0xffffffff, IC0_WAKECLR);
+       au_writel(0xffffffff, IC0_SRCSET);
+       au_writel(0xffffffff, IC0_FALLINGCLR);
+       au_writel(0xffffffff, IC0_RISINGCLR);
+       au_writel(0x00000000, IC0_TESTBIT);
+
+       au_writel(0xffffffff, IC1_CFG0CLR);
+       au_writel(0xffffffff, IC1_CFG1CLR);
+       au_writel(0xffffffff, IC1_CFG2CLR);
+       au_writel(0xffffffff, IC1_MASKCLR);
+       au_writel(0xffffffff, IC1_ASSIGNSET);
+       au_writel(0xffffffff, IC1_WAKECLR);
+       au_writel(0xffffffff, IC1_SRCSET);
+       au_writel(0xffffffff, IC1_FALLINGCLR);
+       au_writel(0xffffffff, IC1_RISINGCLR);
+       au_writel(0x00000000, IC1_TESTBIT);
+
+       mips_cpu_irq_init();
+
+       /*
+        * Initialize IC0, which is fixed per processor.
+        */
+       imp = au1xxx_ic0_map;
+       for (i = 0; i < au1xxx_ic0_nr_irqs; i++) {
+               setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
+               imp++;
+       }
+
+       /*
+        * Now set up the irq mapping for the board.
+        */
+       imp = au1xxx_irq_map;
+       for (i = 0; i < au1xxx_nr_irqs; i++) {
+               setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
+               imp++;
+       }
+
+       set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4);
+
+       /* Board specific IRQ initialization.
+       */
+       if (board_init_irq)
+               board_init_irq();
+}
diff --git a/arch/mips/alchemy/common/pci.c b/arch/mips/alchemy/common/pci.c
new file mode 100644 (file)
index 0000000..7866cf5
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Alchemy/AMD Au1x00 PCI support.
+ *
+ * Copyright 2001-2003, 2007-2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org)
+ *
+ *  Support for all devices (greater than 16) added by David Gathright.
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/pci.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+/* TBD */
+static struct resource pci_io_resource = {
+       .start  = PCI_IO_START,
+       .end    = PCI_IO_END,
+       .name   = "PCI IO space",
+       .flags  = IORESOURCE_IO
+};
+
+static struct resource pci_mem_resource = {
+       .start  = PCI_MEM_START,
+       .end    = PCI_MEM_END,
+       .name   = "PCI memory space",
+       .flags  = IORESOURCE_MEM
+};
+
+extern struct pci_ops au1x_pci_ops;
+
+static struct pci_controller au1x_controller = {
+       .pci_ops        = &au1x_pci_ops,
+       .io_resource    = &pci_io_resource,
+       .mem_resource   = &pci_mem_resource,
+};
+
+#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
+static unsigned long virt_io_addr;
+#endif
+
+static int __init au1x_pci_setup(void)
+{
+       extern void au1x_pci_cfg_init(void);
+
+#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
+       virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START,
+                       Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1);
+
+       if (!virt_io_addr) {
+               printk(KERN_ERR "Unable to ioremap pci space\n");
+               return 1;
+       }
+       au1x_controller.io_map_base = virt_io_addr;
+
+#ifdef CONFIG_DMA_NONCOHERENT
+       {
+               /*
+                *  Set the NC bit in controller for Au1500 pre-AC silicon
+                */
+               u32 prid = read_c0_prid();
+
+               if ((prid & 0xFF000000) == 0x01000000 && prid < 0x01030202) {
+                       au_writel((1 << 16) | au_readl(Au1500_PCI_CFG),
+                                 Au1500_PCI_CFG);
+                       printk(KERN_INFO "Non-coherent PCI accesses enabled\n");
+               }
+       }
+#endif
+
+       set_io_port_base(virt_io_addr);
+#endif
+
+       au1x_pci_cfg_init();
+
+       register_pci_controller(&au1x_controller);
+       return 0;
+}
+
+arch_initcall(au1x_pci_setup);
diff --git a/arch/mips/alchemy/common/platform.c b/arch/mips/alchemy/common/platform.c
new file mode 100644 (file)
index 0000000..dc8a67e
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * Platform device support for Au1x00 SoCs.
+ *
+ * Copyright 2004, Matt Porter <mporter@kernel.crashing.org>
+ *
+ * (C) Copyright Embedded Alley Solutions, Inc 2005
+ * Author: Pantelis Antoniou <pantelis@embeddedalley.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/platform_device.h>
+#include <linux/serial_8250.h>
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1xxx.h>
+
+#define PORT(_base, _irq)                              \
+       {                                               \
+               .iobase         = _base,                \
+               .membase        = (void __iomem *)_base,\
+               .mapbase        = CPHYSADDR(_base),     \
+               .irq            = _irq,                 \
+               .regshift       = 2,                    \
+               .iotype         = UPIO_AU,              \
+               .flags          = UPF_SKIP_TEST         \
+       }
+
+static struct plat_serial8250_port au1x00_uart_data[] = {
+#if defined(CONFIG_SERIAL_8250_AU1X00)
+#if defined(CONFIG_SOC_AU1000)
+       PORT(UART0_ADDR, AU1000_UART0_INT),
+       PORT(UART1_ADDR, AU1000_UART1_INT),
+       PORT(UART2_ADDR, AU1000_UART2_INT),
+       PORT(UART3_ADDR, AU1000_UART3_INT),
+#elif defined(CONFIG_SOC_AU1500)
+       PORT(UART0_ADDR, AU1500_UART0_INT),
+       PORT(UART3_ADDR, AU1500_UART3_INT),
+#elif defined(CONFIG_SOC_AU1100)
+       PORT(UART0_ADDR, AU1100_UART0_INT),
+       PORT(UART1_ADDR, AU1100_UART1_INT),
+       PORT(UART3_ADDR, AU1100_UART3_INT),
+#elif defined(CONFIG_SOC_AU1550)
+       PORT(UART0_ADDR, AU1550_UART0_INT),
+       PORT(UART1_ADDR, AU1550_UART1_INT),
+       PORT(UART3_ADDR, AU1550_UART3_INT),
+#elif defined(CONFIG_SOC_AU1200)
+       PORT(UART0_ADDR, AU1200_UART0_INT),
+       PORT(UART1_ADDR, AU1200_UART1_INT),
+#endif
+#endif /* CONFIG_SERIAL_8250_AU1X00 */
+       { },
+};
+
+static struct platform_device au1xx0_uart_device = {
+       .name                   = "serial8250",
+       .id                     = PLAT8250_DEV_AU1X00,
+       .dev                    = {
+               .platform_data  = au1x00_uart_data,
+       },
+};
+
+/* OHCI (USB full speed host controller) */
+static struct resource au1xxx_usb_ohci_resources[] = {
+       [0] = {
+               .start          = USB_OHCI_BASE,
+               .end            = USB_OHCI_BASE + USB_OHCI_LEN - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = AU1000_USB_HOST_INT,
+               .end            = AU1000_USB_HOST_INT,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+/* The dmamask must be set for OHCI to work */
+static u64 ohci_dmamask = DMA_32BIT_MASK;
+
+static struct platform_device au1xxx_usb_ohci_device = {
+       .name           = "au1xxx-ohci",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &ohci_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(au1xxx_usb_ohci_resources),
+       .resource       = au1xxx_usb_ohci_resources,
+};
+
+/*** AU1100 LCD controller ***/
+
+#ifdef CONFIG_FB_AU1100
+static struct resource au1100_lcd_resources[] = {
+       [0] = {
+               .start          = LCD_PHYS_ADDR,
+               .end            = LCD_PHYS_ADDR + 0x800 - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = AU1100_LCD_INT,
+               .end            = AU1100_LCD_INT,
+               .flags          = IORESOURCE_IRQ,
+       }
+};
+
+static u64 au1100_lcd_dmamask = DMA_32BIT_MASK;
+
+static struct platform_device au1100_lcd_device = {
+       .name           = "au1100-lcd",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1100_lcd_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(au1100_lcd_resources),
+       .resource       = au1100_lcd_resources,
+};
+#endif
+
+#ifdef CONFIG_SOC_AU1200
+/* EHCI (USB high speed host controller) */
+static struct resource au1xxx_usb_ehci_resources[] = {
+       [0] = {
+               .start          = USB_EHCI_BASE,
+               .end            = USB_EHCI_BASE + USB_EHCI_LEN - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = AU1000_USB_HOST_INT,
+               .end            = AU1000_USB_HOST_INT,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static u64 ehci_dmamask = DMA_32BIT_MASK;
+
+static struct platform_device au1xxx_usb_ehci_device = {
+       .name           = "au1xxx-ehci",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &ehci_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(au1xxx_usb_ehci_resources),
+       .resource       = au1xxx_usb_ehci_resources,
+};
+
+/* Au1200 UDC (USB gadget controller) */
+static struct resource au1xxx_usb_gdt_resources[] = {
+       [0] = {
+               .start          = USB_UDC_BASE,
+               .end            = USB_UDC_BASE + USB_UDC_LEN - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = AU1200_USB_INT,
+               .end            = AU1200_USB_INT,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static struct resource au1xxx_mmc_resources[] = {
+       [0] = {
+               .start          = SD0_PHYS_ADDR,
+               .end            = SD0_PHYS_ADDR + 0x7ffff,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = SD1_PHYS_ADDR,
+               .end            = SD1_PHYS_ADDR + 0x7ffff,
+               .flags          = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start          = AU1200_SD_INT,
+               .end            = AU1200_SD_INT,
+               .flags          = IORESOURCE_IRQ,
+       }
+};
+
+static u64 udc_dmamask = DMA_32BIT_MASK;
+
+static struct platform_device au1xxx_usb_gdt_device = {
+       .name           = "au1xxx-udc",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &udc_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(au1xxx_usb_gdt_resources),
+       .resource       = au1xxx_usb_gdt_resources,
+};
+
+/* Au1200 UOC (USB OTG controller) */
+static struct resource au1xxx_usb_otg_resources[] = {
+       [0] = {
+               .start          = USB_UOC_BASE,
+               .end            = USB_UOC_BASE + USB_UOC_LEN - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = AU1200_USB_INT,
+               .end            = AU1200_USB_INT,
+               .flags          = IORESOURCE_IRQ,
+       },
+};
+
+static u64 uoc_dmamask = DMA_32BIT_MASK;
+
+static struct platform_device au1xxx_usb_otg_device = {
+       .name           = "au1xxx-uoc",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &uoc_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(au1xxx_usb_otg_resources),
+       .resource       = au1xxx_usb_otg_resources,
+};
+
+static struct resource au1200_lcd_resources[] = {
+       [0] = {
+               .start          = LCD_PHYS_ADDR,
+               .end            = LCD_PHYS_ADDR + 0x800 - 1,
+               .flags          = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start          = AU1200_LCD_INT,
+               .end            = AU1200_LCD_INT,
+               .flags          = IORESOURCE_IRQ,
+       }
+};
+
+static u64 au1200_lcd_dmamask = DMA_32BIT_MASK;
+
+static struct platform_device au1200_lcd_device = {
+       .name           = "au1200-lcd",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &au1200_lcd_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(au1200_lcd_resources),
+       .resource       = au1200_lcd_resources,
+};
+
+static u64 au1xxx_mmc_dmamask =  DMA_32BIT_MASK;
+
+static struct platform_device au1xxx_mmc_device = {
+       .name = "au1xxx-mmc",
+       .id = 0,
+       .dev = {
+               .dma_mask               = &au1xxx_mmc_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(au1xxx_mmc_resources),
+       .resource       = au1xxx_mmc_resources,
+};
+#endif /* #ifdef CONFIG_SOC_AU1200 */
+
+static struct platform_device au1x00_pcmcia_device = {
+       .name           = "au1x00-pcmcia",
+       .id             = 0,
+};
+
+/* All Alchemy demoboards with I2C have this #define in their headers */
+#ifdef SMBUS_PSC_BASE
+static struct resource pbdb_smbus_resources[] = {
+       {
+               .start  = CPHYSADDR(SMBUS_PSC_BASE),
+               .end    = CPHYSADDR(SMBUS_PSC_BASE + 0xfffff),
+               .flags  = IORESOURCE_MEM,
+       },
+};
+
+static struct platform_device pbdb_smbus_device = {
+       .name           = "au1xpsc_smbus",
+       .id             = 0,    /* bus number */
+       .num_resources  = ARRAY_SIZE(pbdb_smbus_resources),
+       .resource       = pbdb_smbus_resources,
+};
+#endif
+
+static struct platform_device *au1xxx_platform_devices[] __initdata = {
+       &au1xx0_uart_device,
+       &au1xxx_usb_ohci_device,
+       &au1x00_pcmcia_device,
+#ifdef CONFIG_FB_AU1100
+       &au1100_lcd_device,
+#endif
+#ifdef CONFIG_SOC_AU1200
+       &au1xxx_usb_ehci_device,
+       &au1xxx_usb_gdt_device,
+       &au1xxx_usb_otg_device,
+       &au1200_lcd_device,
+       &au1xxx_mmc_device,
+#endif
+#ifdef SMBUS_PSC_BASE
+       &pbdb_smbus_device,
+#endif
+};
+
+static int __init au1xxx_platform_init(void)
+{
+       unsigned int uartclk = get_au1x00_uart_baud_base() * 16;
+       int i;
+
+       /* Fill up uartclk. */
+       for (i = 0; au1x00_uart_data[i].flags; i++)
+               au1x00_uart_data[i].uartclk = uartclk;
+
+       return platform_add_devices(au1xxx_platform_devices,
+                                   ARRAY_SIZE(au1xxx_platform_devices));
+}
+
+arch_initcall(au1xxx_platform_init);
diff --git a/arch/mips/alchemy/common/power.c b/arch/mips/alchemy/common/power.c
new file mode 100644 (file)
index 0000000..bd854a6
--- /dev/null
@@ -0,0 +1,465 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xx0 Power Management routines.
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  Some of the routines are right out of init/main.c, whose
+ *  copyrights apply here.
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/pm.h>
+#include <linux/sysctl.h>
+#include <linux/jiffies.h>
+
+#include <asm/uaccess.h>
+#include <asm/cacheflush.h>
+#include <asm/mach-au1x00/au1000.h>
+
+#ifdef CONFIG_PM
+
+#define DEBUG 1
+#ifdef DEBUG
+#define DPRINTK(fmt, args...)  printk(KERN_DEBUG "%s: " fmt, __func__, ## args)
+#else
+#define DPRINTK(fmt, args...)
+#endif
+
+static void au1000_calibrate_delay(void);
+
+extern unsigned long save_local_and_disable(int controller);
+extern void restore_local_and_enable(int controller, unsigned long mask);
+extern void local_enable_irq(unsigned int irq_nr);
+
+static DEFINE_SPINLOCK(pm_lock);
+
+/*
+ * We need to save/restore a bunch of core registers that are
+ * either volatile or reset to some state across a processor sleep.
+ * If reading a register doesn't provide a proper result for a
+ * later restore, we have to provide a function for loading that
+ * register and save a copy.
+ *
+ * We only have to save/restore registers that aren't otherwise
+ * done as part of a driver pm_* function.
+ */
+static unsigned int    sleep_aux_pll_cntrl;
+static unsigned int    sleep_cpu_pll_cntrl;
+static unsigned int    sleep_pin_function;
+static unsigned int    sleep_uart0_inten;
+static unsigned int    sleep_uart0_fifoctl;
+static unsigned int    sleep_uart0_linectl;
+static unsigned int    sleep_uart0_clkdiv;
+static unsigned int    sleep_uart0_enable;
+static unsigned int    sleep_usbhost_enable;
+static unsigned int    sleep_usbdev_enable;
+static unsigned int    sleep_static_memctlr[4][3];
+
+/*
+ * Define this to cause the value you write to /proc/sys/pm/sleep to
+ * set the TOY timer for the amount of time you want to sleep.
+ * This is done mainly for testing, but may be useful in other cases.
+ * The value is number of 32KHz ticks to sleep.
+ */
+#define SLEEP_TEST_TIMEOUT 1
+#ifdef SLEEP_TEST_TIMEOUT
+static int sleep_ticks;
+void wakeup_counter0_set(int ticks);
+#endif
+
+static void save_core_regs(void)
+{
+       extern void save_au1xxx_intctl(void);
+       extern void pm_eth0_shutdown(void);
+
+       /*
+        * Do the serial ports.....these really should be a pm_*
+        * registered function by the driver......but of course the
+        * standard serial driver doesn't understand our Au1xxx
+        * unique registers.
+        */
+       sleep_uart0_inten = au_readl(UART0_ADDR + UART_IER);
+       sleep_uart0_fifoctl = au_readl(UART0_ADDR + UART_FCR);
+       sleep_uart0_linectl = au_readl(UART0_ADDR + UART_LCR);
+       sleep_uart0_clkdiv = au_readl(UART0_ADDR + UART_CLK);
+       sleep_uart0_enable = au_readl(UART0_ADDR + UART_MOD_CNTRL);
+
+       /* Shutdown USB host/device. */
+       sleep_usbhost_enable = au_readl(USB_HOST_CONFIG);
+
+       /* There appears to be some undocumented reset register.... */
+       au_writel(0, 0xb0100004); au_sync();
+       au_writel(0, USB_HOST_CONFIG); au_sync();
+
+       sleep_usbdev_enable = au_readl(USBD_ENABLE);
+       au_writel(0, USBD_ENABLE); au_sync();
+
+       /* Save interrupt controller state. */
+       save_au1xxx_intctl();
+
+       /* Clocks and PLLs. */
+       sleep_aux_pll_cntrl = au_readl(SYS_AUXPLL);
+
+       /*
+        * We don't really need to do this one, but unless we
+        * write it again it won't have a valid value if we
+        * happen to read it.
+        */
+       sleep_cpu_pll_cntrl = au_readl(SYS_CPUPLL);
+
+       sleep_pin_function = au_readl(SYS_PINFUNC);
+
+       /* Save the static memory controller configuration. */
+       sleep_static_memctlr[0][0] = au_readl(MEM_STCFG0);
+       sleep_static_memctlr[0][1] = au_readl(MEM_STTIME0);
+       sleep_static_memctlr[0][2] = au_readl(MEM_STADDR0);
+       sleep_static_memctlr[1][0] = au_readl(MEM_STCFG1);
+       sleep_static_memctlr[1][1] = au_readl(MEM_STTIME1);
+       sleep_static_memctlr[1][2] = au_readl(MEM_STADDR1);
+       sleep_static_memctlr[2][0] = au_readl(MEM_STCFG2);
+       sleep_static_memctlr[2][1] = au_readl(MEM_STTIME2);
+       sleep_static_memctlr[2][2] = au_readl(MEM_STADDR2);
+       sleep_static_memctlr[3][0] = au_readl(MEM_STCFG3);
+       sleep_static_memctlr[3][1] = au_readl(MEM_STTIME3);
+       sleep_static_memctlr[3][2] = au_readl(MEM_STADDR3);
+}
+
+static void restore_core_regs(void)
+{
+       extern void restore_au1xxx_intctl(void);
+       extern void wakeup_counter0_adjust(void);
+
+       au_writel(sleep_aux_pll_cntrl, SYS_AUXPLL); au_sync();
+       au_writel(sleep_cpu_pll_cntrl, SYS_CPUPLL); au_sync();
+       au_writel(sleep_pin_function, SYS_PINFUNC); au_sync();
+
+       /* Restore the static memory controller configuration. */
+       au_writel(sleep_static_memctlr[0][0], MEM_STCFG0);
+       au_writel(sleep_static_memctlr[0][1], MEM_STTIME0);
+       au_writel(sleep_static_memctlr[0][2], MEM_STADDR0);
+       au_writel(sleep_static_memctlr[1][0], MEM_STCFG1);
+       au_writel(sleep_static_memctlr[1][1], MEM_STTIME1);
+       au_writel(sleep_static_memctlr[1][2], MEM_STADDR1);
+       au_writel(sleep_static_memctlr[2][0], MEM_STCFG2);
+       au_writel(sleep_static_memctlr[2][1], MEM_STTIME2);
+       au_writel(sleep_static_memctlr[2][2], MEM_STADDR2);
+       au_writel(sleep_static_memctlr[3][0], MEM_STCFG3);
+       au_writel(sleep_static_memctlr[3][1], MEM_STTIME3);
+       au_writel(sleep_static_memctlr[3][2], MEM_STADDR3);
+
+       /*
+        * Enable the UART if it was enabled before sleep.
+        * I guess I should define module control bits........
+        */
+       if (sleep_uart0_enable & 0x02) {
+               au_writel(0, UART0_ADDR + UART_MOD_CNTRL); au_sync();
+               au_writel(1, UART0_ADDR + UART_MOD_CNTRL); au_sync();
+               au_writel(3, UART0_ADDR + UART_MOD_CNTRL); au_sync();
+               au_writel(sleep_uart0_inten, UART0_ADDR + UART_IER); au_sync();
+               au_writel(sleep_uart0_fifoctl, UART0_ADDR + UART_FCR); au_sync();
+               au_writel(sleep_uart0_linectl, UART0_ADDR + UART_LCR); au_sync();
+               au_writel(sleep_uart0_clkdiv, UART0_ADDR + UART_CLK); au_sync();
+       }
+
+       restore_au1xxx_intctl();
+       wakeup_counter0_adjust();
+}
+
+unsigned long suspend_mode;
+
+void wakeup_from_suspend(void)
+{
+       suspend_mode = 0;
+}
+
+int au_sleep(void)
+{
+       unsigned long wakeup, flags;
+       extern void save_and_sleep(void);
+
+       spin_lock_irqsave(&pm_lock, flags);
+
+       save_core_regs();
+
+       flush_cache_all();
+
+       /**
+        ** The code below is all system dependent and we should probably
+        ** have a function call out of here to set this up.  You need
+        ** to configure the GPIO or timer interrupts that will bring
+        ** you out of sleep.
+        ** For testing, the TOY counter wakeup is useful.
+        **/
+#if 0
+       au_writel(au_readl(SYS_PINSTATERD) & ~(1 << 11), SYS_PINSTATERD);
+
+       /* GPIO 6 can cause a wake up event */
+       wakeup = au_readl(SYS_WAKEMSK);
+       wakeup &= ~(1 << 8);    /* turn off match20 wakeup */
+       wakeup |= 1 << 6;       /* turn on  GPIO  6 wakeup */
+#else
+       /* For testing, allow match20 to wake us up. */
+#ifdef SLEEP_TEST_TIMEOUT
+       wakeup_counter0_set(sleep_ticks);
+#endif
+       wakeup = 1 << 8;        /* turn on match20 wakeup   */
+       wakeup = 0;
+#endif
+       au_writel(1, SYS_WAKESRC);      /* clear cause */
+       au_sync();
+       au_writel(wakeup, SYS_WAKEMSK);
+       au_sync();
+
+       save_and_sleep();
+
+       /*
+        * After a wakeup, the cpu vectors back to 0x1fc00000, so
+        * it's up to the boot code to get us back here.
+        */
+       restore_core_regs();
+       spin_unlock_irqrestore(&pm_lock, flags);
+       return 0;
+}
+
+static int pm_do_sleep(ctl_table *ctl, int write, struct file *file,
+                      void __user *buffer, size_t *len, loff_t *ppos)
+{
+#ifdef SLEEP_TEST_TIMEOUT
+#define TMPBUFLEN2 16
+       char buf[TMPBUFLEN2], *p;
+#endif
+
+       if (!write)
+               *len = 0;
+       else {
+#ifdef SLEEP_TEST_TIMEOUT
+               if (*len > TMPBUFLEN2 - 1)
+                       return -EFAULT;
+               if (copy_from_user(buf, buffer, *len))
+                       return -EFAULT;
+               buf[*len] = 0;
+               p = buf;
+               sleep_ticks = simple_strtoul(p, &p, 0);
+#endif
+
+               au_sleep();
+       }
+       return 0;
+}
+
+static int pm_do_freq(ctl_table *ctl, int write, struct file *file,
+                     void __user *buffer, size_t *len, loff_t *ppos)
+{
+       int retval = 0, i;
+       unsigned long val, pll;
+#define TMPBUFLEN 64
+#define MAX_CPU_FREQ 396
+       char buf[TMPBUFLEN], *p;
+       unsigned long flags, intc0_mask, intc1_mask;
+       unsigned long old_baud_base, old_cpu_freq, old_clk, old_refresh;
+       unsigned long new_baud_base, new_cpu_freq, new_clk, new_refresh;
+       unsigned long baud_rate;
+
+       spin_lock_irqsave(&pm_lock, flags);
+       if (!write)
+               *len = 0;
+       else {
+               /* Parse the new frequency */
+               if (*len > TMPBUFLEN - 1) {
+                       spin_unlock_irqrestore(&pm_lock, flags);
+                       return -EFAULT;
+               }
+               if (copy_from_user(buf, buffer, *len)) {
+                       spin_unlock_irqrestore(&pm_lock, flags);
+                       return -EFAULT;
+               }
+               buf[*len] = 0;
+               p = buf;
+               val = simple_strtoul(p, &p, 0);
+               if (val > MAX_CPU_FREQ) {
+                       spin_unlock_irqrestore(&pm_lock, flags);
+                       return -EFAULT;
+               }
+
+               pll = val / 12;
+               if ((pll > 33) || (pll < 7)) {  /* 396 MHz max, 84 MHz min */
+                       /* Revisit this for higher speed CPUs */
+                       spin_unlock_irqrestore(&pm_lock, flags);
+                       return -EFAULT;
+               }
+
+               old_baud_base = get_au1x00_uart_baud_base();
+               old_cpu_freq = get_au1x00_speed();
+
+               new_cpu_freq = pll * 12 * 1000000;
+               new_baud_base = (new_cpu_freq / (2 * ((int)(au_readl(SYS_POWERCTRL)
+                                                           & 0x03) + 2) * 16));
+               set_au1x00_speed(new_cpu_freq);
+               set_au1x00_uart_baud_base(new_baud_base);
+
+               old_refresh = au_readl(MEM_SDREFCFG) & 0x1ffffff;
+               new_refresh = ((old_refresh * new_cpu_freq) / old_cpu_freq) |
+                             (au_readl(MEM_SDREFCFG) & ~0x1ffffff);
+
+               au_writel(pll, SYS_CPUPLL);
+               au_sync_delay(1);
+               au_writel(new_refresh, MEM_SDREFCFG);
+               au_sync_delay(1);
+
+               for (i = 0; i < 4; i++)
+                       if (au_readl(UART_BASE + UART_MOD_CNTRL +
+                                    i * 0x00100000) == 3) {
+                               old_clk = au_readl(UART_BASE + UART_CLK +
+                                                  i * 0x00100000);
+                               baud_rate = old_baud_base / old_clk;
+                               /*
+                                * We won't get an exact baud rate and the error
+                                * could be significant enough that our new
+                                * calculation will result in a clock that will
+                                * give us a baud rate that's too far off from
+                                * what we really want.
+                                */
+                               if (baud_rate > 100000)
+                                       baud_rate = 115200;
+                               else if (baud_rate > 50000)
+                                       baud_rate = 57600;
+                               else if (baud_rate > 30000)
+                                       baud_rate = 38400;
+                               else if (baud_rate > 17000)
+                                       baud_rate = 19200;
+                               else
+                                       baud_rate = 9600;
+                               new_clk = new_baud_base / baud_rate;
+                               au_writel(new_clk, UART_BASE + UART_CLK +
+                                         i * 0x00100000);
+                               au_sync_delay(10);
+                       }
+       }
+
+       /*
+        * We don't want _any_ interrupts other than match20. Otherwise our
+        * au1000_calibrate_delay() calculation will be off, potentially a lot.
+        */
+       intc0_mask = save_local_and_disable(0);
+       intc1_mask = save_local_and_disable(1);
+       local_enable_irq(AU1000_TOY_MATCH2_INT);
+       spin_unlock_irqrestore(&pm_lock, flags);
+       au1000_calibrate_delay();
+       restore_local_and_enable(0, intc0_mask);
+       restore_local_and_enable(1, intc1_mask);
+
+       return retval;
+}
+
+
+static struct ctl_table pm_table[] = {
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "sleep",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0600,
+               .proc_handler   = &pm_do_sleep
+       },
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "freq",
+               .data           = NULL,
+               .maxlen         = 0,
+               .mode           = 0600,
+               .proc_handler   = &pm_do_freq
+       },
+       {}
+};
+
+static struct ctl_table pm_dir_table[] = {
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "pm",
+               .mode           = 0555,
+               .child          = pm_table
+       },
+       {}
+};
+
+/*
+ * Initialize power interface
+ */
+static int __init pm_init(void)
+{
+       register_sysctl_table(pm_dir_table);
+       return 0;
+}
+
+__initcall(pm_init);
+
+/*
+ * This is right out of init/main.c
+ */
+
+/*
+ * This is the number of bits of precision for the loops_per_jiffy.
+ * Each bit takes on average 1.5/HZ seconds.  This (like the original)
+ * is a little better than 1%.
+ */
+#define LPS_PREC 8
+
+static void au1000_calibrate_delay(void)
+{
+       unsigned long ticks, loopbit;
+       int lps_precision = LPS_PREC;
+
+       loops_per_jiffy = 1 << 12;
+
+       while (loops_per_jiffy <<= 1) {
+               /* Wait for "start of" clock tick */
+               ticks = jiffies;
+               while (ticks == jiffies)
+                       /* nothing */ ;
+               /* Go ... */
+               ticks = jiffies;
+               __delay(loops_per_jiffy);
+               ticks = jiffies - ticks;
+               if (ticks)
+                       break;
+       }
+
+       /*
+        * Do a binary approximation to get loops_per_jiffy set to be equal
+        * one clock (up to lps_precision bits)
+        */
+       loops_per_jiffy >>= 1;
+       loopbit = loops_per_jiffy;
+       while (lps_precision-- && (loopbit >>= 1)) {
+               loops_per_jiffy |= loopbit;
+               ticks = jiffies;
+               while (ticks == jiffies);
+               ticks = jiffies;
+               __delay(loops_per_jiffy);
+               if (jiffies != ticks)   /* longer than 1 tick */
+                       loops_per_jiffy &= ~loopbit;
+       }
+}
+#endif /* CONFIG_PM */
diff --git a/arch/mips/alchemy/common/prom.c b/arch/mips/alchemy/common/prom.c
new file mode 100644 (file)
index 0000000..18b310b
--- /dev/null
@@ -0,0 +1,146 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *    PROM library initialisation code, supports YAMON and U-Boot.
+ *
+ * Copyright 2000-2001, 2006, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ * This file was derived from Carsten Langgaard's
+ * arch/mips/mips-boards/xx files.
+ *
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/string.h>
+
+#include <asm/bootinfo.h>
+
+int prom_argc;
+char **prom_argv;
+char **prom_envp;
+
+char * __init_or_module prom_getcmdline(void)
+{
+       return &(arcs_cmdline[0]);
+}
+
+void prom_init_cmdline(void)
+{
+       char *cp;
+       int actr;
+
+       actr = 1; /* Always ignore argv[0] */
+
+       cp = &(arcs_cmdline[0]);
+       while (actr < prom_argc) {
+               strcpy(cp, prom_argv[actr]);
+               cp += strlen(prom_argv[actr]);
+               *cp++ = ' ';
+               actr++;
+       }
+       if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */
+               --cp;
+       if (prom_argc > 1)
+               *cp = '\0';
+}
+
+char *prom_getenv(char *envname)
+{
+       /*
+        * Return a pointer to the given environment variable.
+        * YAMON uses "name", "value" pairs, while U-Boot uses "name=value".
+        */
+
+       char **env = prom_envp;
+       int i = strlen(envname);
+       int yamon = (*env && strchr(*env, '=') == NULL);
+
+       while (*env) {
+               if (yamon) {
+                       if (strcmp(envname, *env++) == 0)
+                               return *env;
+               } else if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=')
+                       return *env + i + 1;
+               env++;
+       }
+
+       return NULL;
+}
+
+static inline unsigned char str2hexnum(unsigned char c)
+{
+       if (c >= '0' && c <= '9')
+               return c - '0';
+       if (c >= 'a' && c <= 'f')
+               return c - 'a' + 10;
+       if (c >= 'A' && c <= 'F')
+               return c - 'A' + 10;
+
+       return 0; /* foo */
+}
+
+static inline void str2eaddr(unsigned char *ea, unsigned char *str)
+{
+       int i;
+
+       for (i = 0; i < 6; i++) {
+               unsigned char num;
+
+               if ((*str == '.') || (*str == ':'))
+                       str++;
+               num  = str2hexnum(*str++) << 4;
+               num |= str2hexnum(*str++);
+               ea[i] = num;
+       }
+}
+
+int prom_get_ethernet_addr(char *ethernet_addr)
+{
+       char *ethaddr_str;
+       char *argptr;
+
+       /* Check the environment variables first */
+       ethaddr_str = prom_getenv("ethaddr");
+       if (!ethaddr_str) {
+               /* Check command line */
+               argptr = prom_getcmdline();
+               ethaddr_str = strstr(argptr, "ethaddr=");
+               if (!ethaddr_str)
+                       return -1;
+
+               ethaddr_str += strlen("ethaddr=");
+       }
+
+       str2eaddr(ethernet_addr, ethaddr_str);
+
+       return 0;
+}
+EXPORT_SYMBOL(prom_get_ethernet_addr);
+
+void __init prom_free_prom_memory(void)
+{
+}
diff --git a/arch/mips/alchemy/common/puts.c b/arch/mips/alchemy/common/puts.c
new file mode 100644 (file)
index 0000000..55bbe24
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Low level UART routines to directly access Alchemy UART.
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <asm/mach-au1x00/au1000.h>
+
+#define SERIAL_BASE   UART_BASE
+#define SER_CMD       0x7
+#define SER_DATA      0x1
+#define TX_BUSY       0x20
+
+#define TIMEOUT       0xffffff
+#define SLOW_DOWN
+
+static volatile unsigned long * const com1 = (unsigned long *)SERIAL_BASE;
+
+#ifdef SLOW_DOWN
+static inline void slow_down(void)
+{
+       int k;
+
+       for (k = 0; k < 10000; k++);
+}
+#else
+#define slow_down()
+#endif
+
+void
+prom_putchar(const unsigned char c)
+{
+       unsigned char ch;
+       int i = 0;
+
+       do {
+               ch = com1[SER_CMD];
+               slow_down();
+               i++;
+               if (i > TIMEOUT)
+                       break;
+       } while (0 == (ch & TX_BUSY));
+
+       com1[SER_DATA] = c;
+}
diff --git a/arch/mips/alchemy/common/reset.c b/arch/mips/alchemy/common/reset.c
new file mode 100644 (file)
index 0000000..d555429
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xx0 reset routines.
+ *
+ * Copyright 2001, 2006, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <asm/cacheflush.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+extern int au_sleep(void);
+
+void au1000_restart(char *command)
+{
+       /* Set all integrated peripherals to disabled states */
+       extern void board_reset(void);
+       u32 prid = read_c0_prid();
+
+       printk(KERN_NOTICE "\n** Resetting Integrated Peripherals\n");
+
+       switch (prid & 0xFF000000) {
+       case 0x00000000: /* Au1000 */
+               au_writel(0x02, 0xb0000010); /* ac97_enable */
+               au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
+               asm("sync");
+               au_writel(0x00, 0xb017fffc); /* usbh_enable */
+               au_writel(0x00, 0xb0200058); /* usbd_enable */
+               au_writel(0x00, 0xb0300040); /* ir_enable */
+               au_writel(0x00, 0xb4004104); /* mac dma */
+               au_writel(0x00, 0xb4004114); /* mac dma */
+               au_writel(0x00, 0xb4004124); /* mac dma */
+               au_writel(0x00, 0xb4004134); /* mac dma */
+               au_writel(0x00, 0xb0520000); /* macen0 */
+               au_writel(0x00, 0xb0520004); /* macen1 */
+               au_writel(0x00, 0xb1000008); /* i2s_enable  */
+               au_writel(0x00, 0xb1100100); /* uart0_enable */
+               au_writel(0x00, 0xb1200100); /* uart1_enable */
+               au_writel(0x00, 0xb1300100); /* uart2_enable */
+               au_writel(0x00, 0xb1400100); /* uart3_enable */
+               au_writel(0x02, 0xb1600100); /* ssi0_enable */
+               au_writel(0x02, 0xb1680100); /* ssi1_enable */
+               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
+               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
+               au_writel(0x00, 0xb1900028); /* sys_clksrc */
+               au_writel(0x10, 0xb1900060); /* sys_cpupll */
+               au_writel(0x00, 0xb1900064); /* sys_auxpll */
+               au_writel(0x00, 0xb1900100); /* sys_pininputen */
+               break;
+       case 0x01000000: /* Au1500 */
+               au_writel(0x02, 0xb0000010); /* ac97_enable */
+               au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
+               asm("sync");
+               au_writel(0x00, 0xb017fffc); /* usbh_enable */
+               au_writel(0x00, 0xb0200058); /* usbd_enable */
+               au_writel(0x00, 0xb4004104); /* mac dma */
+               au_writel(0x00, 0xb4004114); /* mac dma */
+               au_writel(0x00, 0xb4004124); /* mac dma */
+               au_writel(0x00, 0xb4004134); /* mac dma */
+               au_writel(0x00, 0xb1520000); /* macen0 */
+               au_writel(0x00, 0xb1520004); /* macen1 */
+               au_writel(0x00, 0xb1100100); /* uart0_enable */
+               au_writel(0x00, 0xb1400100); /* uart3_enable */
+               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
+               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
+               au_writel(0x00, 0xb1900028); /* sys_clksrc */
+               au_writel(0x10, 0xb1900060); /* sys_cpupll */
+               au_writel(0x00, 0xb1900064); /* sys_auxpll */
+               au_writel(0x00, 0xb1900100); /* sys_pininputen */
+               break;
+       case 0x02000000: /* Au1100 */
+               au_writel(0x02, 0xb0000010); /* ac97_enable */
+               au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
+               asm("sync");
+               au_writel(0x00, 0xb017fffc); /* usbh_enable */
+               au_writel(0x00, 0xb0200058); /* usbd_enable */
+               au_writel(0x00, 0xb0300040); /* ir_enable */
+               au_writel(0x00, 0xb4004104); /* mac dma */
+               au_writel(0x00, 0xb4004114); /* mac dma */
+               au_writel(0x00, 0xb4004124); /* mac dma */
+               au_writel(0x00, 0xb4004134); /* mac dma */
+               au_writel(0x00, 0xb0520000); /* macen0 */
+               au_writel(0x00, 0xb1000008); /* i2s_enable  */
+               au_writel(0x00, 0xb1100100); /* uart0_enable */
+               au_writel(0x00, 0xb1200100); /* uart1_enable */
+               au_writel(0x00, 0xb1400100); /* uart3_enable */
+               au_writel(0x02, 0xb1600100); /* ssi0_enable */
+               au_writel(0x02, 0xb1680100); /* ssi1_enable */
+               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
+               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
+               au_writel(0x00, 0xb1900028); /* sys_clksrc */
+               au_writel(0x10, 0xb1900060); /* sys_cpupll */
+               au_writel(0x00, 0xb1900064); /* sys_auxpll */
+               au_writel(0x00, 0xb1900100); /* sys_pininputen */
+               break;
+       case 0x03000000: /* Au1550 */
+               au_writel(0x00, 0xb1a00004); /* psc 0 */
+               au_writel(0x00, 0xb1b00004); /* psc 1 */
+               au_writel(0x00, 0xb0a00004); /* psc 2 */
+               au_writel(0x00, 0xb0b00004); /* psc 3 */
+               au_writel(0x00, 0xb017fffc); /* usbh_enable */
+               au_writel(0x00, 0xb0200058); /* usbd_enable */
+               au_writel(0x00, 0xb4004104); /* mac dma */
+               au_writel(0x00, 0xb4004114); /* mac dma */
+               au_writel(0x00, 0xb4004124); /* mac dma */
+               au_writel(0x00, 0xb4004134); /* mac dma */
+               au_writel(0x00, 0xb1520000); /* macen0 */
+               au_writel(0x00, 0xb1520004); /* macen1 */
+               au_writel(0x00, 0xb1100100); /* uart0_enable */
+               au_writel(0x00, 0xb1200100); /* uart1_enable */
+               au_writel(0x00, 0xb1400100); /* uart3_enable */
+               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
+               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
+               au_writel(0x00, 0xb1900028); /* sys_clksrc */
+               au_writel(0x10, 0xb1900060); /* sys_cpupll */
+               au_writel(0x00, 0xb1900064); /* sys_auxpll */
+               au_writel(0x00, 0xb1900100); /* sys_pininputen */
+               break;
+       }
+
+       set_c0_status(ST0_BEV | ST0_ERL);
+       change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
+       flush_cache_all();
+       write_c0_wired(0);
+
+       /* Give board a chance to do a hardware reset */
+       board_reset();
+
+       /* Jump to the beggining in case board_reset() is empty */
+       __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
+}
+
+void au1000_halt(void)
+{
+#if defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550)
+       /* Power off system */
+       printk(KERN_NOTICE "\n** Powering off...\n");
+       au_writew(au_readw(0xAF00001C) | (3 << 14), 0xAF00001C);
+       au_sync();
+       while (1); /* should not get here */
+#else
+       printk(KERN_NOTICE "\n** You can safely turn off the power\n");
+#ifdef CONFIG_MIPS_MIRAGE
+       au_writel((1 << 26) | (1 << 10), GPIO2_OUTPUT);
+#endif
+#ifdef CONFIG_MIPS_DB1200
+       au_writew(au_readw(0xB980001C) | (1 << 14), 0xB980001C);
+#endif
+#ifdef CONFIG_PM
+       au_sleep();
+
+       /* Should not get here */
+       printk(KERN_ERR "Unable to put CPU in sleep mode\n");
+       while (1);
+#else
+       while (1)
+               __asm__(".set\tmips3\n\t"
+                       "wait\n\t"
+                       ".set\tmips0");
+#endif
+#endif /* defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550) */
+}
+
+void au1000_power_off(void)
+{
+       au1000_halt();
+}
diff --git a/arch/mips/alchemy/common/setup.c b/arch/mips/alchemy/common/setup.c
new file mode 100644 (file)
index 0000000..1ac6b06
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * Copyright 2000, 2007-2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com
+ *
+ * Updates to 2.6, Pete Popov, Embedded Alley Solutions, 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.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/module.h>
+#include <linux/pm.h>
+
+#include <asm/mipsregs.h>
+#include <asm/reboot.h>
+#include <asm/time.h>
+
+#include <au1000.h>
+#include <prom.h>
+
+extern void __init board_setup(void);
+extern void au1000_restart(char *);
+extern void au1000_halt(void);
+extern void au1000_power_off(void);
+extern void set_cpuspec(void);
+
+void __init plat_mem_setup(void)
+{
+       struct  cpu_spec *sp;
+       char *argptr;
+       unsigned long prid, cpufreq, bclk;
+
+       set_cpuspec();
+       sp = cur_cpu_spec[0];
+
+       board_setup();  /* board specific setup */
+
+       prid = read_c0_prid();
+       if (sp->cpu_pll_wo)
+#ifdef CONFIG_SOC_AU1000_FREQUENCY
+               cpufreq = CONFIG_SOC_AU1000_FREQUENCY / 1000000;
+#else
+               cpufreq = 396;
+#endif
+       else
+               cpufreq = (au_readl(SYS_CPUPLL) & 0x3F) * 12;
+       printk(KERN_INFO "(PRID %08lx) @ %ld MHz\n", prid, cpufreq);
+
+       if (sp->cpu_bclk) {
+               /* Enable BCLK switching */
+               bclk = au_readl(SYS_POWERCTRL);
+               au_writel(bclk | 0x60, SYS_POWERCTRL);
+               printk(KERN_INFO "BCLK switching enabled!\n");
+       }
+
+       if (sp->cpu_od)
+               /* Various early Au1xx0 errata corrected by this */
+               set_c0_config(1 << 19); /* Set Config[OD] */
+       else
+               /* Clear to obtain best system bus performance */
+               clear_c0_config(1 << 19); /* Clear Config[OD] */
+
+       argptr = prom_getcmdline();
+
+#ifdef CONFIG_SERIAL_8250_CONSOLE
+       argptr = strstr(argptr, "console=");
+       if (argptr == NULL) {
+               argptr = prom_getcmdline();
+               strcat(argptr, " console=ttyS0,115200");
+       }
+#endif
+
+#ifdef CONFIG_FB_AU1100
+       argptr = strstr(argptr, "video=");
+       if (argptr == NULL) {
+               argptr = prom_getcmdline();
+               /* default panel */
+               /*strcat(argptr, " video=au1100fb:panel:Sharp_320x240_16");*/
+       }
+#endif
+
+#if defined(CONFIG_SOUND_AU1X00) && !defined(CONFIG_SOC_AU1000)
+       /* au1000 does not support vra, au1500 and au1100 do */
+       strcat(argptr, " au1000_audio=vra");
+       argptr = prom_getcmdline();
+#endif
+       _machine_restart = au1000_restart;
+       _machine_halt = au1000_halt;
+       pm_power_off = au1000_power_off;
+
+       /* IO/MEM resources. */
+       set_io_port_base(0);
+       ioport_resource.start = IOPORT_RESOURCE_START;
+       ioport_resource.end = IOPORT_RESOURCE_END;
+       iomem_resource.start = IOMEM_RESOURCE_START;
+       iomem_resource.end = IOMEM_RESOURCE_END;
+
+       while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_E0S);
+       au_writel(SYS_CNTRL_E0 | SYS_CNTRL_EN0, SYS_COUNTER_CNTRL);
+       au_sync();
+       while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T0S);
+       au_writel(0, SYS_TOYTRIM);
+}
+
+#if defined(CONFIG_64BIT_PHYS_ADDR)
+/* This routine should be valid for all Au1x based boards */
+phys_t __fixup_bigphys_addr(phys_t phys_addr, phys_t size)
+{
+       /* Don't fixup 36-bit addresses */
+       if ((phys_addr >> 32) != 0)
+               return phys_addr;
+
+#ifdef CONFIG_PCI
+       {
+               u32 start = (u32)Au1500_PCI_MEM_START;
+               u32 end   = (u32)Au1500_PCI_MEM_END;
+
+               /* Check for PCI memory window */
+               if (phys_addr >= start && (phys_addr + size - 1) <= end)
+                       return (phys_t)
+                              ((phys_addr - start) + Au1500_PCI_MEM_START);
+       }
+#endif
+
+       /*
+        * All Au1xx0 SOCs have a PCMCIA controller.
+        * We setup our 32-bit pseudo addresses to be equal to the
+        * 36-bit addr >> 4, to make it easier to check the address
+        * and fix it.
+        * The PCMCIA socket 0 physical attribute address is 0xF 4000 0000.
+        * The pseudo address we use is 0xF400 0000. Any address over
+        * 0xF400 0000 is a PCMCIA pseudo address.
+        */
+       if ((phys_addr >= 0xF4000000) && (phys_addr < 0xFFFFFFFF))
+               return (phys_t)(phys_addr << 4);
+
+       /* default nop */
+       return phys_addr;
+}
+EXPORT_SYMBOL(__fixup_bigphys_addr);
+#endif
diff --git a/arch/mips/alchemy/common/sleeper.S b/arch/mips/alchemy/common/sleeper.S
new file mode 100644 (file)
index 0000000..3006e27
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2002 Embedded Edge, LLC
+ * Author: dan@embeddededge.com
+ *
+ * Sleep helper for Au1xxx sleep mode.
+ *
+ * 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 <asm/asm.h>
+#include <asm/mipsregs.h>
+#include <asm/regdef.h>
+#include <asm/stackframe.h>
+
+       .text
+       .set    macro
+       .set    noat
+       .align  5
+
+/* Save all of the processor general registers and go to sleep.
+ * A wakeup condition will get us back here to restore the registers.
+ */
+LEAF(save_and_sleep)
+
+       subu    sp, PT_SIZE
+       sw      $1, PT_R1(sp)
+       sw      $2, PT_R2(sp)
+       sw      $3, PT_R3(sp)
+       sw      $4, PT_R4(sp)
+       sw      $5, PT_R5(sp)
+       sw      $6, PT_R6(sp)
+       sw      $7, PT_R7(sp)
+       sw      $8, PT_R8(sp)
+       sw      $9, PT_R9(sp)
+       sw      $10, PT_R10(sp)
+       sw      $11, PT_R11(sp)
+       sw      $12, PT_R12(sp)
+       sw      $13, PT_R13(sp)
+       sw      $14, PT_R14(sp)
+       sw      $15, PT_R15(sp)
+       sw      $16, PT_R16(sp)
+       sw      $17, PT_R17(sp)
+       sw      $18, PT_R18(sp)
+       sw      $19, PT_R19(sp)
+       sw      $20, PT_R20(sp)
+       sw      $21, PT_R21(sp)
+       sw      $22, PT_R22(sp)
+       sw      $23, PT_R23(sp)
+       sw      $24, PT_R24(sp)
+       sw      $25, PT_R25(sp)
+       sw      $26, PT_R26(sp)
+       sw      $27, PT_R27(sp)
+       sw      $28, PT_R28(sp)
+       sw      $29, PT_R29(sp)
+       sw      $30, PT_R30(sp)
+       sw      $31, PT_R31(sp)
+       mfc0    k0, CP0_STATUS
+       sw      k0, 0x20(sp)
+       mfc0    k0, CP0_CONTEXT
+       sw      k0, 0x1c(sp)
+       mfc0    k0, CP0_PAGEMASK
+       sw      k0, 0x18(sp)
+       mfc0    k0, CP0_CONFIG
+       sw      k0, 0x14(sp)
+
+       /* Now set up the scratch registers so the boot rom will
+        * return to this point upon wakeup.
+        */
+       la      k0, 1f
+       lui     k1, 0xb190
+       ori     k1, 0x18
+       sw      sp, 0(k1)
+       ori     k1, 0x1c
+       sw      k0, 0(k1)
+
+/* Put SDRAM into self refresh.  Preload instructions into cache,
+ * issue a precharge, then auto refresh, then sleep commands to it.
+ */
+       la      t0, sdsleep
+       .set    mips3
+       cache   0x14, 0(t0)
+       cache   0x14, 32(t0)
+       cache   0x14, 64(t0)
+       cache   0x14, 96(t0)
+       .set    mips0
+
+sdsleep:
+       lui     k0, 0xb400
+       sw      zero, 0x001c(k0)        /* Precharge */
+       sw      zero, 0x0020(k0)        /* Auto refresh */
+       sw      zero, 0x0030(k0)        /* SDRAM sleep */
+       sync
+
+       lui     k1, 0xb190
+       sw      zero, 0x0078(k1)        /* get ready  to sleep */
+       sync
+       sw      zero, 0x007c(k1)        /* Put processor to sleep */
+       sync
+
+       /* This is where we return upon wakeup.
+        * Reload all of the registers and return.
+        */
+1:     nop
+       lw      k0, 0x20(sp)
+       mtc0    k0, CP0_STATUS
+       lw      k0, 0x1c(sp)
+       mtc0    k0, CP0_CONTEXT
+       lw      k0, 0x18(sp)
+       mtc0    k0, CP0_PAGEMASK
+       lw      k0, 0x14(sp)
+       mtc0    k0, CP0_CONFIG
+
+       /* We need to catch the ealry Alchemy SOCs with
+        * the write-only Config[OD] bit and set it back to one...
+        */
+       jal     au1x00_fixup_config_od
+       lw      $1, PT_R1(sp)
+       lw      $2, PT_R2(sp)
+       lw      $3, PT_R3(sp)
+       lw      $4, PT_R4(sp)
+       lw      $5, PT_R5(sp)
+       lw      $6, PT_R6(sp)
+       lw      $7, PT_R7(sp)
+       lw      $8, PT_R8(sp)
+       lw      $9, PT_R9(sp)
+       lw      $10, PT_R10(sp)
+       lw      $11, PT_R11(sp)
+       lw      $12, PT_R12(sp)
+       lw      $13, PT_R13(sp)
+       lw      $14, PT_R14(sp)
+       lw      $15, PT_R15(sp)
+       lw      $16, PT_R16(sp)
+       lw      $17, PT_R17(sp)
+       lw      $18, PT_R18(sp)
+       lw      $19, PT_R19(sp)
+       lw      $20, PT_R20(sp)
+       lw      $21, PT_R21(sp)
+       lw      $22, PT_R22(sp)
+       lw      $23, PT_R23(sp)
+       lw      $24, PT_R24(sp)
+       lw      $25, PT_R25(sp)
+       lw      $26, PT_R26(sp)
+       lw      $27, PT_R27(sp)
+       lw      $28, PT_R28(sp)
+       lw      $29, PT_R29(sp)
+       lw      $30, PT_R30(sp)
+       lw      $31, PT_R31(sp)
+       addiu   sp, PT_SIZE
+
+       jr      ra
+END(save_and_sleep)
diff --git a/arch/mips/alchemy/common/time.c b/arch/mips/alchemy/common/time.c
new file mode 100644 (file)
index 0000000..563d939
--- /dev/null
@@ -0,0 +1,266 @@
+/*
+ *
+ * Copyright (C) 2001, 2006, 2008 MontaVista Software, <source@mvista.com>
+ * Copied and modified Carsten Langgaard's time.c
+ *
+ * Carsten Langgaard, carstenl@mips.com
+ * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
+ *
+ * ########################################################################
+ *
+ *  This program is free software; you can distribute it and/or modify it
+ *  under the terms of the GNU General Public License (Version 2) as
+ *  published by the Free Software Foundation.
+ *
+ *  This program is distributed in the hope it will be useful, but WITHOUT
+ *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ *  for more details.
+ *
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ *
+ * ########################################################################
+ *
+ * Setting up the clock on the MIPS boards.
+ *
+ * We provide the clock interrupt processing and the timer offset compute
+ * functions.  If CONFIG_PM is selected, we also ensure the 32KHz timer is
+ * available.  -- Dan
+ */
+
+#include <linux/types.h>
+#include <linux/init.h>
+#include <linux/spinlock.h>
+
+#include <asm/mipsregs.h>
+#include <asm/time.h>
+#include <asm/mach-au1x00/au1000.h>
+
+static int no_au1xxx_32khz;
+extern int allow_au1k_wait; /* default off for CP0 Counter */
+
+#ifdef CONFIG_PM
+#if HZ < 100 || HZ > 1000
+#error "unsupported HZ value! Must be in [100,1000]"
+#endif
+#define MATCH20_INC (328 * 100 / HZ) /* magic number 328 is for HZ=100... */
+static unsigned long last_pc0, last_match20;
+#endif
+
+static DEFINE_SPINLOCK(time_lock);
+
+unsigned long wtimer;
+
+#ifdef CONFIG_PM
+static irqreturn_t counter0_irq(int irq, void *dev_id)
+{
+       unsigned long pc0;
+       int time_elapsed;
+       static int jiffie_drift;
+
+       if (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20) {
+               /* should never happen! */
+               printk(KERN_WARNING "counter 0 w status error\n");
+               return IRQ_NONE;
+       }
+
+       pc0 = au_readl(SYS_TOYREAD);
+       if (pc0 < last_match20)
+               /* counter overflowed */
+               time_elapsed = (0xffffffff - last_match20) + pc0;
+       else
+               time_elapsed = pc0 - last_match20;
+
+       while (time_elapsed > 0) {
+               do_timer(1);
+#ifndef CONFIG_SMP
+               update_process_times(user_mode(get_irq_regs()));
+#endif
+               time_elapsed -= MATCH20_INC;
+               last_match20 += MATCH20_INC;
+               jiffie_drift++;
+       }
+
+       last_pc0 = pc0;
+       au_writel(last_match20 + MATCH20_INC, SYS_TOYMATCH2);
+       au_sync();
+
+       /*
+        * Our counter ticks at 10.009765625 ms/tick, we we're running
+        * almost 10 uS too slow per tick.
+        */
+
+       if (jiffie_drift >= 999) {
+               jiffie_drift -= 999;
+               do_timer(1); /* increment jiffies by one */
+#ifndef CONFIG_SMP
+               update_process_times(user_mode(get_irq_regs()));
+#endif
+       }
+
+       return IRQ_HANDLED;
+}
+
+struct irqaction counter0_action = {
+       .handler        = counter0_irq,
+       .flags          = IRQF_DISABLED,
+       .name           = "alchemy-toy",
+       .dev_id         = NULL,
+};
+
+/* When we wakeup from sleep, we have to "catch up" on all of the
+ * timer ticks we have missed.
+ */
+void wakeup_counter0_adjust(void)
+{
+       unsigned long pc0;
+       int time_elapsed;
+
+       pc0 = au_readl(SYS_TOYREAD);
+       if (pc0 < last_match20)
+               /* counter overflowed */
+               time_elapsed = (0xffffffff - last_match20) + pc0;
+       else
+               time_elapsed = pc0 - last_match20;
+
+       while (time_elapsed > 0) {
+               time_elapsed -= MATCH20_INC;
+               last_match20 += MATCH20_INC;
+       }
+
+       last_pc0 = pc0;
+       au_writel(last_match20 + MATCH20_INC, SYS_TOYMATCH2);
+       au_sync();
+
+}
+
+/* This is just for debugging to set the timer for a sleep delay. */
+void wakeup_counter0_set(int ticks)
+{
+       unsigned long pc0;
+
+       pc0 = au_readl(SYS_TOYREAD);
+       last_pc0 = pc0;
+       au_writel(last_match20 + (MATCH20_INC * ticks), SYS_TOYMATCH2);
+       au_sync();
+}
+#endif
+
+/*
+ * I haven't found anyone that doesn't use a 12 MHz source clock,
+ * but just in case.....
+ */
+#define AU1000_SRC_CLK 12000000
+
+/*
+ * We read the real processor speed from the PLL.  This is important
+ * because it is more accurate than computing it from the 32 KHz
+ * counter, if it exists.  If we don't have an accurate processor
+ * speed, all of the peripherals that derive their clocks based on
+ * this advertised speed will introduce error and sometimes not work
+ * properly.  This function is futher convoluted to still allow configurations
+ * to do that in case they have really, really old silicon with a
+ * write-only PLL register, that we need the 32 KHz when power management
+ * "wait" is enabled, and we need to detect if the 32 KHz isn't present
+ * but requested......got it? :-)              -- Dan
+ */
+unsigned long calc_clock(void)
+{
+       unsigned long cpu_speed;
+       unsigned long flags;
+       unsigned long counter;
+
+       spin_lock_irqsave(&time_lock, flags);
+
+       /* Power management cares if we don't have a 32 KHz counter. */
+       no_au1xxx_32khz = 0;
+       counter = au_readl(SYS_COUNTER_CNTRL);
+       if (counter & SYS_CNTRL_E0) {
+               int trim_divide = 16;
+
+               au_writel(counter | SYS_CNTRL_EN1, SYS_COUNTER_CNTRL);
+
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S);
+               /* RTC now ticks at 32.768/16 kHz */
+               au_writel(trim_divide - 1, SYS_RTCTRIM);
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S);
+
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
+               au_writel(0, SYS_TOYWRITE);
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
+       } else
+               no_au1xxx_32khz = 1;
+
+       /*
+        * On early Au1000, sys_cpupll was write-only. Since these
+        * silicon versions of Au1000 are not sold by AMD, we don't bend
+        * over backwards trying to determine the frequency.
+        */
+       if (cur_cpu_spec[0]->cpu_pll_wo)
+#ifdef CONFIG_SOC_AU1000_FREQUENCY
+               cpu_speed = CONFIG_SOC_AU1000_FREQUENCY;
+#else
+               cpu_speed = 396000000;
+#endif
+       else
+               cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK;
+       /* On Alchemy CPU:counter ratio is 1:1 */
+       mips_hpt_frequency = cpu_speed;
+       /* Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16) */
+       set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)
+                                                         & 0x03) + 2) * 16));
+       spin_unlock_irqrestore(&time_lock, flags);
+       return cpu_speed;
+}
+
+void __init plat_time_init(void)
+{
+       unsigned int est_freq = calc_clock();
+
+       est_freq += 5000;    /* round */
+       est_freq -= est_freq%10000;
+       printk(KERN_INFO "CPU frequency %u.%02u MHz\n",
+              est_freq / 1000000, ((est_freq % 1000000) * 100) / 1000000);
+       set_au1x00_speed(est_freq);
+       set_au1x00_lcd_clock(); /* program the LCD clock */
+
+#ifdef CONFIG_PM
+       /*
+        * setup counter 0, since it keeps ticking after a
+        * 'wait' instruction has been executed. The CP0 timer and
+        * counter 1 do NOT continue running after 'wait'
+        *
+        * It's too early to call request_irq() here, so we handle
+        * counter 0 interrupt as a special irq and it doesn't show
+        * up under /proc/interrupts.
+        *
+        * Check to ensure we really have a 32 KHz oscillator before
+        * we do this.
+        */
+       if (no_au1xxx_32khz)
+               printk(KERN_WARNING "WARNING: no 32KHz clock found.\n");
+       else {
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C0S);
+               au_writel(0, SYS_TOYWRITE);
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C0S);
+
+               au_writel(au_readl(SYS_WAKEMSK) | (1 << 8), SYS_WAKEMSK);
+               au_writel(~0, SYS_WAKESRC);
+               au_sync();
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20);
+
+               /* Setup match20 to interrupt once every HZ */
+               last_pc0 = last_match20 = au_readl(SYS_TOYREAD);
+               au_writel(last_match20 + MATCH20_INC, SYS_TOYMATCH2);
+               au_sync();
+               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20);
+               setup_irq(AU1000_TOY_MATCH2_INT, &counter0_action);
+
+               /* We can use the real 'wait' instruction. */
+               allow_au1k_wait = 1;
+       }
+
+#endif
+}
diff --git a/arch/mips/alchemy/db1x00/Makefile b/arch/mips/alchemy/db1x00/Makefile
new file mode 100644 (file)
index 0000000..274db3b
--- /dev/null
@@ -0,0 +1,8 @@
+#
+#  Copyright 2000, 2008 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#
+# Makefile for the Alchemy Semiconductor DBAu1xx0 boards.
+#
+
+lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/alchemy/db1x00/board_setup.c b/arch/mips/alchemy/db1x00/board_setup.c
new file mode 100644 (file)
index 0000000..9e5ccbb
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Alchemy Db1x00 board setup.
+ *
+ * Copyright 2000, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-db1x00/db1x00.h>
+
+static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR;
+
+void board_reset(void)
+{
+       /* Hit BCSR.SW_RESET[RESET] */
+       bcsr->swreset = 0x0000;
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func = 0;
+
+       /* Not valid for Au1550 */
+#if defined(CONFIG_IRDA) && \
+   (defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1100))
+       /* Set IRFIRSEL instead of GPIO15 */
+       pin_func = au_readl(SYS_PINFUNC) | SYS_PF_IRF;
+       au_writel(pin_func, SYS_PINFUNC);
+       /* Power off until the driver is in use */
+       bcsr->resets &= ~BCSR_RESETS_IRDA_MODE_MASK;
+       bcsr->resets |=  BCSR_RESETS_IRDA_MODE_OFF;
+       au_sync();
+#endif
+       bcsr->pcmcia = 0x0000; /* turn off PCMCIA power */
+
+#ifdef CONFIG_MIPS_MIRAGE
+       /* Enable GPIO[31:0] inputs */
+       au_writel(0, SYS_PININPUTEN);
+
+       /* GPIO[20] is output, tristate the other input primary GPIOs */
+       au_writel(~(1 << 20), SYS_TRIOUTCLR);
+
+       /* Set GPIO[210:208] instead of SSI_0 */
+       pin_func = au_readl(SYS_PINFUNC) | SYS_PF_S0;
+
+       /* Set GPIO[215:211] for LEDs */
+       pin_func |= 5 << 2;
+
+       /* Set GPIO[214:213] for more LEDs */
+       pin_func |= 5 << 12;
+
+       /* Set GPIO[207:200] instead of PCMCIA/LCD */
+       pin_func |= SYS_PF_LCD | SYS_PF_PC;
+       au_writel(pin_func, SYS_PINFUNC);
+
+       /*
+        * Enable speaker amplifier.  This should
+        * be part of the audio driver.
+        */
+       au_writel(au_readl(GPIO2_DIR) | 0x200, GPIO2_DIR);
+       au_writel(0x02000200, GPIO2_OUTPUT);
+#endif
+
+       au_sync();
+
+#ifdef CONFIG_MIPS_DB1000
+       printk(KERN_INFO "AMD Alchemy Au1000/Db1000 Board\n");
+#endif
+#ifdef CONFIG_MIPS_DB1500
+       printk(KERN_INFO "AMD Alchemy Au1500/Db1500 Board\n");
+#endif
+#ifdef CONFIG_MIPS_DB1100
+       printk(KERN_INFO "AMD Alchemy Au1100/Db1100 Board\n");
+#endif
+#ifdef CONFIG_MIPS_BOSPORUS
+       printk(KERN_INFO "AMD Alchemy Bosporus Board\n");
+#endif
+#ifdef CONFIG_MIPS_MIRAGE
+       printk(KERN_INFO "AMD Alchemy Mirage Board\n");
+#endif
+#ifdef CONFIG_MIPS_DB1550
+       printk(KERN_INFO "AMD Alchemy Au1550/Db1550 Board\n");
+#endif
+}
diff --git a/arch/mips/alchemy/db1x00/init.c b/arch/mips/alchemy/db1x00/init.c
new file mode 100644 (file)
index 0000000..8474135
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     PB1000 board setup
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+#ifdef CONFIG_MIPS_BOSPORUS
+       return "Alchemy Bosporus Gateway Reference";
+#else
+       return "Alchemy Db1x00";
+#endif
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/db1x00/irqmap.c b/arch/mips/alchemy/db1x00/irqmap.c
new file mode 100644 (file)
index 0000000..94c090e
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xxx irq map table
+ *
+ * Copyright 2003 Embedded Edge, LLC
+ *             dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+#ifdef CONFIG_MIPS_DB1500
+char irq_tab_alchemy[][5] __initdata = {
+       [12] = { -1, INTA, INTX, INTX, INTX }, /* IDSEL 12 - HPT371   */
+       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot */
+};
+#endif
+
+#ifdef CONFIG_MIPS_BOSPORUS
+char irq_tab_alchemy[][5] __initdata = {
+       [11] = { -1, INTA, INTB, INTX, INTX }, /* IDSEL 11 - miniPCI  */
+       [12] = { -1, INTA, INTX, INTX, INTX }, /* IDSEL 12 - SN1741   */
+       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot */
+};
+#endif
+
+#ifdef CONFIG_MIPS_MIRAGE
+char irq_tab_alchemy[][5] __initdata = {
+       [11] = { -1, INTD, INTX, INTX, INTX }, /* IDSEL 11 - SMI VGX */
+       [12] = { -1, INTX, INTX, INTC, INTX }, /* IDSEL 12 - PNX1300 */
+       [13] = { -1, INTA, INTB, INTX, INTX }, /* IDSEL 13 - miniPCI */
+};
+#endif
+
+#ifdef CONFIG_MIPS_DB1550
+char irq_tab_alchemy[][5] __initdata = {
+       [11] = { -1, INTC, INTX, INTX, INTX }, /* IDSEL 11 - on-board HPT371 */
+       [12] = { -1, INTB, INTC, INTD, INTA }, /* IDSEL 12 - PCI slot 2 (left) */
+       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot 1 (right) */
+};
+#endif
+
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+
+#ifndef CONFIG_MIPS_MIRAGE
+#ifdef CONFIG_MIPS_DB1550
+       { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */
+       { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */
+#else
+       { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 Fully_Interted# */
+       { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 STSCHG# */
+       { AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */
+
+       { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 Fully_Interted# */
+       { AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 STSCHG# */
+       { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */
+#endif
+#else
+       { AU1000_GPIO_7, INTC_INT_RISE_EDGE, 0 }, /* touchscreen pen down */
+#endif
+
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/alchemy/mtx-1/Makefile b/arch/mips/alchemy/mtx-1/Makefile
new file mode 100644 (file)
index 0000000..7c67b3d
--- /dev/null
@@ -0,0 +1,12 @@
+#
+#  Copyright 2003 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#       Bruno Randolf <bruno.randolf@4g-systems.biz>
+#
+# Makefile for 4G Systems MTX-1 board.
+#
+
+lib-y := init.o board_setup.o irqmap.o
+obj-y := platform.o
+
+EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/alchemy/mtx-1/board_setup.c b/arch/mips/alchemy/mtx-1/board_setup.c
new file mode 100644 (file)
index 0000000..3f80791
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     4G Systems MTX-1 board setup.
+ *
+ * Copyright 2003, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *         Bruno Randolf <bruno.randolf@4g-systems.biz>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+extern int (*board_pci_idsel)(unsigned int devsel, int assert);
+int mtx1_pci_idsel(unsigned int devsel, int assert);
+
+void board_reset(void)
+{
+       /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
+       au_writel(0x00000000, 0xAE00001C);
+}
+
+void __init board_setup(void)
+{
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+       /* Enable USB power switch */
+       au_writel(au_readl(GPIO2_DIR) | 0x10, GPIO2_DIR);
+       au_writel(0x100000, GPIO2_OUTPUT);
+#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
+
+#ifdef CONFIG_PCI
+#if defined(__MIPSEB__)
+       au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG);
+#else
+       au_writel(0xf, Au1500_PCI_CFG);
+#endif
+#endif
+
+       /* Initialize sys_pinfunc */
+       au_writel(SYS_PF_NI2, SYS_PINFUNC);
+
+       /* Initialize GPIO */
+       au_writel(0xFFFFFFFF, SYS_TRIOUTCLR);
+       au_writel(0x00000001, SYS_OUTPUTCLR); /* set M66EN (PCI 66MHz) to OFF */
+       au_writel(0x00000008, SYS_OUTPUTSET); /* set PCI CLKRUN# to OFF */
+       au_writel(0x00000002, SYS_OUTPUTSET); /* set EXT_IO3 ON */
+       au_writel(0x00000020, SYS_OUTPUTCLR); /* set eth PHY TX_ER to OFF */
+
+       /* Enable LED and set it to green */
+       au_writel(au_readl(GPIO2_DIR) | 0x1800, GPIO2_DIR);
+       au_writel(0x18000800, GPIO2_OUTPUT);
+
+       board_pci_idsel = mtx1_pci_idsel;
+
+       printk(KERN_INFO "4G Systems MTX-1 Board\n");
+}
+
+int
+mtx1_pci_idsel(unsigned int devsel, int assert)
+{
+#define MTX_IDSEL_ONLY_0_AND_3 0
+#if MTX_IDSEL_ONLY_0_AND_3
+       if (devsel != 0 && devsel != 3) {
+               printk(KERN_ERR "*** not 0 or 3\n");
+               return 0;
+       }
+#endif
+
+       if (assert && devsel != 0)
+               /* Suppress signal to Cardbus */
+               au_writel(0x00000002, SYS_OUTPUTCLR); /* set EXT_IO3 OFF */
+       else
+               au_writel(0x00000002, SYS_OUTPUTSET); /* set EXT_IO3 ON */
+       au_sync_udelay(1);
+       return 1;
+}
+
diff --git a/arch/mips/alchemy/mtx-1/init.c b/arch/mips/alchemy/mtx-1/init.c
new file mode 100644 (file)
index 0000000..3bae13c
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     4G Systems MTX-1 board setup
+ *
+ * Copyright 2003, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *         Bruno Randolf <bruno.randolf@4g-systems.biz>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "MTX-1";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/mtx-1/irqmap.c b/arch/mips/alchemy/mtx-1/irqmap.c
new file mode 100644 (file)
index 0000000..f2bf029
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xxx irq map table
+ *
+ * Copyright 2003 Embedded Edge, LLC
+ *             dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+char irq_tab_alchemy[][5] __initdata = {
+       [0] = { -1, INTA, INTA, INTX, INTX }, /* IDSEL 00 - AdapterA-Slot0 (top) */
+       [1] = { -1, INTB, INTA, INTX, INTX }, /* IDSEL 01 - AdapterA-Slot1 (bottom) */
+       [2] = { -1, INTC, INTD, INTX, INTX }, /* IDSEL 02 - AdapterB-Slot0 (top) */
+       [3] = { -1, INTD, INTC, INTX, INTX }, /* IDSEL 03 - AdapterB-Slot1 (bottom) */
+       [4] = { -1, INTA, INTB, INTX, INTX }, /* IDSEL 04 - AdapterC-Slot0 (top) */
+       [5] = { -1, INTB, INTA, INTX, INTX }, /* IDSEL 05 - AdapterC-Slot1 (bottom) */
+       [6] = { -1, INTC, INTD, INTX, INTX }, /* IDSEL 06 - AdapterD-Slot0 (top) */
+       [7] = { -1, INTD, INTC, INTX, INTX }, /* IDSEL 07 - AdapterD-Slot1 (bottom) */
+};
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+       { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/alchemy/mtx-1/platform.c b/arch/mips/alchemy/mtx-1/platform.c
new file mode 100644 (file)
index 0000000..8b5914d
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * MTX-1 platform devices registration
+ *
+ * Copyright (C) 2007, Florian Fainelli <florian@openwrt.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/leds.h>
+#include <linux/gpio.h>
+#include <linux/gpio_keys.h>
+#include <linux/input.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <mtd/mtd-abi.h>
+
+static struct gpio_keys_button mtx1_gpio_button[] = {
+       {
+               .gpio = 207,
+               .code = BTN_0,
+               .desc = "System button",
+       }
+};
+
+static struct gpio_keys_platform_data mtx1_buttons_data = {
+       .buttons = mtx1_gpio_button,
+       .nbuttons = ARRAY_SIZE(mtx1_gpio_button),
+};
+
+static struct platform_device mtx1_button = {
+       .name = "gpio-keys",
+       .id = -1,
+       .dev = {
+               .platform_data = &mtx1_buttons_data,
+       }
+};
+
+static struct resource mtx1_wdt_res[] = {
+       [0] = {
+               .start  = 15,
+               .end    = 15,
+               .name   = "mtx1-wdt-gpio",
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+static struct platform_device mtx1_wdt = {
+       .name = "mtx1-wdt",
+       .id = 0,
+       .num_resources = ARRAY_SIZE(mtx1_wdt_res),
+       .resource = mtx1_wdt_res,
+};
+
+static struct gpio_led default_leds[] = {
+       {
+               .name   = "mtx1:green",
+               .gpio = 211,
+       }, {
+               .name = "mtx1:red",
+               .gpio = 212,
+       },
+};
+
+static struct gpio_led_platform_data mtx1_led_data = {
+       .num_leds = ARRAY_SIZE(default_leds),
+       .leds = default_leds,
+};
+
+static struct platform_device mtx1_gpio_leds = {
+       .name = "leds-gpio",
+       .id = -1,
+       .dev = {
+               .platform_data = &mtx1_led_data,
+       }
+};
+
+static struct mtd_partition mtx1_mtd_partitions[] = {
+       {
+               .name   = "filesystem",
+               .size   = 0x01C00000,
+               .offset = 0,
+       },
+       {
+               .name   = "yamon",
+               .size   = 0x00100000,
+               .offset = MTDPART_OFS_APPEND,
+               .mask_flags = MTD_WRITEABLE,
+       },
+       {
+               .name   = "kernel",
+               .size   = 0x002c0000,
+               .offset = MTDPART_OFS_APPEND,
+       },
+       {
+               .name   = "yamon env",
+               .size   = 0x00040000,
+               .offset = MTDPART_OFS_APPEND,
+       },
+};
+
+static struct physmap_flash_data mtx1_flash_data = {
+       .width          = 4,
+       .nr_parts       = 4,
+       .parts          = mtx1_mtd_partitions,
+};
+
+static struct resource mtx1_mtd_resource = {
+       .start  = 0x1e000000,
+       .end    = 0x1fffffff,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct platform_device mtx1_mtd = {
+       .name           = "physmap-flash",
+       .dev            = {
+               .platform_data  = &mtx1_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &mtx1_mtd_resource,
+};
+
+static struct __initdata platform_device * mtx1_devs[] = {
+       &mtx1_gpio_leds,
+       &mtx1_wdt,
+       &mtx1_button,
+       &mtx1_mtd,
+};
+
+static int __init mtx1_register_devices(void)
+{
+       gpio_direction_input(207);
+       return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs));
+}
+
+arch_initcall(mtx1_register_devices);
diff --git a/arch/mips/alchemy/pb1000/Makefile b/arch/mips/alchemy/pb1000/Makefile
new file mode 100644 (file)
index 0000000..99bbec0
--- /dev/null
@@ -0,0 +1,8 @@
+#
+#  Copyright 2000, 2008 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#
+# Makefile for the Alchemy Semiconductor Pb1000 board.
+#
+
+lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/alchemy/pb1000/board_setup.c b/arch/mips/alchemy/pb1000/board_setup.c
new file mode 100644 (file)
index 0000000..25df167
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2000, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/delay.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-pb1x00/pb1000.h>
+
+void board_reset(void)
+{
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func, static_cfg0;
+       u32 sys_freqctrl, sys_clksrc;
+       u32 prid = read_c0_prid();
+
+       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
+       au_writel(8, SYS_AUXPLL);
+       au_writel(0, SYS_PINSTATERD);
+       udelay(100);
+
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+       /* Zero and disable FREQ2 */
+       sys_freqctrl = au_readl(SYS_FREQCTRL0);
+       sys_freqctrl &= ~0xFFF00000;
+       au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+       /* Zero and disable USBH/USBD clocks */
+       sys_clksrc = au_readl(SYS_CLKSRC);
+       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
+                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
+       au_writel(sys_clksrc, SYS_CLKSRC);
+
+       sys_freqctrl = au_readl(SYS_FREQCTRL0);
+       sys_freqctrl &= ~0xFFF00000;
+
+       sys_clksrc = au_readl(SYS_CLKSRC);
+       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
+                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
+
+       switch (prid & 0x000000FF) {
+       case 0x00: /* DA */
+       case 0x01: /* HA */
+       case 0x02: /* HB */
+               /* CPU core freq to 48 MHz to slow it way down... */
+               au_writel(4, SYS_CPUPLL);
+
+               /*
+                * Setup 48 MHz FREQ2 from CPUPLL for USB Host
+                * FRDIV2 = 3 -> div by 8 of 384 MHz -> 48 MHz
+                */
+               sys_freqctrl |= (3 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2;
+               au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+               /* CPU core freq to 384 MHz */
+               au_writel(0x20, SYS_CPUPLL);
+
+               printk(KERN_INFO "Au1000: 48 MHz OHCI workaround enabled\n");
+               break;
+
+       default: /* HC and newer */
+               /* FREQ2 = aux / 2 = 48 MHz */
+               sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |
+                                SYS_FC_FE2 | SYS_FC_FS2;
+               au_writel(sys_freqctrl, SYS_FREQCTRL0);
+               break;
+       }
+
+       /*
+        * Route 48 MHz FREQ2 into USB Host and/or Device
+        */
+       sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;
+       au_writel(sys_clksrc, SYS_CLKSRC);
+
+       /* Configure pins GPIO[14:9] as GPIO */
+       pin_func = au_readl(SYS_PINFUNC) & ~(SYS_PF_UR3 | SYS_PF_USB);
+
+       /* 2nd USB port is USB host */
+       pin_func |= SYS_PF_USB;
+
+       au_writel(pin_func, SYS_PINFUNC);
+       au_writel(0x2800, SYS_TRIOUTCLR);
+       au_writel(0x0030, SYS_OUTPUTCLR);
+#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
+
+       /* Make GPIO 15 an input (for interrupt line) */
+       pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_IRF;
+       /* We don't need I2S, so make it available for GPIO[31:29] */
+       pin_func |= SYS_PF_I2S;
+       au_writel(pin_func, SYS_PINFUNC);
+
+       au_writel(0x8000, SYS_TRIOUTCLR);
+
+       static_cfg0 = au_readl(MEM_STCFG0) & ~0xc00;
+       au_writel(static_cfg0, MEM_STCFG0);
+
+       /* configure RCE2* for LCD */
+       au_writel(0x00000004, MEM_STCFG2);
+
+       /* MEM_STTIME2 */
+       au_writel(0x09000000, MEM_STTIME2);
+
+       /* Set 32-bit base address decoding for RCE2* */
+       au_writel(0x10003ff0, MEM_STADDR2);
+
+       /*
+        * PCI CPLD setup
+        * Expand CE0 to cover PCI
+        */
+       au_writel(0x11803e40, MEM_STADDR1);
+
+       /* Burst visibility on */
+       au_writel(au_readl(MEM_STCFG0) | 0x1000, MEM_STCFG0);
+
+       au_writel(0x83, MEM_STCFG1);         /* ewait enabled, flash timing */
+       au_writel(0x33030a10, MEM_STTIME1);  /* slower timing for FPGA */
+
+       /* Setup the static bus controller */
+       au_writel(0x00000002, MEM_STCFG3);  /* type = PCMCIA */
+       au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */
+       au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */
+
+       /*
+        * Enable Au1000 BCLK switching - note: sed1356 must not use
+        * its BCLK (Au1000 LCLK) for any timings
+        */
+       switch (prid & 0x000000FF) {
+       case 0x00: /* DA */
+       case 0x01: /* HA */
+       case 0x02: /* HB */
+               break;
+       default:  /* HC and newer */
+               /*
+                * Enable sys bus clock divider when IDLE state or no bus
+                * activity.
+                */
+               au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
+               break;
+       }
+}
diff --git a/arch/mips/alchemy/pb1000/init.c b/arch/mips/alchemy/pb1000/init.c
new file mode 100644 (file)
index 0000000..8a9c7d5
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Pb1000 board setup
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "Alchemy Pb1000";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = (int)fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/pb1000/irqmap.c b/arch/mips/alchemy/pb1000/irqmap.c
new file mode 100644 (file)
index 0000000..b3d56b0
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xxx irq map table
+ *
+ * Copyright 2003 Embedded Edge, LLC
+ *             dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+       { AU1000_GPIO_15, INTC_INT_LOW_LEVEL, 0 },
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/alchemy/pb1100/Makefile b/arch/mips/alchemy/pb1100/Makefile
new file mode 100644 (file)
index 0000000..793e97c
--- /dev/null
@@ -0,0 +1,8 @@
+#
+#  Copyright 2000, 2001, 2008 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#
+# Makefile for the Alchemy Semiconductor Pb1100 board.
+#
+
+lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/alchemy/pb1100/board_setup.c b/arch/mips/alchemy/pb1100/board_setup.c
new file mode 100644 (file)
index 0000000..c0bfd59
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2002, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/delay.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-pb1x00/pb1100.h>
+
+void board_reset(void)
+{
+       /* Hit BCSR.RST_VDDI[SOFT_RESET] */
+       au_writel(0x00000000, PB1100_RST_VDDI);
+}
+
+void __init board_setup(void)
+{
+       volatile void __iomem *base = (volatile void __iomem *)0xac000000UL;
+
+       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
+       au_writel(8, SYS_AUXPLL);
+       au_writel(0, SYS_PININPUTEN);
+       udelay(100);
+
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+       {
+               u32 pin_func, sys_freqctrl, sys_clksrc;
+
+               /* Configure pins GPIO[14:9] as GPIO */
+               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
+
+               /* Zero and disable FREQ2 */
+               sys_freqctrl = au_readl(SYS_FREQCTRL0);
+               sys_freqctrl &= ~0xFFF00000;
+               au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+               /* Zero and disable USBH/USBD/IrDA clock */
+               sys_clksrc = au_readl(SYS_CLKSRC);
+               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
+               au_writel(sys_clksrc, SYS_CLKSRC);
+
+               sys_freqctrl = au_readl(SYS_FREQCTRL0);
+               sys_freqctrl &= ~0xFFF00000;
+
+               sys_clksrc = au_readl(SYS_CLKSRC);
+               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
+
+               /* FREQ2 = aux / 2 = 48 MHz */
+               sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |
+                               SYS_FC_FE2 | SYS_FC_FS2;
+               au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+               /*
+                * Route 48 MHz FREQ2 into USBH/USBD/IrDA
+                */
+               sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MIR_BIT;
+               au_writel(sys_clksrc, SYS_CLKSRC);
+
+               /* Setup the static bus controller */
+               au_writel(0x00000002, MEM_STCFG3);  /* type = PCMCIA */
+               au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */
+               au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */
+
+               /*
+                * Get USB Functionality pin state (device vs host drive pins).
+                */
+               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
+               /* 2nd USB port is USB host. */
+               pin_func |= SYS_PF_USB;
+               au_writel(pin_func, SYS_PINFUNC);
+       }
+#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
+
+       /* Enable sys bus clock divider when IDLE state or no bus activity. */
+       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
+
+       /* Enable the RTC if not already enabled. */
+       if (!(readb(base + 0x28) & 0x20)) {
+               writeb(readb(base + 0x28) | 0x20, base + 0x28);
+               au_sync();
+       }
+       /* Put the clock in BCD mode. */
+       if (readb(base + 0x2C) & 0x4) { /* reg B */
+               writeb(readb(base + 0x2c) & ~0x4, base + 0x2c);
+               au_sync();
+       }
+}
diff --git a/arch/mips/alchemy/pb1100/init.c b/arch/mips/alchemy/pb1100/init.c
new file mode 100644 (file)
index 0000000..7c67923
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Pb1100 board setup
+ *
+ * Copyright 2002, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "Alchemy Pb1100";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg3;
+
+       prom_init_cmdline();
+
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/pb1100/irqmap.c b/arch/mips/alchemy/pb1100/irqmap.c
new file mode 100644 (file)
index 0000000..9b7dd8b
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xx0 IRQ map table
+ *
+ * Copyright 2003 Embedded Edge, LLC
+ *             dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+       { AU1000_GPIO_9,  INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card Fully_Inserted# */
+       { AU1000_GPIO_10, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card STSCHG# */
+       { AU1000_GPIO_11, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card IRQ# */
+       { AU1000_GPIO_13, INTC_INT_LOW_LEVEL, 0 }, /* DC_IRQ# */
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/alchemy/pb1200/Makefile b/arch/mips/alchemy/pb1200/Makefile
new file mode 100644 (file)
index 0000000..d678adf
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# Makefile for the Alchemy Semiconductor Pb1200/DBAu1200 boards.
+#
+
+lib-y := init.o board_setup.o irqmap.o
+obj-y += platform.o
+
+EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/alchemy/pb1200/board_setup.c b/arch/mips/alchemy/pb1200/board_setup.c
new file mode 100644 (file)
index 0000000..6cb2115
--- /dev/null
@@ -0,0 +1,162 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Alchemy Pb1200/Db1200 board setup.
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/sched.h>
+
+#include <prom.h>
+#include <au1xxx.h>
+
+extern void _board_init_irq(void);
+extern void (*board_init_irq)(void);
+
+void board_reset(void)
+{
+       bcsr->resets = 0;
+       bcsr->system = 0;
+}
+
+void __init board_setup(void)
+{
+       char *argptr = NULL;
+
+#if 0
+       {
+               u32 pin_func;
+
+               /*
+                * Enable PSC1 SYNC for AC97.  Normaly done in audio driver,
+                * but it is board specific code, so put it here.
+                */
+               pin_func = au_readl(SYS_PINFUNC);
+               au_sync();
+               pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
+               au_writel(pin_func, SYS_PINFUNC);
+
+               au_writel(0, (u32)bcsr | 0x10); /* turn off PCMCIA power */
+               au_sync();
+       }
+#endif
+
+#if defined(CONFIG_I2C_AU1550)
+       {
+               u32 freq0, clksrc;
+               u32 pin_func;
+
+               /* Select SMBus in CPLD */
+               bcsr->resets &= ~BCSR_RESETS_PCS0MUX;
+
+               pin_func = au_readl(SYS_PINFUNC);
+               au_sync();
+               pin_func &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
+               /* Set GPIOs correctly */
+               pin_func |= 2 << 17;
+               au_writel(pin_func, SYS_PINFUNC);
+               au_sync();
+
+               /* The I2C driver depends on 50 MHz clock */
+               freq0 = au_readl(SYS_FREQCTRL0);
+               au_sync();
+               freq0 &= ~(SYS_FC_FRDIV1_MASK | SYS_FC_FS1 | SYS_FC_FE1);
+               freq0 |= 3 << SYS_FC_FRDIV1_BIT;
+               /* 396 MHz / (3 + 1) * 2 == 49.5 MHz */
+               au_writel(freq0, SYS_FREQCTRL0);
+               au_sync();
+               freq0 |= SYS_FC_FE1;
+               au_writel(freq0, SYS_FREQCTRL0);
+               au_sync();
+
+               clksrc = au_readl(SYS_CLKSRC);
+               au_sync();
+               clksrc &= ~(SYS_CS_CE0 | SYS_CS_DE0 | SYS_CS_ME0_MASK);
+               /* Bit 22 is EXTCLK0 for PSC0 */
+               clksrc |= SYS_CS_MUX_FQ1 << SYS_CS_ME0_BIT;
+               au_writel(clksrc, SYS_CLKSRC);
+               au_sync();
+       }
+#endif
+
+#ifdef CONFIG_FB_AU1200
+       argptr = prom_getcmdline();
+#ifdef CONFIG_MIPS_PB1200
+       strcat(argptr, " video=au1200fb:panel:bs");
+#endif
+#ifdef CONFIG_MIPS_DB1200
+       strcat(argptr, " video=au1200fb:panel:bs");
+#endif
+#endif
+
+       /*
+        * The Pb1200 development board uses external MUX for PSC0 to
+        * support SMB/SPI. bcsr->resets bit 12: 0=SMB 1=SPI
+        */
+#ifdef CONFIG_I2C_AU1550
+       bcsr->resets &= ~BCSR_RESETS_PCS0MUX;
+#endif
+       au_sync();
+
+#ifdef CONFIG_MIPS_PB1200
+       printk(KERN_INFO "AMD Alchemy Pb1200 Board\n");
+#endif
+#ifdef CONFIG_MIPS_DB1200
+       printk(KERN_INFO "AMD Alchemy Db1200 Board\n");
+#endif
+
+       /* Setup Pb1200 External Interrupt Controller */
+       board_init_irq = _board_init_irq;
+}
+
+int board_au1200fb_panel(void)
+{
+       BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR;
+       int p;
+
+       p = bcsr->switches;
+       p >>= 8;
+       p &= 0x0F;
+       return p;
+}
+
+int board_au1200fb_panel_init(void)
+{
+       /* Apply power */
+       BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR;
+
+       bcsr->board |= BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | BCSR_BOARD_LCDBL;
+       /* printk(KERN_DEBUG "board_au1200fb_panel_init()\n"); */
+       return 0;
+}
+
+int board_au1200fb_panel_shutdown(void)
+{
+       /* Remove power */
+       BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR;
+
+       bcsr->board &= ~(BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
+                        BCSR_BOARD_LCDBL);
+       /* printk(KERN_DEBUG "board_au1200fb_panel_shutdown()\n"); */
+       return 0;
+}
diff --git a/arch/mips/alchemy/pb1200/init.c b/arch/mips/alchemy/pb1200/init.c
new file mode 100644 (file)
index 0000000..e9b2a0f
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     PB1200 board setup
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "Alchemy Pb1200";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = (int)fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x08000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/pb1200/irqmap.c b/arch/mips/alchemy/pb1200/irqmap.c
new file mode 100644 (file)
index 0000000..2a505ad
--- /dev/null
@@ -0,0 +1,160 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xxx irq map table
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/interrupt.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+#ifdef CONFIG_MIPS_PB1200
+#include <asm/mach-pb1x00/pb1200.h>
+#endif
+
+#ifdef CONFIG_MIPS_DB1200
+#include <asm/mach-db1x00/db1200.h>
+#define PB1200_INT_BEGIN DB1200_INT_BEGIN
+#define PB1200_INT_END DB1200_INT_END
+#endif
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+       /* This is external interrupt cascade */
+       { AU1000_GPIO_7, INTC_INT_LOW_LEVEL, 0 },
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
+
+/*
+ * Support for External interrupts on the Pb1200 Development platform.
+ */
+static volatile int pb1200_cascade_en;
+
+irqreturn_t pb1200_cascade_handler(int irq, void *dev_id)
+{
+       unsigned short bisr = bcsr->int_status;
+       int extirq_nr = 0;
+
+       /* Clear all the edge interrupts. This has no effect on level. */
+       bcsr->int_status = bisr;
+       for ( ; bisr; bisr &= bisr - 1) {
+               extirq_nr = PB1200_INT_BEGIN + __ffs(bisr);
+               /* Ack and dispatch IRQ */
+               do_IRQ(extirq_nr);
+       }
+
+       return IRQ_RETVAL(1);
+}
+
+inline void pb1200_enable_irq(unsigned int irq_nr)
+{
+       bcsr->intset_mask = 1 << (irq_nr - PB1200_INT_BEGIN);
+       bcsr->intset = 1 << (irq_nr - PB1200_INT_BEGIN);
+}
+
+inline void pb1200_disable_irq(unsigned int irq_nr)
+{
+       bcsr->intclr_mask = 1 << (irq_nr - PB1200_INT_BEGIN);
+       bcsr->intclr = 1 << (irq_nr - PB1200_INT_BEGIN);
+}
+
+static unsigned int pb1200_setup_cascade(void)
+{
+       return request_irq(AU1000_GPIO_7, &pb1200_cascade_handler,
+                          0, "Pb1200 Cascade", &pb1200_cascade_handler);
+}
+
+static unsigned int pb1200_startup_irq(unsigned int irq)
+{
+       if (++pb1200_cascade_en == 1) {
+               int res;
+
+               res = pb1200_setup_cascade();
+               if (res)
+                       return res;
+       }
+
+       pb1200_enable_irq(irq);
+
+       return 0;
+}
+
+static void pb1200_shutdown_irq(unsigned int irq)
+{
+       pb1200_disable_irq(irq);
+       if (--pb1200_cascade_en == 0)
+               free_irq(AU1000_GPIO_7, &pb1200_cascade_handler);
+}
+
+static struct irq_chip external_irq_type = {
+#ifdef CONFIG_MIPS_PB1200
+       .name = "Pb1200 Ext",
+#endif
+#ifdef CONFIG_MIPS_DB1200
+       .name = "Db1200 Ext",
+#endif
+       .startup  = pb1200_startup_irq,
+       .shutdown = pb1200_shutdown_irq,
+       .ack      = pb1200_disable_irq,
+       .mask     = pb1200_disable_irq,
+       .mask_ack = pb1200_disable_irq,
+       .unmask   = pb1200_enable_irq,
+};
+
+void _board_init_irq(void)
+{
+       unsigned int irq;
+
+#ifdef CONFIG_MIPS_PB1200
+       /* We have a problem with CPLD rev 3. */
+       if (((bcsr->whoami & BCSR_WHOAMI_CPLD) >> 4) <= 3) {
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "Pb1200 must be at CPLD rev 4. Please have Pb1200\n");
+               printk(KERN_ERR "updated to latest revision. This software will\n");
+               printk(KERN_ERR "not work on anything less than CPLD rev 4.\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               printk(KERN_ERR "WARNING!!!\n");
+               panic("Game over.  Your score is 0.");
+       }
+#endif
+
+       for (irq = PB1200_INT_BEGIN; irq <= PB1200_INT_END; irq++) {
+               set_irq_chip_and_handler(irq, &external_irq_type,
+                                        handle_level_irq);
+               pb1200_disable_irq(irq);
+       }
+
+       /*
+        * GPIO_7 can not be hooked here, so it is hooked upon first
+        * request of any source attached to the cascade.
+        */
+}
diff --git a/arch/mips/alchemy/pb1200/platform.c b/arch/mips/alchemy/pb1200/platform.c
new file mode 100644 (file)
index 0000000..f8fb0ae
--- /dev/null
@@ -0,0 +1,85 @@
+/*
+ * Pb1200/DBAu1200 board platform device registration
+ *
+ * Copyright (C) 2008 MontaVista Software Inc. <source@mvista.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include <linux/dma-mapping.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach-au1x00/au1xxx.h>
+
+static struct resource ide_resources[] = {
+       [0] = {
+               .start  = IDE_PHYS_ADDR,
+               .end    = IDE_PHYS_ADDR + IDE_PHYS_LEN - 1,
+               .flags  = IORESOURCE_MEM
+       },
+       [1] = {
+               .start  = IDE_INT,
+               .end    = IDE_INT,
+               .flags  = IORESOURCE_IRQ
+       }
+};
+
+static u64 ide_dmamask = DMA_32BIT_MASK;
+
+static struct platform_device ide_device = {
+       .name           = "au1200-ide",
+       .id             = 0,
+       .dev = {
+               .dma_mask               = &ide_dmamask,
+               .coherent_dma_mask      = DMA_32BIT_MASK,
+       },
+       .num_resources  = ARRAY_SIZE(ide_resources),
+       .resource       = ide_resources
+};
+
+static struct resource smc91c111_resources[] = {
+       [0] = {
+               .name   = "smc91x-regs",
+               .start  = SMC91C111_PHYS_ADDR,
+               .end    = SMC91C111_PHYS_ADDR + 0xf,
+               .flags  = IORESOURCE_MEM
+       },
+       [1] = {
+               .start  = SMC91C111_INT,
+               .end    = SMC91C111_INT,
+               .flags  = IORESOURCE_IRQ
+       },
+};
+
+static struct platform_device smc91c111_device = {
+       .name           = "smc91x",
+       .id             = -1,
+       .num_resources  = ARRAY_SIZE(smc91c111_resources),
+       .resource       = smc91c111_resources
+};
+
+static struct platform_device *board_platform_devices[] __initdata = {
+       &ide_device,
+       &smc91c111_device
+};
+
+static int __init board_register_devices(void)
+{
+       return platform_add_devices(board_platform_devices,
+                                   ARRAY_SIZE(board_platform_devices));
+}
+
+arch_initcall(board_register_devices);
diff --git a/arch/mips/alchemy/pb1500/Makefile b/arch/mips/alchemy/pb1500/Makefile
new file mode 100644 (file)
index 0000000..602f38d
--- /dev/null
@@ -0,0 +1,8 @@
+#
+#  Copyright 2000, 2001, 2008 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#
+# Makefile for the Alchemy Semiconductor Pb1500 board.
+#
+
+lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/alchemy/pb1500/board_setup.c b/arch/mips/alchemy/pb1500/board_setup.c
new file mode 100644 (file)
index 0000000..035771c
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright 2000, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/delay.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-pb1x00/pb1500.h>
+
+void board_reset(void)
+{
+       /* Hit BCSR.RST_VDDI[SOFT_RESET] */
+       au_writel(0x00000000, PB1500_RST_VDDI);
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func;
+       u32 sys_freqctrl, sys_clksrc;
+
+       sys_clksrc = sys_freqctrl = pin_func = 0;
+       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
+       au_writel(8, SYS_AUXPLL);
+       au_writel(0, SYS_PINSTATERD);
+       udelay(100);
+
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+
+       /* GPIO201 is input for PCMCIA card detect */
+       /* GPIO203 is input for PCMCIA interrupt request */
+       au_writel(au_readl(GPIO2_DIR) & ~((1 << 1) | (1 << 3)), GPIO2_DIR);
+
+       /* Zero and disable FREQ2 */
+       sys_freqctrl = au_readl(SYS_FREQCTRL0);
+       sys_freqctrl &= ~0xFFF00000;
+       au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+       /* zero and disable USBH/USBD clocks */
+       sys_clksrc = au_readl(SYS_CLKSRC);
+       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
+                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
+       au_writel(sys_clksrc, SYS_CLKSRC);
+
+       sys_freqctrl = au_readl(SYS_FREQCTRL0);
+       sys_freqctrl &= ~0xFFF00000;
+
+       sys_clksrc = au_readl(SYS_CLKSRC);
+       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
+                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
+
+       /* FREQ2 = aux/2 = 48 MHz */
+       sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2 | SYS_FC_FS2;
+       au_writel(sys_freqctrl, SYS_FREQCTRL0);
+
+       /*
+        * Route 48MHz FREQ2 into USB Host and/or Device
+        */
+       sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;
+       au_writel(sys_clksrc, SYS_CLKSRC);
+
+       pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
+       /* 2nd USB port is USB host */
+       pin_func |= SYS_PF_USB;
+       au_writel(pin_func, SYS_PINFUNC);
+#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
+
+#ifdef CONFIG_PCI
+       /* Setup PCI bus controller */
+       au_writel(0, Au1500_PCI_CMEM);
+       au_writel(0x00003fff, Au1500_CFG_BASE);
+#if defined(__MIPSEB__)
+       au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG);
+#else
+       au_writel(0xf, Au1500_PCI_CFG);
+#endif
+       au_writel(0xf0000000, Au1500_PCI_MWMASK_DEV);
+       au_writel(0, Au1500_PCI_MWBASE_REV_CCL);
+       au_writel(0x02a00356, Au1500_PCI_STATCMD);
+       au_writel(0x00003c04, Au1500_PCI_HDRTYPE);
+       au_writel(0x00000008, Au1500_PCI_MBAR);
+       au_sync();
+#endif
+
+       /* Enable sys bus clock divider when IDLE state or no bus activity. */
+       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
+
+       /* Enable the RTC if not already enabled */
+       if (!(au_readl(0xac000028) & 0x20)) {
+               printk(KERN_INFO "enabling clock ...\n");
+               au_writel((au_readl(0xac000028) | 0x20), 0xac000028);
+       }
+       /* Put the clock in BCD mode */
+       if (au_readl(0xac00002c) & 0x4) { /* reg B */
+               au_writel(au_readl(0xac00002c) & ~0x4, 0xac00002c);
+               au_sync();
+       }
+}
diff --git a/arch/mips/alchemy/pb1500/init.c b/arch/mips/alchemy/pb1500/init.c
new file mode 100644 (file)
index 0000000..3b6e395
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Pb1500 board setup
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "Alchemy Pb1500";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = (int)fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/pb1500/irqmap.c b/arch/mips/alchemy/pb1500/irqmap.c
new file mode 100644 (file)
index 0000000..39c4682
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xxx irq map table
+ *
+ * Copyright 2003 Embedded Edge, LLC
+ *             dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+char irq_tab_alchemy[][5] __initdata = {
+       [12] = { -1, INTA, INTX, INTX, INTX },   /* IDSEL 12 - HPT370   */
+       [13] = { -1, INTA, INTB, INTC, INTD },   /* IDSEL 13 - PCI slot */
+};
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+       { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/alchemy/pb1550/Makefile b/arch/mips/alchemy/pb1550/Makefile
new file mode 100644 (file)
index 0000000..7d8beca
--- /dev/null
@@ -0,0 +1,8 @@
+#
+#  Copyright 2000, 2008 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#
+# Makefile for the Alchemy Semiconductor Pb1550 board.
+#
+
+lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/alchemy/pb1550/board_setup.c b/arch/mips/alchemy/pb1550/board_setup.c
new file mode 100644 (file)
index 0000000..0ed76b6
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Alchemy Pb1550 board setup.
+ *
+ * Copyright 2000, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+#include <asm/mach-pb1x00/pb1550.h>
+
+void board_reset(void)
+{
+       /* Hit BCSR.SYSTEM[RESET] */
+       au_writew(au_readw(0xAF00001C) & ~BCSR_SYSTEM_RESET, 0xAF00001C);
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func;
+
+       /*
+        * Enable PSC1 SYNC for AC'97.  Normaly done in audio driver,
+        * but it is board specific code, so put it here.
+        */
+       pin_func = au_readl(SYS_PINFUNC);
+       au_sync();
+       pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
+       au_writel(pin_func, SYS_PINFUNC);
+
+       au_writel(0, (u32)bcsr | 0x10); /* turn off PCMCIA power */
+       au_sync();
+
+       printk(KERN_INFO "AMD Alchemy Pb1550 Board\n");
+}
diff --git a/arch/mips/alchemy/pb1550/init.c b/arch/mips/alchemy/pb1550/init.c
new file mode 100644 (file)
index 0000000..e1055a1
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *
+ * BRIEF MODULE DESCRIPTION
+ *     Pb1550 board setup
+ *
+ * Copyright 2001, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "Alchemy Pb1550";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = (int)fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x08000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/pb1550/irqmap.c b/arch/mips/alchemy/pb1550/irqmap.c
new file mode 100644 (file)
index 0000000..a02a4d1
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xx0 IRQ map table
+ *
+ * Copyright 2003 Embedded Edge, LLC
+ *             dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+char irq_tab_alchemy[][5] __initdata = {
+       [12] = { -1, INTB, INTC, INTD, INTA }, /* IDSEL 12 - PCI slot 2 (left)  */
+       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot 1 (right) */
+};
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+       { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 },
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/alchemy/xxs1500/Makefile b/arch/mips/alchemy/xxs1500/Makefile
new file mode 100644 (file)
index 0000000..db3c526
--- /dev/null
@@ -0,0 +1,8 @@
+#
+#  Copyright 2003 MontaVista Software Inc.
+#  Author: MontaVista Software, Inc. <source@mvista.com>
+#
+# Makefile for MyCable XXS1500 board.
+#
+
+lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/alchemy/xxs1500/board_setup.c b/arch/mips/alchemy/xxs1500/board_setup.c
new file mode 100644 (file)
index 0000000..4c587ac
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2000-2003, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/delay.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+void board_reset(void)
+{
+       /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
+       au_writel(0x00000000, 0xAE00001C);
+}
+
+void __init board_setup(void)
+{
+       u32 pin_func;
+
+       /* Set multiple use pins (UART3/GPIO) to UART (it's used as UART too) */
+       pin_func  = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
+       pin_func |= SYS_PF_UR3;
+       au_writel(pin_func, SYS_PINFUNC);
+
+       /* Enable UART */
+       au_writel(0x01, UART3_ADDR + UART_MOD_CNTRL); /* clock enable (CE) */
+       mdelay(10);
+       au_writel(0x03, UART3_ADDR + UART_MOD_CNTRL); /* CE and "enable" */
+       mdelay(10);
+
+       /* Enable DTR = USB power up */
+       au_writel(0x01, UART3_ADDR + UART_MCR); /* UART_MCR_DTR is 0x01??? */
+
+#ifdef CONFIG_PCMCIA_XXS1500
+       /* Setup PCMCIA signals */
+       au_writel(0, SYS_PININPUTEN);
+
+       /* GPIO 0, 1, and 4 are inputs */
+       au_writel(1 | (1 << 1) | (1 << 4), SYS_TRIOUTCLR);
+
+       /* Enable GPIO2 if not already enabled */
+       au_writel(1, GPIO2_ENABLE);
+       /* GPIO2 208/9/10/11 are inputs */
+       au_writel((1 << 8) | (1 << 9) | (1 << 10) | (1 << 11), GPIO2_DIR);
+
+       /* Turn off power */
+       au_writel((au_readl(GPIO2_PINSTATE) & ~(1 << 14)) | (1 << 30),
+                 GPIO2_OUTPUT);
+#endif
+
+#ifdef CONFIG_PCI
+#if defined(__MIPSEB__)
+       au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG);
+#else
+       au_writel(0xf, Au1500_PCI_CFG);
+#endif
+#endif
+}
diff --git a/arch/mips/alchemy/xxs1500/init.c b/arch/mips/alchemy/xxs1500/init.c
new file mode 100644 (file)
index 0000000..7516434
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     XXS1500 board setup
+ *
+ * Copyright 2003, 2008 MontaVista Software Inc.
+ * Author: MontaVista Software, Inc. <source@mvista.com>
+ *
+ *  This program is free software; you can redistribute  it and/or modify it
+ *  under  the terms of  the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the  License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+#include <linux/kernel.h>
+
+#include <asm/bootinfo.h>
+
+#include <prom.h>
+
+const char *get_system_type(void)
+{
+       return "XXS1500";
+}
+
+void __init prom_init(void)
+{
+       unsigned char *memsize_str;
+       unsigned long memsize;
+
+       prom_argc = fw_arg0;
+       prom_argv = (char **)fw_arg1;
+       prom_envp = (char **)fw_arg2;
+
+       prom_init_cmdline();
+
+       memsize_str = prom_getenv("memsize");
+       if (!memsize_str)
+               memsize = 0x04000000;
+       else
+               strict_strtol(memsize_str, 0, &memsize);
+       add_memory_region(0, memsize, BOOT_MEM_RAM);
+}
diff --git a/arch/mips/alchemy/xxs1500/irqmap.c b/arch/mips/alchemy/xxs1500/irqmap.c
new file mode 100644 (file)
index 0000000..edf06ed
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * BRIEF MODULE DESCRIPTION
+ *     Au1xxx irq map table
+ *
+ * Copyright 2003 Embedded Edge, LLC
+ *             dan@embeddededge.com
+ *
+ *  This program is free software; you can redistribute         it and/or modify it
+ *  under  the terms of         the GNU General  Public License as published by the
+ *  Free Software Foundation;  either version 2 of the License, or (at your
+ *  option) any later version.
+ *
+ *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
+ *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
+ *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+ *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
+ *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
+ *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *  You should have received a copy of the  GNU General Public License along
+ *  with this program; if not, write  to the Free Software Foundation, Inc.,
+ *  675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <linux/init.h>
+
+#include <asm/mach-au1x00/au1000.h>
+
+struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
+       { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0 },
+       { AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
+       { AU1500_GPIO_207, INTC_INT_LOW_LEVEL, 0 },
+
+       { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 },
+       { AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, /* CF interrupt */
+       { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 },
+};
+
+int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/au1000/Kconfig b/arch/mips/au1000/Kconfig
deleted file mode 100644 (file)
index e4a057d..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-choice
-       prompt "Machine type"
-       depends on MACH_ALCHEMY
-       default MIPS_DB1000
-
-config MIPS_MTX1
-       bool "4G Systems MTX-1 board"
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select SOC_AU1500
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_BOSPORUS
-       bool "Alchemy Bosporus board"
-       select SOC_AU1500
-       select DMA_NONCOHERENT
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_DB1000
-       bool "Alchemy DB1000 board"
-       select SOC_AU1000
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_DB1100
-       bool "Alchemy DB1100 board"
-       select SOC_AU1100
-       select DMA_NONCOHERENT
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_DB1200
-       bool "Alchemy DB1200 board"
-       select SOC_AU1200
-       select DMA_COHERENT
-       select MIPS_DISABLE_OBSOLETE_IDE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_DB1500
-       bool "Alchemy DB1500 board"
-       select SOC_AU1500
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select MIPS_DISABLE_OBSOLETE_IDE
-       select SYS_SUPPORTS_BIG_ENDIAN
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_DB1550
-       bool "Alchemy DB1550 board"
-       select SOC_AU1550
-       select HW_HAS_PCI
-       select DMA_NONCOHERENT
-       select MIPS_DISABLE_OBSOLETE_IDE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_MIRAGE
-       bool "Alchemy Mirage board"
-       select DMA_NONCOHERENT
-       select SOC_AU1500
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_PB1000
-       bool "Alchemy PB1000 board"
-       select SOC_AU1000
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select SWAP_IO_SPACE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_PB1100
-       bool "Alchemy PB1100 board"
-       select SOC_AU1100
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select SWAP_IO_SPACE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_PB1200
-       bool "Alchemy PB1200 board"
-       select SOC_AU1200
-       select DMA_NONCOHERENT
-       select MIPS_DISABLE_OBSOLETE_IDE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_PB1500
-       bool "Alchemy PB1500 board"
-       select SOC_AU1500
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_PB1550
-       bool "Alchemy PB1550 board"
-       select SOC_AU1550
-       select DMA_NONCOHERENT
-       select HW_HAS_PCI
-       select MIPS_DISABLE_OBSOLETE_IDE
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-config MIPS_XXS1500
-       bool "MyCable XXS1500 board"
-       select DMA_NONCOHERENT
-       select SOC_AU1500
-       select SYS_SUPPORTS_LITTLE_ENDIAN
-
-endchoice
-
-config SOC_AU1000
-       bool
-       select SOC_AU1X00
-
-config SOC_AU1100
-       bool
-       select SOC_AU1X00
-
-config SOC_AU1500
-       bool
-       select SOC_AU1X00
-
-config SOC_AU1550
-       bool
-       select SOC_AU1X00
-
-config SOC_AU1200
-       bool
-       select SOC_AU1X00
-
-config SOC_AU1X00
-       bool
-       select 64BIT_PHYS_ADDR
-       select CEVT_R4K
-       select CSRC_R4K
-       select IRQ_CPU
-       select SYS_HAS_CPU_MIPS32_R1
-       select SYS_SUPPORTS_32BIT_KERNEL
-       select SYS_SUPPORTS_APM_EMULATION
diff --git a/arch/mips/au1000/common/Makefile b/arch/mips/au1000/common/Makefile
deleted file mode 100644 (file)
index df48fd6..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#
-#  Copyright 2000, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Au1xx0 CPUs, generic files.
-#
-
-obj-y += prom.o irq.o puts.o time.o reset.o \
-       au1xxx_irqmap.o clocks.o platform.o power.o setup.o \
-       sleeper.o cputable.o dma.o dbdma.o gpio.o
-
-obj-$(CONFIG_PCI)              += pci.o
-
-EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/au1000/common/au1xxx_irqmap.c b/arch/mips/au1000/common/au1xxx_irqmap.c
deleted file mode 100644 (file)
index c7ca159..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xxx processor specific IRQ tables
- *
- * Copyright 2004 Embedded Edge, LLC
- *     dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <au1000.h>
-
-/* The IC0 interrupt table.  This is processor, rather than
- * board dependent, so no reason to keep this info in the board
- * dependent files.
- *
- * Careful if you change match 2 request!
- * The interrupt handler is called directly from the low level dispatch code.
- */
-struct au1xxx_irqmap __initdata au1xxx_ic0_map[] = {
-
-#if defined(CONFIG_SOC_AU1000)
-       { AU1000_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_UART2_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
-       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-
-#elif defined(CONFIG_SOC_AU1500)
-
-       { AU1500_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
-       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1500_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1500_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-
-#elif defined(CONFIG_SOC_AU1100)
-
-       { AU1100_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1100_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1100_SD_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1100_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_SSI0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_SSI1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+1, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+2, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+3, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+4, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+5, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+6, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_DMA_INT_BASE+7, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
-       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_IRDA_TX_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_IRDA_RX_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_ACSYNC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1100_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       /* { AU1000_GPIO215_208_INT, INTC_INT_HIGH_LEVEL, 0 }, */
-       { AU1100_LCD_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_AC97C_INT, INTC_INT_RISE_EDGE, 0 },
-
-#elif defined(CONFIG_SOC_AU1550)
-
-       { AU1550_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_PCI_INTA, INTC_INT_LOW_LEVEL, 0 },
-       { AU1550_PCI_INTB, INTC_INT_LOW_LEVEL, 0 },
-       { AU1550_DDMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_CRYPTO_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_PCI_INTC, INTC_INT_LOW_LEVEL, 0 },
-       { AU1550_PCI_INTD, INTC_INT_LOW_LEVEL, 0 },
-       { AU1550_PCI_RST_INT, INTC_INT_LOW_LEVEL, 0 },
-       { AU1550_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_UART3_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_PSC0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_PSC1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_PSC2_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_PSC3_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
-       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1550_NAND_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1550_USB_DEV_REQ_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_USB_DEV_SUS_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1550_USB_HOST_INT, INTC_INT_LOW_LEVEL, 0 },
-       { AU1550_MAC0_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1550_MAC1_DMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-
-#elif defined(CONFIG_SOC_AU1200)
-
-       { AU1200_UART0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_SWT_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1200_SD_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_DDMA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_MAE_BE_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_UART1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_MAE_FE_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_PSC0_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_PSC1_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_AES_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_CAMERA_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1000_TOY_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_TOY_MATCH2_INT, INTC_INT_RISE_EDGE, 1 },
-       { AU1000_RTC_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH0_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH1_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1000_RTC_MATCH2_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1200_NAND_INT, INTC_INT_RISE_EDGE, 0 },
-       { AU1200_USB_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_LCD_INT, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1200_MAE_BOTH_INT, INTC_INT_HIGH_LEVEL, 0 },
-
-#else
-#error "Error: Unknown Alchemy SOC"
-#endif
-
-};
-
-int __initdata au1xxx_ic0_nr_irqs = ARRAY_SIZE(au1xxx_ic0_map);
diff --git a/arch/mips/au1000/common/clocks.c b/arch/mips/au1000/common/clocks.c
deleted file mode 100644 (file)
index 043429d..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Simple Au1xx0 clocks routines.
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/module.h>
-#include <asm/mach-au1x00/au1000.h>
-
-static unsigned int au1x00_clock; /*  Hz */
-static unsigned int lcd_clock;    /* KHz */
-static unsigned long uart_baud_base;
-
-/*
- * Set the au1000_clock
- */
-void set_au1x00_speed(unsigned int new_freq)
-{
-       au1x00_clock = new_freq;
-}
-
-unsigned int get_au1x00_speed(void)
-{
-       return au1x00_clock;
-}
-EXPORT_SYMBOL(get_au1x00_speed);
-
-/*
- * The UART baud base is not known at compile time ... if
- * we want to be able to use the same code on different
- * speed CPUs.
- */
-unsigned long get_au1x00_uart_baud_base(void)
-{
-       return uart_baud_base;
-}
-
-void set_au1x00_uart_baud_base(unsigned long new_baud_base)
-{
-       uart_baud_base = new_baud_base;
-}
-
-/*
- * Calculate the Au1x00's LCD clock based on the current
- * cpu clock and the system bus clock, and try to keep it
- * below 40 MHz (the Pb1000 board can lock-up if the LCD
- * clock is over 40 MHz).
- */
-void set_au1x00_lcd_clock(void)
-{
-       unsigned int static_cfg0;
-       unsigned int sys_busclk = (get_au1x00_speed() / 1000) /
-                                 ((int)(au_readl(SYS_POWERCTRL) & 0x03) + 2);
-
-       static_cfg0 = au_readl(MEM_STCFG0);
-
-       if (static_cfg0 & (1 << 11))
-               lcd_clock = sys_busclk / 5; /* note: BCLK switching fails with D5 */
-       else
-               lcd_clock = sys_busclk / 4;
-
-       if (lcd_clock > 50000) /* Epson MAX */
-               printk(KERN_WARNING "warning: LCD clock too high (%u KHz)\n",
-                                   lcd_clock);
-}
-
-unsigned int get_au1x00_lcd_clock(void)
-{
-       return lcd_clock;
-}
-EXPORT_SYMBOL(get_au1x00_lcd_clock);
diff --git a/arch/mips/au1000/common/cputable.c b/arch/mips/au1000/common/cputable.c
deleted file mode 100644 (file)
index ba6430b..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  arch/mips/au1000/common/cputable.c
- *
- *  Copyright (C) 2004 Dan Malek (dan@embeddededge.com)
- *     Copied from PowerPC and updated for Alchemy Au1xxx processors.
- *
- *  Copyright (C) 2001 Ben. Herrenschmidt (benh@kernel.crashing.org)
- *
- *  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 <asm/mach-au1x00/au1000.h>
-
-struct cpu_spec *cur_cpu_spec[NR_CPUS];
-
-/* With some thought, we can probably use the mask to reduce the
- * size of the table.
- */
-struct cpu_spec cpu_specs[] = {
-       { 0xffffffff, 0x00030100, "Au1000 DA", 1, 0, 1 },
-       { 0xffffffff, 0x00030201, "Au1000 HA", 1, 0, 1 },
-       { 0xffffffff, 0x00030202, "Au1000 HB", 1, 0, 1 },
-       { 0xffffffff, 0x00030203, "Au1000 HC", 1, 1, 0 },
-       { 0xffffffff, 0x00030204, "Au1000 HD", 1, 1, 0 },
-       { 0xffffffff, 0x01030200, "Au1500 AB", 1, 1, 0 },
-       { 0xffffffff, 0x01030201, "Au1500 AC", 0, 1, 0 },
-       { 0xffffffff, 0x01030202, "Au1500 AD", 0, 1, 0 },
-       { 0xffffffff, 0x02030200, "Au1100 AB", 1, 1, 0 },
-       { 0xffffffff, 0x02030201, "Au1100 BA", 1, 1, 0 },
-       { 0xffffffff, 0x02030202, "Au1100 BC", 1, 1, 0 },
-       { 0xffffffff, 0x02030203, "Au1100 BD", 0, 1, 0 },
-       { 0xffffffff, 0x02030204, "Au1100 BE", 0, 1, 0 },
-       { 0xffffffff, 0x03030200, "Au1550 AA", 0, 1, 0 },
-       { 0xffffffff, 0x04030200, "Au1200 AB", 0, 0, 0 },
-       { 0xffffffff, 0x04030201, "Au1200 AC", 1, 0, 0 },
-       { 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0, 0 }
-};
-
-void set_cpuspec(void)
-{
-       struct  cpu_spec *sp;
-       u32     prid;
-
-       prid = read_c0_prid();
-       sp = cpu_specs;
-       while ((prid & sp->prid_mask) != sp->prid_value)
-               sp++;
-       cur_cpu_spec[0] = sp;
-}
diff --git a/arch/mips/au1000/common/dbdma.c b/arch/mips/au1000/common/dbdma.c
deleted file mode 100644 (file)
index 601ee91..0000000
+++ /dev/null
@@ -1,978 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *      The Descriptor Based DMA channel manager that first appeared
- *     on the Au1550.  I started with dma.c, but I think all that is
- *     left is this initial comment :-)
- *
- * Copyright 2004 Embedded Edge, LLC
- *     dan@embeddededge.com
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-#include <linux/module.h>
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-au1x00/au1xxx_dbdma.h>
-
-#if defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200)
-
-/*
- * The Descriptor Based DMA supports up to 16 channels.
- *
- * There are 32 devices defined. We keep an internal structure
- * of devices using these channels, along with additional
- * information.
- *
- * We allocate the descriptors and allow access to them through various
- * functions.  The drivers allocate the data buffers and assign them
- * to the descriptors.
- */
-static DEFINE_SPINLOCK(au1xxx_dbdma_spin_lock);
-
-/* I couldn't find a macro that did this... */
-#define ALIGN_ADDR(x, a)       ((((u32)(x)) + (a-1)) & ~(a-1))
-
-static dbdma_global_t *dbdma_gptr = (dbdma_global_t *)DDMA_GLOBAL_BASE;
-static int dbdma_initialized;
-static void au1xxx_dbdma_init(void);
-
-static dbdev_tab_t dbdev_tab[] = {
-#ifdef CONFIG_SOC_AU1550
-       /* UARTS */
-       { DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8, 0x11100004, 0, 0 },
-       { DSCR_CMD0_UART0_RX, DEV_FLAGS_IN, 0, 8, 0x11100000, 0, 0 },
-       { DSCR_CMD0_UART3_TX, DEV_FLAGS_OUT, 0, 8, 0x11400004, 0, 0 },
-       { DSCR_CMD0_UART3_RX, DEV_FLAGS_IN, 0, 8, 0x11400000, 0, 0 },
-
-       /* EXT DMA */
-       { DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_DMA_REQ2, 0, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_DMA_REQ3, 0, 0, 0, 0x00000000, 0, 0 },
-
-       /* USB DEV */
-       { DSCR_CMD0_USBDEV_RX0, DEV_FLAGS_IN, 4, 8, 0x10200000, 0, 0 },
-       { DSCR_CMD0_USBDEV_TX0, DEV_FLAGS_OUT, 4, 8, 0x10200004, 0, 0 },
-       { DSCR_CMD0_USBDEV_TX1, DEV_FLAGS_OUT, 4, 8, 0x10200008, 0, 0 },
-       { DSCR_CMD0_USBDEV_TX2, DEV_FLAGS_OUT, 4, 8, 0x1020000c, 0, 0 },
-       { DSCR_CMD0_USBDEV_RX3, DEV_FLAGS_IN, 4, 8, 0x10200010, 0, 0 },
-       { DSCR_CMD0_USBDEV_RX4, DEV_FLAGS_IN, 4, 8, 0x10200014, 0, 0 },
-
-       /* PSC 0 */
-       { DSCR_CMD0_PSC0_TX, DEV_FLAGS_OUT, 0, 0, 0x11a0001c, 0, 0 },
-       { DSCR_CMD0_PSC0_RX, DEV_FLAGS_IN, 0, 0, 0x11a0001c, 0, 0 },
-
-       /* PSC 1 */
-       { DSCR_CMD0_PSC1_TX, DEV_FLAGS_OUT, 0, 0, 0x11b0001c, 0, 0 },
-       { DSCR_CMD0_PSC1_RX, DEV_FLAGS_IN, 0, 0, 0x11b0001c, 0, 0 },
-
-       /* PSC 2 */
-       { DSCR_CMD0_PSC2_TX, DEV_FLAGS_OUT, 0, 0, 0x10a0001c, 0, 0 },
-       { DSCR_CMD0_PSC2_RX, DEV_FLAGS_IN, 0, 0, 0x10a0001c, 0, 0 },
-
-       /* PSC 3 */
-       { DSCR_CMD0_PSC3_TX, DEV_FLAGS_OUT, 0, 0, 0x10b0001c, 0, 0 },
-       { DSCR_CMD0_PSC3_RX, DEV_FLAGS_IN, 0, 0, 0x10b0001c, 0, 0 },
-
-       { DSCR_CMD0_PCI_WRITE, 0, 0, 0, 0x00000000, 0, 0 },     /* PCI */
-       { DSCR_CMD0_NAND_FLASH, 0, 0, 0, 0x00000000, 0, 0 },    /* NAND */
-
-       /* MAC 0 */
-       { DSCR_CMD0_MAC0_RX, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_MAC0_TX, DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
-
-       /* MAC 1 */
-       { DSCR_CMD0_MAC1_RX, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_MAC1_TX, DEV_FLAGS_OUT, 0, 0, 0x00000000, 0, 0 },
-
-#endif /* CONFIG_SOC_AU1550 */
-
-#ifdef CONFIG_SOC_AU1200
-       { DSCR_CMD0_UART0_TX, DEV_FLAGS_OUT, 0, 8, 0x11100004, 0, 0 },
-       { DSCR_CMD0_UART0_RX, DEV_FLAGS_IN, 0, 8, 0x11100000, 0, 0 },
-       { DSCR_CMD0_UART1_TX, DEV_FLAGS_OUT, 0, 8, 0x11200004, 0, 0 },
-       { DSCR_CMD0_UART1_RX, DEV_FLAGS_IN, 0, 8, 0x11200000, 0, 0 },
-
-       { DSCR_CMD0_DMA_REQ0, 0, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_DMA_REQ1, 0, 0, 0, 0x00000000, 0, 0 },
-
-       { DSCR_CMD0_MAE_BE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_MAE_FE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_MAE_BOTH, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_LCD, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-
-       { DSCR_CMD0_SDMS_TX0, DEV_FLAGS_OUT, 4, 8, 0x10600000, 0, 0 },
-       { DSCR_CMD0_SDMS_RX0, DEV_FLAGS_IN, 4, 8, 0x10600004, 0, 0 },
-       { DSCR_CMD0_SDMS_TX1, DEV_FLAGS_OUT, 4, 8, 0x10680000, 0, 0 },
-       { DSCR_CMD0_SDMS_RX1, DEV_FLAGS_IN, 4, 8, 0x10680004, 0, 0 },
-
-       { DSCR_CMD0_AES_RX, DEV_FLAGS_IN , 4, 32, 0x10300008, 0, 0 },
-       { DSCR_CMD0_AES_TX, DEV_FLAGS_OUT, 4, 32, 0x10300004, 0, 0 },
-
-       { DSCR_CMD0_PSC0_TX, DEV_FLAGS_OUT, 0, 16, 0x11a0001c, 0, 0 },
-       { DSCR_CMD0_PSC0_RX, DEV_FLAGS_IN, 0, 16, 0x11a0001c, 0, 0 },
-       { DSCR_CMD0_PSC0_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-
-       { DSCR_CMD0_PSC1_TX, DEV_FLAGS_OUT, 0, 16, 0x11b0001c, 0, 0 },
-       { DSCR_CMD0_PSC1_RX, DEV_FLAGS_IN, 0, 16, 0x11b0001c, 0, 0 },
-       { DSCR_CMD0_PSC1_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-
-       { DSCR_CMD0_CIM_RXA, DEV_FLAGS_IN, 0, 32, 0x14004020, 0, 0 },
-       { DSCR_CMD0_CIM_RXB, DEV_FLAGS_IN, 0, 32, 0x14004040, 0, 0 },
-       { DSCR_CMD0_CIM_RXC, DEV_FLAGS_IN, 0, 32, 0x14004060, 0, 0 },
-       { DSCR_CMD0_CIM_SYNC, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-
-       { DSCR_CMD0_NAND_FLASH, DEV_FLAGS_IN, 0, 0, 0x00000000, 0, 0 },
-
-#endif /* CONFIG_SOC_AU1200 */
-
-       { DSCR_CMD0_THROTTLE, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-       { DSCR_CMD0_ALWAYS, DEV_FLAGS_ANYUSE, 0, 0, 0x00000000, 0, 0 },
-
-       /* Provide 16 user definable device types */
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-       { ~0, 0, 0, 0, 0, 0, 0 },
-};
-
-#define DBDEV_TAB_SIZE ARRAY_SIZE(dbdev_tab)
-
-static chan_tab_t *chan_tab_ptr[NUM_DBDMA_CHANS];
-
-static dbdev_tab_t *find_dbdev_id(u32 id)
-{
-       int i;
-       dbdev_tab_t *p;
-       for (i = 0; i < DBDEV_TAB_SIZE; ++i) {
-               p = &dbdev_tab[i];
-               if (p->dev_id == id)
-                       return p;
-       }
-       return NULL;
-}
-
-void *au1xxx_ddma_get_nextptr_virt(au1x_ddma_desc_t *dp)
-{
-       return phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-}
-EXPORT_SYMBOL(au1xxx_ddma_get_nextptr_virt);
-
-u32 au1xxx_ddma_add_device(dbdev_tab_t *dev)
-{
-       u32 ret = 0;
-       dbdev_tab_t *p;
-       static u16 new_id = 0x1000;
-
-       p = find_dbdev_id(~0);
-       if (NULL != p) {
-               memcpy(p, dev, sizeof(dbdev_tab_t));
-               p->dev_id = DSCR_DEV2CUSTOM_ID(new_id, dev->dev_id);
-               ret = p->dev_id;
-               new_id++;
-#if 0
-               printk(KERN_DEBUG "add_device: id:%x flags:%x padd:%x\n",
-                                 p->dev_id, p->dev_flags, p->dev_physaddr);
-#endif
-       }
-
-       return ret;
-}
-EXPORT_SYMBOL(au1xxx_ddma_add_device);
-
-void au1xxx_ddma_del_device(u32 devid)
-{
-       dbdev_tab_t *p = find_dbdev_id(devid);
-
-       if (p != NULL) {
-               memset(p, 0, sizeof(dbdev_tab_t));
-               p->dev_id = ~0;
-       }
-}
-EXPORT_SYMBOL(au1xxx_ddma_del_device);
-
-/* Allocate a channel and return a non-zero descriptor if successful. */
-u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
-       void (*callback)(int, void *), void *callparam)
-{
-       unsigned long   flags;
-       u32             used, chan, rv;
-       u32             dcp;
-       int             i;
-       dbdev_tab_t     *stp, *dtp;
-       chan_tab_t      *ctp;
-       au1x_dma_chan_t *cp;
-
-       /*
-        * We do the intialization on the first channel allocation.
-        * We have to wait because of the interrupt handler initialization
-        * which can't be done successfully during board set up.
-        */
-       if (!dbdma_initialized)
-               au1xxx_dbdma_init();
-       dbdma_initialized = 1;
-
-       stp = find_dbdev_id(srcid);
-       if (stp == NULL)
-               return 0;
-       dtp = find_dbdev_id(destid);
-       if (dtp == NULL)
-               return 0;
-
-       used = 0;
-       rv = 0;
-
-       /* Check to see if we can get both channels. */
-       spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
-       if (!(stp->dev_flags & DEV_FLAGS_INUSE) ||
-            (stp->dev_flags & DEV_FLAGS_ANYUSE)) {
-               /* Got source */
-               stp->dev_flags |= DEV_FLAGS_INUSE;
-               if (!(dtp->dev_flags & DEV_FLAGS_INUSE) ||
-                    (dtp->dev_flags & DEV_FLAGS_ANYUSE)) {
-                       /* Got destination */
-                       dtp->dev_flags |= DEV_FLAGS_INUSE;
-               } else {
-                       /* Can't get dest.  Release src. */
-                       stp->dev_flags &= ~DEV_FLAGS_INUSE;
-                       used++;
-               }
-       } else
-               used++;
-       spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
-
-       if (!used) {
-               /* Let's see if we can allocate a channel for it. */
-               ctp = NULL;
-               chan = 0;
-               spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
-               for (i = 0; i < NUM_DBDMA_CHANS; i++)
-                       if (chan_tab_ptr[i] == NULL) {
-                               /*
-                                * If kmalloc fails, it is caught below same
-                                * as a channel not available.
-                                */
-                               ctp = kmalloc(sizeof(chan_tab_t), GFP_ATOMIC);
-                               chan_tab_ptr[i] = ctp;
-                               break;
-                       }
-               spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
-
-               if (ctp != NULL) {
-                       memset(ctp, 0, sizeof(chan_tab_t));
-                       ctp->chan_index = chan = i;
-                       dcp = DDMA_CHANNEL_BASE;
-                       dcp += (0x0100 * chan);
-                       ctp->chan_ptr = (au1x_dma_chan_t *)dcp;
-                       cp = (au1x_dma_chan_t *)dcp;
-                       ctp->chan_src = stp;
-                       ctp->chan_dest = dtp;
-                       ctp->chan_callback = callback;
-                       ctp->chan_callparam = callparam;
-
-                       /* Initialize channel configuration. */
-                       i = 0;
-                       if (stp->dev_intlevel)
-                               i |= DDMA_CFG_SED;
-                       if (stp->dev_intpolarity)
-                               i |= DDMA_CFG_SP;
-                       if (dtp->dev_intlevel)
-                               i |= DDMA_CFG_DED;
-                       if (dtp->dev_intpolarity)
-                               i |= DDMA_CFG_DP;
-                       if ((stp->dev_flags & DEV_FLAGS_SYNC) ||
-                               (dtp->dev_flags & DEV_FLAGS_SYNC))
-                                       i |= DDMA_CFG_SYNC;
-                       cp->ddma_cfg = i;
-                       au_sync();
-
-                       /* Return a non-zero value that can be used to
-                        * find the channel information in subsequent
-                        * operations.
-                        */
-                       rv = (u32)(&chan_tab_ptr[chan]);
-               } else {
-                       /* Release devices */
-                       stp->dev_flags &= ~DEV_FLAGS_INUSE;
-                       dtp->dev_flags &= ~DEV_FLAGS_INUSE;
-               }
-       }
-       return rv;
-}
-EXPORT_SYMBOL(au1xxx_dbdma_chan_alloc);
-
-/*
- * Set the device width if source or destination is a FIFO.
- * Should be 8, 16, or 32 bits.
- */
-u32 au1xxx_dbdma_set_devwidth(u32 chanid, int bits)
-{
-       u32             rv;
-       chan_tab_t      *ctp;
-       dbdev_tab_t     *stp, *dtp;
-
-       ctp = *((chan_tab_t **)chanid);
-       stp = ctp->chan_src;
-       dtp = ctp->chan_dest;
-       rv = 0;
-
-       if (stp->dev_flags & DEV_FLAGS_IN) {    /* Source in fifo */
-               rv = stp->dev_devwidth;
-               stp->dev_devwidth = bits;
-       }
-       if (dtp->dev_flags & DEV_FLAGS_OUT) {   /* Destination out fifo */
-               rv = dtp->dev_devwidth;
-               dtp->dev_devwidth = bits;
-       }
-
-       return rv;
-}
-EXPORT_SYMBOL(au1xxx_dbdma_set_devwidth);
-
-/* Allocate a descriptor ring, initializing as much as possible. */
-u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries)
-{
-       int                     i;
-       u32                     desc_base, srcid, destid;
-       u32                     cmd0, cmd1, src1, dest1;
-       u32                     src0, dest0;
-       chan_tab_t              *ctp;
-       dbdev_tab_t             *stp, *dtp;
-       au1x_ddma_desc_t        *dp;
-
-       /*
-        * I guess we could check this to be within the
-        * range of the table......
-        */
-       ctp = *((chan_tab_t **)chanid);
-       stp = ctp->chan_src;
-       dtp = ctp->chan_dest;
-
-       /*
-        * The descriptors must be 32-byte aligned.  There is a
-        * possibility the allocation will give us such an address,
-        * and if we try that first we are likely to not waste larger
-        * slabs of memory.
-        */
-       desc_base = (u32)kmalloc(entries * sizeof(au1x_ddma_desc_t),
-                                GFP_KERNEL|GFP_DMA);
-       if (desc_base == 0)
-               return 0;
-
-       if (desc_base & 0x1f) {
-               /*
-                * Lost....do it again, allocate extra, and round
-                * the address base.
-                */
-               kfree((const void *)desc_base);
-               i = entries * sizeof(au1x_ddma_desc_t);
-               i += (sizeof(au1x_ddma_desc_t) - 1);
-               desc_base = (u32)kmalloc(i, GFP_KERNEL|GFP_DMA);
-               if (desc_base == 0)
-                       return 0;
-
-               desc_base = ALIGN_ADDR(desc_base, sizeof(au1x_ddma_desc_t));
-       }
-       dp = (au1x_ddma_desc_t *)desc_base;
-
-       /* Keep track of the base descriptor. */
-       ctp->chan_desc_base = dp;
-
-       /* Initialize the rings with as much information as we know. */
-       srcid = stp->dev_id;
-       destid = dtp->dev_id;
-
-       cmd0 = cmd1 = src1 = dest1 = 0;
-       src0 = dest0 = 0;
-
-       cmd0 |= DSCR_CMD0_SID(srcid);
-       cmd0 |= DSCR_CMD0_DID(destid);
-       cmd0 |= DSCR_CMD0_IE | DSCR_CMD0_CV;
-       cmd0 |= DSCR_CMD0_ST(DSCR_CMD0_ST_NOCHANGE);
-
-       /* Is it mem to mem transfer? */
-       if (((DSCR_CUSTOM2DEV_ID(srcid) == DSCR_CMD0_THROTTLE) ||
-            (DSCR_CUSTOM2DEV_ID(srcid) == DSCR_CMD0_ALWAYS)) &&
-           ((DSCR_CUSTOM2DEV_ID(destid) == DSCR_CMD0_THROTTLE) ||
-            (DSCR_CUSTOM2DEV_ID(destid) == DSCR_CMD0_ALWAYS)))
-               cmd0 |= DSCR_CMD0_MEM;
-
-       switch (stp->dev_devwidth) {
-       case 8:
-               cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_BYTE);
-               break;
-       case 16:
-               cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_HALFWORD);
-               break;
-       case 32:
-       default:
-               cmd0 |= DSCR_CMD0_SW(DSCR_CMD0_WORD);
-               break;
-       }
-
-       switch (dtp->dev_devwidth) {
-       case 8:
-               cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_BYTE);
-               break;
-       case 16:
-               cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_HALFWORD);
-               break;
-       case 32:
-       default:
-               cmd0 |= DSCR_CMD0_DW(DSCR_CMD0_WORD);
-               break;
-       }
-
-       /*
-        * If the device is marked as an in/out FIFO, ensure it is
-        * set non-coherent.
-        */
-       if (stp->dev_flags & DEV_FLAGS_IN)
-               cmd0 |= DSCR_CMD0_SN;           /* Source in FIFO */
-       if (dtp->dev_flags & DEV_FLAGS_OUT)
-               cmd0 |= DSCR_CMD0_DN;           /* Destination out FIFO */
-
-       /*
-        * Set up source1.  For now, assume no stride and increment.
-        * A channel attribute update can change this later.
-        */
-       switch (stp->dev_tsize) {
-       case 1:
-               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE1);
-               break;
-       case 2:
-               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE2);
-               break;
-       case 4:
-               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE4);
-               break;
-       case 8:
-       default:
-               src1 |= DSCR_SRC1_STS(DSCR_xTS_SIZE8);
-               break;
-       }
-
-       /* If source input is FIFO, set static address. */
-       if (stp->dev_flags & DEV_FLAGS_IN) {
-               if (stp->dev_flags & DEV_FLAGS_BURSTABLE)
-                       src1 |= DSCR_SRC1_SAM(DSCR_xAM_BURST);
-               else
-                       src1 |= DSCR_SRC1_SAM(DSCR_xAM_STATIC);
-       }
-
-       if (stp->dev_physaddr)
-               src0 = stp->dev_physaddr;
-
-       /*
-        * Set up dest1.  For now, assume no stride and increment.
-        * A channel attribute update can change this later.
-        */
-       switch (dtp->dev_tsize) {
-       case 1:
-               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE1);
-               break;
-       case 2:
-               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE2);
-               break;
-       case 4:
-               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE4);
-               break;
-       case 8:
-       default:
-               dest1 |= DSCR_DEST1_DTS(DSCR_xTS_SIZE8);
-               break;
-       }
-
-       /* If destination output is FIFO, set static address. */
-       if (dtp->dev_flags & DEV_FLAGS_OUT) {
-               if (dtp->dev_flags & DEV_FLAGS_BURSTABLE)
-                       dest1 |= DSCR_DEST1_DAM(DSCR_xAM_BURST);
-               else
-                       dest1 |= DSCR_DEST1_DAM(DSCR_xAM_STATIC);
-       }
-
-       if (dtp->dev_physaddr)
-               dest0 = dtp->dev_physaddr;
-
-#if 0
-               printk(KERN_DEBUG "did:%x sid:%x cmd0:%x cmd1:%x source0:%x "
-                                 "source1:%x dest0:%x dest1:%x\n",
-                                 dtp->dev_id, stp->dev_id, cmd0, cmd1, src0,
-                                 src1, dest0, dest1);
-#endif
-       for (i = 0; i < entries; i++) {
-               dp->dscr_cmd0 = cmd0;
-               dp->dscr_cmd1 = cmd1;
-               dp->dscr_source0 = src0;
-               dp->dscr_source1 = src1;
-               dp->dscr_dest0 = dest0;
-               dp->dscr_dest1 = dest1;
-               dp->dscr_stat = 0;
-               dp->sw_context = 0;
-               dp->sw_status = 0;
-               dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(dp + 1));
-               dp++;
-       }
-
-       /* Make last descrptor point to the first. */
-       dp--;
-       dp->dscr_nxtptr = DSCR_NXTPTR(virt_to_phys(ctp->chan_desc_base));
-       ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
-
-       return (u32)ctp->chan_desc_base;
-}
-EXPORT_SYMBOL(au1xxx_dbdma_ring_alloc);
-
-/*
- * Put a source buffer into the DMA ring.
- * This updates the source pointer and byte count.  Normally used
- * for memory to fifo transfers.
- */
-u32 _au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags)
-{
-       chan_tab_t              *ctp;
-       au1x_ddma_desc_t        *dp;
-
-       /*
-        * I guess we could check this to be within the
-        * range of the table......
-        */
-       ctp = *(chan_tab_t **)chanid;
-
-       /*
-        * We should have multiple callers for a particular channel,
-        * an interrupt doesn't affect this pointer nor the descriptor,
-        * so no locking should be needed.
-        */
-       dp = ctp->put_ptr;
-
-       /*
-        * If the descriptor is valid, we are way ahead of the DMA
-        * engine, so just return an error condition.
-        */
-       if (dp->dscr_cmd0 & DSCR_CMD0_V)
-               return 0;
-
-       /* Load up buffer address and byte count. */
-       dp->dscr_source0 = virt_to_phys(buf);
-       dp->dscr_cmd1 = nbytes;
-       /* Check flags */
-       if (flags & DDMA_FLAGS_IE)
-               dp->dscr_cmd0 |= DSCR_CMD0_IE;
-       if (flags & DDMA_FLAGS_NOIE)
-               dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
-
-       /*
-        * There is an errata on the Au1200/Au1550 parts that could result
-        * in "stale" data being DMA'ed. It has to do with the snoop logic on
-        * the cache eviction buffer.  DMA_NONCOHERENT is on by default for
-        * these parts. If it is fixed in the future, these dma_cache_inv will
-        * just be nothing more than empty macros. See io.h.
-        */
-       dma_cache_wback_inv((unsigned long)buf, nbytes);
-       dp->dscr_cmd0 |= DSCR_CMD0_V;   /* Let it rip */
-       au_sync();
-       dma_cache_wback_inv((unsigned long)dp, sizeof(dp));
-       ctp->chan_ptr->ddma_dbell = 0;
-
-       /* Get next descriptor pointer. */
-       ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-
-       /* Return something non-zero. */
-       return nbytes;
-}
-EXPORT_SYMBOL(_au1xxx_dbdma_put_source);
-
-/* Put a destination buffer into the DMA ring.
- * This updates the destination pointer and byte count.  Normally used
- * to place an empty buffer into the ring for fifo to memory transfers.
- */
-u32
-_au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags)
-{
-       chan_tab_t              *ctp;
-       au1x_ddma_desc_t        *dp;
-
-       /* I guess we could check this to be within the
-        * range of the table......
-        */
-       ctp = *((chan_tab_t **)chanid);
-
-       /* We should have multiple callers for a particular channel,
-        * an interrupt doesn't affect this pointer nor the descriptor,
-        * so no locking should be needed.
-        */
-       dp = ctp->put_ptr;
-
-       /* If the descriptor is valid, we are way ahead of the DMA
-        * engine, so just return an error condition.
-        */
-       if (dp->dscr_cmd0 & DSCR_CMD0_V)
-               return 0;
-
-       /* Load up buffer address and byte count */
-
-       /* Check flags  */
-       if (flags & DDMA_FLAGS_IE)
-               dp->dscr_cmd0 |= DSCR_CMD0_IE;
-       if (flags & DDMA_FLAGS_NOIE)
-               dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
-
-       dp->dscr_dest0 = virt_to_phys(buf);
-       dp->dscr_cmd1 = nbytes;
-#if 0
-       printk(KERN_DEBUG "cmd0:%x cmd1:%x source0:%x source1:%x dest0:%x dest1:%x\n",
-                         dp->dscr_cmd0, dp->dscr_cmd1, dp->dscr_source0,
-                         dp->dscr_source1, dp->dscr_dest0, dp->dscr_dest1);
-#endif
-       /*
-        * There is an errata on the Au1200/Au1550 parts that could result in
-        * "stale" data being DMA'ed. It has to do with the snoop logic on the
-        * cache eviction buffer.  DMA_NONCOHERENT is on by default for these
-        * parts. If it is fixed in the future, these dma_cache_inv will just
-        * be nothing more than empty macros. See io.h.
-        */
-       dma_cache_inv((unsigned long)buf, nbytes);
-       dp->dscr_cmd0 |= DSCR_CMD0_V;   /* Let it rip */
-       au_sync();
-       dma_cache_wback_inv((unsigned long)dp, sizeof(dp));
-       ctp->chan_ptr->ddma_dbell = 0;
-
-       /* Get next descriptor pointer. */
-       ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-
-       /* Return something non-zero. */
-       return nbytes;
-}
-EXPORT_SYMBOL(_au1xxx_dbdma_put_dest);
-
-/*
- * Get a destination buffer into the DMA ring.
- * Normally used to get a full buffer from the ring during fifo
- * to memory transfers.  This does not set the valid bit, you will
- * have to put another destination buffer to keep the DMA going.
- */
-u32 au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes)
-{
-       chan_tab_t              *ctp;
-       au1x_ddma_desc_t        *dp;
-       u32                     rv;
-
-       /*
-        * I guess we could check this to be within the
-        * range of the table......
-        */
-       ctp = *((chan_tab_t **)chanid);
-
-       /*
-        * We should have multiple callers for a particular channel,
-        * an interrupt doesn't affect this pointer nor the descriptor,
-        * so no locking should be needed.
-        */
-       dp = ctp->get_ptr;
-
-       /*
-        * If the descriptor is valid, we are way ahead of the DMA
-        * engine, so just return an error condition.
-        */
-       if (dp->dscr_cmd0 & DSCR_CMD0_V)
-               return 0;
-
-       /* Return buffer address and byte count. */
-       *buf = (void *)(phys_to_virt(dp->dscr_dest0));
-       *nbytes = dp->dscr_cmd1;
-       rv = dp->dscr_stat;
-
-       /* Get next descriptor pointer. */
-       ctp->get_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-
-       /* Return something non-zero. */
-       return rv;
-}
-EXPORT_SYMBOL_GPL(au1xxx_dbdma_get_dest);
-
-void au1xxx_dbdma_stop(u32 chanid)
-{
-       chan_tab_t      *ctp;
-       au1x_dma_chan_t *cp;
-       int halt_timeout = 0;
-
-       ctp = *((chan_tab_t **)chanid);
-
-       cp = ctp->chan_ptr;
-       cp->ddma_cfg &= ~DDMA_CFG_EN;   /* Disable channel */
-       au_sync();
-       while (!(cp->ddma_stat & DDMA_STAT_H)) {
-               udelay(1);
-               halt_timeout++;
-               if (halt_timeout > 100) {
-                       printk(KERN_WARNING "warning: DMA channel won't halt\n");
-                       break;
-               }
-       }
-       /* clear current desc valid and doorbell */
-       cp->ddma_stat |= (DDMA_STAT_DB | DDMA_STAT_V);
-       au_sync();
-}
-EXPORT_SYMBOL(au1xxx_dbdma_stop);
-
-/*
- * Start using the current descriptor pointer.  If the DBDMA encounters
- * a non-valid descriptor, it will stop.  In this case, we can just
- * continue by adding a buffer to the list and starting again.
- */
-void au1xxx_dbdma_start(u32 chanid)
-{
-       chan_tab_t      *ctp;
-       au1x_dma_chan_t *cp;
-
-       ctp = *((chan_tab_t **)chanid);
-       cp = ctp->chan_ptr;
-       cp->ddma_desptr = virt_to_phys(ctp->cur_ptr);
-       cp->ddma_cfg |= DDMA_CFG_EN;    /* Enable channel */
-       au_sync();
-       cp->ddma_dbell = 0;
-       au_sync();
-}
-EXPORT_SYMBOL(au1xxx_dbdma_start);
-
-void au1xxx_dbdma_reset(u32 chanid)
-{
-       chan_tab_t              *ctp;
-       au1x_ddma_desc_t        *dp;
-
-       au1xxx_dbdma_stop(chanid);
-
-       ctp = *((chan_tab_t **)chanid);
-       ctp->get_ptr = ctp->put_ptr = ctp->cur_ptr = ctp->chan_desc_base;
-
-       /* Run through the descriptors and reset the valid indicator. */
-       dp = ctp->chan_desc_base;
-
-       do {
-               dp->dscr_cmd0 &= ~DSCR_CMD0_V;
-               /*
-                * Reset our software status -- this is used to determine
-                * if a descriptor is in use by upper level software. Since
-                * posting can reset 'V' bit.
-                */
-               dp->sw_status = 0;
-               dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-       } while (dp != ctp->chan_desc_base);
-}
-EXPORT_SYMBOL(au1xxx_dbdma_reset);
-
-u32 au1xxx_get_dma_residue(u32 chanid)
-{
-       chan_tab_t      *ctp;
-       au1x_dma_chan_t *cp;
-       u32             rv;
-
-       ctp = *((chan_tab_t **)chanid);
-       cp = ctp->chan_ptr;
-
-       /* This is only valid if the channel is stopped. */
-       rv = cp->ddma_bytecnt;
-       au_sync();
-
-       return rv;
-}
-EXPORT_SYMBOL_GPL(au1xxx_get_dma_residue);
-
-void au1xxx_dbdma_chan_free(u32 chanid)
-{
-       chan_tab_t      *ctp;
-       dbdev_tab_t     *stp, *dtp;
-
-       ctp = *((chan_tab_t **)chanid);
-       stp = ctp->chan_src;
-       dtp = ctp->chan_dest;
-
-       au1xxx_dbdma_stop(chanid);
-
-       kfree((void *)ctp->chan_desc_base);
-
-       stp->dev_flags &= ~DEV_FLAGS_INUSE;
-       dtp->dev_flags &= ~DEV_FLAGS_INUSE;
-       chan_tab_ptr[ctp->chan_index] = NULL;
-
-       kfree(ctp);
-}
-EXPORT_SYMBOL(au1xxx_dbdma_chan_free);
-
-static irqreturn_t dbdma_interrupt(int irq, void *dev_id)
-{
-       u32 intstat;
-       u32 chan_index;
-       chan_tab_t              *ctp;
-       au1x_ddma_desc_t        *dp;
-       au1x_dma_chan_t *cp;
-
-       intstat = dbdma_gptr->ddma_intstat;
-       au_sync();
-       chan_index = __ffs(intstat);
-
-       ctp = chan_tab_ptr[chan_index];
-       cp = ctp->chan_ptr;
-       dp = ctp->cur_ptr;
-
-       /* Reset interrupt. */
-       cp->ddma_irq = 0;
-       au_sync();
-
-       if (ctp->chan_callback)
-               ctp->chan_callback(irq, ctp->chan_callparam);
-
-       ctp->cur_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-       return IRQ_RETVAL(1);
-}
-
-static void au1xxx_dbdma_init(void)
-{
-       int irq_nr;
-
-       dbdma_gptr->ddma_config = 0;
-       dbdma_gptr->ddma_throttle = 0;
-       dbdma_gptr->ddma_inten = 0xffff;
-       au_sync();
-
-#if defined(CONFIG_SOC_AU1550)
-       irq_nr = AU1550_DDMA_INT;
-#elif defined(CONFIG_SOC_AU1200)
-       irq_nr = AU1200_DDMA_INT;
-#else
-       #error Unknown Au1x00 SOC
-#endif
-
-       if (request_irq(irq_nr, dbdma_interrupt, IRQF_DISABLED,
-                       "Au1xxx dbdma", (void *)dbdma_gptr))
-               printk(KERN_ERR "Can't get 1550 dbdma irq");
-}
-
-void au1xxx_dbdma_dump(u32 chanid)
-{
-       chan_tab_t       *ctp;
-       au1x_ddma_desc_t *dp;
-       dbdev_tab_t      *stp, *dtp;
-       au1x_dma_chan_t  *cp;
-       u32 i            = 0;
-
-       ctp = *((chan_tab_t **)chanid);
-       stp = ctp->chan_src;
-       dtp = ctp->chan_dest;
-       cp = ctp->chan_ptr;
-
-       printk(KERN_DEBUG "Chan %x, stp %x (dev %d)  dtp %x (dev %d) \n",
-                         (u32)ctp, (u32)stp, stp - dbdev_tab, (u32)dtp,
-                         dtp - dbdev_tab);
-       printk(KERN_DEBUG "desc base %x, get %x, put %x, cur %x\n",
-                         (u32)(ctp->chan_desc_base), (u32)(ctp->get_ptr),
-                         (u32)(ctp->put_ptr), (u32)(ctp->cur_ptr));
-
-       printk(KERN_DEBUG "dbdma chan %x\n", (u32)cp);
-       printk(KERN_DEBUG "cfg %08x, desptr %08x, statptr %08x\n",
-                         cp->ddma_cfg, cp->ddma_desptr, cp->ddma_statptr);
-       printk(KERN_DEBUG "dbell %08x, irq %08x, stat %08x, bytecnt %08x\n",
-                         cp->ddma_dbell, cp->ddma_irq, cp->ddma_stat,
-                         cp->ddma_bytecnt);
-
-       /* Run through the descriptors */
-       dp = ctp->chan_desc_base;
-
-       do {
-               printk(KERN_DEBUG "Dp[%d]= %08x, cmd0 %08x, cmd1 %08x\n",
-                                 i++, (u32)dp, dp->dscr_cmd0, dp->dscr_cmd1);
-               printk(KERN_DEBUG "src0 %08x, src1 %08x, dest0 %08x, dest1 %08x\n",
-                                 dp->dscr_source0, dp->dscr_source1,
-                                 dp->dscr_dest0, dp->dscr_dest1);
-               printk(KERN_DEBUG "stat %08x, nxtptr %08x\n",
-                                 dp->dscr_stat, dp->dscr_nxtptr);
-               dp = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-       } while (dp != ctp->chan_desc_base);
-}
-
-/* Put a descriptor into the DMA ring.
- * This updates the source/destination pointers and byte count.
- */
-u32 au1xxx_dbdma_put_dscr(u32 chanid, au1x_ddma_desc_t *dscr)
-{
-       chan_tab_t *ctp;
-       au1x_ddma_desc_t *dp;
-       u32 nbytes = 0;
-
-       /*
-        * I guess we could check this to be within the
-        * range of the table......
-        */
-       ctp = *((chan_tab_t **)chanid);
-
-       /*
-        * We should have multiple callers for a particular channel,
-        * an interrupt doesn't affect this pointer nor the descriptor,
-        * so no locking should be needed.
-        */
-       dp = ctp->put_ptr;
-
-       /*
-        * If the descriptor is valid, we are way ahead of the DMA
-        * engine, so just return an error condition.
-        */
-       if (dp->dscr_cmd0 & DSCR_CMD0_V)
-               return 0;
-
-       /* Load up buffer addresses and byte count. */
-       dp->dscr_dest0 = dscr->dscr_dest0;
-       dp->dscr_source0 = dscr->dscr_source0;
-       dp->dscr_dest1 = dscr->dscr_dest1;
-       dp->dscr_source1 = dscr->dscr_source1;
-       dp->dscr_cmd1 = dscr->dscr_cmd1;
-       nbytes = dscr->dscr_cmd1;
-       /* Allow the caller to specifiy if an interrupt is generated */
-       dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
-       dp->dscr_cmd0 |= dscr->dscr_cmd0 | DSCR_CMD0_V;
-       ctp->chan_ptr->ddma_dbell = 0;
-
-       /* Get next descriptor pointer. */
-       ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
-
-       /* Return something non-zero. */
-       return nbytes;
-}
-
-#endif /* defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200) */
diff --git a/arch/mips/au1000/common/dma.c b/arch/mips/au1000/common/dma.c
deleted file mode 100644 (file)
index d6fbda2..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *      A DMA channel allocator for Au1x00. API is modeled loosely off of
- *      linux/kernel/dma.c.
- *
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- * Copyright (C) 2005 Ralf Baechle (ralf@linux-mips.org)
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/spinlock.h>
-#include <linux/interrupt.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-au1x00/au1000_dma.h>
-
-#if defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1500) || \
-    defined(CONFIG_SOC_AU1100)
-/*
- * A note on resource allocation:
- *
- * All drivers needing DMA channels, should allocate and release them
- * through the public routines `request_dma()' and `free_dma()'.
- *
- * In order to avoid problems, all processes should allocate resources in
- * the same sequence and release them in the reverse order.
- *
- * So, when allocating DMAs and IRQs, first allocate the DMA, then the IRQ.
- * When releasing them, first release the IRQ, then release the DMA. The
- * main reason for this order is that, if you are requesting the DMA buffer
- * done interrupt, you won't know the irq number until the DMA channel is
- * returned from request_dma.
- */
-
-DEFINE_SPINLOCK(au1000_dma_spin_lock);
-
-struct dma_chan au1000_dma_table[NUM_AU1000_DMA_CHANNELS] = {
-      {.dev_id = -1,},
-      {.dev_id = -1,},
-      {.dev_id = -1,},
-      {.dev_id = -1,},
-      {.dev_id = -1,},
-      {.dev_id = -1,},
-      {.dev_id = -1,},
-      {.dev_id = -1,}
-};
-EXPORT_SYMBOL(au1000_dma_table);
-
-/* Device FIFO addresses and default DMA modes */
-static const struct dma_dev {
-       unsigned int fifo_addr;
-       unsigned int dma_mode;
-} dma_dev_table[DMA_NUM_DEV] = {
-       {UART0_ADDR + UART_TX, 0},
-       {UART0_ADDR + UART_RX, 0},
-       {0, 0},
-       {0, 0},
-       {AC97C_DATA, DMA_DW16 },          /* coherent */
-       {AC97C_DATA, DMA_DR | DMA_DW16 }, /* coherent */
-       {UART3_ADDR + UART_TX, DMA_DW8 | DMA_NC},
-       {UART3_ADDR + UART_RX, DMA_DR | DMA_DW8 | DMA_NC},
-       {USBD_EP0RD, DMA_DR | DMA_DW8 | DMA_NC},
-       {USBD_EP0WR, DMA_DW8 | DMA_NC},
-       {USBD_EP2WR, DMA_DW8 | DMA_NC},
-       {USBD_EP3WR, DMA_DW8 | DMA_NC},
-       {USBD_EP4RD, DMA_DR | DMA_DW8 | DMA_NC},
-       {USBD_EP5RD, DMA_DR | DMA_DW8 | DMA_NC},
-       {I2S_DATA, DMA_DW32 | DMA_NC},
-       {I2S_DATA, DMA_DR | DMA_DW32 | DMA_NC}
-};
-
-int au1000_dma_read_proc(char *buf, char **start, off_t fpos,
-                        int length, int *eof, void *data)
-{
-       int i, len = 0;
-       struct dma_chan *chan;
-
-       for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) {
-               chan = get_dma_chan(i);
-               if (chan != NULL)
-                       len += sprintf(buf + len, "%2d: %s\n",
-                                      i, chan->dev_str);
-       }
-
-       if (fpos >= len) {
-               *start = buf;
-               *eof = 1;
-               return 0;
-       }
-       *start = buf + fpos;
-       len -= fpos;
-       if (len > length)
-               return length;
-       *eof = 1;
-       return len;
-}
-
-/* Device FIFO addresses and default DMA modes - 2nd bank */
-static const struct dma_dev dma_dev_table_bank2[DMA_NUM_DEV_BANK2] = {
-       { SD0_XMIT_FIFO, DMA_DS | DMA_DW8 },            /* coherent */
-       { SD0_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8 },   /* coherent */
-       { SD1_XMIT_FIFO, DMA_DS | DMA_DW8 },            /* coherent */
-       { SD1_RECV_FIFO, DMA_DS | DMA_DR | DMA_DW8 }    /* coherent */
-};
-
-void dump_au1000_dma_channel(unsigned int dmanr)
-{
-       struct dma_chan *chan;
-
-       if (dmanr >= NUM_AU1000_DMA_CHANNELS)
-               return;
-       chan = &au1000_dma_table[dmanr];
-
-       printk(KERN_INFO "Au1000 DMA%d Register Dump:\n", dmanr);
-       printk(KERN_INFO "  mode = 0x%08x\n",
-              au_readl(chan->io + DMA_MODE_SET));
-       printk(KERN_INFO "  addr = 0x%08x\n",
-              au_readl(chan->io + DMA_PERIPHERAL_ADDR));
-       printk(KERN_INFO "  start0 = 0x%08x\n",
-              au_readl(chan->io + DMA_BUFFER0_START));
-       printk(KERN_INFO "  start1 = 0x%08x\n",
-              au_readl(chan->io + DMA_BUFFER1_START));
-       printk(KERN_INFO "  count0 = 0x%08x\n",
-              au_readl(chan->io + DMA_BUFFER0_COUNT));
-       printk(KERN_INFO "  count1 = 0x%08x\n",
-              au_readl(chan->io + DMA_BUFFER1_COUNT));
-}
-
-/*
- * Finds a free channel, and binds the requested device to it.
- * Returns the allocated channel number, or negative on error.
- * Requests the DMA done IRQ if irqhandler != NULL.
- */
-int request_au1000_dma(int dev_id, const char *dev_str,
-                      irq_handler_t irqhandler,
-                      unsigned long irqflags,
-                      void *irq_dev_id)
-{
-       struct dma_chan *chan;
-       const struct dma_dev *dev;
-       int i, ret;
-
-#if defined(CONFIG_SOC_AU1100)
-       if (dev_id < 0 || dev_id >= (DMA_NUM_DEV + DMA_NUM_DEV_BANK2))
-               return -EINVAL;
-#else
-       if (dev_id < 0 || dev_id >= DMA_NUM_DEV)
-               return -EINVAL;
-#endif
-
-       for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++)
-               if (au1000_dma_table[i].dev_id < 0)
-                       break;
-
-       if (i == NUM_AU1000_DMA_CHANNELS)
-               return -ENODEV;
-
-       chan = &au1000_dma_table[i];
-
-       if (dev_id >= DMA_NUM_DEV) {
-               dev_id -= DMA_NUM_DEV;
-               dev = &dma_dev_table_bank2[dev_id];
-       } else
-               dev = &dma_dev_table[dev_id];
-
-       if (irqhandler) {
-               chan->irq = AU1000_DMA_INT_BASE + i;
-               chan->irq_dev = irq_dev_id;
-               ret = request_irq(chan->irq, irqhandler, irqflags, dev_str,
-                                 chan->irq_dev);
-               if (ret) {
-                       chan->irq = 0;
-                       chan->irq_dev = NULL;
-                       return ret;
-               }
-       } else {
-               chan->irq = 0;
-               chan->irq_dev = NULL;
-       }
-
-       /* fill it in */
-       chan->io = DMA_CHANNEL_BASE + i * DMA_CHANNEL_LEN;
-       chan->dev_id = dev_id;
-       chan->dev_str = dev_str;
-       chan->fifo_addr = dev->fifo_addr;
-       chan->mode = dev->dma_mode;
-
-       /* initialize the channel before returning */
-       init_dma(i);
-
-       return i;
-}
-EXPORT_SYMBOL(request_au1000_dma);
-
-void free_au1000_dma(unsigned int dmanr)
-{
-       struct dma_chan *chan = get_dma_chan(dmanr);
-
-       if (!chan) {
-               printk(KERN_ERR "Error trying to free DMA%d\n", dmanr);
-               return;
-       }
-
-       disable_dma(dmanr);
-       if (chan->irq)
-               free_irq(chan->irq, chan->irq_dev);
-
-       chan->irq = 0;
-       chan->irq_dev = NULL;
-       chan->dev_id = -1;
-}
-EXPORT_SYMBOL(free_au1000_dma);
-
-#endif /* AU1000 AU1500 AU1100 */
diff --git a/arch/mips/au1000/common/gpio.c b/arch/mips/au1000/common/gpio.c
deleted file mode 100644 (file)
index e660ddd..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright (C) 2007, OpenWrt.org, Florian Fainelli <florian@openwrt.org>
- *     Architecture specific GPIO support
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *  Notes :
- *     au1000 SoC have only one GPIO line : GPIO1
- *     others have a second one : GPIO2
- */
-
-#include <linux/module.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/gpio.h>
-
-#define gpio1 sys
-#if !defined(CONFIG_SOC_AU1000)
-
-static struct au1x00_gpio2 *const gpio2 = (struct au1x00_gpio2 *) GPIO2_BASE;
-#define GPIO2_OUTPUT_ENABLE_MASK       0x00010000
-
-static int au1xxx_gpio2_read(unsigned gpio)
-{
-       gpio -= AU1XXX_GPIO_BASE;
-       return ((gpio2->pinstate >> gpio) & 0x01);
-}
-
-static void au1xxx_gpio2_write(unsigned gpio, int value)
-{
-       gpio -= AU1XXX_GPIO_BASE;
-
-       gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << gpio) | ((!!value) << gpio);
-}
-
-static int au1xxx_gpio2_direction_input(unsigned gpio)
-{
-       gpio -= AU1XXX_GPIO_BASE;
-       gpio2->dir &= ~(0x01 << gpio);
-       return 0;
-}
-
-static int au1xxx_gpio2_direction_output(unsigned gpio, int value)
-{
-       gpio -= AU1XXX_GPIO_BASE;
-       gpio2->dir |= 0x01 << gpio;
-       gpio2->output = (GPIO2_OUTPUT_ENABLE_MASK << gpio) | ((!!value) << gpio);
-       return 0;
-}
-
-#endif /* !defined(CONFIG_SOC_AU1000) */
-
-static int au1xxx_gpio1_read(unsigned gpio)
-{
-       return (gpio1->pinstaterd >> gpio) & 0x01;
-}
-
-static void au1xxx_gpio1_write(unsigned gpio, int value)
-{
-       if (value)
-               gpio1->outputset = (0x01 << gpio);
-       else
-               /* Output a zero */
-               gpio1->outputclr = (0x01 << gpio);
-}
-
-static int au1xxx_gpio1_direction_input(unsigned gpio)
-{
-       gpio1->pininputen = (0x01 << gpio);
-       return 0;
-}
-
-static int au1xxx_gpio1_direction_output(unsigned gpio, int value)
-{
-       gpio1->trioutclr = (0x01 & gpio);
-       au1xxx_gpio1_write(gpio, value);
-       return 0;
-}
-
-int au1xxx_gpio_get_value(unsigned gpio)
-{
-       if (gpio >= AU1XXX_GPIO_BASE)
-#if defined(CONFIG_SOC_AU1000)
-               return 0;
-#else
-               return au1xxx_gpio2_read(gpio);
-#endif
-       else
-               return au1xxx_gpio1_read(gpio);
-}
-EXPORT_SYMBOL(au1xxx_gpio_get_value);
-
-void au1xxx_gpio_set_value(unsigned gpio, int value)
-{
-       if (gpio >= AU1XXX_GPIO_BASE)
-#if defined(CONFIG_SOC_AU1000)
-               ;
-#else
-               au1xxx_gpio2_write(gpio, value);
-#endif
-       else
-               au1xxx_gpio1_write(gpio, value);
-}
-EXPORT_SYMBOL(au1xxx_gpio_set_value);
-
-int au1xxx_gpio_direction_input(unsigned gpio)
-{
-       if (gpio >= AU1XXX_GPIO_BASE)
-#if defined(CONFIG_SOC_AU1000)
-               return -ENODEV;
-#else
-               return au1xxx_gpio2_direction_input(gpio);
-#endif
-
-       return au1xxx_gpio1_direction_input(gpio);
-}
-EXPORT_SYMBOL(au1xxx_gpio_direction_input);
-
-int au1xxx_gpio_direction_output(unsigned gpio, int value)
-{
-       if (gpio >= AU1XXX_GPIO_BASE)
-#if defined(CONFIG_SOC_AU1000)
-               return -ENODEV;
-#else
-               return au1xxx_gpio2_direction_output(gpio, value);
-#endif
-
-       return au1xxx_gpio1_direction_output(gpio, value);
-}
-EXPORT_SYMBOL(au1xxx_gpio_direction_output);
diff --git a/arch/mips/au1000/common/irq.c b/arch/mips/au1000/common/irq.c
deleted file mode 100644 (file)
index 40c6cec..0000000
+++ /dev/null
@@ -1,596 +0,0 @@
-/*
- * Copyright 2001, 2007-2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- * Copyright (C) 2007 Ralf Baechle (ralf@linux-mips.org)
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-#include <linux/bitops.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <linux/irq.h>
-
-#include <asm/irq_cpu.h>
-#include <asm/mipsregs.h>
-#include <asm/mach-au1x00/au1000.h>
-#ifdef CONFIG_MIPS_PB1000
-#include <asm/mach-pb1x00/pb1000.h>
-#endif
-
-#define EXT_INTC0_REQ0 2 /* IP 2 */
-#define EXT_INTC0_REQ1 3 /* IP 3 */
-#define EXT_INTC1_REQ0 4 /* IP 4 */
-#define EXT_INTC1_REQ1 5 /* IP 5 */
-#define MIPS_TIMER_IP  7 /* IP 7 */
-
-void (*board_init_irq)(void) __initdata = NULL;
-
-static DEFINE_SPINLOCK(irq_lock);
-
-#ifdef CONFIG_PM
-
-/*
- * Save/restore the interrupt controller state.
- * Called from the save/restore core registers as part of the
- * au_sleep function in power.c.....maybe I should just pm_register()
- * them instead?
- */
-static unsigned int    sleep_intctl_config0[2];
-static unsigned int    sleep_intctl_config1[2];
-static unsigned int    sleep_intctl_config2[2];
-static unsigned int    sleep_intctl_src[2];
-static unsigned int    sleep_intctl_assign[2];
-static unsigned int    sleep_intctl_wake[2];
-static unsigned int    sleep_intctl_mask[2];
-
-void save_au1xxx_intctl(void)
-{
-       sleep_intctl_config0[0] = au_readl(IC0_CFG0RD);
-       sleep_intctl_config1[0] = au_readl(IC0_CFG1RD);
-       sleep_intctl_config2[0] = au_readl(IC0_CFG2RD);
-       sleep_intctl_src[0] = au_readl(IC0_SRCRD);
-       sleep_intctl_assign[0] = au_readl(IC0_ASSIGNRD);
-       sleep_intctl_wake[0] = au_readl(IC0_WAKERD);
-       sleep_intctl_mask[0] = au_readl(IC0_MASKRD);
-
-       sleep_intctl_config0[1] = au_readl(IC1_CFG0RD);
-       sleep_intctl_config1[1] = au_readl(IC1_CFG1RD);
-       sleep_intctl_config2[1] = au_readl(IC1_CFG2RD);
-       sleep_intctl_src[1] = au_readl(IC1_SRCRD);
-       sleep_intctl_assign[1] = au_readl(IC1_ASSIGNRD);
-       sleep_intctl_wake[1] = au_readl(IC1_WAKERD);
-       sleep_intctl_mask[1] = au_readl(IC1_MASKRD);
-}
-
-/*
- * For most restore operations, we clear the entire register and
- * then set the bits we found during the save.
- */
-void restore_au1xxx_intctl(void)
-{
-       au_writel(0xffffffff, IC0_MASKCLR); au_sync();
-
-       au_writel(0xffffffff, IC0_CFG0CLR); au_sync();
-       au_writel(sleep_intctl_config0[0], IC0_CFG0SET); au_sync();
-       au_writel(0xffffffff, IC0_CFG1CLR); au_sync();
-       au_writel(sleep_intctl_config1[0], IC0_CFG1SET); au_sync();
-       au_writel(0xffffffff, IC0_CFG2CLR); au_sync();
-       au_writel(sleep_intctl_config2[0], IC0_CFG2SET); au_sync();
-       au_writel(0xffffffff, IC0_SRCCLR); au_sync();
-       au_writel(sleep_intctl_src[0], IC0_SRCSET); au_sync();
-       au_writel(0xffffffff, IC0_ASSIGNCLR); au_sync();
-       au_writel(sleep_intctl_assign[0], IC0_ASSIGNSET); au_sync();
-       au_writel(0xffffffff, IC0_WAKECLR); au_sync();
-       au_writel(sleep_intctl_wake[0], IC0_WAKESET); au_sync();
-       au_writel(0xffffffff, IC0_RISINGCLR); au_sync();
-       au_writel(0xffffffff, IC0_FALLINGCLR); au_sync();
-       au_writel(0x00000000, IC0_TESTBIT); au_sync();
-
-       au_writel(0xffffffff, IC1_MASKCLR); au_sync();
-
-       au_writel(0xffffffff, IC1_CFG0CLR); au_sync();
-       au_writel(sleep_intctl_config0[1], IC1_CFG0SET); au_sync();
-       au_writel(0xffffffff, IC1_CFG1CLR); au_sync();
-       au_writel(sleep_intctl_config1[1], IC1_CFG1SET); au_sync();
-       au_writel(0xffffffff, IC1_CFG2CLR); au_sync();
-       au_writel(sleep_intctl_config2[1], IC1_CFG2SET); au_sync();
-       au_writel(0xffffffff, IC1_SRCCLR); au_sync();
-       au_writel(sleep_intctl_src[1], IC1_SRCSET); au_sync();
-       au_writel(0xffffffff, IC1_ASSIGNCLR); au_sync();
-       au_writel(sleep_intctl_assign[1], IC1_ASSIGNSET); au_sync();
-       au_writel(0xffffffff, IC1_WAKECLR); au_sync();
-       au_writel(sleep_intctl_wake[1], IC1_WAKESET); au_sync();
-       au_writel(0xffffffff, IC1_RISINGCLR); au_sync();
-       au_writel(0xffffffff, IC1_FALLINGCLR); au_sync();
-       au_writel(0x00000000, IC1_TESTBIT); au_sync();
-
-       au_writel(sleep_intctl_mask[1], IC1_MASKSET); au_sync();
-
-       au_writel(sleep_intctl_mask[0], IC0_MASKSET); au_sync();
-}
-#endif /* CONFIG_PM */
-
-
-inline void local_enable_irq(unsigned int irq_nr)
-{
-       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
-
-       if (bit >= 32) {
-               au_writel(1 << (bit - 32), IC1_MASKSET);
-               au_writel(1 << (bit - 32), IC1_WAKESET);
-       } else {
-               au_writel(1 << bit, IC0_MASKSET);
-               au_writel(1 << bit, IC0_WAKESET);
-       }
-       au_sync();
-}
-
-
-inline void local_disable_irq(unsigned int irq_nr)
-{
-       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
-
-       if (bit >= 32) {
-               au_writel(1 << (bit - 32), IC1_MASKCLR);
-               au_writel(1 << (bit - 32), IC1_WAKECLR);
-       } else {
-               au_writel(1 << bit, IC0_MASKCLR);
-               au_writel(1 << bit, IC0_WAKECLR);
-       }
-       au_sync();
-}
-
-
-static inline void mask_and_ack_rise_edge_irq(unsigned int irq_nr)
-{
-       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
-
-       if (bit >= 32) {
-               au_writel(1 << (bit - 32), IC1_RISINGCLR);
-               au_writel(1 << (bit - 32), IC1_MASKCLR);
-       } else {
-               au_writel(1 << bit, IC0_RISINGCLR);
-               au_writel(1 << bit, IC0_MASKCLR);
-       }
-       au_sync();
-}
-
-
-static inline void mask_and_ack_fall_edge_irq(unsigned int irq_nr)
-{
-       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
-
-       if (bit >= 32) {
-               au_writel(1 << (bit - 32), IC1_FALLINGCLR);
-               au_writel(1 << (bit - 32), IC1_MASKCLR);
-       } else {
-               au_writel(1 << bit, IC0_FALLINGCLR);
-               au_writel(1 << bit, IC0_MASKCLR);
-       }
-       au_sync();
-}
-
-
-static inline void mask_and_ack_either_edge_irq(unsigned int irq_nr)
-{
-       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
-
-       /*
-        * This may assume that we don't get interrupts from
-        * both edges at once, or if we do, that we don't care.
-        */
-       if (bit >= 32) {
-               au_writel(1 << (bit - 32), IC1_FALLINGCLR);
-               au_writel(1 << (bit - 32), IC1_RISINGCLR);
-               au_writel(1 << (bit - 32), IC1_MASKCLR);
-       } else {
-               au_writel(1 << bit, IC0_FALLINGCLR);
-               au_writel(1 << bit, IC0_RISINGCLR);
-               au_writel(1 << bit, IC0_MASKCLR);
-       }
-       au_sync();
-}
-
-static inline void mask_and_ack_level_irq(unsigned int irq_nr)
-{
-       local_disable_irq(irq_nr);
-       au_sync();
-#if defined(CONFIG_MIPS_PB1000)
-       if (irq_nr == AU1000_GPIO_15) {
-               au_writel(0x8000, PB1000_MDR); /* ack int */
-               au_sync();
-       }
-#endif
-}
-
-static void end_irq(unsigned int irq_nr)
-{
-       if (!(irq_desc[irq_nr].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
-               local_enable_irq(irq_nr);
-
-#if defined(CONFIG_MIPS_PB1000)
-       if (irq_nr == AU1000_GPIO_15) {
-               au_writel(0x4000, PB1000_MDR); /* enable int */
-               au_sync();
-       }
-#endif
-}
-
-unsigned long save_local_and_disable(int controller)
-{
-       int i;
-       unsigned long flags, mask;
-
-       spin_lock_irqsave(&irq_lock, flags);
-       if (controller) {
-               mask = au_readl(IC1_MASKSET);
-               for (i = 32; i < 64; i++)
-                       local_disable_irq(i);
-       } else {
-               mask = au_readl(IC0_MASKSET);
-               for (i = 0; i < 32; i++)
-                       local_disable_irq(i);
-       }
-       spin_unlock_irqrestore(&irq_lock, flags);
-
-       return mask;
-}
-
-void restore_local_and_enable(int controller, unsigned long mask)
-{
-       int i;
-       unsigned long flags, new_mask;
-
-       spin_lock_irqsave(&irq_lock, flags);
-       for (i = 0; i < 32; i++)
-               if (mask & (1 << i)) {
-                       if (controller)
-                               local_enable_irq(i + 32);
-                       else
-                               local_enable_irq(i);
-               }
-
-       if (controller)
-               new_mask = au_readl(IC1_MASKSET);
-       else
-               new_mask = au_readl(IC0_MASKSET);
-
-       spin_unlock_irqrestore(&irq_lock, flags);
-}
-
-
-static struct irq_chip rise_edge_irq_type = {
-       .name           = "Au1000 Rise Edge",
-       .ack            = mask_and_ack_rise_edge_irq,
-       .mask           = local_disable_irq,
-       .mask_ack       = mask_and_ack_rise_edge_irq,
-       .unmask         = local_enable_irq,
-       .end            = end_irq,
-};
-
-static struct irq_chip fall_edge_irq_type = {
-       .name           = "Au1000 Fall Edge",
-       .ack            = mask_and_ack_fall_edge_irq,
-       .mask           = local_disable_irq,
-       .mask_ack       = mask_and_ack_fall_edge_irq,
-       .unmask         = local_enable_irq,
-       .end            = end_irq,
-};
-
-static struct irq_chip either_edge_irq_type = {
-       .name           = "Au1000 Rise or Fall Edge",
-       .ack            = mask_and_ack_either_edge_irq,
-       .mask           = local_disable_irq,
-       .mask_ack       = mask_and_ack_either_edge_irq,
-       .unmask         = local_enable_irq,
-       .end            = end_irq,
-};
-
-static struct irq_chip level_irq_type = {
-       .name           = "Au1000 Level",
-       .ack            = mask_and_ack_level_irq,
-       .mask           = local_disable_irq,
-       .mask_ack       = mask_and_ack_level_irq,
-       .unmask         = local_enable_irq,
-       .end            = end_irq,
-};
-
-static void __init setup_local_irq(unsigned int irq_nr, int type, int int_req)
-{
-       unsigned int bit = irq_nr - AU1000_INTC0_INT_BASE;
-
-       if (irq_nr > AU1000_MAX_INTR)
-               return;
-
-       /* Config2[n], Config1[n], Config0[n] */
-       if (bit >= 32) {
-               switch (type) {
-               case INTC_INT_RISE_EDGE: /* 0:0:1 */
-                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG0SET);
-                       set_irq_chip(irq_nr, &rise_edge_irq_type);
-                       break;
-               case INTC_INT_FALL_EDGE: /* 0:1:0 */
-                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG1SET);
-                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
-                       set_irq_chip(irq_nr, &fall_edge_irq_type);
-                       break;
-               case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
-                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG1SET);
-                       au_writel(1 << (bit - 32), IC1_CFG0SET);
-                       set_irq_chip(irq_nr, &either_edge_irq_type);
-                       break;
-               case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
-                       au_writel(1 << (bit - 32), IC1_CFG2SET);
-                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG0SET);
-                       set_irq_chip(irq_nr, &level_irq_type);
-                       break;
-               case INTC_INT_LOW_LEVEL: /* 1:1:0 */
-                       au_writel(1 << (bit - 32), IC1_CFG2SET);
-                       au_writel(1 << (bit - 32), IC1_CFG1SET);
-                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
-                       set_irq_chip(irq_nr, &level_irq_type);
-                       break;
-               case INTC_INT_DISABLED: /* 0:0:0 */
-                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
-                       break;
-               default: /* disable the interrupt */
-                       printk(KERN_WARNING "unexpected int type %d (irq %d)\n",
-                              type, irq_nr);
-                       au_writel(1 << (bit - 32), IC1_CFG0CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG1CLR);
-                       au_writel(1 << (bit - 32), IC1_CFG2CLR);
-                       return;
-               }
-               if (int_req) /* assign to interrupt request 1 */
-                       au_writel(1 << (bit - 32), IC1_ASSIGNCLR);
-               else         /* assign to interrupt request 0 */
-                       au_writel(1 << (bit - 32), IC1_ASSIGNSET);
-               au_writel(1 << (bit - 32), IC1_SRCSET);
-               au_writel(1 << (bit - 32), IC1_MASKCLR);
-               au_writel(1 << (bit - 32), IC1_WAKECLR);
-       } else {
-               switch (type) {
-               case INTC_INT_RISE_EDGE: /* 0:0:1 */
-                       au_writel(1 << bit, IC0_CFG2CLR);
-                       au_writel(1 << bit, IC0_CFG1CLR);
-                       au_writel(1 << bit, IC0_CFG0SET);
-                       set_irq_chip(irq_nr, &rise_edge_irq_type);
-                       break;
-               case INTC_INT_FALL_EDGE: /* 0:1:0 */
-                       au_writel(1 << bit, IC0_CFG2CLR);
-                       au_writel(1 << bit, IC0_CFG1SET);
-                       au_writel(1 << bit, IC0_CFG0CLR);
-                       set_irq_chip(irq_nr, &fall_edge_irq_type);
-                       break;
-               case INTC_INT_RISE_AND_FALL_EDGE: /* 0:1:1 */
-                       au_writel(1 << bit, IC0_CFG2CLR);
-                       au_writel(1 << bit, IC0_CFG1SET);
-                       au_writel(1 << bit, IC0_CFG0SET);
-                       set_irq_chip(irq_nr, &either_edge_irq_type);
-                       break;
-               case INTC_INT_HIGH_LEVEL: /* 1:0:1 */
-                       au_writel(1 << bit, IC0_CFG2SET);
-                       au_writel(1 << bit, IC0_CFG1CLR);
-                       au_writel(1 << bit, IC0_CFG0SET);
-                       set_irq_chip(irq_nr, &level_irq_type);
-                       break;
-               case INTC_INT_LOW_LEVEL: /* 1:1:0 */
-                       au_writel(1 << bit, IC0_CFG2SET);
-                       au_writel(1 << bit, IC0_CFG1SET);
-                       au_writel(1 << bit, IC0_CFG0CLR);
-                       set_irq_chip(irq_nr, &level_irq_type);
-                       break;
-               case INTC_INT_DISABLED: /* 0:0:0 */
-                       au_writel(1 << bit, IC0_CFG0CLR);
-                       au_writel(1 << bit, IC0_CFG1CLR);
-                       au_writel(1 << bit, IC0_CFG2CLR);
-                       break;
-               default: /* disable the interrupt */
-                       printk(KERN_WARNING "unexpected int type %d (irq %d)\n",
-                              type, irq_nr);
-                       au_writel(1 << bit, IC0_CFG0CLR);
-                       au_writel(1 << bit, IC0_CFG1CLR);
-                       au_writel(1 << bit, IC0_CFG2CLR);
-                       return;
-               }
-               if (int_req) /* assign to interrupt request 1 */
-                       au_writel(1 << bit, IC0_ASSIGNCLR);
-               else         /* assign to interrupt request 0 */
-                       au_writel(1 << bit, IC0_ASSIGNSET);
-               au_writel(1 << bit, IC0_SRCSET);
-               au_writel(1 << bit, IC0_MASKCLR);
-               au_writel(1 << bit, IC0_WAKECLR);
-       }
-       au_sync();
-}
-
-/*
- * Interrupts are nested. Even if an interrupt handler is registered
- * as "fast", we might get another interrupt before we return from
- * intcX_reqX_irqdispatch().
- */
-
-static void intc0_req0_irqdispatch(void)
-{
-       static unsigned long intc0_req0;
-       unsigned int bit;
-
-       intc0_req0 |= au_readl(IC0_REQ0INT);
-
-       if (!intc0_req0)
-               return;
-
-#ifdef AU1000_USB_DEV_REQ_INT
-       /*
-        * Because of the tight timing of SETUP token to reply
-        * transactions, the USB devices-side packet complete
-        * interrupt needs the highest priority.
-        */
-       if ((intc0_req0 & (1 << AU1000_USB_DEV_REQ_INT))) {
-               intc0_req0 &= ~(1 << AU1000_USB_DEV_REQ_INT);
-               do_IRQ(AU1000_USB_DEV_REQ_INT);
-               return;
-       }
-#endif
-       bit = __ffs(intc0_req0);
-       intc0_req0 &= ~(1 << bit);
-       do_IRQ(AU1000_INTC0_INT_BASE + bit);
-}
-
-
-static void intc0_req1_irqdispatch(void)
-{
-       static unsigned long intc0_req1;
-       unsigned int bit;
-
-       intc0_req1 |= au_readl(IC0_REQ1INT);
-
-       if (!intc0_req1)
-               return;
-
-       bit = __ffs(intc0_req1);
-       intc0_req1 &= ~(1 << bit);
-       do_IRQ(AU1000_INTC0_INT_BASE + bit);
-}
-
-
-/*
- * Interrupt Controller 1:
- * interrupts 32 - 63
- */
-static void intc1_req0_irqdispatch(void)
-{
-       static unsigned long intc1_req0;
-       unsigned int bit;
-
-       intc1_req0 |= au_readl(IC1_REQ0INT);
-
-       if (!intc1_req0)
-               return;
-
-       bit = __ffs(intc1_req0);
-       intc1_req0 &= ~(1 << bit);
-       do_IRQ(AU1000_INTC1_INT_BASE + bit);
-}
-
-
-static void intc1_req1_irqdispatch(void)
-{
-       static unsigned long intc1_req1;
-       unsigned int bit;
-
-       intc1_req1 |= au_readl(IC1_REQ1INT);
-
-       if (!intc1_req1)
-               return;
-
-       bit = __ffs(intc1_req1);
-       intc1_req1 &= ~(1 << bit);
-       do_IRQ(AU1000_INTC1_INT_BASE + bit);
-}
-
-asmlinkage void plat_irq_dispatch(void)
-{
-       unsigned int pending = read_c0_status() & read_c0_cause();
-
-       if (pending & CAUSEF_IP7)
-               do_IRQ(MIPS_CPU_IRQ_BASE + 7);
-       else if (pending & CAUSEF_IP2)
-               intc0_req0_irqdispatch();
-       else if (pending & CAUSEF_IP3)
-               intc0_req1_irqdispatch();
-       else if (pending & CAUSEF_IP4)
-               intc1_req0_irqdispatch();
-       else if (pending  & CAUSEF_IP5)
-               intc1_req1_irqdispatch();
-       else
-               spurious_interrupt();
-}
-
-void __init arch_init_irq(void)
-{
-       int i;
-       struct au1xxx_irqmap *imp;
-       extern struct au1xxx_irqmap au1xxx_irq_map[];
-       extern struct au1xxx_irqmap au1xxx_ic0_map[];
-       extern int au1xxx_nr_irqs;
-       extern int au1xxx_ic0_nr_irqs;
-
-       /*
-        * Initialize interrupt controllers to a safe state.
-        */
-       au_writel(0xffffffff, IC0_CFG0CLR);
-       au_writel(0xffffffff, IC0_CFG1CLR);
-       au_writel(0xffffffff, IC0_CFG2CLR);
-       au_writel(0xffffffff, IC0_MASKCLR);
-       au_writel(0xffffffff, IC0_ASSIGNSET);
-       au_writel(0xffffffff, IC0_WAKECLR);
-       au_writel(0xffffffff, IC0_SRCSET);
-       au_writel(0xffffffff, IC0_FALLINGCLR);
-       au_writel(0xffffffff, IC0_RISINGCLR);
-       au_writel(0x00000000, IC0_TESTBIT);
-
-       au_writel(0xffffffff, IC1_CFG0CLR);
-       au_writel(0xffffffff, IC1_CFG1CLR);
-       au_writel(0xffffffff, IC1_CFG2CLR);
-       au_writel(0xffffffff, IC1_MASKCLR);
-       au_writel(0xffffffff, IC1_ASSIGNSET);
-       au_writel(0xffffffff, IC1_WAKECLR);
-       au_writel(0xffffffff, IC1_SRCSET);
-       au_writel(0xffffffff, IC1_FALLINGCLR);
-       au_writel(0xffffffff, IC1_RISINGCLR);
-       au_writel(0x00000000, IC1_TESTBIT);
-
-       mips_cpu_irq_init();
-
-       /*
-        * Initialize IC0, which is fixed per processor.
-        */
-       imp = au1xxx_ic0_map;
-       for (i = 0; i < au1xxx_ic0_nr_irqs; i++) {
-               setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
-               imp++;
-       }
-
-       /*
-        * Now set up the irq mapping for the board.
-        */
-       imp = au1xxx_irq_map;
-       for (i = 0; i < au1xxx_nr_irqs; i++) {
-               setup_local_irq(imp->im_irq, imp->im_type, imp->im_request);
-               imp++;
-       }
-
-       set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4);
-
-       /* Board specific IRQ initialization.
-       */
-       if (board_init_irq)
-               board_init_irq();
-}
diff --git a/arch/mips/au1000/common/pci.c b/arch/mips/au1000/common/pci.c
deleted file mode 100644 (file)
index 7866cf5..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Alchemy/AMD Au1x00 PCI support.
- *
- * Copyright 2001-2003, 2007-2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- * Copyright (C) 2004 by Ralf Baechle (ralf@linux-mips.org)
- *
- *  Support for all devices (greater than 16) added by David Gathright.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/pci.h>
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-/* TBD */
-static struct resource pci_io_resource = {
-       .start  = PCI_IO_START,
-       .end    = PCI_IO_END,
-       .name   = "PCI IO space",
-       .flags  = IORESOURCE_IO
-};
-
-static struct resource pci_mem_resource = {
-       .start  = PCI_MEM_START,
-       .end    = PCI_MEM_END,
-       .name   = "PCI memory space",
-       .flags  = IORESOURCE_MEM
-};
-
-extern struct pci_ops au1x_pci_ops;
-
-static struct pci_controller au1x_controller = {
-       .pci_ops        = &au1x_pci_ops,
-       .io_resource    = &pci_io_resource,
-       .mem_resource   = &pci_mem_resource,
-};
-
-#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
-static unsigned long virt_io_addr;
-#endif
-
-static int __init au1x_pci_setup(void)
-{
-       extern void au1x_pci_cfg_init(void);
-
-#if defined(CONFIG_SOC_AU1500) || defined(CONFIG_SOC_AU1550)
-       virt_io_addr = (unsigned long)ioremap(Au1500_PCI_IO_START,
-                       Au1500_PCI_IO_END - Au1500_PCI_IO_START + 1);
-
-       if (!virt_io_addr) {
-               printk(KERN_ERR "Unable to ioremap pci space\n");
-               return 1;
-       }
-       au1x_controller.io_map_base = virt_io_addr;
-
-#ifdef CONFIG_DMA_NONCOHERENT
-       {
-               /*
-                *  Set the NC bit in controller for Au1500 pre-AC silicon
-                */
-               u32 prid = read_c0_prid();
-
-               if ((prid & 0xFF000000) == 0x01000000 && prid < 0x01030202) {
-                       au_writel((1 << 16) | au_readl(Au1500_PCI_CFG),
-                                 Au1500_PCI_CFG);
-                       printk(KERN_INFO "Non-coherent PCI accesses enabled\n");
-               }
-       }
-#endif
-
-       set_io_port_base(virt_io_addr);
-#endif
-
-       au1x_pci_cfg_init();
-
-       register_pci_controller(&au1x_controller);
-       return 0;
-}
-
-arch_initcall(au1x_pci_setup);
diff --git a/arch/mips/au1000/common/platform.c b/arch/mips/au1000/common/platform.c
deleted file mode 100644 (file)
index dc8a67e..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Platform device support for Au1x00 SoCs.
- *
- * Copyright 2004, Matt Porter <mporter@kernel.crashing.org>
- *
- * (C) Copyright Embedded Alley Solutions, Inc 2005
- * Author: Pantelis Antoniou <pantelis@embeddedalley.com>
- *
- * This file is licensed under the terms of the GNU General Public
- * License version 2.  This program is licensed "as is" without any
- * warranty of any kind, whether express or implied.
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/platform_device.h>
-#include <linux/serial_8250.h>
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1xxx.h>
-
-#define PORT(_base, _irq)                              \
-       {                                               \
-               .iobase         = _base,                \
-               .membase        = (void __iomem *)_base,\
-               .mapbase        = CPHYSADDR(_base),     \
-               .irq            = _irq,                 \
-               .regshift       = 2,                    \
-               .iotype         = UPIO_AU,              \
-               .flags          = UPF_SKIP_TEST         \
-       }
-
-static struct plat_serial8250_port au1x00_uart_data[] = {
-#if defined(CONFIG_SERIAL_8250_AU1X00)
-#if defined(CONFIG_SOC_AU1000)
-       PORT(UART0_ADDR, AU1000_UART0_INT),
-       PORT(UART1_ADDR, AU1000_UART1_INT),
-       PORT(UART2_ADDR, AU1000_UART2_INT),
-       PORT(UART3_ADDR, AU1000_UART3_INT),
-#elif defined(CONFIG_SOC_AU1500)
-       PORT(UART0_ADDR, AU1500_UART0_INT),
-       PORT(UART3_ADDR, AU1500_UART3_INT),
-#elif defined(CONFIG_SOC_AU1100)
-       PORT(UART0_ADDR, AU1100_UART0_INT),
-       PORT(UART1_ADDR, AU1100_UART1_INT),
-       PORT(UART3_ADDR, AU1100_UART3_INT),
-#elif defined(CONFIG_SOC_AU1550)
-       PORT(UART0_ADDR, AU1550_UART0_INT),
-       PORT(UART1_ADDR, AU1550_UART1_INT),
-       PORT(UART3_ADDR, AU1550_UART3_INT),
-#elif defined(CONFIG_SOC_AU1200)
-       PORT(UART0_ADDR, AU1200_UART0_INT),
-       PORT(UART1_ADDR, AU1200_UART1_INT),
-#endif
-#endif /* CONFIG_SERIAL_8250_AU1X00 */
-       { },
-};
-
-static struct platform_device au1xx0_uart_device = {
-       .name                   = "serial8250",
-       .id                     = PLAT8250_DEV_AU1X00,
-       .dev                    = {
-               .platform_data  = au1x00_uart_data,
-       },
-};
-
-/* OHCI (USB full speed host controller) */
-static struct resource au1xxx_usb_ohci_resources[] = {
-       [0] = {
-               .start          = USB_OHCI_BASE,
-               .end            = USB_OHCI_BASE + USB_OHCI_LEN - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = AU1000_USB_HOST_INT,
-               .end            = AU1000_USB_HOST_INT,
-               .flags          = IORESOURCE_IRQ,
-       },
-};
-
-/* The dmamask must be set for OHCI to work */
-static u64 ohci_dmamask = DMA_32BIT_MASK;
-
-static struct platform_device au1xxx_usb_ohci_device = {
-       .name           = "au1xxx-ohci",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &ohci_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(au1xxx_usb_ohci_resources),
-       .resource       = au1xxx_usb_ohci_resources,
-};
-
-/*** AU1100 LCD controller ***/
-
-#ifdef CONFIG_FB_AU1100
-static struct resource au1100_lcd_resources[] = {
-       [0] = {
-               .start          = LCD_PHYS_ADDR,
-               .end            = LCD_PHYS_ADDR + 0x800 - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = AU1100_LCD_INT,
-               .end            = AU1100_LCD_INT,
-               .flags          = IORESOURCE_IRQ,
-       }
-};
-
-static u64 au1100_lcd_dmamask = DMA_32BIT_MASK;
-
-static struct platform_device au1100_lcd_device = {
-       .name           = "au1100-lcd",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1100_lcd_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(au1100_lcd_resources),
-       .resource       = au1100_lcd_resources,
-};
-#endif
-
-#ifdef CONFIG_SOC_AU1200
-/* EHCI (USB high speed host controller) */
-static struct resource au1xxx_usb_ehci_resources[] = {
-       [0] = {
-               .start          = USB_EHCI_BASE,
-               .end            = USB_EHCI_BASE + USB_EHCI_LEN - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = AU1000_USB_HOST_INT,
-               .end            = AU1000_USB_HOST_INT,
-               .flags          = IORESOURCE_IRQ,
-       },
-};
-
-static u64 ehci_dmamask = DMA_32BIT_MASK;
-
-static struct platform_device au1xxx_usb_ehci_device = {
-       .name           = "au1xxx-ehci",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &ehci_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(au1xxx_usb_ehci_resources),
-       .resource       = au1xxx_usb_ehci_resources,
-};
-
-/* Au1200 UDC (USB gadget controller) */
-static struct resource au1xxx_usb_gdt_resources[] = {
-       [0] = {
-               .start          = USB_UDC_BASE,
-               .end            = USB_UDC_BASE + USB_UDC_LEN - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = AU1200_USB_INT,
-               .end            = AU1200_USB_INT,
-               .flags          = IORESOURCE_IRQ,
-       },
-};
-
-static struct resource au1xxx_mmc_resources[] = {
-       [0] = {
-               .start          = SD0_PHYS_ADDR,
-               .end            = SD0_PHYS_ADDR + 0x7ffff,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = SD1_PHYS_ADDR,
-               .end            = SD1_PHYS_ADDR + 0x7ffff,
-               .flags          = IORESOURCE_MEM,
-       },
-       [2] = {
-               .start          = AU1200_SD_INT,
-               .end            = AU1200_SD_INT,
-               .flags          = IORESOURCE_IRQ,
-       }
-};
-
-static u64 udc_dmamask = DMA_32BIT_MASK;
-
-static struct platform_device au1xxx_usb_gdt_device = {
-       .name           = "au1xxx-udc",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &udc_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(au1xxx_usb_gdt_resources),
-       .resource       = au1xxx_usb_gdt_resources,
-};
-
-/* Au1200 UOC (USB OTG controller) */
-static struct resource au1xxx_usb_otg_resources[] = {
-       [0] = {
-               .start          = USB_UOC_BASE,
-               .end            = USB_UOC_BASE + USB_UOC_LEN - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = AU1200_USB_INT,
-               .end            = AU1200_USB_INT,
-               .flags          = IORESOURCE_IRQ,
-       },
-};
-
-static u64 uoc_dmamask = DMA_32BIT_MASK;
-
-static struct platform_device au1xxx_usb_otg_device = {
-       .name           = "au1xxx-uoc",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &uoc_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(au1xxx_usb_otg_resources),
-       .resource       = au1xxx_usb_otg_resources,
-};
-
-static struct resource au1200_lcd_resources[] = {
-       [0] = {
-               .start          = LCD_PHYS_ADDR,
-               .end            = LCD_PHYS_ADDR + 0x800 - 1,
-               .flags          = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start          = AU1200_LCD_INT,
-               .end            = AU1200_LCD_INT,
-               .flags          = IORESOURCE_IRQ,
-       }
-};
-
-static u64 au1200_lcd_dmamask = DMA_32BIT_MASK;
-
-static struct platform_device au1200_lcd_device = {
-       .name           = "au1200-lcd",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &au1200_lcd_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(au1200_lcd_resources),
-       .resource       = au1200_lcd_resources,
-};
-
-static u64 au1xxx_mmc_dmamask =  DMA_32BIT_MASK;
-
-static struct platform_device au1xxx_mmc_device = {
-       .name = "au1xxx-mmc",
-       .id = 0,
-       .dev = {
-               .dma_mask               = &au1xxx_mmc_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(au1xxx_mmc_resources),
-       .resource       = au1xxx_mmc_resources,
-};
-#endif /* #ifdef CONFIG_SOC_AU1200 */
-
-static struct platform_device au1x00_pcmcia_device = {
-       .name           = "au1x00-pcmcia",
-       .id             = 0,
-};
-
-/* All Alchemy demoboards with I2C have this #define in their headers */
-#ifdef SMBUS_PSC_BASE
-static struct resource pbdb_smbus_resources[] = {
-       {
-               .start  = CPHYSADDR(SMBUS_PSC_BASE),
-               .end    = CPHYSADDR(SMBUS_PSC_BASE + 0xfffff),
-               .flags  = IORESOURCE_MEM,
-       },
-};
-
-static struct platform_device pbdb_smbus_device = {
-       .name           = "au1xpsc_smbus",
-       .id             = 0,    /* bus number */
-       .num_resources  = ARRAY_SIZE(pbdb_smbus_resources),
-       .resource       = pbdb_smbus_resources,
-};
-#endif
-
-static struct platform_device *au1xxx_platform_devices[] __initdata = {
-       &au1xx0_uart_device,
-       &au1xxx_usb_ohci_device,
-       &au1x00_pcmcia_device,
-#ifdef CONFIG_FB_AU1100
-       &au1100_lcd_device,
-#endif
-#ifdef CONFIG_SOC_AU1200
-       &au1xxx_usb_ehci_device,
-       &au1xxx_usb_gdt_device,
-       &au1xxx_usb_otg_device,
-       &au1200_lcd_device,
-       &au1xxx_mmc_device,
-#endif
-#ifdef SMBUS_PSC_BASE
-       &pbdb_smbus_device,
-#endif
-};
-
-static int __init au1xxx_platform_init(void)
-{
-       unsigned int uartclk = get_au1x00_uart_baud_base() * 16;
-       int i;
-
-       /* Fill up uartclk. */
-       for (i = 0; au1x00_uart_data[i].flags; i++)
-               au1x00_uart_data[i].uartclk = uartclk;
-
-       return platform_add_devices(au1xxx_platform_devices,
-                                   ARRAY_SIZE(au1xxx_platform_devices));
-}
-
-arch_initcall(au1xxx_platform_init);
diff --git a/arch/mips/au1000/common/power.c b/arch/mips/au1000/common/power.c
deleted file mode 100644 (file)
index bd854a6..0000000
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xx0 Power Management routines.
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  Some of the routines are right out of init/main.c, whose
- *  copyrights apply here.
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/pm.h>
-#include <linux/sysctl.h>
-#include <linux/jiffies.h>
-
-#include <asm/uaccess.h>
-#include <asm/cacheflush.h>
-#include <asm/mach-au1x00/au1000.h>
-
-#ifdef CONFIG_PM
-
-#define DEBUG 1
-#ifdef DEBUG
-#define DPRINTK(fmt, args...)  printk(KERN_DEBUG "%s: " fmt, __func__, ## args)
-#else
-#define DPRINTK(fmt, args...)
-#endif
-
-static void au1000_calibrate_delay(void);
-
-extern unsigned long save_local_and_disable(int controller);
-extern void restore_local_and_enable(int controller, unsigned long mask);
-extern void local_enable_irq(unsigned int irq_nr);
-
-static DEFINE_SPINLOCK(pm_lock);
-
-/*
- * We need to save/restore a bunch of core registers that are
- * either volatile or reset to some state across a processor sleep.
- * If reading a register doesn't provide a proper result for a
- * later restore, we have to provide a function for loading that
- * register and save a copy.
- *
- * We only have to save/restore registers that aren't otherwise
- * done as part of a driver pm_* function.
- */
-static unsigned int    sleep_aux_pll_cntrl;
-static unsigned int    sleep_cpu_pll_cntrl;
-static unsigned int    sleep_pin_function;
-static unsigned int    sleep_uart0_inten;
-static unsigned int    sleep_uart0_fifoctl;
-static unsigned int    sleep_uart0_linectl;
-static unsigned int    sleep_uart0_clkdiv;
-static unsigned int    sleep_uart0_enable;
-static unsigned int    sleep_usbhost_enable;
-static unsigned int    sleep_usbdev_enable;
-static unsigned int    sleep_static_memctlr[4][3];
-
-/*
- * Define this to cause the value you write to /proc/sys/pm/sleep to
- * set the TOY timer for the amount of time you want to sleep.
- * This is done mainly for testing, but may be useful in other cases.
- * The value is number of 32KHz ticks to sleep.
- */
-#define SLEEP_TEST_TIMEOUT 1
-#ifdef SLEEP_TEST_TIMEOUT
-static int sleep_ticks;
-void wakeup_counter0_set(int ticks);
-#endif
-
-static void save_core_regs(void)
-{
-       extern void save_au1xxx_intctl(void);
-       extern void pm_eth0_shutdown(void);
-
-       /*
-        * Do the serial ports.....these really should be a pm_*
-        * registered function by the driver......but of course the
-        * standard serial driver doesn't understand our Au1xxx
-        * unique registers.
-        */
-       sleep_uart0_inten = au_readl(UART0_ADDR + UART_IER);
-       sleep_uart0_fifoctl = au_readl(UART0_ADDR + UART_FCR);
-       sleep_uart0_linectl = au_readl(UART0_ADDR + UART_LCR);
-       sleep_uart0_clkdiv = au_readl(UART0_ADDR + UART_CLK);
-       sleep_uart0_enable = au_readl(UART0_ADDR + UART_MOD_CNTRL);
-
-       /* Shutdown USB host/device. */
-       sleep_usbhost_enable = au_readl(USB_HOST_CONFIG);
-
-       /* There appears to be some undocumented reset register.... */
-       au_writel(0, 0xb0100004); au_sync();
-       au_writel(0, USB_HOST_CONFIG); au_sync();
-
-       sleep_usbdev_enable = au_readl(USBD_ENABLE);
-       au_writel(0, USBD_ENABLE); au_sync();
-
-       /* Save interrupt controller state. */
-       save_au1xxx_intctl();
-
-       /* Clocks and PLLs. */
-       sleep_aux_pll_cntrl = au_readl(SYS_AUXPLL);
-
-       /*
-        * We don't really need to do this one, but unless we
-        * write it again it won't have a valid value if we
-        * happen to read it.
-        */
-       sleep_cpu_pll_cntrl = au_readl(SYS_CPUPLL);
-
-       sleep_pin_function = au_readl(SYS_PINFUNC);
-
-       /* Save the static memory controller configuration. */
-       sleep_static_memctlr[0][0] = au_readl(MEM_STCFG0);
-       sleep_static_memctlr[0][1] = au_readl(MEM_STTIME0);
-       sleep_static_memctlr[0][2] = au_readl(MEM_STADDR0);
-       sleep_static_memctlr[1][0] = au_readl(MEM_STCFG1);
-       sleep_static_memctlr[1][1] = au_readl(MEM_STTIME1);
-       sleep_static_memctlr[1][2] = au_readl(MEM_STADDR1);
-       sleep_static_memctlr[2][0] = au_readl(MEM_STCFG2);
-       sleep_static_memctlr[2][1] = au_readl(MEM_STTIME2);
-       sleep_static_memctlr[2][2] = au_readl(MEM_STADDR2);
-       sleep_static_memctlr[3][0] = au_readl(MEM_STCFG3);
-       sleep_static_memctlr[3][1] = au_readl(MEM_STTIME3);
-       sleep_static_memctlr[3][2] = au_readl(MEM_STADDR3);
-}
-
-static void restore_core_regs(void)
-{
-       extern void restore_au1xxx_intctl(void);
-       extern void wakeup_counter0_adjust(void);
-
-       au_writel(sleep_aux_pll_cntrl, SYS_AUXPLL); au_sync();
-       au_writel(sleep_cpu_pll_cntrl, SYS_CPUPLL); au_sync();
-       au_writel(sleep_pin_function, SYS_PINFUNC); au_sync();
-
-       /* Restore the static memory controller configuration. */
-       au_writel(sleep_static_memctlr[0][0], MEM_STCFG0);
-       au_writel(sleep_static_memctlr[0][1], MEM_STTIME0);
-       au_writel(sleep_static_memctlr[0][2], MEM_STADDR0);
-       au_writel(sleep_static_memctlr[1][0], MEM_STCFG1);
-       au_writel(sleep_static_memctlr[1][1], MEM_STTIME1);
-       au_writel(sleep_static_memctlr[1][2], MEM_STADDR1);
-       au_writel(sleep_static_memctlr[2][0], MEM_STCFG2);
-       au_writel(sleep_static_memctlr[2][1], MEM_STTIME2);
-       au_writel(sleep_static_memctlr[2][2], MEM_STADDR2);
-       au_writel(sleep_static_memctlr[3][0], MEM_STCFG3);
-       au_writel(sleep_static_memctlr[3][1], MEM_STTIME3);
-       au_writel(sleep_static_memctlr[3][2], MEM_STADDR3);
-
-       /*
-        * Enable the UART if it was enabled before sleep.
-        * I guess I should define module control bits........
-        */
-       if (sleep_uart0_enable & 0x02) {
-               au_writel(0, UART0_ADDR + UART_MOD_CNTRL); au_sync();
-               au_writel(1, UART0_ADDR + UART_MOD_CNTRL); au_sync();
-               au_writel(3, UART0_ADDR + UART_MOD_CNTRL); au_sync();
-               au_writel(sleep_uart0_inten, UART0_ADDR + UART_IER); au_sync();
-               au_writel(sleep_uart0_fifoctl, UART0_ADDR + UART_FCR); au_sync();
-               au_writel(sleep_uart0_linectl, UART0_ADDR + UART_LCR); au_sync();
-               au_writel(sleep_uart0_clkdiv, UART0_ADDR + UART_CLK); au_sync();
-       }
-
-       restore_au1xxx_intctl();
-       wakeup_counter0_adjust();
-}
-
-unsigned long suspend_mode;
-
-void wakeup_from_suspend(void)
-{
-       suspend_mode = 0;
-}
-
-int au_sleep(void)
-{
-       unsigned long wakeup, flags;
-       extern void save_and_sleep(void);
-
-       spin_lock_irqsave(&pm_lock, flags);
-
-       save_core_regs();
-
-       flush_cache_all();
-
-       /**
-        ** The code below is all system dependent and we should probably
-        ** have a function call out of here to set this up.  You need
-        ** to configure the GPIO or timer interrupts that will bring
-        ** you out of sleep.
-        ** For testing, the TOY counter wakeup is useful.
-        **/
-#if 0
-       au_writel(au_readl(SYS_PINSTATERD) & ~(1 << 11), SYS_PINSTATERD);
-
-       /* GPIO 6 can cause a wake up event */
-       wakeup = au_readl(SYS_WAKEMSK);
-       wakeup &= ~(1 << 8);    /* turn off match20 wakeup */
-       wakeup |= 1 << 6;       /* turn on  GPIO  6 wakeup */
-#else
-       /* For testing, allow match20 to wake us up. */
-#ifdef SLEEP_TEST_TIMEOUT
-       wakeup_counter0_set(sleep_ticks);
-#endif
-       wakeup = 1 << 8;        /* turn on match20 wakeup   */
-       wakeup = 0;
-#endif
-       au_writel(1, SYS_WAKESRC);      /* clear cause */
-       au_sync();
-       au_writel(wakeup, SYS_WAKEMSK);
-       au_sync();
-
-       save_and_sleep();
-
-       /*
-        * After a wakeup, the cpu vectors back to 0x1fc00000, so
-        * it's up to the boot code to get us back here.
-        */
-       restore_core_regs();
-       spin_unlock_irqrestore(&pm_lock, flags);
-       return 0;
-}
-
-static int pm_do_sleep(ctl_table *ctl, int write, struct file *file,
-                      void __user *buffer, size_t *len, loff_t *ppos)
-{
-#ifdef SLEEP_TEST_TIMEOUT
-#define TMPBUFLEN2 16
-       char buf[TMPBUFLEN2], *p;
-#endif
-
-       if (!write)
-               *len = 0;
-       else {
-#ifdef SLEEP_TEST_TIMEOUT
-               if (*len > TMPBUFLEN2 - 1)
-                       return -EFAULT;
-               if (copy_from_user(buf, buffer, *len))
-                       return -EFAULT;
-               buf[*len] = 0;
-               p = buf;
-               sleep_ticks = simple_strtoul(p, &p, 0);
-#endif
-
-               au_sleep();
-       }
-       return 0;
-}
-
-static int pm_do_freq(ctl_table *ctl, int write, struct file *file,
-                     void __user *buffer, size_t *len, loff_t *ppos)
-{
-       int retval = 0, i;
-       unsigned long val, pll;
-#define TMPBUFLEN 64
-#define MAX_CPU_FREQ 396
-       char buf[TMPBUFLEN], *p;
-       unsigned long flags, intc0_mask, intc1_mask;
-       unsigned long old_baud_base, old_cpu_freq, old_clk, old_refresh;
-       unsigned long new_baud_base, new_cpu_freq, new_clk, new_refresh;
-       unsigned long baud_rate;
-
-       spin_lock_irqsave(&pm_lock, flags);
-       if (!write)
-               *len = 0;
-       else {
-               /* Parse the new frequency */
-               if (*len > TMPBUFLEN - 1) {
-                       spin_unlock_irqrestore(&pm_lock, flags);
-                       return -EFAULT;
-               }
-               if (copy_from_user(buf, buffer, *len)) {
-                       spin_unlock_irqrestore(&pm_lock, flags);
-                       return -EFAULT;
-               }
-               buf[*len] = 0;
-               p = buf;
-               val = simple_strtoul(p, &p, 0);
-               if (val > MAX_CPU_FREQ) {
-                       spin_unlock_irqrestore(&pm_lock, flags);
-                       return -EFAULT;
-               }
-
-               pll = val / 12;
-               if ((pll > 33) || (pll < 7)) {  /* 396 MHz max, 84 MHz min */
-                       /* Revisit this for higher speed CPUs */
-                       spin_unlock_irqrestore(&pm_lock, flags);
-                       return -EFAULT;
-               }
-
-               old_baud_base = get_au1x00_uart_baud_base();
-               old_cpu_freq = get_au1x00_speed();
-
-               new_cpu_freq = pll * 12 * 1000000;
-               new_baud_base = (new_cpu_freq / (2 * ((int)(au_readl(SYS_POWERCTRL)
-                                                           & 0x03) + 2) * 16));
-               set_au1x00_speed(new_cpu_freq);
-               set_au1x00_uart_baud_base(new_baud_base);
-
-               old_refresh = au_readl(MEM_SDREFCFG) & 0x1ffffff;
-               new_refresh = ((old_refresh * new_cpu_freq) / old_cpu_freq) |
-                             (au_readl(MEM_SDREFCFG) & ~0x1ffffff);
-
-               au_writel(pll, SYS_CPUPLL);
-               au_sync_delay(1);
-               au_writel(new_refresh, MEM_SDREFCFG);
-               au_sync_delay(1);
-
-               for (i = 0; i < 4; i++)
-                       if (au_readl(UART_BASE + UART_MOD_CNTRL +
-                                    i * 0x00100000) == 3) {
-                               old_clk = au_readl(UART_BASE + UART_CLK +
-                                                  i * 0x00100000);
-                               baud_rate = old_baud_base / old_clk;
-                               /*
-                                * We won't get an exact baud rate and the error
-                                * could be significant enough that our new
-                                * calculation will result in a clock that will
-                                * give us a baud rate that's too far off from
-                                * what we really want.
-                                */
-                               if (baud_rate > 100000)
-                                       baud_rate = 115200;
-                               else if (baud_rate > 50000)
-                                       baud_rate = 57600;
-                               else if (baud_rate > 30000)
-                                       baud_rate = 38400;
-                               else if (baud_rate > 17000)
-                                       baud_rate = 19200;
-                               else
-                                       baud_rate = 9600;
-                               new_clk = new_baud_base / baud_rate;
-                               au_writel(new_clk, UART_BASE + UART_CLK +
-                                         i * 0x00100000);
-                               au_sync_delay(10);
-                       }
-       }
-
-       /*
-        * We don't want _any_ interrupts other than match20. Otherwise our
-        * au1000_calibrate_delay() calculation will be off, potentially a lot.
-        */
-       intc0_mask = save_local_and_disable(0);
-       intc1_mask = save_local_and_disable(1);
-       local_enable_irq(AU1000_TOY_MATCH2_INT);
-       spin_unlock_irqrestore(&pm_lock, flags);
-       au1000_calibrate_delay();
-       restore_local_and_enable(0, intc0_mask);
-       restore_local_and_enable(1, intc1_mask);
-
-       return retval;
-}
-
-
-static struct ctl_table pm_table[] = {
-       {
-               .ctl_name       = CTL_UNNUMBERED,
-               .procname       = "sleep",
-               .data           = NULL,
-               .maxlen         = 0,
-               .mode           = 0600,
-               .proc_handler   = &pm_do_sleep
-       },
-       {
-               .ctl_name       = CTL_UNNUMBERED,
-               .procname       = "freq",
-               .data           = NULL,
-               .maxlen         = 0,
-               .mode           = 0600,
-               .proc_handler   = &pm_do_freq
-       },
-       {}
-};
-
-static struct ctl_table pm_dir_table[] = {
-       {
-               .ctl_name       = CTL_UNNUMBERED,
-               .procname       = "pm",
-               .mode           = 0555,
-               .child          = pm_table
-       },
-       {}
-};
-
-/*
- * Initialize power interface
- */
-static int __init pm_init(void)
-{
-       register_sysctl_table(pm_dir_table);
-       return 0;
-}
-
-__initcall(pm_init);
-
-/*
- * This is right out of init/main.c
- */
-
-/*
- * This is the number of bits of precision for the loops_per_jiffy.
- * Each bit takes on average 1.5/HZ seconds.  This (like the original)
- * is a little better than 1%.
- */
-#define LPS_PREC 8
-
-static void au1000_calibrate_delay(void)
-{
-       unsigned long ticks, loopbit;
-       int lps_precision = LPS_PREC;
-
-       loops_per_jiffy = 1 << 12;
-
-       while (loops_per_jiffy <<= 1) {
-               /* Wait for "start of" clock tick */
-               ticks = jiffies;
-               while (ticks == jiffies)
-                       /* nothing */ ;
-               /* Go ... */
-               ticks = jiffies;
-               __delay(loops_per_jiffy);
-               ticks = jiffies - ticks;
-               if (ticks)
-                       break;
-       }
-
-       /*
-        * Do a binary approximation to get loops_per_jiffy set to be equal
-        * one clock (up to lps_precision bits)
-        */
-       loops_per_jiffy >>= 1;
-       loopbit = loops_per_jiffy;
-       while (lps_precision-- && (loopbit >>= 1)) {
-               loops_per_jiffy |= loopbit;
-               ticks = jiffies;
-               while (ticks == jiffies);
-               ticks = jiffies;
-               __delay(loops_per_jiffy);
-               if (jiffies != ticks)   /* longer than 1 tick */
-                       loops_per_jiffy &= ~loopbit;
-       }
-}
-#endif /* CONFIG_PM */
diff --git a/arch/mips/au1000/common/prom.c b/arch/mips/au1000/common/prom.c
deleted file mode 100644 (file)
index 18b310b..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *    PROM library initialisation code, supports YAMON and U-Boot.
- *
- * Copyright 2000-2001, 2006, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- * This file was derived from Carsten Langgaard's
- * arch/mips/mips-boards/xx files.
- *
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/string.h>
-
-#include <asm/bootinfo.h>
-
-int prom_argc;
-char **prom_argv;
-char **prom_envp;
-
-char * __init_or_module prom_getcmdline(void)
-{
-       return &(arcs_cmdline[0]);
-}
-
-void prom_init_cmdline(void)
-{
-       char *cp;
-       int actr;
-
-       actr = 1; /* Always ignore argv[0] */
-
-       cp = &(arcs_cmdline[0]);
-       while (actr < prom_argc) {
-               strcpy(cp, prom_argv[actr]);
-               cp += strlen(prom_argv[actr]);
-               *cp++ = ' ';
-               actr++;
-       }
-       if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */
-               --cp;
-       if (prom_argc > 1)
-               *cp = '\0';
-}
-
-char *prom_getenv(char *envname)
-{
-       /*
-        * Return a pointer to the given environment variable.
-        * YAMON uses "name", "value" pairs, while U-Boot uses "name=value".
-        */
-
-       char **env = prom_envp;
-       int i = strlen(envname);
-       int yamon = (*env && strchr(*env, '=') == NULL);
-
-       while (*env) {
-               if (yamon) {
-                       if (strcmp(envname, *env++) == 0)
-                               return *env;
-               } else if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=')
-                       return *env + i + 1;
-               env++;
-       }
-
-       return NULL;
-}
-
-static inline unsigned char str2hexnum(unsigned char c)
-{
-       if (c >= '0' && c <= '9')
-               return c - '0';
-       if (c >= 'a' && c <= 'f')
-               return c - 'a' + 10;
-       if (c >= 'A' && c <= 'F')
-               return c - 'A' + 10;
-
-       return 0; /* foo */
-}
-
-static inline void str2eaddr(unsigned char *ea, unsigned char *str)
-{
-       int i;
-
-       for (i = 0; i < 6; i++) {
-               unsigned char num;
-
-               if ((*str == '.') || (*str == ':'))
-                       str++;
-               num  = str2hexnum(*str++) << 4;
-               num |= str2hexnum(*str++);
-               ea[i] = num;
-       }
-}
-
-int prom_get_ethernet_addr(char *ethernet_addr)
-{
-       char *ethaddr_str;
-       char *argptr;
-
-       /* Check the environment variables first */
-       ethaddr_str = prom_getenv("ethaddr");
-       if (!ethaddr_str) {
-               /* Check command line */
-               argptr = prom_getcmdline();
-               ethaddr_str = strstr(argptr, "ethaddr=");
-               if (!ethaddr_str)
-                       return -1;
-
-               ethaddr_str += strlen("ethaddr=");
-       }
-
-       str2eaddr(ethernet_addr, ethaddr_str);
-
-       return 0;
-}
-EXPORT_SYMBOL(prom_get_ethernet_addr);
-
-void __init prom_free_prom_memory(void)
-{
-}
diff --git a/arch/mips/au1000/common/puts.c b/arch/mips/au1000/common/puts.c
deleted file mode 100644 (file)
index 55bbe24..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Low level UART routines to directly access Alchemy UART.
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <asm/mach-au1x00/au1000.h>
-
-#define SERIAL_BASE   UART_BASE
-#define SER_CMD       0x7
-#define SER_DATA      0x1
-#define TX_BUSY       0x20
-
-#define TIMEOUT       0xffffff
-#define SLOW_DOWN
-
-static volatile unsigned long * const com1 = (unsigned long *)SERIAL_BASE;
-
-#ifdef SLOW_DOWN
-static inline void slow_down(void)
-{
-       int k;
-
-       for (k = 0; k < 10000; k++);
-}
-#else
-#define slow_down()
-#endif
-
-void
-prom_putchar(const unsigned char c)
-{
-       unsigned char ch;
-       int i = 0;
-
-       do {
-               ch = com1[SER_CMD];
-               slow_down();
-               i++;
-               if (i > TIMEOUT)
-                       break;
-       } while (0 == (ch & TX_BUSY));
-
-       com1[SER_DATA] = c;
-}
diff --git a/arch/mips/au1000/common/reset.c b/arch/mips/au1000/common/reset.c
deleted file mode 100644 (file)
index d555429..0000000
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Au1xx0 reset routines.
- *
- * Copyright 2001, 2006, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <asm/cacheflush.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-extern int au_sleep(void);
-
-void au1000_restart(char *command)
-{
-       /* Set all integrated peripherals to disabled states */
-       extern void board_reset(void);
-       u32 prid = read_c0_prid();
-
-       printk(KERN_NOTICE "\n** Resetting Integrated Peripherals\n");
-
-       switch (prid & 0xFF000000) {
-       case 0x00000000: /* Au1000 */
-               au_writel(0x02, 0xb0000010); /* ac97_enable */
-               au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
-               asm("sync");
-               au_writel(0x00, 0xb017fffc); /* usbh_enable */
-               au_writel(0x00, 0xb0200058); /* usbd_enable */
-               au_writel(0x00, 0xb0300040); /* ir_enable */
-               au_writel(0x00, 0xb4004104); /* mac dma */
-               au_writel(0x00, 0xb4004114); /* mac dma */
-               au_writel(0x00, 0xb4004124); /* mac dma */
-               au_writel(0x00, 0xb4004134); /* mac dma */
-               au_writel(0x00, 0xb0520000); /* macen0 */
-               au_writel(0x00, 0xb0520004); /* macen1 */
-               au_writel(0x00, 0xb1000008); /* i2s_enable  */
-               au_writel(0x00, 0xb1100100); /* uart0_enable */
-               au_writel(0x00, 0xb1200100); /* uart1_enable */
-               au_writel(0x00, 0xb1300100); /* uart2_enable */
-               au_writel(0x00, 0xb1400100); /* uart3_enable */
-               au_writel(0x02, 0xb1600100); /* ssi0_enable */
-               au_writel(0x02, 0xb1680100); /* ssi1_enable */
-               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
-               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
-               au_writel(0x00, 0xb1900028); /* sys_clksrc */
-               au_writel(0x10, 0xb1900060); /* sys_cpupll */
-               au_writel(0x00, 0xb1900064); /* sys_auxpll */
-               au_writel(0x00, 0xb1900100); /* sys_pininputen */
-               break;
-       case 0x01000000: /* Au1500 */
-               au_writel(0x02, 0xb0000010); /* ac97_enable */
-               au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
-               asm("sync");
-               au_writel(0x00, 0xb017fffc); /* usbh_enable */
-               au_writel(0x00, 0xb0200058); /* usbd_enable */
-               au_writel(0x00, 0xb4004104); /* mac dma */
-               au_writel(0x00, 0xb4004114); /* mac dma */
-               au_writel(0x00, 0xb4004124); /* mac dma */
-               au_writel(0x00, 0xb4004134); /* mac dma */
-               au_writel(0x00, 0xb1520000); /* macen0 */
-               au_writel(0x00, 0xb1520004); /* macen1 */
-               au_writel(0x00, 0xb1100100); /* uart0_enable */
-               au_writel(0x00, 0xb1400100); /* uart3_enable */
-               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
-               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
-               au_writel(0x00, 0xb1900028); /* sys_clksrc */
-               au_writel(0x10, 0xb1900060); /* sys_cpupll */
-               au_writel(0x00, 0xb1900064); /* sys_auxpll */
-               au_writel(0x00, 0xb1900100); /* sys_pininputen */
-               break;
-       case 0x02000000: /* Au1100 */
-               au_writel(0x02, 0xb0000010); /* ac97_enable */
-               au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
-               asm("sync");
-               au_writel(0x00, 0xb017fffc); /* usbh_enable */
-               au_writel(0x00, 0xb0200058); /* usbd_enable */
-               au_writel(0x00, 0xb0300040); /* ir_enable */
-               au_writel(0x00, 0xb4004104); /* mac dma */
-               au_writel(0x00, 0xb4004114); /* mac dma */
-               au_writel(0x00, 0xb4004124); /* mac dma */
-               au_writel(0x00, 0xb4004134); /* mac dma */
-               au_writel(0x00, 0xb0520000); /* macen0 */
-               au_writel(0x00, 0xb1000008); /* i2s_enable  */
-               au_writel(0x00, 0xb1100100); /* uart0_enable */
-               au_writel(0x00, 0xb1200100); /* uart1_enable */
-               au_writel(0x00, 0xb1400100); /* uart3_enable */
-               au_writel(0x02, 0xb1600100); /* ssi0_enable */
-               au_writel(0x02, 0xb1680100); /* ssi1_enable */
-               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
-               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
-               au_writel(0x00, 0xb1900028); /* sys_clksrc */
-               au_writel(0x10, 0xb1900060); /* sys_cpupll */
-               au_writel(0x00, 0xb1900064); /* sys_auxpll */
-               au_writel(0x00, 0xb1900100); /* sys_pininputen */
-               break;
-       case 0x03000000: /* Au1550 */
-               au_writel(0x00, 0xb1a00004); /* psc 0 */
-               au_writel(0x00, 0xb1b00004); /* psc 1 */
-               au_writel(0x00, 0xb0a00004); /* psc 2 */
-               au_writel(0x00, 0xb0b00004); /* psc 3 */
-               au_writel(0x00, 0xb017fffc); /* usbh_enable */
-               au_writel(0x00, 0xb0200058); /* usbd_enable */
-               au_writel(0x00, 0xb4004104); /* mac dma */
-               au_writel(0x00, 0xb4004114); /* mac dma */
-               au_writel(0x00, 0xb4004124); /* mac dma */
-               au_writel(0x00, 0xb4004134); /* mac dma */
-               au_writel(0x00, 0xb1520000); /* macen0 */
-               au_writel(0x00, 0xb1520004); /* macen1 */
-               au_writel(0x00, 0xb1100100); /* uart0_enable */
-               au_writel(0x00, 0xb1200100); /* uart1_enable */
-               au_writel(0x00, 0xb1400100); /* uart3_enable */
-               au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
-               au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
-               au_writel(0x00, 0xb1900028); /* sys_clksrc */
-               au_writel(0x10, 0xb1900060); /* sys_cpupll */
-               au_writel(0x00, 0xb1900064); /* sys_auxpll */
-               au_writel(0x00, 0xb1900100); /* sys_pininputen */
-               break;
-       }
-
-       set_c0_status(ST0_BEV | ST0_ERL);
-       change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
-       flush_cache_all();
-       write_c0_wired(0);
-
-       /* Give board a chance to do a hardware reset */
-       board_reset();
-
-       /* Jump to the beggining in case board_reset() is empty */
-       __asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
-}
-
-void au1000_halt(void)
-{
-#if defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550)
-       /* Power off system */
-       printk(KERN_NOTICE "\n** Powering off...\n");
-       au_writew(au_readw(0xAF00001C) | (3 << 14), 0xAF00001C);
-       au_sync();
-       while (1); /* should not get here */
-#else
-       printk(KERN_NOTICE "\n** You can safely turn off the power\n");
-#ifdef CONFIG_MIPS_MIRAGE
-       au_writel((1 << 26) | (1 << 10), GPIO2_OUTPUT);
-#endif
-#ifdef CONFIG_MIPS_DB1200
-       au_writew(au_readw(0xB980001C) | (1 << 14), 0xB980001C);
-#endif
-#ifdef CONFIG_PM
-       au_sleep();
-
-       /* Should not get here */
-       printk(KERN_ERR "Unable to put CPU in sleep mode\n");
-       while (1);
-#else
-       while (1)
-               __asm__(".set\tmips3\n\t"
-                       "wait\n\t"
-                       ".set\tmips0");
-#endif
-#endif /* defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550) */
-}
-
-void au1000_power_off(void)
-{
-       au1000_halt();
-}
diff --git a/arch/mips/au1000/common/setup.c b/arch/mips/au1000/common/setup.c
deleted file mode 100644 (file)
index 1ac6b06..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2000, 2007-2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com
- *
- * Updates to 2.6, Pete Popov, Embedded Alley Solutions, 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.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/module.h>
-#include <linux/pm.h>
-
-#include <asm/mipsregs.h>
-#include <asm/reboot.h>
-#include <asm/time.h>
-
-#include <au1000.h>
-#include <prom.h>
-
-extern void __init board_setup(void);
-extern void au1000_restart(char *);
-extern void au1000_halt(void);
-extern void au1000_power_off(void);
-extern void set_cpuspec(void);
-
-void __init plat_mem_setup(void)
-{
-       struct  cpu_spec *sp;
-       char *argptr;
-       unsigned long prid, cpufreq, bclk;
-
-       set_cpuspec();
-       sp = cur_cpu_spec[0];
-
-       board_setup();  /* board specific setup */
-
-       prid = read_c0_prid();
-       if (sp->cpu_pll_wo)
-#ifdef CONFIG_SOC_AU1000_FREQUENCY
-               cpufreq = CONFIG_SOC_AU1000_FREQUENCY / 1000000;
-#else
-               cpufreq = 396;
-#endif
-       else
-               cpufreq = (au_readl(SYS_CPUPLL) & 0x3F) * 12;
-       printk(KERN_INFO "(PRID %08lx) @ %ld MHz\n", prid, cpufreq);
-
-       if (sp->cpu_bclk) {
-               /* Enable BCLK switching */
-               bclk = au_readl(SYS_POWERCTRL);
-               au_writel(bclk | 0x60, SYS_POWERCTRL);
-               printk(KERN_INFO "BCLK switching enabled!\n");
-       }
-
-       if (sp->cpu_od)
-               /* Various early Au1xx0 errata corrected by this */
-               set_c0_config(1 << 19); /* Set Config[OD] */
-       else
-               /* Clear to obtain best system bus performance */
-               clear_c0_config(1 << 19); /* Clear Config[OD] */
-
-       argptr = prom_getcmdline();
-
-#ifdef CONFIG_SERIAL_8250_CONSOLE
-       argptr = strstr(argptr, "console=");
-       if (argptr == NULL) {
-               argptr = prom_getcmdline();
-               strcat(argptr, " console=ttyS0,115200");
-       }
-#endif
-
-#ifdef CONFIG_FB_AU1100
-       argptr = strstr(argptr, "video=");
-       if (argptr == NULL) {
-               argptr = prom_getcmdline();
-               /* default panel */
-               /*strcat(argptr, " video=au1100fb:panel:Sharp_320x240_16");*/
-       }
-#endif
-
-#if defined(CONFIG_SOUND_AU1X00) && !defined(CONFIG_SOC_AU1000)
-       /* au1000 does not support vra, au1500 and au1100 do */
-       strcat(argptr, " au1000_audio=vra");
-       argptr = prom_getcmdline();
-#endif
-       _machine_restart = au1000_restart;
-       _machine_halt = au1000_halt;
-       pm_power_off = au1000_power_off;
-
-       /* IO/MEM resources. */
-       set_io_port_base(0);
-       ioport_resource.start = IOPORT_RESOURCE_START;
-       ioport_resource.end = IOPORT_RESOURCE_END;
-       iomem_resource.start = IOMEM_RESOURCE_START;
-       iomem_resource.end = IOMEM_RESOURCE_END;
-
-       while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_E0S);
-       au_writel(SYS_CNTRL_E0 | SYS_CNTRL_EN0, SYS_COUNTER_CNTRL);
-       au_sync();
-       while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T0S);
-       au_writel(0, SYS_TOYTRIM);
-}
-
-#if defined(CONFIG_64BIT_PHYS_ADDR)
-/* This routine should be valid for all Au1x based boards */
-phys_t __fixup_bigphys_addr(phys_t phys_addr, phys_t size)
-{
-       /* Don't fixup 36-bit addresses */
-       if ((phys_addr >> 32) != 0)
-               return phys_addr;
-
-#ifdef CONFIG_PCI
-       {
-               u32 start = (u32)Au1500_PCI_MEM_START;
-               u32 end   = (u32)Au1500_PCI_MEM_END;
-
-               /* Check for PCI memory window */
-               if (phys_addr >= start && (phys_addr + size - 1) <= end)
-                       return (phys_t)
-                              ((phys_addr - start) + Au1500_PCI_MEM_START);
-       }
-#endif
-
-       /*
-        * All Au1xx0 SOCs have a PCMCIA controller.
-        * We setup our 32-bit pseudo addresses to be equal to the
-        * 36-bit addr >> 4, to make it easier to check the address
-        * and fix it.
-        * The PCMCIA socket 0 physical attribute address is 0xF 4000 0000.
-        * The pseudo address we use is 0xF400 0000. Any address over
-        * 0xF400 0000 is a PCMCIA pseudo address.
-        */
-       if ((phys_addr >= 0xF4000000) && (phys_addr < 0xFFFFFFFF))
-               return (phys_t)(phys_addr << 4);
-
-       /* default nop */
-       return phys_addr;
-}
-EXPORT_SYMBOL(__fixup_bigphys_addr);
-#endif
diff --git a/arch/mips/au1000/common/sleeper.S b/arch/mips/au1000/common/sleeper.S
deleted file mode 100644 (file)
index 4b3cf02..0000000
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2002 Embedded Edge, LLC
- * Author: dan@embeddededge.com
- *
- * Sleep helper for Au1xxx sleep mode.
- *
- * 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 <asm/asm.h>
-#include <asm/mipsregs.h>
-#include <asm/regdef.h>
-#include <asm/stackframe.h>
-
-       .text
-       .set    macro
-       .set    noat
-       .align  5
-
-/* Save all of the processor general registers and go to sleep.
- * A wakeup condition will get us back here to restore the registers.
- */
-LEAF(save_and_sleep)
-
-       subu    sp, PT_SIZE
-       sw      $1, PT_R1(sp)
-       sw      $2, PT_R2(sp)
-       sw      $3, PT_R3(sp)
-       sw      $4, PT_R4(sp)
-       sw      $5, PT_R5(sp)
-       sw      $6, PT_R6(sp)
-       sw      $7, PT_R7(sp)
-       sw      $8, PT_R8(sp)
-       sw      $9, PT_R9(sp)
-       sw      $10, PT_R10(sp)
-       sw      $11, PT_R11(sp)
-       sw      $12, PT_R12(sp)
-       sw      $13, PT_R13(sp)
-       sw      $14, PT_R14(sp)
-       sw      $15, PT_R15(sp)
-       sw      $16, PT_R16(sp)
-       sw      $17, PT_R17(sp)
-       sw      $18, PT_R18(sp)
-       sw      $19, PT_R19(sp)
-       sw      $20, PT_R20(sp)
-       sw      $21, PT_R21(sp)
-       sw      $22, PT_R22(sp)
-       sw      $23, PT_R23(sp)
-       sw      $24, PT_R24(sp)
-       sw      $25, PT_R25(sp)
-       sw      $26, PT_R26(sp)
-       sw      $27, PT_R27(sp)
-       sw      $28, PT_R28(sp)
-       sw      $29, PT_R29(sp)
-       sw      $30, PT_R30(sp)
-       sw      $31, PT_R31(sp)
-       mfc0    k0, CP0_STATUS
-       sw      k0, 0x20(sp)
-       mfc0    k0, CP0_CONTEXT
-       sw      k0, 0x1c(sp)
-       mfc0    k0, CP0_PAGEMASK
-       sw      k0, 0x18(sp)
-       mfc0    k0, CP0_CONFIG
-       sw      k0, 0x14(sp)
-
-       /* Now set up the scratch registers so the boot rom will
-        * return to this point upon wakeup.
-        */
-       la      k0, 1f
-       lui     k1, 0xb190
-       ori     k1, 0x18
-       sw      sp, 0(k1)
-       ori     k1, 0x1c
-       sw      k0, 0(k1)
-
-/* Put SDRAM into self refresh.  Preload instructions into cache,
- * issue a precharge, then auto refresh, then sleep commands to it.
- */
-       la      t0, sdsleep
-       .set    mips3
-       cache   0x14, 0(t0)
-       cache   0x14, 32(t0)
-       cache   0x14, 64(t0)
-       cache   0x14, 96(t0)
-       .set    mips0
-
-sdsleep:
-       lui     k0, 0xb400
-       sw      zero, 0x001c(k0)        /* Precharge */
-       sw      zero, 0x0020(k0)        /* Auto refresh */
-       sw      zero, 0x0030(k0)        /* SDRAM sleep */
-       sync
-
-       lui     k1, 0xb190
-       sw      zero, 0x0078(k1)        /* get ready  to sleep */
-       sync
-       sw      zero, 0x007c(k1)        /* Put processor to sleep */
-       sync
-
-       /* This is where we return upon wakeup.
-        * Reload all of the registers and return.
-        */
-1:     nop
-       lw      k0, 0x20(sp)
-       mtc0    k0, CP0_STATUS
-       lw      k0, 0x1c(sp)
-       mtc0    k0, CP0_CONTEXT
-       lw      k0, 0x18(sp)
-       mtc0    k0, CP0_PAGEMASK
-       lw      k0, 0x14(sp)
-       mtc0    k0, CP0_CONFIG
-
-       /* We need to catch the ealry Alchemy SOCs with
-        * the write-only Config[OD] bit and set it back to one...
-        */
-       jal     au1x00_fixup_config_od
-       lw      $1, PT_R1(sp)
-       lw      $2, PT_R2(sp)
-       lw      $3, PT_R3(sp)
-       lw      $4, PT_R4(sp)
-       lw      $5, PT_R5(sp)
-       lw      $6, PT_R6(sp)
-       lw      $7, PT_R7(sp)
-       lw      $8, PT_R8(sp)
-       lw      $9, PT_R9(sp)
-       lw      $10, PT_R10(sp)
-       lw      $11, PT_R11(sp)
-       lw      $12, PT_R12(sp)
-       lw      $13, PT_R13(sp)
-       lw      $14, PT_R14(sp)
-       lw      $15, PT_R15(sp)
-       lw      $16, PT_R16(sp)
-       lw      $17, PT_R17(sp)
-       lw      $18, PT_R18(sp)
-       lw      $19, PT_R19(sp)
-       lw      $20, PT_R20(sp)
-       lw      $21, PT_R21(sp)
-       lw      $22, PT_R22(sp)
-       lw      $23, PT_R23(sp)
-       lw      $24, PT_R24(sp)
-       lw      $25, PT_R25(sp)
-       lw      $26, PT_R26(sp)
-       lw      $27, PT_R27(sp)
-       lw      $28, PT_R28(sp)
-       lw      $29, PT_R29(sp)
-       lw      $30, PT_R30(sp)
-       lw      $31, PT_R31(sp)
-       addiu   sp, PT_SIZE
-
-       jr      ra
-END(save_and_sleep)
diff --git a/arch/mips/au1000/common/time.c b/arch/mips/au1000/common/time.c
deleted file mode 100644 (file)
index 563d939..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- *
- * Copyright (C) 2001, 2006, 2008 MontaVista Software, <source@mvista.com>
- * Copied and modified Carsten Langgaard's time.c
- *
- * Carsten Langgaard, carstenl@mips.com
- * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
- *
- * ########################################################################
- *
- *  This program is free software; you can distribute it and/or modify it
- *  under the terms of the GNU General Public License (Version 2) as
- *  published by the Free Software Foundation.
- *
- *  This program is distributed in the hope it will be useful, but WITHOUT
- *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
- *  for more details.
- *
- *  You should have received a copy of the GNU General Public License along
- *  with this program; if not, write to the Free Software Foundation, Inc.,
- *  59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
- *
- * ########################################################################
- *
- * Setting up the clock on the MIPS boards.
- *
- * We provide the clock interrupt processing and the timer offset compute
- * functions.  If CONFIG_PM is selected, we also ensure the 32KHz timer is
- * available.  -- Dan
- */
-
-#include <linux/types.h>
-#include <linux/init.h>
-#include <linux/spinlock.h>
-
-#include <asm/mipsregs.h>
-#include <asm/time.h>
-#include <asm/mach-au1x00/au1000.h>
-
-static int no_au1xxx_32khz;
-extern int allow_au1k_wait; /* default off for CP0 Counter */
-
-#ifdef CONFIG_PM
-#if HZ < 100 || HZ > 1000
-#error "unsupported HZ value! Must be in [100,1000]"
-#endif
-#define MATCH20_INC (328 * 100 / HZ) /* magic number 328 is for HZ=100... */
-static unsigned long last_pc0, last_match20;
-#endif
-
-static DEFINE_SPINLOCK(time_lock);
-
-unsigned long wtimer;
-
-#ifdef CONFIG_PM
-static irqreturn_t counter0_irq(int irq, void *dev_id)
-{
-       unsigned long pc0;
-       int time_elapsed;
-       static int jiffie_drift;
-
-       if (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20) {
-               /* should never happen! */
-               printk(KERN_WARNING "counter 0 w status error\n");
-               return IRQ_NONE;
-       }
-
-       pc0 = au_readl(SYS_TOYREAD);
-       if (pc0 < last_match20)
-               /* counter overflowed */
-               time_elapsed = (0xffffffff - last_match20) + pc0;
-       else
-               time_elapsed = pc0 - last_match20;
-
-       while (time_elapsed > 0) {
-               do_timer(1);
-#ifndef CONFIG_SMP
-               update_process_times(user_mode(get_irq_regs()));
-#endif
-               time_elapsed -= MATCH20_INC;
-               last_match20 += MATCH20_INC;
-               jiffie_drift++;
-       }
-
-       last_pc0 = pc0;
-       au_writel(last_match20 + MATCH20_INC, SYS_TOYMATCH2);
-       au_sync();
-
-       /*
-        * Our counter ticks at 10.009765625 ms/tick, we we're running
-        * almost 10 uS too slow per tick.
-        */
-
-       if (jiffie_drift >= 999) {
-               jiffie_drift -= 999;
-               do_timer(1); /* increment jiffies by one */
-#ifndef CONFIG_SMP
-               update_process_times(user_mode(get_irq_regs()));
-#endif
-       }
-
-       return IRQ_HANDLED;
-}
-
-struct irqaction counter0_action = {
-       .handler        = counter0_irq,
-       .flags          = IRQF_DISABLED,
-       .name           = "alchemy-toy",
-       .dev_id         = NULL,
-};
-
-/* When we wakeup from sleep, we have to "catch up" on all of the
- * timer ticks we have missed.
- */
-void wakeup_counter0_adjust(void)
-{
-       unsigned long pc0;
-       int time_elapsed;
-
-       pc0 = au_readl(SYS_TOYREAD);
-       if (pc0 < last_match20)
-               /* counter overflowed */
-               time_elapsed = (0xffffffff - last_match20) + pc0;
-       else
-               time_elapsed = pc0 - last_match20;
-
-       while (time_elapsed > 0) {
-               time_elapsed -= MATCH20_INC;
-               last_match20 += MATCH20_INC;
-       }
-
-       last_pc0 = pc0;
-       au_writel(last_match20 + MATCH20_INC, SYS_TOYMATCH2);
-       au_sync();
-
-}
-
-/* This is just for debugging to set the timer for a sleep delay. */
-void wakeup_counter0_set(int ticks)
-{
-       unsigned long pc0;
-
-       pc0 = au_readl(SYS_TOYREAD);
-       last_pc0 = pc0;
-       au_writel(last_match20 + (MATCH20_INC * ticks), SYS_TOYMATCH2);
-       au_sync();
-}
-#endif
-
-/*
- * I haven't found anyone that doesn't use a 12 MHz source clock,
- * but just in case.....
- */
-#define AU1000_SRC_CLK 12000000
-
-/*
- * We read the real processor speed from the PLL.  This is important
- * because it is more accurate than computing it from the 32 KHz
- * counter, if it exists.  If we don't have an accurate processor
- * speed, all of the peripherals that derive their clocks based on
- * this advertised speed will introduce error and sometimes not work
- * properly.  This function is futher convoluted to still allow configurations
- * to do that in case they have really, really old silicon with a
- * write-only PLL register, that we need the 32 KHz when power management
- * "wait" is enabled, and we need to detect if the 32 KHz isn't present
- * but requested......got it? :-)              -- Dan
- */
-unsigned long calc_clock(void)
-{
-       unsigned long cpu_speed;
-       unsigned long flags;
-       unsigned long counter;
-
-       spin_lock_irqsave(&time_lock, flags);
-
-       /* Power management cares if we don't have a 32 KHz counter. */
-       no_au1xxx_32khz = 0;
-       counter = au_readl(SYS_COUNTER_CNTRL);
-       if (counter & SYS_CNTRL_E0) {
-               int trim_divide = 16;
-
-               au_writel(counter | SYS_CNTRL_EN1, SYS_COUNTER_CNTRL);
-
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S);
-               /* RTC now ticks at 32.768/16 kHz */
-               au_writel(trim_divide - 1, SYS_RTCTRIM);
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_T1S);
-
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
-               au_writel(0, SYS_TOYWRITE);
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
-       } else
-               no_au1xxx_32khz = 1;
-
-       /*
-        * On early Au1000, sys_cpupll was write-only. Since these
-        * silicon versions of Au1000 are not sold by AMD, we don't bend
-        * over backwards trying to determine the frequency.
-        */
-       if (cur_cpu_spec[0]->cpu_pll_wo)
-#ifdef CONFIG_SOC_AU1000_FREQUENCY
-               cpu_speed = CONFIG_SOC_AU1000_FREQUENCY;
-#else
-               cpu_speed = 396000000;
-#endif
-       else
-               cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK;
-       /* On Alchemy CPU:counter ratio is 1:1 */
-       mips_hpt_frequency = cpu_speed;
-       /* Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16) */
-       set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)
-                                                         & 0x03) + 2) * 16));
-       spin_unlock_irqrestore(&time_lock, flags);
-       return cpu_speed;
-}
-
-void __init plat_time_init(void)
-{
-       unsigned int est_freq = calc_clock();
-
-       est_freq += 5000;    /* round */
-       est_freq -= est_freq%10000;
-       printk(KERN_INFO "CPU frequency %u.%02u MHz\n",
-              est_freq / 1000000, ((est_freq % 1000000) * 100) / 1000000);
-       set_au1x00_speed(est_freq);
-       set_au1x00_lcd_clock(); /* program the LCD clock */
-
-#ifdef CONFIG_PM
-       /*
-        * setup counter 0, since it keeps ticking after a
-        * 'wait' instruction has been executed. The CP0 timer and
-        * counter 1 do NOT continue running after 'wait'
-        *
-        * It's too early to call request_irq() here, so we handle
-        * counter 0 interrupt as a special irq and it doesn't show
-        * up under /proc/interrupts.
-        *
-        * Check to ensure we really have a 32 KHz oscillator before
-        * we do this.
-        */
-       if (no_au1xxx_32khz)
-               printk(KERN_WARNING "WARNING: no 32KHz clock found.\n");
-       else {
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C0S);
-               au_writel(0, SYS_TOYWRITE);
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C0S);
-
-               au_writel(au_readl(SYS_WAKEMSK) | (1 << 8), SYS_WAKEMSK);
-               au_writel(~0, SYS_WAKESRC);
-               au_sync();
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20);
-
-               /* Setup match20 to interrupt once every HZ */
-               last_pc0 = last_match20 = au_readl(SYS_TOYREAD);
-               au_writel(last_match20 + MATCH20_INC, SYS_TOYMATCH2);
-               au_sync();
-               while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_M20);
-               setup_irq(AU1000_TOY_MATCH2_INT, &counter0_action);
-
-               /* We can use the real 'wait' instruction. */
-               allow_au1k_wait = 1;
-       }
-
-#endif
-}
diff --git a/arch/mips/au1000/db1x00/Makefile b/arch/mips/au1000/db1x00/Makefile
deleted file mode 100644 (file)
index 274db3b..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor DBAu1xx0 boards.
-#
-
-lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/au1000/db1x00/board_setup.c b/arch/mips/au1000/db1x00/board_setup.c
deleted file mode 100644 (file)
index 9e5ccbb..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Alchemy Db1x00 board setup.
- *
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-db1x00/db1x00.h>
-
-static BCSR * const bcsr = (BCSR *)BCSR_KSEG1_ADDR;
-
-void board_reset(void)
-{
-       /* Hit BCSR.SW_RESET[RESET] */
-       bcsr->swreset = 0x0000;
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func = 0;
-
-       /* Not valid for Au1550 */
-#if defined(CONFIG_IRDA) && \
-   (defined(CONFIG_SOC_AU1000) || defined(CONFIG_SOC_AU1100))
-       /* Set IRFIRSEL instead of GPIO15 */
-       pin_func = au_readl(SYS_PINFUNC) | SYS_PF_IRF;
-       au_writel(pin_func, SYS_PINFUNC);
-       /* Power off until the driver is in use */
-       bcsr->resets &= ~BCSR_RESETS_IRDA_MODE_MASK;
-       bcsr->resets |=  BCSR_RESETS_IRDA_MODE_OFF;
-       au_sync();
-#endif
-       bcsr->pcmcia = 0x0000; /* turn off PCMCIA power */
-
-#ifdef CONFIG_MIPS_MIRAGE
-       /* Enable GPIO[31:0] inputs */
-       au_writel(0, SYS_PININPUTEN);
-
-       /* GPIO[20] is output, tristate the other input primary GPIOs */
-       au_writel(~(1 << 20), SYS_TRIOUTCLR);
-
-       /* Set GPIO[210:208] instead of SSI_0 */
-       pin_func = au_readl(SYS_PINFUNC) | SYS_PF_S0;
-
-       /* Set GPIO[215:211] for LEDs */
-       pin_func |= 5 << 2;
-
-       /* Set GPIO[214:213] for more LEDs */
-       pin_func |= 5 << 12;
-
-       /* Set GPIO[207:200] instead of PCMCIA/LCD */
-       pin_func |= SYS_PF_LCD | SYS_PF_PC;
-       au_writel(pin_func, SYS_PINFUNC);
-
-       /*
-        * Enable speaker amplifier.  This should
-        * be part of the audio driver.
-        */
-       au_writel(au_readl(GPIO2_DIR) | 0x200, GPIO2_DIR);
-       au_writel(0x02000200, GPIO2_OUTPUT);
-#endif
-
-       au_sync();
-
-#ifdef CONFIG_MIPS_DB1000
-       printk(KERN_INFO "AMD Alchemy Au1000/Db1000 Board\n");
-#endif
-#ifdef CONFIG_MIPS_DB1500
-       printk(KERN_INFO "AMD Alchemy Au1500/Db1500 Board\n");
-#endif
-#ifdef CONFIG_MIPS_DB1100
-       printk(KERN_INFO "AMD Alchemy Au1100/Db1100 Board\n");
-#endif
-#ifdef CONFIG_MIPS_BOSPORUS
-       printk(KERN_INFO "AMD Alchemy Bosporus Board\n");
-#endif
-#ifdef CONFIG_MIPS_MIRAGE
-       printk(KERN_INFO "AMD Alchemy Mirage Board\n");
-#endif
-#ifdef CONFIG_MIPS_DB1550
-       printk(KERN_INFO "AMD Alchemy Au1550/Db1550 Board\n");
-#endif
-}
diff --git a/arch/mips/au1000/db1x00/init.c b/arch/mips/au1000/db1x00/init.c
deleted file mode 100644 (file)
index 8474135..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     PB1000 board setup
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-#ifdef CONFIG_MIPS_BOSPORUS
-       return "Alchemy Bosporus Gateway Reference";
-#else
-       return "Alchemy Db1x00";
-#endif
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/db1x00/irqmap.c b/arch/mips/au1000/db1x00/irqmap.c
deleted file mode 100644 (file)
index 94c090e..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xxx irq map table
- *
- * Copyright 2003 Embedded Edge, LLC
- *             dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-#ifdef CONFIG_MIPS_DB1500
-char irq_tab_alchemy[][5] __initdata = {
-       [12] = { -1, INTA, INTX, INTX, INTX }, /* IDSEL 12 - HPT371   */
-       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot */
-};
-#endif
-
-#ifdef CONFIG_MIPS_BOSPORUS
-char irq_tab_alchemy[][5] __initdata = {
-       [11] = { -1, INTA, INTB, INTX, INTX }, /* IDSEL 11 - miniPCI  */
-       [12] = { -1, INTA, INTX, INTX, INTX }, /* IDSEL 12 - SN1741   */
-       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot */
-};
-#endif
-
-#ifdef CONFIG_MIPS_MIRAGE
-char irq_tab_alchemy[][5] __initdata = {
-       [11] = { -1, INTD, INTX, INTX, INTX }, /* IDSEL 11 - SMI VGX */
-       [12] = { -1, INTX, INTX, INTC, INTX }, /* IDSEL 12 - PNX1300 */
-       [13] = { -1, INTA, INTB, INTX, INTX }, /* IDSEL 13 - miniPCI */
-};
-#endif
-
-#ifdef CONFIG_MIPS_DB1550
-char irq_tab_alchemy[][5] __initdata = {
-       [11] = { -1, INTC, INTX, INTX, INTX }, /* IDSEL 11 - on-board HPT371 */
-       [12] = { -1, INTB, INTC, INTD, INTA }, /* IDSEL 12 - PCI slot 2 (left) */
-       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot 1 (right) */
-};
-#endif
-
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-
-#ifndef CONFIG_MIPS_MIRAGE
-#ifdef CONFIG_MIPS_DB1550
-       { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */
-       { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */
-#else
-       { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 Fully_Interted# */
-       { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 STSCHG# */
-       { AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 0 IRQ# */
-
-       { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 Fully_Interted# */
-       { AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 STSCHG# */
-       { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card 1 IRQ# */
-#endif
-#else
-       { AU1000_GPIO_7, INTC_INT_RISE_EDGE, 0 }, /* touchscreen pen down */
-#endif
-
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/au1000/mtx-1/Makefile b/arch/mips/au1000/mtx-1/Makefile
deleted file mode 100644 (file)
index 7c67b3d..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-#  Copyright 2003 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#       Bruno Randolf <bruno.randolf@4g-systems.biz>
-#
-# Makefile for 4G Systems MTX-1 board.
-#
-
-lib-y := init.o board_setup.o irqmap.o
-obj-y := platform.o
-
-EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/au1000/mtx-1/board_setup.c b/arch/mips/au1000/mtx-1/board_setup.c
deleted file mode 100644 (file)
index 3f80791..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     4G Systems MTX-1 board setup.
- *
- * Copyright 2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *         Bruno Randolf <bruno.randolf@4g-systems.biz>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-extern int (*board_pci_idsel)(unsigned int devsel, int assert);
-int mtx1_pci_idsel(unsigned int devsel, int assert);
-
-void board_reset(void)
-{
-       /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
-       au_writel(0x00000000, 0xAE00001C);
-}
-
-void __init board_setup(void)
-{
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-       /* Enable USB power switch */
-       au_writel(au_readl(GPIO2_DIR) | 0x10, GPIO2_DIR);
-       au_writel(0x100000, GPIO2_OUTPUT);
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-#ifdef CONFIG_PCI
-#if defined(__MIPSEB__)
-       au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG);
-#else
-       au_writel(0xf, Au1500_PCI_CFG);
-#endif
-#endif
-
-       /* Initialize sys_pinfunc */
-       au_writel(SYS_PF_NI2, SYS_PINFUNC);
-
-       /* Initialize GPIO */
-       au_writel(0xFFFFFFFF, SYS_TRIOUTCLR);
-       au_writel(0x00000001, SYS_OUTPUTCLR); /* set M66EN (PCI 66MHz) to OFF */
-       au_writel(0x00000008, SYS_OUTPUTSET); /* set PCI CLKRUN# to OFF */
-       au_writel(0x00000002, SYS_OUTPUTSET); /* set EXT_IO3 ON */
-       au_writel(0x00000020, SYS_OUTPUTCLR); /* set eth PHY TX_ER to OFF */
-
-       /* Enable LED and set it to green */
-       au_writel(au_readl(GPIO2_DIR) | 0x1800, GPIO2_DIR);
-       au_writel(0x18000800, GPIO2_OUTPUT);
-
-       board_pci_idsel = mtx1_pci_idsel;
-
-       printk(KERN_INFO "4G Systems MTX-1 Board\n");
-}
-
-int
-mtx1_pci_idsel(unsigned int devsel, int assert)
-{
-#define MTX_IDSEL_ONLY_0_AND_3 0
-#if MTX_IDSEL_ONLY_0_AND_3
-       if (devsel != 0 && devsel != 3) {
-               printk(KERN_ERR "*** not 0 or 3\n");
-               return 0;
-       }
-#endif
-
-       if (assert && devsel != 0)
-               /* Suppress signal to Cardbus */
-               au_writel(0x00000002, SYS_OUTPUTCLR); /* set EXT_IO3 OFF */
-       else
-               au_writel(0x00000002, SYS_OUTPUTSET); /* set EXT_IO3 ON */
-       au_sync_udelay(1);
-       return 1;
-}
-
diff --git a/arch/mips/au1000/mtx-1/init.c b/arch/mips/au1000/mtx-1/init.c
deleted file mode 100644 (file)
index 3bae13c..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     4G Systems MTX-1 board setup
- *
- * Copyright 2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *         Bruno Randolf <bruno.randolf@4g-systems.biz>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "MTX-1";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/mtx-1/irqmap.c b/arch/mips/au1000/mtx-1/irqmap.c
deleted file mode 100644 (file)
index f2bf029..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xxx irq map table
- *
- * Copyright 2003 Embedded Edge, LLC
- *             dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-char irq_tab_alchemy[][5] __initdata = {
-       [0] = { -1, INTA, INTA, INTX, INTX }, /* IDSEL 00 - AdapterA-Slot0 (top) */
-       [1] = { -1, INTB, INTA, INTX, INTX }, /* IDSEL 01 - AdapterA-Slot1 (bottom) */
-       [2] = { -1, INTC, INTD, INTX, INTX }, /* IDSEL 02 - AdapterB-Slot0 (top) */
-       [3] = { -1, INTD, INTC, INTX, INTX }, /* IDSEL 03 - AdapterB-Slot1 (bottom) */
-       [4] = { -1, INTA, INTB, INTX, INTX }, /* IDSEL 04 - AdapterC-Slot0 (top) */
-       [5] = { -1, INTB, INTA, INTX, INTX }, /* IDSEL 05 - AdapterC-Slot1 (bottom) */
-       [6] = { -1, INTC, INTD, INTX, INTX }, /* IDSEL 06 - AdapterD-Slot0 (top) */
-       [7] = { -1, INTD, INTC, INTX, INTX }, /* IDSEL 07 - AdapterD-Slot1 (bottom) */
-};
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-       { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/au1000/mtx-1/platform.c b/arch/mips/au1000/mtx-1/platform.c
deleted file mode 100644 (file)
index 8b5914d..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * MTX-1 platform devices registration
- *
- * Copyright (C) 2007, Florian Fainelli <florian@openwrt.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/leds.h>
-#include <linux/gpio.h>
-#include <linux/gpio_keys.h>
-#include <linux/input.h>
-#include <linux/mtd/partitions.h>
-#include <linux/mtd/physmap.h>
-#include <mtd/mtd-abi.h>
-
-static struct gpio_keys_button mtx1_gpio_button[] = {
-       {
-               .gpio = 207,
-               .code = BTN_0,
-               .desc = "System button",
-       }
-};
-
-static struct gpio_keys_platform_data mtx1_buttons_data = {
-       .buttons = mtx1_gpio_button,
-       .nbuttons = ARRAY_SIZE(mtx1_gpio_button),
-};
-
-static struct platform_device mtx1_button = {
-       .name = "gpio-keys",
-       .id = -1,
-       .dev = {
-               .platform_data = &mtx1_buttons_data,
-       }
-};
-
-static struct resource mtx1_wdt_res[] = {
-       [0] = {
-               .start  = 15,
-               .end    = 15,
-               .name   = "mtx1-wdt-gpio",
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-static struct platform_device mtx1_wdt = {
-       .name = "mtx1-wdt",
-       .id = 0,
-       .num_resources = ARRAY_SIZE(mtx1_wdt_res),
-       .resource = mtx1_wdt_res,
-};
-
-static struct gpio_led default_leds[] = {
-       {
-               .name   = "mtx1:green",
-               .gpio = 211,
-       }, {
-               .name = "mtx1:red",
-               .gpio = 212,
-       },
-};
-
-static struct gpio_led_platform_data mtx1_led_data = {
-       .num_leds = ARRAY_SIZE(default_leds),
-       .leds = default_leds,
-};
-
-static struct platform_device mtx1_gpio_leds = {
-       .name = "leds-gpio",
-       .id = -1,
-       .dev = {
-               .platform_data = &mtx1_led_data,
-       }
-};
-
-static struct mtd_partition mtx1_mtd_partitions[] = {
-       {
-               .name   = "filesystem",
-               .size   = 0x01C00000,
-               .offset = 0,
-       },
-       {
-               .name   = "yamon",
-               .size   = 0x00100000,
-               .offset = MTDPART_OFS_APPEND,
-               .mask_flags = MTD_WRITEABLE,
-       },
-       {
-               .name   = "kernel",
-               .size   = 0x002c0000,
-               .offset = MTDPART_OFS_APPEND,
-       },
-       {
-               .name   = "yamon env",
-               .size   = 0x00040000,
-               .offset = MTDPART_OFS_APPEND,
-       },
-};
-
-static struct physmap_flash_data mtx1_flash_data = {
-       .width          = 4,
-       .nr_parts       = 4,
-       .parts          = mtx1_mtd_partitions,
-};
-
-static struct resource mtx1_mtd_resource = {
-       .start  = 0x1e000000,
-       .end    = 0x1fffffff,
-       .flags  = IORESOURCE_MEM,
-};
-
-static struct platform_device mtx1_mtd = {
-       .name           = "physmap-flash",
-       .dev            = {
-               .platform_data  = &mtx1_flash_data,
-       },
-       .num_resources  = 1,
-       .resource       = &mtx1_mtd_resource,
-};
-
-static struct __initdata platform_device * mtx1_devs[] = {
-       &mtx1_gpio_leds,
-       &mtx1_wdt,
-       &mtx1_button,
-       &mtx1_mtd,
-};
-
-static int __init mtx1_register_devices(void)
-{
-       gpio_direction_input(207);
-       return platform_add_devices(mtx1_devs, ARRAY_SIZE(mtx1_devs));
-}
-
-arch_initcall(mtx1_register_devices);
diff --git a/arch/mips/au1000/pb1000/Makefile b/arch/mips/au1000/pb1000/Makefile
deleted file mode 100644 (file)
index 99bbec0..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1000 board.
-#
-
-lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/au1000/pb1000/board_setup.c b/arch/mips/au1000/pb1000/board_setup.c
deleted file mode 100644 (file)
index 25df167..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/delay.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-pb1x00/pb1000.h>
-
-void board_reset(void)
-{
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func, static_cfg0;
-       u32 sys_freqctrl, sys_clksrc;
-       u32 prid = read_c0_prid();
-
-       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
-       au_writel(8, SYS_AUXPLL);
-       au_writel(0, SYS_PINSTATERD);
-       udelay(100);
-
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-       /* Zero and disable FREQ2 */
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-       au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-       /* Zero and disable USBH/USBD clocks */
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-
-       switch (prid & 0x000000FF) {
-       case 0x00: /* DA */
-       case 0x01: /* HA */
-       case 0x02: /* HB */
-               /* CPU core freq to 48 MHz to slow it way down... */
-               au_writel(4, SYS_CPUPLL);
-
-               /*
-                * Setup 48 MHz FREQ2 from CPUPLL for USB Host
-                * FRDIV2 = 3 -> div by 8 of 384 MHz -> 48 MHz
-                */
-               sys_freqctrl |= (3 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-               /* CPU core freq to 384 MHz */
-               au_writel(0x20, SYS_CPUPLL);
-
-               printk(KERN_INFO "Au1000: 48 MHz OHCI workaround enabled\n");
-               break;
-
-       default: /* HC and newer */
-               /* FREQ2 = aux / 2 = 48 MHz */
-               sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |
-                                SYS_FC_FE2 | SYS_FC_FS2;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-               break;
-       }
-
-       /*
-        * Route 48 MHz FREQ2 into USB Host and/or Device
-        */
-       sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       /* Configure pins GPIO[14:9] as GPIO */
-       pin_func = au_readl(SYS_PINFUNC) & ~(SYS_PF_UR3 | SYS_PF_USB);
-
-       /* 2nd USB port is USB host */
-       pin_func |= SYS_PF_USB;
-
-       au_writel(pin_func, SYS_PINFUNC);
-       au_writel(0x2800, SYS_TRIOUTCLR);
-       au_writel(0x0030, SYS_OUTPUTCLR);
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-       /* Make GPIO 15 an input (for interrupt line) */
-       pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_IRF;
-       /* We don't need I2S, so make it available for GPIO[31:29] */
-       pin_func |= SYS_PF_I2S;
-       au_writel(pin_func, SYS_PINFUNC);
-
-       au_writel(0x8000, SYS_TRIOUTCLR);
-
-       static_cfg0 = au_readl(MEM_STCFG0) & ~0xc00;
-       au_writel(static_cfg0, MEM_STCFG0);
-
-       /* configure RCE2* for LCD */
-       au_writel(0x00000004, MEM_STCFG2);
-
-       /* MEM_STTIME2 */
-       au_writel(0x09000000, MEM_STTIME2);
-
-       /* Set 32-bit base address decoding for RCE2* */
-       au_writel(0x10003ff0, MEM_STADDR2);
-
-       /*
-        * PCI CPLD setup
-        * Expand CE0 to cover PCI
-        */
-       au_writel(0x11803e40, MEM_STADDR1);
-
-       /* Burst visibility on */
-       au_writel(au_readl(MEM_STCFG0) | 0x1000, MEM_STCFG0);
-
-       au_writel(0x83, MEM_STCFG1);         /* ewait enabled, flash timing */
-       au_writel(0x33030a10, MEM_STTIME1);  /* slower timing for FPGA */
-
-       /* Setup the static bus controller */
-       au_writel(0x00000002, MEM_STCFG3);  /* type = PCMCIA */
-       au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */
-       au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */
-
-       /*
-        * Enable Au1000 BCLK switching - note: sed1356 must not use
-        * its BCLK (Au1000 LCLK) for any timings
-        */
-       switch (prid & 0x000000FF) {
-       case 0x00: /* DA */
-       case 0x01: /* HA */
-       case 0x02: /* HB */
-               break;
-       default:  /* HC and newer */
-               /*
-                * Enable sys bus clock divider when IDLE state or no bus
-                * activity.
-                */
-               au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
-               break;
-       }
-}
diff --git a/arch/mips/au1000/pb1000/init.c b/arch/mips/au1000/pb1000/init.c
deleted file mode 100644 (file)
index 8a9c7d5..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Pb1000 board setup
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1000";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = (int)fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/pb1000/irqmap.c b/arch/mips/au1000/pb1000/irqmap.c
deleted file mode 100644 (file)
index b3d56b0..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xxx irq map table
- *
- * Copyright 2003 Embedded Edge, LLC
- *             dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/interrupt.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-       { AU1000_GPIO_15, INTC_INT_LOW_LEVEL, 0 },
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/au1000/pb1100/Makefile b/arch/mips/au1000/pb1100/Makefile
deleted file mode 100644 (file)
index 793e97c..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2001, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1100 board.
-#
-
-lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/au1000/pb1100/board_setup.c b/arch/mips/au1000/pb1100/board_setup.c
deleted file mode 100644 (file)
index c0bfd59..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright 2002, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/delay.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-pb1x00/pb1100.h>
-
-void board_reset(void)
-{
-       /* Hit BCSR.RST_VDDI[SOFT_RESET] */
-       au_writel(0x00000000, PB1100_RST_VDDI);
-}
-
-void __init board_setup(void)
-{
-       volatile void __iomem *base = (volatile void __iomem *)0xac000000UL;
-
-       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
-       au_writel(8, SYS_AUXPLL);
-       au_writel(0, SYS_PININPUTEN);
-       udelay(100);
-
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-       {
-               u32 pin_func, sys_freqctrl, sys_clksrc;
-
-               /* Configure pins GPIO[14:9] as GPIO */
-               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
-
-               /* Zero and disable FREQ2 */
-               sys_freqctrl = au_readl(SYS_FREQCTRL0);
-               sys_freqctrl &= ~0xFFF00000;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-               /* Zero and disable USBH/USBD/IrDA clock */
-               sys_clksrc = au_readl(SYS_CLKSRC);
-               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
-               au_writel(sys_clksrc, SYS_CLKSRC);
-
-               sys_freqctrl = au_readl(SYS_FREQCTRL0);
-               sys_freqctrl &= ~0xFFF00000;
-
-               sys_clksrc = au_readl(SYS_CLKSRC);
-               sys_clksrc &= ~(SYS_CS_CIR | SYS_CS_DIR | SYS_CS_MIR_MASK);
-
-               /* FREQ2 = aux / 2 = 48 MHz */
-               sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) |
-                               SYS_FC_FE2 | SYS_FC_FS2;
-               au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-               /*
-                * Route 48 MHz FREQ2 into USBH/USBD/IrDA
-                */
-               sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MIR_BIT;
-               au_writel(sys_clksrc, SYS_CLKSRC);
-
-               /* Setup the static bus controller */
-               au_writel(0x00000002, MEM_STCFG3);  /* type = PCMCIA */
-               au_writel(0x280E3D07, MEM_STTIME3); /* 250ns cycle time */
-               au_writel(0x10000000, MEM_STADDR3); /* any PCMCIA select */
-
-               /*
-                * Get USB Functionality pin state (device vs host drive pins).
-                */
-               pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
-               /* 2nd USB port is USB host. */
-               pin_func |= SYS_PF_USB;
-               au_writel(pin_func, SYS_PINFUNC);
-       }
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-       /* Enable sys bus clock divider when IDLE state or no bus activity. */
-       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
-
-       /* Enable the RTC if not already enabled. */
-       if (!(readb(base + 0x28) & 0x20)) {
-               writeb(readb(base + 0x28) | 0x20, base + 0x28);
-               au_sync();
-       }
-       /* Put the clock in BCD mode. */
-       if (readb(base + 0x2C) & 0x4) { /* reg B */
-               writeb(readb(base + 0x2c) & ~0x4, base + 0x2c);
-               au_sync();
-       }
-}
diff --git a/arch/mips/au1000/pb1100/init.c b/arch/mips/au1000/pb1100/init.c
deleted file mode 100644 (file)
index 7c67923..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Pb1100 board setup
- *
- * Copyright 2002, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1100";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg3;
-
-       prom_init_cmdline();
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/pb1100/irqmap.c b/arch/mips/au1000/pb1100/irqmap.c
deleted file mode 100644 (file)
index 9b7dd8b..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xx0 IRQ map table
- *
- * Copyright 2003 Embedded Edge, LLC
- *             dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-       { AU1000_GPIO_9,  INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card Fully_Inserted# */
-       { AU1000_GPIO_10, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card STSCHG# */
-       { AU1000_GPIO_11, INTC_INT_LOW_LEVEL, 0 }, /* PCMCIA Card IRQ# */
-       { AU1000_GPIO_13, INTC_INT_LOW_LEVEL, 0 }, /* DC_IRQ# */
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/au1000/pb1200/Makefile b/arch/mips/au1000/pb1200/Makefile
deleted file mode 100644 (file)
index d678adf..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-# Makefile for the Alchemy Semiconductor Pb1200/DBAu1200 boards.
-#
-
-lib-y := init.o board_setup.o irqmap.o
-obj-y += platform.o
-
-EXTRA_CFLAGS += -Werror
diff --git a/arch/mips/au1000/pb1200/board_setup.c b/arch/mips/au1000/pb1200/board_setup.c
deleted file mode 100644 (file)
index 6cb2115..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Alchemy Pb1200/Db1200 board setup.
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/sched.h>
-
-#include <prom.h>
-#include <au1xxx.h>
-
-extern void _board_init_irq(void);
-extern void (*board_init_irq)(void);
-
-void board_reset(void)
-{
-       bcsr->resets = 0;
-       bcsr->system = 0;
-}
-
-void __init board_setup(void)
-{
-       char *argptr = NULL;
-
-#if 0
-       {
-               u32 pin_func;
-
-               /*
-                * Enable PSC1 SYNC for AC97.  Normaly done in audio driver,
-                * but it is board specific code, so put it here.
-                */
-               pin_func = au_readl(SYS_PINFUNC);
-               au_sync();
-               pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
-               au_writel(pin_func, SYS_PINFUNC);
-
-               au_writel(0, (u32)bcsr | 0x10); /* turn off PCMCIA power */
-               au_sync();
-       }
-#endif
-
-#if defined(CONFIG_I2C_AU1550)
-       {
-               u32 freq0, clksrc;
-               u32 pin_func;
-
-               /* Select SMBus in CPLD */
-               bcsr->resets &= ~BCSR_RESETS_PCS0MUX;
-
-               pin_func = au_readl(SYS_PINFUNC);
-               au_sync();
-               pin_func &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
-               /* Set GPIOs correctly */
-               pin_func |= 2 << 17;
-               au_writel(pin_func, SYS_PINFUNC);
-               au_sync();
-
-               /* The I2C driver depends on 50 MHz clock */
-               freq0 = au_readl(SYS_FREQCTRL0);
-               au_sync();
-               freq0 &= ~(SYS_FC_FRDIV1_MASK | SYS_FC_FS1 | SYS_FC_FE1);
-               freq0 |= 3 << SYS_FC_FRDIV1_BIT;
-               /* 396 MHz / (3 + 1) * 2 == 49.5 MHz */
-               au_writel(freq0, SYS_FREQCTRL0);
-               au_sync();
-               freq0 |= SYS_FC_FE1;
-               au_writel(freq0, SYS_FREQCTRL0);
-               au_sync();
-
-               clksrc = au_readl(SYS_CLKSRC);
-               au_sync();
-               clksrc &= ~(SYS_CS_CE0 | SYS_CS_DE0 | SYS_CS_ME0_MASK);
-               /* Bit 22 is EXTCLK0 for PSC0 */
-               clksrc |= SYS_CS_MUX_FQ1 << SYS_CS_ME0_BIT;
-               au_writel(clksrc, SYS_CLKSRC);
-               au_sync();
-       }
-#endif
-
-#ifdef CONFIG_FB_AU1200
-       argptr = prom_getcmdline();
-#ifdef CONFIG_MIPS_PB1200
-       strcat(argptr, " video=au1200fb:panel:bs");
-#endif
-#ifdef CONFIG_MIPS_DB1200
-       strcat(argptr, " video=au1200fb:panel:bs");
-#endif
-#endif
-
-       /*
-        * The Pb1200 development board uses external MUX for PSC0 to
-        * support SMB/SPI. bcsr->resets bit 12: 0=SMB 1=SPI
-        */
-#ifdef CONFIG_I2C_AU1550
-       bcsr->resets &= ~BCSR_RESETS_PCS0MUX;
-#endif
-       au_sync();
-
-#ifdef CONFIG_MIPS_PB1200
-       printk(KERN_INFO "AMD Alchemy Pb1200 Board\n");
-#endif
-#ifdef CONFIG_MIPS_DB1200
-       printk(KERN_INFO "AMD Alchemy Db1200 Board\n");
-#endif
-
-       /* Setup Pb1200 External Interrupt Controller */
-       board_init_irq = _board_init_irq;
-}
-
-int board_au1200fb_panel(void)
-{
-       BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR;
-       int p;
-
-       p = bcsr->switches;
-       p >>= 8;
-       p &= 0x0F;
-       return p;
-}
-
-int board_au1200fb_panel_init(void)
-{
-       /* Apply power */
-       BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR;
-
-       bcsr->board |= BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD | BCSR_BOARD_LCDBL;
-       /* printk(KERN_DEBUG "board_au1200fb_panel_init()\n"); */
-       return 0;
-}
-
-int board_au1200fb_panel_shutdown(void)
-{
-       /* Remove power */
-       BCSR *bcsr = (BCSR *)BCSR_KSEG1_ADDR;
-
-       bcsr->board &= ~(BCSR_BOARD_LCDVEE | BCSR_BOARD_LCDVDD |
-                        BCSR_BOARD_LCDBL);
-       /* printk(KERN_DEBUG "board_au1200fb_panel_shutdown()\n"); */
-       return 0;
-}
diff --git a/arch/mips/au1000/pb1200/init.c b/arch/mips/au1000/pb1200/init.c
deleted file mode 100644 (file)
index e9b2a0f..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     PB1200 board setup
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1200";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = (int)fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x08000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/pb1200/irqmap.c b/arch/mips/au1000/pb1200/irqmap.c
deleted file mode 100644 (file)
index 2a505ad..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xxx irq map table
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/interrupt.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-#ifdef CONFIG_MIPS_PB1200
-#include <asm/mach-pb1x00/pb1200.h>
-#endif
-
-#ifdef CONFIG_MIPS_DB1200
-#include <asm/mach-db1x00/db1200.h>
-#define PB1200_INT_BEGIN DB1200_INT_BEGIN
-#define PB1200_INT_END DB1200_INT_END
-#endif
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-       /* This is external interrupt cascade */
-       { AU1000_GPIO_7, INTC_INT_LOW_LEVEL, 0 },
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
-
-/*
- * Support for External interrupts on the Pb1200 Development platform.
- */
-static volatile int pb1200_cascade_en;
-
-irqreturn_t pb1200_cascade_handler(int irq, void *dev_id)
-{
-       unsigned short bisr = bcsr->int_status;
-       int extirq_nr = 0;
-
-       /* Clear all the edge interrupts. This has no effect on level. */
-       bcsr->int_status = bisr;
-       for ( ; bisr; bisr &= bisr - 1) {
-               extirq_nr = PB1200_INT_BEGIN + __ffs(bisr);
-               /* Ack and dispatch IRQ */
-               do_IRQ(extirq_nr);
-       }
-
-       return IRQ_RETVAL(1);
-}
-
-inline void pb1200_enable_irq(unsigned int irq_nr)
-{
-       bcsr->intset_mask = 1 << (irq_nr - PB1200_INT_BEGIN);
-       bcsr->intset = 1 << (irq_nr - PB1200_INT_BEGIN);
-}
-
-inline void pb1200_disable_irq(unsigned int irq_nr)
-{
-       bcsr->intclr_mask = 1 << (irq_nr - PB1200_INT_BEGIN);
-       bcsr->intclr = 1 << (irq_nr - PB1200_INT_BEGIN);
-}
-
-static unsigned int pb1200_setup_cascade(void)
-{
-       return request_irq(AU1000_GPIO_7, &pb1200_cascade_handler,
-                          0, "Pb1200 Cascade", &pb1200_cascade_handler);
-}
-
-static unsigned int pb1200_startup_irq(unsigned int irq)
-{
-       if (++pb1200_cascade_en == 1) {
-               int res;
-
-               res = pb1200_setup_cascade();
-               if (res)
-                       return res;
-       }
-
-       pb1200_enable_irq(irq);
-
-       return 0;
-}
-
-static void pb1200_shutdown_irq(unsigned int irq)
-{
-       pb1200_disable_irq(irq);
-       if (--pb1200_cascade_en == 0)
-               free_irq(AU1000_GPIO_7, &pb1200_cascade_handler);
-}
-
-static struct irq_chip external_irq_type = {
-#ifdef CONFIG_MIPS_PB1200
-       .name = "Pb1200 Ext",
-#endif
-#ifdef CONFIG_MIPS_DB1200
-       .name = "Db1200 Ext",
-#endif
-       .startup  = pb1200_startup_irq,
-       .shutdown = pb1200_shutdown_irq,
-       .ack      = pb1200_disable_irq,
-       .mask     = pb1200_disable_irq,
-       .mask_ack = pb1200_disable_irq,
-       .unmask   = pb1200_enable_irq,
-};
-
-void _board_init_irq(void)
-{
-       unsigned int irq;
-
-#ifdef CONFIG_MIPS_PB1200
-       /* We have a problem with CPLD rev 3. */
-       if (((bcsr->whoami & BCSR_WHOAMI_CPLD) >> 4) <= 3) {
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "Pb1200 must be at CPLD rev 4. Please have Pb1200\n");
-               printk(KERN_ERR "updated to latest revision. This software will\n");
-               printk(KERN_ERR "not work on anything less than CPLD rev 4.\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               printk(KERN_ERR "WARNING!!!\n");
-               panic("Game over.  Your score is 0.");
-       }
-#endif
-
-       for (irq = PB1200_INT_BEGIN; irq <= PB1200_INT_END; irq++) {
-               set_irq_chip_and_handler(irq, &external_irq_type,
-                                        handle_level_irq);
-               pb1200_disable_irq(irq);
-       }
-
-       /*
-        * GPIO_7 can not be hooked here, so it is hooked upon first
-        * request of any source attached to the cascade.
-        */
-}
diff --git a/arch/mips/au1000/pb1200/platform.c b/arch/mips/au1000/pb1200/platform.c
deleted file mode 100644 (file)
index f8fb0ae..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Pb1200/DBAu1200 board platform device registration
- *
- * Copyright (C) 2008 MontaVista Software Inc. <source@mvista.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#include <linux/dma-mapping.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-
-#include <asm/mach-au1x00/au1xxx.h>
-
-static struct resource ide_resources[] = {
-       [0] = {
-               .start  = IDE_PHYS_ADDR,
-               .end    = IDE_PHYS_ADDR + IDE_PHYS_LEN - 1,
-               .flags  = IORESOURCE_MEM
-       },
-       [1] = {
-               .start  = IDE_INT,
-               .end    = IDE_INT,
-               .flags  = IORESOURCE_IRQ
-       }
-};
-
-static u64 ide_dmamask = DMA_32BIT_MASK;
-
-static struct platform_device ide_device = {
-       .name           = "au1200-ide",
-       .id             = 0,
-       .dev = {
-               .dma_mask               = &ide_dmamask,
-               .coherent_dma_mask      = DMA_32BIT_MASK,
-       },
-       .num_resources  = ARRAY_SIZE(ide_resources),
-       .resource       = ide_resources
-};
-
-static struct resource smc91c111_resources[] = {
-       [0] = {
-               .name   = "smc91x-regs",
-               .start  = SMC91C111_PHYS_ADDR,
-               .end    = SMC91C111_PHYS_ADDR + 0xf,
-               .flags  = IORESOURCE_MEM
-       },
-       [1] = {
-               .start  = SMC91C111_INT,
-               .end    = SMC91C111_INT,
-               .flags  = IORESOURCE_IRQ
-       },
-};
-
-static struct platform_device smc91c111_device = {
-       .name           = "smc91x",
-       .id             = -1,
-       .num_resources  = ARRAY_SIZE(smc91c111_resources),
-       .resource       = smc91c111_resources
-};
-
-static struct platform_device *board_platform_devices[] __initdata = {
-       &ide_device,
-       &smc91c111_device
-};
-
-static int __init board_register_devices(void)
-{
-       return platform_add_devices(board_platform_devices,
-                                   ARRAY_SIZE(board_platform_devices));
-}
-
-arch_initcall(board_register_devices);
diff --git a/arch/mips/au1000/pb1500/Makefile b/arch/mips/au1000/pb1500/Makefile
deleted file mode 100644 (file)
index 602f38d..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2001, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1500 board.
-#
-
-lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/au1000/pb1500/board_setup.c b/arch/mips/au1000/pb1500/board_setup.c
deleted file mode 100644 (file)
index 035771c..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/delay.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-pb1x00/pb1500.h>
-
-void board_reset(void)
-{
-       /* Hit BCSR.RST_VDDI[SOFT_RESET] */
-       au_writel(0x00000000, PB1500_RST_VDDI);
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func;
-       u32 sys_freqctrl, sys_clksrc;
-
-       sys_clksrc = sys_freqctrl = pin_func = 0;
-       /* Set AUX clock to 12 MHz * 8 = 96 MHz */
-       au_writel(8, SYS_AUXPLL);
-       au_writel(0, SYS_PINSTATERD);
-       udelay(100);
-
-#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
-
-       /* GPIO201 is input for PCMCIA card detect */
-       /* GPIO203 is input for PCMCIA interrupt request */
-       au_writel(au_readl(GPIO2_DIR) & ~((1 << 1) | (1 << 3)), GPIO2_DIR);
-
-       /* Zero and disable FREQ2 */
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-       au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-       /* zero and disable USBH/USBD clocks */
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       sys_freqctrl = au_readl(SYS_FREQCTRL0);
-       sys_freqctrl &= ~0xFFF00000;
-
-       sys_clksrc = au_readl(SYS_CLKSRC);
-       sys_clksrc &= ~(SYS_CS_CUD | SYS_CS_DUD | SYS_CS_MUD_MASK |
-                       SYS_CS_CUH | SYS_CS_DUH | SYS_CS_MUH_MASK);
-
-       /* FREQ2 = aux/2 = 48 MHz */
-       sys_freqctrl |= (0 << SYS_FC_FRDIV2_BIT) | SYS_FC_FE2 | SYS_FC_FS2;
-       au_writel(sys_freqctrl, SYS_FREQCTRL0);
-
-       /*
-        * Route 48MHz FREQ2 into USB Host and/or Device
-        */
-       sys_clksrc |= SYS_CS_MUX_FQ2 << SYS_CS_MUH_BIT;
-       au_writel(sys_clksrc, SYS_CLKSRC);
-
-       pin_func = au_readl(SYS_PINFUNC) & ~SYS_PF_USB;
-       /* 2nd USB port is USB host */
-       pin_func |= SYS_PF_USB;
-       au_writel(pin_func, SYS_PINFUNC);
-#endif /* defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE) */
-
-#ifdef CONFIG_PCI
-       /* Setup PCI bus controller */
-       au_writel(0, Au1500_PCI_CMEM);
-       au_writel(0x00003fff, Au1500_CFG_BASE);
-#if defined(__MIPSEB__)
-       au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG);
-#else
-       au_writel(0xf, Au1500_PCI_CFG);
-#endif
-       au_writel(0xf0000000, Au1500_PCI_MWMASK_DEV);
-       au_writel(0, Au1500_PCI_MWBASE_REV_CCL);
-       au_writel(0x02a00356, Au1500_PCI_STATCMD);
-       au_writel(0x00003c04, Au1500_PCI_HDRTYPE);
-       au_writel(0x00000008, Au1500_PCI_MBAR);
-       au_sync();
-#endif
-
-       /* Enable sys bus clock divider when IDLE state or no bus activity. */
-       au_writel(au_readl(SYS_POWERCTRL) | (0x3 << 5), SYS_POWERCTRL);
-
-       /* Enable the RTC if not already enabled */
-       if (!(au_readl(0xac000028) & 0x20)) {
-               printk(KERN_INFO "enabling clock ...\n");
-               au_writel((au_readl(0xac000028) | 0x20), 0xac000028);
-       }
-       /* Put the clock in BCD mode */
-       if (au_readl(0xac00002c) & 0x4) { /* reg B */
-               au_writel(au_readl(0xac00002c) & ~0x4, 0xac00002c);
-               au_sync();
-       }
-}
diff --git a/arch/mips/au1000/pb1500/init.c b/arch/mips/au1000/pb1500/init.c
deleted file mode 100644 (file)
index 3b6e395..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Pb1500 board setup
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1500";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = (int)fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/pb1500/irqmap.c b/arch/mips/au1000/pb1500/irqmap.c
deleted file mode 100644 (file)
index 39c4682..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xxx irq map table
- *
- * Copyright 2003 Embedded Edge, LLC
- *             dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-char irq_tab_alchemy[][5] __initdata = {
-       [12] = { -1, INTA, INTX, INTX, INTX },   /* IDSEL 12 - HPT370   */
-       [13] = { -1, INTA, INTB, INTC, INTD },   /* IDSEL 13 - PCI slot */
-};
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-       { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/au1000/pb1550/Makefile b/arch/mips/au1000/pb1550/Makefile
deleted file mode 100644 (file)
index 7d8beca..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2000, 2008 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for the Alchemy Semiconductor Pb1550 board.
-#
-
-lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/au1000/pb1550/board_setup.c b/arch/mips/au1000/pb1550/board_setup.c
deleted file mode 100644 (file)
index 0ed76b6..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Alchemy Pb1550 board setup.
- *
- * Copyright 2000, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-#include <asm/mach-pb1x00/pb1550.h>
-
-void board_reset(void)
-{
-       /* Hit BCSR.SYSTEM[RESET] */
-       au_writew(au_readw(0xAF00001C) & ~BCSR_SYSTEM_RESET, 0xAF00001C);
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func;
-
-       /*
-        * Enable PSC1 SYNC for AC'97.  Normaly done in audio driver,
-        * but it is board specific code, so put it here.
-        */
-       pin_func = au_readl(SYS_PINFUNC);
-       au_sync();
-       pin_func |= SYS_PF_MUST_BE_SET | SYS_PF_PSC1_S1;
-       au_writel(pin_func, SYS_PINFUNC);
-
-       au_writel(0, (u32)bcsr | 0x10); /* turn off PCMCIA power */
-       au_sync();
-
-       printk(KERN_INFO "AMD Alchemy Pb1550 Board\n");
-}
diff --git a/arch/mips/au1000/pb1550/init.c b/arch/mips/au1000/pb1550/init.c
deleted file mode 100644 (file)
index e1055a1..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *
- * BRIEF MODULE DESCRIPTION
- *     Pb1550 board setup
- *
- * Copyright 2001, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "Alchemy Pb1550";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = (int)fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x08000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/pb1550/irqmap.c b/arch/mips/au1000/pb1550/irqmap.c
deleted file mode 100644 (file)
index a02a4d1..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xx0 IRQ map table
- *
- * Copyright 2003 Embedded Edge, LLC
- *             dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-char irq_tab_alchemy[][5] __initdata = {
-       [12] = { -1, INTB, INTC, INTD, INTA }, /* IDSEL 12 - PCI slot 2 (left)  */
-       [13] = { -1, INTA, INTB, INTC, INTD }, /* IDSEL 13 - PCI slot 1 (right) */
-};
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-       { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 },
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);
diff --git a/arch/mips/au1000/xxs1500/Makefile b/arch/mips/au1000/xxs1500/Makefile
deleted file mode 100644 (file)
index db3c526..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-#
-#  Copyright 2003 MontaVista Software Inc.
-#  Author: MontaVista Software, Inc. <source@mvista.com>
-#
-# Makefile for MyCable XXS1500 board.
-#
-
-lib-y := init.o board_setup.o irqmap.o
diff --git a/arch/mips/au1000/xxs1500/board_setup.c b/arch/mips/au1000/xxs1500/board_setup.c
deleted file mode 100644 (file)
index 4c587ac..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2000-2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/delay.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-void board_reset(void)
-{
-       /* Hit BCSR.SYSTEM_CONTROL[SW_RST] */
-       au_writel(0x00000000, 0xAE00001C);
-}
-
-void __init board_setup(void)
-{
-       u32 pin_func;
-
-       /* Set multiple use pins (UART3/GPIO) to UART (it's used as UART too) */
-       pin_func  = au_readl(SYS_PINFUNC) & ~SYS_PF_UR3;
-       pin_func |= SYS_PF_UR3;
-       au_writel(pin_func, SYS_PINFUNC);
-
-       /* Enable UART */
-       au_writel(0x01, UART3_ADDR + UART_MOD_CNTRL); /* clock enable (CE) */
-       mdelay(10);
-       au_writel(0x03, UART3_ADDR + UART_MOD_CNTRL); /* CE and "enable" */
-       mdelay(10);
-
-       /* Enable DTR = USB power up */
-       au_writel(0x01, UART3_ADDR + UART_MCR); /* UART_MCR_DTR is 0x01??? */
-
-#ifdef CONFIG_PCMCIA_XXS1500
-       /* Setup PCMCIA signals */
-       au_writel(0, SYS_PININPUTEN);
-
-       /* GPIO 0, 1, and 4 are inputs */
-       au_writel(1 | (1 << 1) | (1 << 4), SYS_TRIOUTCLR);
-
-       /* Enable GPIO2 if not already enabled */
-       au_writel(1, GPIO2_ENABLE);
-       /* GPIO2 208/9/10/11 are inputs */
-       au_writel((1 << 8) | (1 << 9) | (1 << 10) | (1 << 11), GPIO2_DIR);
-
-       /* Turn off power */
-       au_writel((au_readl(GPIO2_PINSTATE) & ~(1 << 14)) | (1 << 30),
-                 GPIO2_OUTPUT);
-#endif
-
-#ifdef CONFIG_PCI
-#if defined(__MIPSEB__)
-       au_writel(0xf | (2 << 6) | (1 << 4), Au1500_PCI_CFG);
-#else
-       au_writel(0xf, Au1500_PCI_CFG);
-#endif
-#endif
-}
diff --git a/arch/mips/au1000/xxs1500/init.c b/arch/mips/au1000/xxs1500/init.c
deleted file mode 100644 (file)
index 7516434..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     XXS1500 board setup
- *
- * Copyright 2003, 2008 MontaVista Software Inc.
- * Author: MontaVista Software, Inc. <source@mvista.com>
- *
- *  This program is free software; you can redistribute  it and/or modify it
- *  under  the terms of  the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the  License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-#include <linux/kernel.h>
-
-#include <asm/bootinfo.h>
-
-#include <prom.h>
-
-const char *get_system_type(void)
-{
-       return "XXS1500";
-}
-
-void __init prom_init(void)
-{
-       unsigned char *memsize_str;
-       unsigned long memsize;
-
-       prom_argc = fw_arg0;
-       prom_argv = (char **)fw_arg1;
-       prom_envp = (char **)fw_arg2;
-
-       prom_init_cmdline();
-
-       memsize_str = prom_getenv("memsize");
-       if (!memsize_str)
-               memsize = 0x04000000;
-       else
-               strict_strtol(memsize_str, 0, &memsize);
-       add_memory_region(0, memsize, BOOT_MEM_RAM);
-}
diff --git a/arch/mips/au1000/xxs1500/irqmap.c b/arch/mips/au1000/xxs1500/irqmap.c
deleted file mode 100644 (file)
index edf06ed..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * BRIEF MODULE DESCRIPTION
- *     Au1xxx irq map table
- *
- * Copyright 2003 Embedded Edge, LLC
- *             dan@embeddededge.com
- *
- *  This program is free software; you can redistribute         it and/or modify it
- *  under  the terms of         the GNU General  Public License as published by the
- *  Free Software Foundation;  either version 2 of the License, or (at your
- *  option) any later version.
- *
- *  THIS  SOFTWARE  IS PROVIDED          ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
- *  WARRANTIES,          INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
- *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
- *  NO EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
- *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- *  NOT LIMITED          TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
- *  USE, DATA, OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
- *  ANY THEORY OF LIABILITY, WHETHER IN         CONTRACT, STRICT LIABILITY, OR TORT
- *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- *  You should have received a copy of the  GNU General Public License along
- *  with this program; if not, write  to the Free Software Foundation, Inc.,
- *  675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
-#include <linux/init.h>
-
-#include <asm/mach-au1x00/au1000.h>
-
-struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
-       { AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0 },
-       { AU1500_GPIO_201, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_202, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_203, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_205, INTC_INT_LOW_LEVEL, 0 },
-       { AU1500_GPIO_207, INTC_INT_LOW_LEVEL, 0 },
-
-       { AU1000_GPIO_0, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_GPIO_1, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_GPIO_2, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_GPIO_3, INTC_INT_LOW_LEVEL, 0 },
-       { AU1000_GPIO_4, INTC_INT_LOW_LEVEL, 0 }, /* CF interrupt */
-       { AU1000_GPIO_5, INTC_INT_LOW_LEVEL, 0 },
-};
-
-int __initdata au1xxx_nr_irqs = ARRAY_SIZE(au1xxx_irq_map);