aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch
diff options
context:
space:
mode:
authorJohn Crispin <john@openwrt.org>2012-05-09 12:52:19 +0000
committerJohn Crispin <john@openwrt.org>2012-05-09 12:52:19 +0000
commit7d638fbb2f7a896df8cbb3cc180db7c3c60d1233 (patch)
treea0f6908c2648d8d5d5736e2499aff6246cea828c /target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch
parent200227e0b4d954f9a76f1587114a53f034539360 (diff)
downloadupstream-7d638fbb2f7a896df8cbb3cc180db7c3c60d1233.tar.gz
upstream-7d638fbb2f7a896df8cbb3cc180db7c3c60d1233.tar.bz2
upstream-7d638fbb2f7a896df8cbb3cc180db7c3c60d1233.zip
Drop 2.6.32 support
SVN-Revision: 31670
Diffstat (limited to 'target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch')
-rw-r--r--target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch1151
1 files changed, 0 insertions, 1151 deletions
diff --git a/target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch b/target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch
deleted file mode 100644
index cb0058cff8..0000000000
--- a/target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch
+++ /dev/null
@@ -1,1151 +0,0 @@
-From 36cc26a362c6ad64ba3d176809847ec60cc40859 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Wed, 30 Mar 2011 09:27:48 +0200
-Subject: [PATCH 02/13] MIPS: Lantiq: add SoC specific code for XWAY family
-
-Add support for the Lantiq XWAY family of Mips24KEc SoCs.
-
-* Danube (PSB50702)
-* Twinpass (PSB4000)
-* AR9 (PSB50802)
-* Amazon SE (PSB5061)
-
-The Amazon SE is a lightweight SoC and has no PCI as well as a different
-clock. We split the code out into seperate files to handle this.
-
-The GPIO pins on the SoCs are multi function and there are several bits
-we can use to configure the pins. To be as compatible as possible to
-GPIOLIB we add a function
-
-int ltq_gpio_request(unsigned int pin, unsigned int alt0,
- unsigned int alt1, unsigned int dir, const char *name);
-
-which lets you configure the 2 "alternate function" bits. This way drivers like
-PCI can make use of GPIOLIB without a cubersome wrapper.
-
-The PLL code inside arch/mips/lantiq/xway/clk-xway.c is voodoo to me. It was
-taken from a 2.4.20 source tree and was never really changed by me since then.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
-Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
-Cc: linux-mips@linux-mips.org
-Patchwork: https://patchwork.linux-mips.org/patch/2249/
-Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
----
- arch/mips/Kconfig | 1 +
- arch/mips/include/asm/mach-lantiq/xway/irq.h | 18 ++
- .../mips/include/asm/mach-lantiq/xway/lantiq_irq.h | 66 ++++++
- .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 140 ++++++++++++
- arch/mips/lantiq/Kconfig | 21 ++
- arch/mips/lantiq/Makefile | 2 +
- arch/mips/lantiq/Platform | 1 +
- arch/mips/lantiq/xway/Makefile | 4 +
- arch/mips/lantiq/xway/clk-ase.c | 48 +++++
- arch/mips/lantiq/xway/clk-xway.c | 223 ++++++++++++++++++++
- arch/mips/lantiq/xway/ebu.c | 53 +++++
- arch/mips/lantiq/xway/gpio.c | 195 +++++++++++++++++
- arch/mips/lantiq/xway/pmu.c | 70 ++++++
- arch/mips/lantiq/xway/prom-ase.c | 39 ++++
- arch/mips/lantiq/xway/prom-xway.c | 54 +++++
- arch/mips/lantiq/xway/reset.c | 91 ++++++++
- 16 files changed, 1026 insertions(+), 0 deletions(-)
- create mode 100644 arch/mips/include/asm/mach-lantiq/xway/irq.h
- create mode 100644 arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
- create mode 100644 arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
- create mode 100644 arch/mips/lantiq/Kconfig
- create mode 100644 arch/mips/lantiq/xway/Makefile
- create mode 100644 arch/mips/lantiq/xway/clk-ase.c
- create mode 100644 arch/mips/lantiq/xway/clk-xway.c
- create mode 100644 arch/mips/lantiq/xway/ebu.c
- create mode 100644 arch/mips/lantiq/xway/gpio.c
- create mode 100644 arch/mips/lantiq/xway/pmu.c
- create mode 100644 arch/mips/lantiq/xway/prom-ase.c
- create mode 100644 arch/mips/lantiq/xway/prom-xway.c
- create mode 100644 arch/mips/lantiq/xway/reset.c
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -694,6 +694,7 @@
- source "arch/mips/basler/excite/Kconfig"
- source "arch/mips/bcm63xx/Kconfig"
- source "arch/mips/jazz/Kconfig"
-+source "arch/mips/lantiq/Kconfig"
- source "arch/mips/lasat/Kconfig"
- source "arch/mips/pmc-sierra/Kconfig"
- source "arch/mips/sgi-ip27/Kconfig"
---- /dev/null
-+++ b/arch/mips/include/asm/mach-lantiq/xway/irq.h
-@@ -0,0 +1,18 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#ifndef __LANTIQ_IRQ_H
-+#define __LANTIQ_IRQ_H
-+
-+#include <lantiq_irq.h>
-+
-+#define NR_IRQS 256
-+
-+#include_next <irq.h>
-+
-+#endif
---- /dev/null
-+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
-@@ -0,0 +1,66 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#ifndef _LANTIQ_XWAY_IRQ_H__
-+#define _LANTIQ_XWAY_IRQ_H__
-+
-+#define INT_NUM_IRQ0 8
-+#define INT_NUM_IM0_IRL0 (INT_NUM_IRQ0 + 0)
-+#define INT_NUM_IM1_IRL0 (INT_NUM_IRQ0 + 32)
-+#define INT_NUM_IM2_IRL0 (INT_NUM_IRQ0 + 64)
-+#define INT_NUM_IM3_IRL0 (INT_NUM_IRQ0 + 96)
-+#define INT_NUM_IM4_IRL0 (INT_NUM_IRQ0 + 128)
-+#define INT_NUM_IM_OFFSET (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0)
-+
-+#define LTQ_ASC_TIR(x) (INT_NUM_IM3_IRL0 + (x * 8))
-+#define LTQ_ASC_RIR(x) (INT_NUM_IM3_IRL0 + (x * 8) + 1)
-+#define LTQ_ASC_EIR(x) (INT_NUM_IM3_IRL0 + (x * 8) + 2)
-+
-+#define LTQ_ASC_ASE_TIR INT_NUM_IM2_IRL0
-+#define LTQ_ASC_ASE_RIR (INT_NUM_IM2_IRL0 + 2)
-+#define LTQ_ASC_ASE_EIR (INT_NUM_IM2_IRL0 + 3)
-+
-+#define LTQ_SSC_TIR (INT_NUM_IM0_IRL0 + 15)
-+#define LTQ_SSC_RIR (INT_NUM_IM0_IRL0 + 14)
-+#define LTQ_SSC_EIR (INT_NUM_IM0_IRL0 + 16)
-+
-+#define LTQ_MEI_DYING_GASP_INT (INT_NUM_IM1_IRL0 + 21)
-+#define LTQ_MEI_INT (INT_NUM_IM1_IRL0 + 23)
-+
-+#define LTQ_TIMER6_INT (INT_NUM_IM1_IRL0 + 23)
-+#define LTQ_USB_INT (INT_NUM_IM1_IRL0 + 22)
-+#define LTQ_USB_OC_INT (INT_NUM_IM4_IRL0 + 23)
-+
-+#define MIPS_CPU_TIMER_IRQ 7
-+
-+#define LTQ_DMA_CH0_INT (INT_NUM_IM2_IRL0)
-+#define LTQ_DMA_CH1_INT (INT_NUM_IM2_IRL0 + 1)
-+#define LTQ_DMA_CH2_INT (INT_NUM_IM2_IRL0 + 2)
-+#define LTQ_DMA_CH3_INT (INT_NUM_IM2_IRL0 + 3)
-+#define LTQ_DMA_CH4_INT (INT_NUM_IM2_IRL0 + 4)
-+#define LTQ_DMA_CH5_INT (INT_NUM_IM2_IRL0 + 5)
-+#define LTQ_DMA_CH6_INT (INT_NUM_IM2_IRL0 + 6)
-+#define LTQ_DMA_CH7_INT (INT_NUM_IM2_IRL0 + 7)
-+#define LTQ_DMA_CH8_INT (INT_NUM_IM2_IRL0 + 8)
-+#define LTQ_DMA_CH9_INT (INT_NUM_IM2_IRL0 + 9)
-+#define LTQ_DMA_CH10_INT (INT_NUM_IM2_IRL0 + 10)
-+#define LTQ_DMA_CH11_INT (INT_NUM_IM2_IRL0 + 11)
-+#define LTQ_DMA_CH12_INT (INT_NUM_IM2_IRL0 + 25)
-+#define LTQ_DMA_CH13_INT (INT_NUM_IM2_IRL0 + 26)
-+#define LTQ_DMA_CH14_INT (INT_NUM_IM2_IRL0 + 27)
-+#define LTQ_DMA_CH15_INT (INT_NUM_IM2_IRL0 + 28)
-+#define LTQ_DMA_CH16_INT (INT_NUM_IM2_IRL0 + 29)
-+#define LTQ_DMA_CH17_INT (INT_NUM_IM2_IRL0 + 30)
-+#define LTQ_DMA_CH18_INT (INT_NUM_IM2_IRL0 + 16)
-+#define LTQ_DMA_CH19_INT (INT_NUM_IM2_IRL0 + 21)
-+
-+#define LTQ_PPE_MBOX_INT (INT_NUM_IM2_IRL0 + 24)
-+
-+#define INT_NUM_IM4_IRL14 (INT_NUM_IM4_IRL0 + 14)
-+
-+#endif
---- /dev/null
-+++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
-@@ -0,0 +1,140 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#ifndef _LTQ_XWAY_H__
-+#define _LTQ_XWAY_H__
-+
-+#ifdef CONFIG_SOC_TYPE_XWAY
-+
-+#include <lantiq.h>
-+
-+/* Chip IDs */
-+#define SOC_ID_DANUBE1 0x129
-+#define SOC_ID_DANUBE2 0x12B
-+#define SOC_ID_TWINPASS 0x12D
-+#define SOC_ID_AMAZON_SE 0x152
-+#define SOC_ID_ARX188 0x16C
-+#define SOC_ID_ARX168 0x16D
-+#define SOC_ID_ARX182 0x16F
-+
-+/* SoC Types */
-+#define SOC_TYPE_DANUBE 0x01
-+#define SOC_TYPE_TWINPASS 0x02
-+#define SOC_TYPE_AR9 0x03
-+#define SOC_TYPE_VR9 0x04
-+#define SOC_TYPE_AMAZON_SE 0x05
-+
-+/* ASC0/1 - serial port */
-+#define LTQ_ASC0_BASE_ADDR 0x1E100400
-+#define LTQ_ASC1_BASE_ADDR 0x1E100C00
-+#define LTQ_ASC_SIZE 0x400
-+
-+/* RCU - reset control unit */
-+#define LTQ_RCU_BASE_ADDR 0x1F203000
-+#define LTQ_RCU_SIZE 0x1000
-+
-+/* GPTU - general purpose timer unit */
-+#define LTQ_GPTU_BASE_ADDR 0x18000300
-+#define LTQ_GPTU_SIZE 0x100
-+
-+/* EBU - external bus unit */
-+#define LTQ_EBU_GPIO_START 0x14000000
-+#define LTQ_EBU_GPIO_SIZE 0x1000
-+
-+#define LTQ_EBU_BASE_ADDR 0x1E105300
-+#define LTQ_EBU_SIZE 0x100
-+
-+#define LTQ_EBU_BUSCON0 0x0060
-+#define LTQ_EBU_PCC_CON 0x0090
-+#define LTQ_EBU_PCC_IEN 0x00A4
-+#define LTQ_EBU_PCC_ISTAT 0x00A0
-+#define LTQ_EBU_BUSCON1 0x0064
-+#define LTQ_EBU_ADDRSEL1 0x0024
-+#define EBU_WRDIS 0x80000000
-+
-+/* CGU - clock generation unit */
-+#define LTQ_CGU_BASE_ADDR 0x1F103000
-+#define LTQ_CGU_SIZE 0x1000
-+
-+/* ICU - interrupt control unit */
-+#define LTQ_ICU_BASE_ADDR 0x1F880200
-+#define LTQ_ICU_SIZE 0x100
-+
-+/* EIU - external interrupt unit */
-+#define LTQ_EIU_BASE_ADDR 0x1F101000
-+#define LTQ_EIU_SIZE 0x1000
-+
-+/* PMU - power management unit */
-+#define LTQ_PMU_BASE_ADDR 0x1F102000
-+#define LTQ_PMU_SIZE 0x1000
-+
-+#define PMU_DMA 0x0020
-+#define PMU_USB 0x8041
-+#define PMU_LED 0x0800
-+#define PMU_GPT 0x1000
-+#define PMU_PPE 0x2000
-+#define PMU_FPI 0x4000
-+#define PMU_SWITCH 0x10000000
-+
-+/* ETOP - ethernet */
-+#define LTQ_PPE32_BASE_ADDR 0xBE180000
-+#define LTQ_PPE32_SIZE 0x40000
-+
-+/* DMA */
-+#define LTQ_DMA_BASE_ADDR 0xBE104100
-+
-+/* PCI */
-+#define PCI_CR_BASE_ADDR 0x1E105400
-+#define PCI_CR_SIZE 0x400
-+
-+/* WDT */
-+#define LTQ_WDT_BASE_ADDR 0x1F8803F0
-+#define LTQ_WDT_SIZE 0x10
-+
-+/* STP - serial to parallel conversion unit */
-+#define LTQ_STP_BASE_ADDR 0x1E100BB0
-+#define LTQ_STP_SIZE 0x40
-+
-+/* GPIO */
-+#define LTQ_GPIO0_BASE_ADDR 0x1E100B10
-+#define LTQ_GPIO1_BASE_ADDR 0x1E100B40
-+#define LTQ_GPIO2_BASE_ADDR 0x1E100B70
-+#define LTQ_GPIO_SIZE 0x30
-+
-+/* SSC */
-+#define LTQ_SSC_BASE_ADDR 0x1e100800
-+#define LTQ_SSC_SIZE 0x100
-+
-+/* MEI - dsl core */
-+#define LTQ_MEI_BASE_ADDR 0x1E116000
-+
-+/* DEU - data encryption unit */
-+#define LTQ_DEU_BASE_ADDR 0x1E103100
-+
-+/* MPS - multi processor unit (voice) */
-+#define LTQ_MPS_BASE_ADDR (KSEG1 + 0x1F107000)
-+#define LTQ_MPS_CHIPID ((u32 *)(LTQ_MPS_BASE_ADDR + 0x0344))
-+
-+/* request a non-gpio and set the PIO config */
-+extern int ltq_gpio_request(unsigned int pin, unsigned int alt0,
-+ unsigned int alt1, unsigned int dir, const char *name);
-+extern void ltq_pmu_enable(unsigned int module);
-+extern void ltq_pmu_disable(unsigned int module);
-+
-+static inline int ltq_is_ar9(void)
-+{
-+ return (ltq_get_soc_type() == SOC_TYPE_AR9);
-+}
-+
-+static inline int ltq_is_vr9(void)
-+{
-+ return (ltq_get_soc_type() == SOC_TYPE_VR9);
-+}
-+
-+#endif /* CONFIG_SOC_TYPE_XWAY */
-+#endif /* _LTQ_XWAY_H__ */
---- /dev/null
-+++ b/arch/mips/lantiq/Kconfig
-@@ -0,0 +1,21 @@
-+if LANTIQ
-+
-+config SOC_TYPE_XWAY
-+ bool
-+ default n
-+
-+choice
-+ prompt "SoC Type"
-+ default SOC_XWAY
-+
-+config SOC_AMAZON_SE
-+ bool "Amazon SE"
-+ select SOC_TYPE_XWAY
-+
-+config SOC_XWAY
-+ bool "XWAY"
-+ select SOC_TYPE_XWAY
-+ select HW_HAS_PCI
-+endchoice
-+
-+endif
---- a/arch/mips/lantiq/Makefile
-+++ b/arch/mips/lantiq/Makefile
-@@ -7,3 +7,5 @@
- obj-y := irq.o setup.o clk.o prom.o
-
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
-+
-+obj-$(CONFIG_SOC_TYPE_XWAY) += xway/
---- a/arch/mips/lantiq/Platform
-+++ b/arch/mips/lantiq/Platform
-@@ -5,3 +5,4 @@
- platform-$(CONFIG_LANTIQ) += lantiq/
- cflags-$(CONFIG_LANTIQ) += -I$(srctree)/arch/mips/include/asm/mach-lantiq
- load-$(CONFIG_LANTIQ) = 0xffffffff80002000
-+cflags-$(CONFIG_SOC_TYPE_XWAY) += -I$(srctree)/arch/mips/include/asm/mach-lantiq/xway
---- /dev/null
-+++ b/arch/mips/lantiq/xway/Makefile
-@@ -0,0 +1,4 @@
-+obj-y := pmu.o ebu.o reset.o gpio.o
-+
-+obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
-+obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
---- /dev/null
-+++ b/arch/mips/lantiq/xway/clk-ase.c
-@@ -0,0 +1,48 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2011 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/io.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/clk.h>
-+
-+#include <asm/time.h>
-+#include <asm/irq.h>
-+#include <asm/div64.h>
-+
-+#include <lantiq_soc.h>
-+
-+/* cgu registers */
-+#define LTQ_CGU_SYS 0x0010
-+
-+unsigned int ltq_get_io_region_clock(void)
-+{
-+ return CLOCK_133M;
-+}
-+EXPORT_SYMBOL(ltq_get_io_region_clock);
-+
-+unsigned int ltq_get_fpi_bus_clock(int fpi)
-+{
-+ return CLOCK_133M;
-+}
-+EXPORT_SYMBOL(ltq_get_fpi_bus_clock);
-+
-+unsigned int ltq_get_cpu_hz(void)
-+{
-+ if (ltq_cgu_r32(LTQ_CGU_SYS) & (1 << 5))
-+ return CLOCK_266M;
-+ else
-+ return CLOCK_133M;
-+}
-+EXPORT_SYMBOL(ltq_get_cpu_hz);
-+
-+unsigned int ltq_get_fpi_hz(void)
-+{
-+ return CLOCK_133M;
-+}
-+EXPORT_SYMBOL(ltq_get_fpi_hz);
---- /dev/null
-+++ b/arch/mips/lantiq/xway/clk-xway.c
-@@ -0,0 +1,223 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/io.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/clk.h>
-+
-+#include <asm/time.h>
-+#include <asm/irq.h>
-+#include <asm/div64.h>
-+
-+#include <lantiq_soc.h>
-+
-+static unsigned int ltq_ram_clocks[] = {
-+ CLOCK_167M, CLOCK_133M, CLOCK_111M, CLOCK_83M };
-+#define DDR_HZ ltq_ram_clocks[ltq_cgu_r32(LTQ_CGU_SYS) & 0x3]
-+
-+#define BASIC_FREQUENCY_1 35328000
-+#define BASIC_FREQUENCY_2 36000000
-+#define BASIS_REQUENCY_USB 12000000
-+
-+#define GET_BITS(x, msb, lsb) \
-+ (((x) & ((1 << ((msb) + 1)) - 1)) >> (lsb))
-+
-+#define LTQ_CGU_PLL0_CFG 0x0004
-+#define LTQ_CGU_PLL1_CFG 0x0008
-+#define LTQ_CGU_PLL2_CFG 0x000C
-+#define LTQ_CGU_SYS 0x0010
-+#define LTQ_CGU_UPDATE 0x0014
-+#define LTQ_CGU_IF_CLK 0x0018
-+#define LTQ_CGU_OSC_CON 0x001C
-+#define LTQ_CGU_SMD 0x0020
-+#define LTQ_CGU_CT1SR 0x0028
-+#define LTQ_CGU_CT2SR 0x002C
-+#define LTQ_CGU_PCMCR 0x0030
-+#define LTQ_CGU_PCI_CR 0x0034
-+#define LTQ_CGU_PD_PC 0x0038
-+#define LTQ_CGU_FMR 0x003C
-+
-+#define CGU_PLL0_PHASE_DIVIDER_ENABLE \
-+ (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 31))
-+#define CGU_PLL0_BYPASS \
-+ (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 30))
-+#define CGU_PLL0_CFG_DSMSEL \
-+ (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 28))
-+#define CGU_PLL0_CFG_FRAC_EN \
-+ (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 27))
-+#define CGU_PLL1_SRC \
-+ (ltq_cgu_r32(LTQ_CGU_PLL1_CFG) & (1 << 31))
-+#define CGU_PLL2_PHASE_DIVIDER_ENABLE \
-+ (ltq_cgu_r32(LTQ_CGU_PLL2_CFG) & (1 << 20))
-+#define CGU_SYS_FPI_SEL (1 << 6)
-+#define CGU_SYS_DDR_SEL 0x3
-+#define CGU_PLL0_SRC (1 << 29)
-+
-+#define CGU_PLL0_CFG_PLLK GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 26, 17)
-+#define CGU_PLL0_CFG_PLLN GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 12, 6)
-+#define CGU_PLL0_CFG_PLLM GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 5, 2)
-+#define CGU_PLL2_SRC GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL2_CFG), 18, 17)
-+#define CGU_PLL2_CFG_INPUT_DIV GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL2_CFG), 16, 13)
-+
-+static unsigned int ltq_get_pll0_fdiv(void);
-+
-+static inline unsigned int get_input_clock(int pll)
-+{
-+ switch (pll) {
-+ case 0:
-+ if (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & CGU_PLL0_SRC)
-+ return BASIS_REQUENCY_USB;
-+ else if (CGU_PLL0_PHASE_DIVIDER_ENABLE)
-+ return BASIC_FREQUENCY_1;
-+ else
-+ return BASIC_FREQUENCY_2;
-+ case 1:
-+ if (CGU_PLL1_SRC)
-+ return BASIS_REQUENCY_USB;
-+ else if (CGU_PLL0_PHASE_DIVIDER_ENABLE)
-+ return BASIC_FREQUENCY_1;
-+ else
-+ return BASIC_FREQUENCY_2;
-+ case 2:
-+ switch (CGU_PLL2_SRC) {
-+ case 0:
-+ return ltq_get_pll0_fdiv();
-+ case 1:
-+ return CGU_PLL2_PHASE_DIVIDER_ENABLE ?
-+ BASIC_FREQUENCY_1 :
-+ BASIC_FREQUENCY_2;
-+ case 2:
-+ return BASIS_REQUENCY_USB;
-+ }
-+ default:
-+ return 0;
-+ }
-+}
-+
-+static inline unsigned int cal_dsm(int pll, unsigned int num, unsigned int den)
-+{
-+ u64 res, clock = get_input_clock(pll);
-+
-+ res = num * clock;
-+ do_div(res, den);
-+ return res;
-+}
-+
-+static inline unsigned int mash_dsm(int pll, unsigned int M, unsigned int N,
-+ unsigned int K)
-+{
-+ unsigned int num = ((N + 1) << 10) + K;
-+ unsigned int den = (M + 1) << 10;
-+
-+ return cal_dsm(pll, num, den);
-+}
-+
-+static inline unsigned int ssff_dsm_1(int pll, unsigned int M, unsigned int N,
-+ unsigned int K)
-+{
-+ unsigned int num = ((N + 1) << 11) + K + 512;
-+ unsigned int den = (M + 1) << 11;
-+
-+ return cal_dsm(pll, num, den);
-+}
-+
-+static inline unsigned int ssff_dsm_2(int pll, unsigned int M, unsigned int N,
-+ unsigned int K)
-+{
-+ unsigned int num = K >= 512 ?
-+ ((N + 1) << 12) + K - 512 : ((N + 1) << 12) + K + 3584;
-+ unsigned int den = (M + 1) << 12;
-+
-+ return cal_dsm(pll, num, den);
-+}
-+
-+static inline unsigned int dsm(int pll, unsigned int M, unsigned int N,
-+ unsigned int K, unsigned int dsmsel, unsigned int phase_div_en)
-+{
-+ if (!dsmsel)
-+ return mash_dsm(pll, M, N, K);
-+ else if (!phase_div_en)
-+ return mash_dsm(pll, M, N, K);
-+ else
-+ return ssff_dsm_2(pll, M, N, K);
-+}
-+
-+static inline unsigned int ltq_get_pll0_fosc(void)
-+{
-+ if (CGU_PLL0_BYPASS)
-+ return get_input_clock(0);
-+ else
-+ return !CGU_PLL0_CFG_FRAC_EN
-+ ? dsm(0, CGU_PLL0_CFG_PLLM, CGU_PLL0_CFG_PLLN, 0,
-+ CGU_PLL0_CFG_DSMSEL,
-+ CGU_PLL0_PHASE_DIVIDER_ENABLE)
-+ : dsm(0, CGU_PLL0_CFG_PLLM, CGU_PLL0_CFG_PLLN,
-+ CGU_PLL0_CFG_PLLK, CGU_PLL0_CFG_DSMSEL,
-+ CGU_PLL0_PHASE_DIVIDER_ENABLE);
-+}
-+
-+static unsigned int ltq_get_pll0_fdiv(void)
-+{
-+ unsigned int div = CGU_PLL2_CFG_INPUT_DIV + 1;
-+
-+ return (ltq_get_pll0_fosc() + (div >> 1)) / div;
-+}
-+
-+unsigned int ltq_get_io_region_clock(void)
-+{
-+ unsigned int ret = ltq_get_pll0_fosc();
-+
-+ switch (ltq_cgu_r32(LTQ_CGU_PLL2_CFG) & CGU_SYS_DDR_SEL) {
-+ default:
-+ case 0:
-+ return (ret + 1) / 2;
-+ case 1:
-+ return (ret * 2 + 2) / 5;
-+ case 2:
-+ return (ret + 1) / 3;
-+ case 3:
-+ return (ret + 2) / 4;
-+ }
-+}
-+EXPORT_SYMBOL(ltq_get_io_region_clock);
-+
-+unsigned int ltq_get_fpi_bus_clock(int fpi)
-+{
-+ unsigned int ret = ltq_get_io_region_clock();
-+
-+ if ((fpi == 2) && (ltq_cgu_r32(LTQ_CGU_SYS) & CGU_SYS_FPI_SEL))
-+ ret >>= 1;
-+ return ret;
-+}
-+EXPORT_SYMBOL(ltq_get_fpi_bus_clock);
-+
-+unsigned int ltq_get_cpu_hz(void)
-+{
-+ switch (ltq_cgu_r32(LTQ_CGU_SYS) & 0xc) {
-+ case 0:
-+ return CLOCK_333M;
-+ case 4:
-+ return DDR_HZ;
-+ case 8:
-+ return DDR_HZ << 1;
-+ default:
-+ return DDR_HZ >> 1;
-+ }
-+}
-+EXPORT_SYMBOL(ltq_get_cpu_hz);
-+
-+unsigned int ltq_get_fpi_hz(void)
-+{
-+ unsigned int ddr_clock = DDR_HZ;
-+
-+ if (ltq_cgu_r32(LTQ_CGU_SYS) & 0x40)
-+ return ddr_clock >> 1;
-+ return ddr_clock;
-+}
-+EXPORT_SYMBOL(ltq_get_fpi_hz);
---- /dev/null
-+++ b/arch/mips/lantiq/xway/ebu.c
-@@ -0,0 +1,53 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * EBU - the external bus unit attaches PCI, NOR and NAND
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/ioport.h>
-+
-+#include <lantiq_soc.h>
-+
-+/* all access to the ebu must be locked */
-+DEFINE_SPINLOCK(ebu_lock);
-+EXPORT_SYMBOL_GPL(ebu_lock);
-+
-+static struct resource ltq_ebu_resource = {
-+ .name = "ebu",
-+ .start = LTQ_EBU_BASE_ADDR,
-+ .end = LTQ_EBU_BASE_ADDR + LTQ_EBU_SIZE - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+/* remapped base addr of the clock unit and external bus unit */
-+void __iomem *ltq_ebu_membase;
-+
-+static int __init lantiq_ebu_init(void)
-+{
-+ /* insert and request the memory region */
-+ if (insert_resource(&iomem_resource, &ltq_ebu_resource) < 0)
-+ panic("Failed to insert ebu memory\n");
-+
-+ if (request_mem_region(ltq_ebu_resource.start,
-+ resource_size(&ltq_ebu_resource), "ebu") < 0)
-+ panic("Failed to request ebu memory\n");
-+
-+ /* remap ebu register range */
-+ ltq_ebu_membase = ioremap_nocache(ltq_ebu_resource.start,
-+ resource_size(&ltq_ebu_resource));
-+ if (!ltq_ebu_membase)
-+ panic("Failed to remap ebu memory\n");
-+
-+ /* make sure to unprotect the memory region where flash is located */
-+ ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_BUSCON0) & ~EBU_WRDIS, LTQ_EBU_BUSCON0);
-+ return 0;
-+}
-+
-+postcore_initcall(lantiq_ebu_init);
---- /dev/null
-+++ b/arch/mips/lantiq/xway/gpio.c
-@@ -0,0 +1,195 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/slab.h>
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/gpio.h>
-+#include <linux/ioport.h>
-+#include <linux/io.h>
-+
-+#include <lantiq_soc.h>
-+
-+#define LTQ_GPIO_OUT 0x00
-+#define LTQ_GPIO_IN 0x04
-+#define LTQ_GPIO_DIR 0x08
-+#define LTQ_GPIO_ALTSEL0 0x0C
-+#define LTQ_GPIO_ALTSEL1 0x10
-+#define LTQ_GPIO_OD 0x14
-+
-+#define PINS_PER_PORT 16
-+#define MAX_PORTS 3
-+
-+#define ltq_gpio_getbit(m, r, p) (!!(ltq_r32(m + r) & (1 << p)))
-+#define ltq_gpio_setbit(m, r, p) ltq_w32_mask(0, (1 << p), m + r)
-+#define ltq_gpio_clearbit(m, r, p) ltq_w32_mask((1 << p), 0, m + r)
-+
-+struct ltq_gpio {
-+ void __iomem *membase;
-+ struct gpio_chip chip;
-+};
-+
-+static struct ltq_gpio ltq_gpio_port[MAX_PORTS];
-+
-+int gpio_to_irq(unsigned int gpio)
-+{
-+ return -EINVAL;
-+}
-+EXPORT_SYMBOL(gpio_to_irq);
-+
-+int irq_to_gpio(unsigned int gpio)
-+{
-+ return -EINVAL;
-+}
-+EXPORT_SYMBOL(irq_to_gpio);
-+
-+int ltq_gpio_request(unsigned int pin, unsigned int alt0,
-+ unsigned int alt1, unsigned int dir, const char *name)
-+{
-+ int id = 0;
-+
-+ if (pin >= (MAX_PORTS * PINS_PER_PORT))
-+ return -EINVAL;
-+ if (gpio_request(pin, name)) {
-+ pr_err("failed to setup lantiq gpio: %s\n", name);
-+ return -EBUSY;
-+ }
-+ if (dir)
-+ gpio_direction_output(pin, 1);
-+ else
-+ gpio_direction_input(pin);
-+ while (pin >= PINS_PER_PORT) {
-+ pin -= PINS_PER_PORT;
-+ id++;
-+ }
-+ if (alt0)
-+ ltq_gpio_setbit(ltq_gpio_port[id].membase,
-+ LTQ_GPIO_ALTSEL0, pin);
-+ else
-+ ltq_gpio_clearbit(ltq_gpio_port[id].membase,
-+ LTQ_GPIO_ALTSEL0, pin);
-+ if (alt1)
-+ ltq_gpio_setbit(ltq_gpio_port[id].membase,
-+ LTQ_GPIO_ALTSEL1, pin);
-+ else
-+ ltq_gpio_clearbit(ltq_gpio_port[id].membase,
-+ LTQ_GPIO_ALTSEL1, pin);
-+ return 0;
-+}
-+EXPORT_SYMBOL(ltq_gpio_request);
-+
-+static void ltq_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
-+{
-+ struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
-+
-+ if (value)
-+ ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OUT, offset);
-+ else
-+ ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OUT, offset);
-+}
-+
-+static int ltq_gpio_get(struct gpio_chip *chip, unsigned int offset)
-+{
-+ struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
-+
-+ return ltq_gpio_getbit(ltq_gpio->membase, LTQ_GPIO_IN, offset);
-+}
-+
-+static int ltq_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
-+{
-+ struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
-+
-+ ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
-+ ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset);
-+
-+ return 0;
-+}
-+
-+static int ltq_gpio_direction_output(struct gpio_chip *chip,
-+ unsigned int offset, int value)
-+{
-+ struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
-+
-+ ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
-+ ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset);
-+ ltq_gpio_set(chip, offset, value);
-+
-+ return 0;
-+}
-+
-+static int ltq_gpio_req(struct gpio_chip *chip, unsigned offset)
-+{
-+ struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
-+
-+ ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL0, offset);
-+ ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL1, offset);
-+ return 0;
-+}
-+
-+static int ltq_gpio_probe(struct platform_device *pdev)
-+{
-+ struct resource *res;
-+
-+ if (pdev->id >= MAX_PORTS) {
-+ dev_err(&pdev->dev, "invalid gpio port %d\n",
-+ pdev->id);
-+ return -EINVAL;
-+ }
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!res) {
-+ dev_err(&pdev->dev, "failed to get memory for gpio port %d\n",
-+ pdev->id);
-+ return -ENOENT;
-+ }
-+ res = devm_request_mem_region(&pdev->dev, res->start,
-+ resource_size(res), dev_name(&pdev->dev));
-+ if (!res) {
-+ dev_err(&pdev->dev,
-+ "failed to request memory for gpio port %d\n",
-+ pdev->id);
-+ return -EBUSY;
-+ }
-+ ltq_gpio_port[pdev->id].membase = devm_ioremap_nocache(&pdev->dev,
-+ res->start, resource_size(res));
-+ if (!ltq_gpio_port[pdev->id].membase) {
-+ dev_err(&pdev->dev, "failed to remap memory for gpio port %d\n",
-+ pdev->id);
-+ return -ENOMEM;
-+ }
-+ ltq_gpio_port[pdev->id].chip.label = "ltq_gpio";
-+ ltq_gpio_port[pdev->id].chip.direction_input = ltq_gpio_direction_input;
-+ ltq_gpio_port[pdev->id].chip.direction_output =
-+ ltq_gpio_direction_output;
-+ ltq_gpio_port[pdev->id].chip.get = ltq_gpio_get;
-+ ltq_gpio_port[pdev->id].chip.set = ltq_gpio_set;
-+ ltq_gpio_port[pdev->id].chip.request = ltq_gpio_req;
-+ ltq_gpio_port[pdev->id].chip.base = PINS_PER_PORT * pdev->id;
-+ ltq_gpio_port[pdev->id].chip.ngpio = PINS_PER_PORT;
-+ platform_set_drvdata(pdev, &ltq_gpio_port[pdev->id]);
-+ return gpiochip_add(&ltq_gpio_port[pdev->id].chip);
-+}
-+
-+static struct platform_driver
-+ltq_gpio_driver = {
-+ .probe = ltq_gpio_probe,
-+ .driver = {
-+ .name = "ltq_gpio",
-+ .owner = THIS_MODULE,
-+ },
-+};
-+
-+int __init ltq_gpio_init(void)
-+{
-+ int ret = platform_driver_register(&ltq_gpio_driver);
-+
-+ if (ret)
-+ pr_info("ltq_gpio : Error registering platfom driver!");
-+ return ret;
-+}
-+
-+postcore_initcall(ltq_gpio_init);
---- /dev/null
-+++ b/arch/mips/lantiq/xway/pmu.c
-@@ -0,0 +1,70 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/ioport.h>
-+
-+#include <lantiq_soc.h>
-+
-+/* PMU - the power management unit allows us to turn part of the core
-+ * on and off
-+ */
-+
-+/* the enable / disable registers */
-+#define LTQ_PMU_PWDCR 0x1C
-+#define LTQ_PMU_PWDSR 0x20
-+
-+#define ltq_pmu_w32(x, y) ltq_w32((x), ltq_pmu_membase + (y))
-+#define ltq_pmu_r32(x) ltq_r32(ltq_pmu_membase + (x))
-+
-+static struct resource ltq_pmu_resource = {
-+ .name = "pmu",
-+ .start = LTQ_PMU_BASE_ADDR,
-+ .end = LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+static void __iomem *ltq_pmu_membase;
-+
-+void ltq_pmu_enable(unsigned int module)
-+{
-+ int err = 1000000;
-+
-+ ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR);
-+ do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
-+
-+ if (!err)
-+ panic("activating PMU module failed!\n");
-+}
-+EXPORT_SYMBOL(ltq_pmu_enable);
-+
-+void ltq_pmu_disable(unsigned int module)
-+{
-+ ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR);
-+}
-+EXPORT_SYMBOL(ltq_pmu_disable);
-+
-+int __init ltq_pmu_init(void)
-+{
-+ if (insert_resource(&iomem_resource, &ltq_pmu_resource) < 0)
-+ panic("Failed to insert pmu memory\n");
-+
-+ if (request_mem_region(ltq_pmu_resource.start,
-+ resource_size(&ltq_pmu_resource), "pmu") < 0)
-+ panic("Failed to request pmu memory\n");
-+
-+ ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start,
-+ resource_size(&ltq_pmu_resource));
-+ if (!ltq_pmu_membase)
-+ panic("Failed to remap pmu memory\n");
-+ return 0;
-+}
-+
-+core_initcall(ltq_pmu_init);
---- /dev/null
-+++ b/arch/mips/lantiq/xway/prom-ase.c
-@@ -0,0 +1,39 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/clk.h>
-+#include <asm/bootinfo.h>
-+#include <asm/time.h>
-+
-+#include <lantiq_soc.h>
-+
-+#include "../prom.h"
-+
-+#define SOC_AMAZON_SE "Amazon_SE"
-+
-+#define PART_SHIFT 12
-+#define PART_MASK 0x0FFFFFFF
-+#define REV_SHIFT 28
-+#define REV_MASK 0xF0000000
-+
-+void __init ltq_soc_detect(struct ltq_soc_info *i)
-+{
-+ i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT;
-+ i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT;
-+ switch (i->partnum) {
-+ case SOC_ID_AMAZON_SE:
-+ i->name = SOC_AMAZON_SE;
-+ i->type = SOC_TYPE_AMAZON_SE;
-+ break;
-+
-+ default:
-+ unreachable();
-+ break;
-+ }
-+}
---- /dev/null
-+++ b/arch/mips/lantiq/xway/prom-xway.c
-@@ -0,0 +1,54 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/clk.h>
-+#include <asm/bootinfo.h>
-+#include <asm/time.h>
-+
-+#include <lantiq_soc.h>
-+
-+#include "../prom.h"
-+
-+#define SOC_DANUBE "Danube"
-+#define SOC_TWINPASS "Twinpass"
-+#define SOC_AR9 "AR9"
-+
-+#define PART_SHIFT 12
-+#define PART_MASK 0x0FFFFFFF
-+#define REV_SHIFT 28
-+#define REV_MASK 0xF0000000
-+
-+void __init ltq_soc_detect(struct ltq_soc_info *i)
-+{
-+ i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT;
-+ i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT;
-+ switch (i->partnum) {
-+ case SOC_ID_DANUBE1:
-+ case SOC_ID_DANUBE2:
-+ i->name = SOC_DANUBE;
-+ i->type = SOC_TYPE_DANUBE;
-+ break;
-+
-+ case SOC_ID_TWINPASS:
-+ i->name = SOC_TWINPASS;
-+ i->type = SOC_TYPE_DANUBE;
-+ break;
-+
-+ case SOC_ID_ARX188:
-+ case SOC_ID_ARX168:
-+ case SOC_ID_ARX182:
-+ i->name = SOC_AR9;
-+ i->type = SOC_TYPE_AR9;
-+ break;
-+
-+ default:
-+ unreachable();
-+ break;
-+ }
-+}
---- /dev/null
-+++ b/arch/mips/lantiq/xway/reset.c
-@@ -0,0 +1,91 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ *
-+ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/io.h>
-+#include <linux/ioport.h>
-+#include <linux/pm.h>
-+#include <linux/module.h>
-+#include <asm/reboot.h>
-+
-+#include <lantiq_soc.h>
-+
-+#define ltq_rcu_w32(x, y) ltq_w32((x), ltq_rcu_membase + (y))
-+#define ltq_rcu_r32(x) ltq_r32(ltq_rcu_membase + (x))
-+
-+/* register definitions */
-+#define LTQ_RCU_RST 0x0010
-+#define LTQ_RCU_RST_ALL 0x40000000
-+
-+#define LTQ_RCU_RST_STAT 0x0014
-+#define LTQ_RCU_STAT_SHIFT 26
-+
-+static struct resource ltq_rcu_resource = {
-+ .name = "rcu",
-+ .start = LTQ_RCU_BASE_ADDR,
-+ .end = LTQ_RCU_BASE_ADDR + LTQ_RCU_SIZE - 1,
-+ .flags = IORESOURCE_MEM,
-+};
-+
-+/* remapped base addr of the reset control unit */
-+static void __iomem *ltq_rcu_membase;
-+
-+/* This function is used by the watchdog driver */
-+int ltq_reset_cause(void)
-+{
-+ u32 val = ltq_rcu_r32(LTQ_RCU_RST_STAT);
-+ return val >> LTQ_RCU_STAT_SHIFT;
-+}
-+EXPORT_SYMBOL_GPL(ltq_reset_cause);
-+
-+static void ltq_machine_restart(char *command)
-+{
-+ pr_notice("System restart\n");
-+ local_irq_disable();
-+ ltq_rcu_w32(ltq_rcu_r32(LTQ_RCU_RST) | LTQ_RCU_RST_ALL, LTQ_RCU_RST);
-+ unreachable();
-+}
-+
-+static void ltq_machine_halt(void)
-+{
-+ pr_notice("System halted.\n");
-+ local_irq_disable();
-+ unreachable();
-+}
-+
-+static void ltq_machine_power_off(void)
-+{
-+ pr_notice("Please turn off the power now.\n");
-+ local_irq_disable();
-+ unreachable();
-+}
-+
-+static int __init mips_reboot_setup(void)
-+{
-+ /* insert and request the memory region */
-+ if (insert_resource(&iomem_resource, &ltq_rcu_resource) < 0)
-+ panic("Failed to insert rcu memory\n");
-+
-+ if (request_mem_region(ltq_rcu_resource.start,
-+ resource_size(&ltq_rcu_resource), "rcu") < 0)
-+ panic("Failed to request rcu memory\n");
-+
-+ /* remap rcu register range */
-+ ltq_rcu_membase = ioremap_nocache(ltq_rcu_resource.start,
-+ resource_size(&ltq_rcu_resource));
-+ if (!ltq_rcu_membase)
-+ panic("Failed to remap rcu memory\n");
-+
-+ _machine_restart = ltq_machine_restart;
-+ _machine_halt = ltq_machine_halt;
-+ pm_power_off = ltq_machine_power_off;
-+
-+ return 0;
-+}
-+
-+arch_initcall(mips_reboot_setup);