ramips: sync kernel patches with the mips-next tree
authorblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 25 Apr 2013 19:02:42 +0000 (19:02 +0000)
committerblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 25 Apr 2013 19:02:42 +0000 (19:02 +0000)
Signed-off-by: John Crispin <blogic@openwrt.org>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36431 3c298f89-4303-0410-b956-a3cf2f4a3e73

77 files changed:
target/linux/ramips/patches-3.8/0100-MIPS-move-mips_-set-get-_machine_name-to-a-more-gene.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0100-MIPS-ralink-fix-RT305x-clock-setup.patch [deleted file]
target/linux/ramips/patches-3.8/0101-MIPS-ralink-add-PCI-IRQ-handling.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0101-MIPS-ralink-add-missing-comment-in-irq-driver.patch [deleted file]
target/linux/ramips/patches-3.8/0102-MIPS-ralink-add-RT3352-register-defines.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0102-MIPS-ralink-add-RT5350-sdram-register-defines.patch [deleted file]
target/linux/ramips/patches-3.8/0103-MIPS-ralink-add-RT3352-usb-register-defines.patch [deleted file]
target/linux/ramips/patches-3.8/0103-MIPS-ralink-fix-RT305x-clock-setup.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0104-MIPS-ralink-add-missing-comment-in-irq-driver.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0104-MIPS-ralink-add-pinmux-driver.patch [deleted file]
target/linux/ramips/patches-3.8/0105-MIPS-extend-RT3050-dtsi-file.patch [deleted file]
target/linux/ramips/patches-3.8/0105-MIPS-ralink-add-RT5350-sdram-register-defines.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0106-MIPS-add-RT5350-dtsi-file.patch [deleted file]
target/linux/ramips/patches-3.8/0106-MIPS-ralink-make-early_printk-work-on-RT2880.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0107-MIPS-ralink-adds-support-for-RT2880-SoC-family.patch [deleted file]
target/linux/ramips/patches-3.8/0107-MIPS-ralink-rename-gpio_pinmux-to-rt_gpio_pinmux.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0108-MIPS-add-rt2880-dts-files.patch [deleted file]
target/linux/ramips/patches-3.8/0108-MIPS-ralink-make-the-RT305x-pinmuxing-structure-stat.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0109-MIPS-ralink-add-pci-group-to-struct-ralink_pinmux.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0109-MIPS-ralink-adds-support-for-RT3883-SoC-family.patch [deleted file]
target/linux/ramips/patches-3.8/0110-MIPS-add-rt3883-dts-files.patch [deleted file]
target/linux/ramips/patches-3.8/0110-MIPS-ralink-add-uart-mask-to-struct-ralink_pinmux.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0111-MIPS-ralink-adds-support-for-MT7620-SoC-family.patch [deleted file]
target/linux/ramips/patches-3.8/0111-MIPS-ralink-adds-support-for-RT2880-SoC-family.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0112-MIPS-add-MT7620-dts-files.patch [deleted file]
target/linux/ramips/patches-3.8/0112-MIPS-ralink-adds-support-for-RT3883-SoC-family.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0113-MIPS-ralink-add-support-for-periodic-timer-irq.patch [deleted file]
target/linux/ramips/patches-3.8/0113-MIPS-ralink-adds-support-for-MT7620-SoC-family.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0114-GPIO-MIPS-ralink-adds-ralink-gpio-support.patch [deleted file]
target/linux/ramips/patches-3.8/0114-MIPS-ralink-add-cpu-feature-overrides.h.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0115-DT-add-vendor-prefixes-for-Ralink.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0115-SPI-ralink-add-Ralink-SoC-spi-driver.patch [deleted file]
target/linux/ramips/patches-3.8/0116-DT-add-documentation-for-the-Ralink-MIPS-SoCs.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0116-serial-of-allow-au1x00-and-rt288x-to-load-from-OF.patch [deleted file]
target/linux/ramips/patches-3.8/0117-DT-MIPS-ralink-clean-up-RT3050-dtsi-and-dts-file.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0117-serial-ralink-adds-mt7620-serial.patch [deleted file]
target/linux/ramips/patches-3.8/0118-DT-MIPS-ralink-add-RT2880-dts-files.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0118-PCI-MIPS-adds-rt2880-pci-support.patch [deleted file]
target/linux/ramips/patches-3.8/0119-DT-MIPS-ralink-add-RT3883-dts-files.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0119-PCI-MIPS-adds-rt3883-pci-support.patch [deleted file]
target/linux/ramips/patches-3.8/0120-DT-MIPS-ralink-add-MT7620A-dts-files.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0120-NET-MIPS-add-ralink-SoC-ethernet-driver.patch [deleted file]
target/linux/ramips/patches-3.8/0121-MIPS-add-detect_memory_region.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0121-watchdog-adds-ralink-wdt.patch [deleted file]
target/linux/ramips/patches-3.8/0122-MIPS-ralink-add-memory-definition-to-struct-ralink_s.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0122-MIPS-ralink-handle-PCI-interrupts-as-well.patch [deleted file]
target/linux/ramips/patches-3.8/0123-MIPS-ralink-add-memory-definition-for-RT305x.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0123-MIPS-ralink-fix-uartmux-group-handling.patch [deleted file]
target/linux/ramips/patches-3.8/0124-MIPS-ralink-add-memory-definition-for-RT2880.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0124-MIPS-ralink-add-pci-group-to-struct-ralink_pinmux.patch [deleted file]
target/linux/ramips/patches-3.8/0125-MIPS-ralink-add-memory-definition-for-RT3883.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0125-MIPS-ralink-process-PCI-pinmux-group.patch [deleted file]
target/linux/ramips/patches-3.8/0126-MIPS-ralink-add-PCI-pinmux-group-for-RT3883.patch [deleted file]
target/linux/ramips/patches-3.8/0126-MIPS-ralink-add-memory-definition-for-MT7620.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0127-MIPS-ralink-add-GPIO-mode-to-RT3883-UART-pinmux-grou.patch [deleted file]
target/linux/ramips/patches-3.8/0127-MIPS-ralink-make-use-of-the-new-memory-detection-cod.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0128-MIPS-ralink-add-cpu-feature-overrides.h-for-RT288x-S.patch [deleted file]
target/linux/ramips/patches-3.8/0128-MIPS-ralink-add-pinmux-driver.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0129-MIPS-ralink-add-cpu-feature-overrides.h-for-RT3x5x-R.patch [deleted file]
target/linux/ramips/patches-3.8/0129-MIPS-ralink-add-support-for-periodic-timer-irq.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0130-GPIO-MIPS-ralink-adds-ralink-gpio-support.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0130-MIPS-ralink-add-cpu-feature-overrides.h-for-RT3662-3.patch [deleted file]
target/linux/ramips/patches-3.8/0131-MIPS-pci-rt3883-rewrite.patch [deleted file]
target/linux/ramips/patches-3.8/0131-SPI-ralink-add-Ralink-SoC-spi-driver.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0132-NET-ramips-fix-mdio-bus-support.patch [deleted file]
target/linux/ramips/patches-3.8/0132-serial-of-allow-au1x00-and-rt288x-to-load-from-OF.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0133-MIPS-ralink-make-early_printk-work-on-RT2880.patch [deleted file]
target/linux/ramips/patches-3.8/0133-serial-ralink-adds-mt7620-serial.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0134-PCI-MIPS-adds-rt2880-pci-support.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0135-PCI-MIPS-adds-rt3883-pci-support.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0136-NET-MIPS-add-ralink-SoC-ethernet-driver.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0137-watchdog-adds-ralink-wdt.patch [new file with mode: 0644]
target/linux/ramips/patches-3.8/0200-MIPS-read-the-mips_machine-name-from-OF-and-output-i.patch [deleted file]
target/linux/ramips/patches-3.8/0204-owrt-MIPS-ralink-add-usb-platform-support.patch
target/linux/ramips/patches-3.8/0205-owrt-MIPS-add-OWRTDTB-secion.patch
target/linux/ramips/patches-3.8/0207-owrt-MIPS-ralink-add-support-for-runtime-memory-dete.patch [deleted file]
target/linux/ramips/patches-3.8/0212-MIPS-ralink-add-GPIO-mode-to-RT305x-UART-pinmux-grou.patch [deleted file]

diff --git a/target/linux/ramips/patches-3.8/0100-MIPS-move-mips_-set-get-_machine_name-to-a-more-gene.patch b/target/linux/ramips/patches-3.8/0100-MIPS-move-mips_-set-get-_machine_name-to-a-more-gene.patch
new file mode 100644 (file)
index 0000000..d5fe653
--- /dev/null
@@ -0,0 +1,154 @@
+From dd4bb7e821d112bff981016fd4e7c014ca9425f9 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Thu, 11 Apr 2013 05:34:59 +0000
+Subject: [PATCH 100/137] MIPS: move mips_{set,get}_machine_name() to a more
+ generic place
+
+Previously this functionality was only available to users of the mips_machine
+api. Moving the code to prom.c allows us to also add a OF wrapper.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5164/
+---
+ arch/mips/include/asm/mips_machine.h |    4 ----
+ arch/mips/include/asm/prom.h         |    3 +++
+ arch/mips/kernel/mips_machine.c      |   21 ---------------------
+ arch/mips/kernel/proc.c              |    2 +-
+ arch/mips/kernel/prom.c              |   31 +++++++++++++++++++++++++++++++
+ 5 files changed, 35 insertions(+), 26 deletions(-)
+
+--- a/arch/mips/include/asm/mips_machine.h
++++ b/arch/mips/include/asm/mips_machine.h
+@@ -42,13 +42,9 @@ extern long __mips_machines_end;
+ #ifdef CONFIG_MIPS_MACHINE
+ int  mips_machtype_setup(char *id) __init;
+ void mips_machine_setup(void) __init;
+-void mips_set_machine_name(const char *name) __init;
+-char *mips_get_machine_name(void);
+ #else
+ static inline int mips_machtype_setup(char *id) { return 1; }
+ static inline void mips_machine_setup(void) { }
+-static inline void mips_set_machine_name(const char *name) { }
+-static inline char *mips_get_machine_name(void) { return NULL; }
+ #endif /* CONFIG_MIPS_MACHINE */
+ #endif /* __ASM_MIPS_MACHINE_H */
+--- a/arch/mips/include/asm/prom.h
++++ b/arch/mips/include/asm/prom.h
+@@ -48,4 +48,7 @@ extern void __dt_setup_arch(struct boot_
+ static inline void device_tree_init(void) { }
+ #endif /* CONFIG_OF */
++extern char *mips_get_machine_name(void);
++extern void mips_set_machine_name(const char *name);
++
+ #endif /* __ASM_PROM_H */
+--- a/arch/mips/kernel/mips_machine.c
++++ b/arch/mips/kernel/mips_machine.c
+@@ -13,7 +13,6 @@
+ #include <asm/mips_machine.h>
+ static struct mips_machine *mips_machine __initdata;
+-static char *mips_machine_name = "Unknown";
+ #define for_each_machine(mach) \
+       for ((mach) = (struct mips_machine *)&__mips_machines_start; \
+@@ -21,25 +20,6 @@ static char *mips_machine_name = "Unknow
+            (unsigned long)(mach) < (unsigned long)&__mips_machines_end; \
+            (mach)++)
+-__init void mips_set_machine_name(const char *name)
+-{
+-      char *p;
+-
+-      if (name == NULL)
+-              return;
+-
+-      p = kstrdup(name, GFP_KERNEL);
+-      if (!p)
+-              pr_err("MIPS: no memory for machine_name\n");
+-
+-      mips_machine_name = p;
+-}
+-
+-char *mips_get_machine_name(void)
+-{
+-      return mips_machine_name;
+-}
+-
+ __init int mips_machtype_setup(char *id)
+ {
+       struct mips_machine *mach;
+@@ -79,7 +59,6 @@ __init void mips_machine_setup(void)
+               return;
+       mips_set_machine_name(mips_machine->mach_name);
+-      pr_info("MIPS: machine is %s\n", mips_machine_name);
+       if (mips_machine->mach_setup)
+               mips_machine->mach_setup();
+--- a/arch/mips/kernel/proc.c
++++ b/arch/mips/kernel/proc.c
+@@ -12,7 +12,7 @@
+ #include <asm/cpu-features.h>
+ #include <asm/mipsregs.h>
+ #include <asm/processor.h>
+-#include <asm/mips_machine.h>
++#include <asm/prom.h>
+ unsigned int vced_count, vcei_count;
+--- a/arch/mips/kernel/prom.c
++++ b/arch/mips/kernel/prom.c
+@@ -23,6 +23,22 @@
+ #include <asm/page.h>
+ #include <asm/prom.h>
++static char mips_machine_name[64] = "Unknown";
++
++__init void mips_set_machine_name(const char *name)
++{
++      if (name == NULL)
++              return;
++
++      strncpy(mips_machine_name, name, sizeof(mips_machine_name));
++      pr_info("MIPS: machine is %s\n", mips_get_machine_name());
++}
++
++char *mips_get_machine_name(void)
++{
++      return mips_machine_name;
++}
++
+ int __init early_init_dt_scan_memory_arch(unsigned long node,
+                                         const char *uname, int depth,
+                                         void *data)
+@@ -50,6 +66,18 @@ void __init early_init_dt_setup_initrd_a
+ }
+ #endif
++int __init early_init_dt_scan_model(unsigned long node,       const char *uname,
++                                  int depth, void *data)
++{
++      if (!depth) {
++              char *model = of_get_flat_dt_prop(node, "model", NULL);
++
++              if (model)
++                      mips_set_machine_name(model);
++      }
++      return 0;
++}
++
+ void __init early_init_devtree(void *params)
+ {
+       /* Setup flat device-tree pointer */
+@@ -65,6 +93,9 @@ void __init early_init_devtree(void *par
+       /* Scan memory nodes */
+       of_scan_flat_dt(early_init_dt_scan_root, NULL);
+       of_scan_flat_dt(early_init_dt_scan_memory_arch, NULL);
++
++      /* try to load the mips machine name */
++      of_scan_flat_dt(early_init_dt_scan_model, NULL);
+ }
+ void __init __dt_setup_arch(struct boot_param_header *bph)
diff --git a/target/linux/ramips/patches-3.8/0100-MIPS-ralink-fix-RT305x-clock-setup.patch b/target/linux/ramips/patches-3.8/0100-MIPS-ralink-fix-RT305x-clock-setup.patch
deleted file mode 100644 (file)
index 55b7532..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-From eb8d7fbba907df0a51e504930c00b2c9ec837b54 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Fri, 22 Mar 2013 19:25:59 +0100
-Subject: [PATCH 100/121] MIPS: ralink: fix RT305x clock setup
-
-Add a few missing clocks and remove the unused sys clock.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/rt305x.c |   14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
---- a/arch/mips/ralink/rt305x.c
-+++ b/arch/mips/ralink/rt305x.c
-@@ -125,6 +125,7 @@ void __init ralink_clk_init(void)
- {
-       unsigned long cpu_rate, sys_rate, wdt_rate, uart_rate;
-       u32 t = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG);
-+      int wmac_20mhz = 0;
-       if (soc_is_rt305x() || soc_is_rt3350()) {
-               t = (t >> RT305X_SYSCFG_CPUCLK_SHIFT) &
-@@ -176,11 +177,24 @@ void __init ralink_clk_init(void)
-               BUG();
-       }
-+      if (soc_is_rt3352() || soc_is_rt5350()) {
-+              u32 val = rt_sysc_r32(RT3352_SYSC_REG_SYSCFG0);
-+              if ((val & RT3352_CLKCFG0_XTAL_SEL) == 0)
-+                      wmac_20mhz = 1;
-+      }
-+
-       ralink_clk_add("cpu", cpu_rate);
-       ralink_clk_add("10000b00.spi", sys_rate);
-       ralink_clk_add("10000100.timer", wdt_rate);
-+      ralink_clk_add("10000120.watchdog", wdt_rate);
-       ralink_clk_add("10000500.uart", uart_rate);
-       ralink_clk_add("10000c00.uartlite", uart_rate);
-+      ralink_clk_add("10100000.ethernet", sys_rate);
-+
-+      if (wmac_20mhz)
-+              ralink_clk_add("10180000.wmac", 20000000);
-+      else
-+              ralink_clk_add("10180000.wmac", 40000000);
- }
- void __init ralink_of_remap(void)
diff --git a/target/linux/ramips/patches-3.8/0101-MIPS-ralink-add-PCI-IRQ-handling.patch b/target/linux/ramips/patches-3.8/0101-MIPS-ralink-add-PCI-IRQ-handling.patch
new file mode 100644 (file)
index 0000000..bdb5cfc
--- /dev/null
@@ -0,0 +1,35 @@
+From 16d9eaf22f30ed0b0deddfe8e11426889ccdb556 Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Wed, 10 Apr 2013 09:07:27 +0200
+Subject: [PATCH 101/137] MIPS: ralink: add PCI IRQ handling
+
+The Ralink IRQ code was not handling the PCI IRQ yet. Add this functionaility
+to make PCI work on rt3883.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5165/
+---
+ arch/mips/ralink/irq.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/arch/mips/ralink/irq.c
++++ b/arch/mips/ralink/irq.c
+@@ -31,6 +31,7 @@
+ #define INTC_INT_GLOBAL               BIT(31)
+ #define RALINK_CPU_IRQ_INTC   (MIPS_CPU_IRQ_BASE + 2)
++#define RALINK_CPU_IRQ_PCI    (MIPS_CPU_IRQ_BASE + 4)
+ #define RALINK_CPU_IRQ_FE     (MIPS_CPU_IRQ_BASE + 5)
+ #define RALINK_CPU_IRQ_WIFI   (MIPS_CPU_IRQ_BASE + 6)
+ #define RALINK_CPU_IRQ_COUNTER        (MIPS_CPU_IRQ_BASE + 7)
+@@ -104,6 +105,9 @@ asmlinkage void plat_irq_dispatch(void)
+       else if (pending & STATUSF_IP6)
+               do_IRQ(RALINK_CPU_IRQ_WIFI);
++      else if (pending & STATUSF_IP4)
++              do_IRQ(RALINK_CPU_IRQ_PCI);
++
+       else if (pending & STATUSF_IP2)
+               do_IRQ(RALINK_CPU_IRQ_INTC);
diff --git a/target/linux/ramips/patches-3.8/0101-MIPS-ralink-add-missing-comment-in-irq-driver.patch b/target/linux/ramips/patches-3.8/0101-MIPS-ralink-add-missing-comment-in-irq-driver.patch
deleted file mode 100644 (file)
index 81ae16e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-From 68dba842ed23c9688340444b44951c448f4ff9ba Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Sat, 16 Mar 2013 16:28:54 +0100
-Subject: [PATCH 101/121] MIPS: ralink: add missing comment in irq driver
-
-Trivial patch that adds a comment that makes the code more readable.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/irq.c |    1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/mips/ralink/irq.c
-+++ b/arch/mips/ralink/irq.c
-@@ -162,6 +162,7 @@ static int __init intc_of_init(struct de
-       irq_set_chained_handler(irq, ralink_intc_irq_handler);
-       irq_set_handler_data(irq, domain);
-+      /* tell the kernel which irq is used for performance monitoring */
-       cp0_perfcount_irq = irq_create_mapping(domain, 9);
-       return 0;
diff --git a/target/linux/ramips/patches-3.8/0102-MIPS-ralink-add-RT3352-register-defines.patch b/target/linux/ramips/patches-3.8/0102-MIPS-ralink-add-RT3352-register-defines.patch
new file mode 100644 (file)
index 0000000..2d296db
--- /dev/null
@@ -0,0 +1,35 @@
+From e6bcdad6f0811daedc2a448f5d7fb98c116a5241 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Thu, 21 Mar 2013 19:01:49 +0100
+Subject: [PATCH 102/137] MIPS: ralink: add RT3352 register defines
+
+Add a few missing defines that are needed to make USB and clock detection work
+on the RT3352.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5166/
+---
+ arch/mips/include/asm/mach-ralink/rt305x.h |   13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+--- a/arch/mips/include/asm/mach-ralink/rt305x.h
++++ b/arch/mips/include/asm/mach-ralink/rt305x.h
+@@ -136,4 +136,17 @@ static inline int soc_is_rt5350(void)
+ #define RT305X_GPIO_MODE_SDRAM                BIT(8)
+ #define RT305X_GPIO_MODE_RGMII                BIT(9)
++#define RT3352_SYSC_REG_SYSCFG0               0x010
++#define RT3352_SYSC_REG_SYSCFG1         0x014
++#define RT3352_SYSC_REG_CLKCFG1         0x030
++#define RT3352_SYSC_REG_RSTCTRL         0x034
++#define RT3352_SYSC_REG_USB_PS          0x05c
++
++#define RT3352_CLKCFG0_XTAL_SEL               BIT(20)
++#define RT3352_CLKCFG1_UPHY0_CLK_EN   BIT(18)
++#define RT3352_CLKCFG1_UPHY1_CLK_EN   BIT(20)
++#define RT3352_RSTCTRL_UHST           BIT(22)
++#define RT3352_RSTCTRL_UDEV           BIT(25)
++#define RT3352_SYSCFG1_USB0_HOST_MODE BIT(10)
++
+ #endif
diff --git a/target/linux/ramips/patches-3.8/0102-MIPS-ralink-add-RT5350-sdram-register-defines.patch b/target/linux/ramips/patches-3.8/0102-MIPS-ralink-add-RT5350-sdram-register-defines.patch
deleted file mode 100644 (file)
index c4bf63a..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From ac2614707be7ddceb0f0b623d55d200f28695d5f Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Mon, 25 Mar 2013 11:19:58 +0100
-Subject: [PATCH 102/121] MIPS: ralink: add RT5350 sdram register defines
-
-Add a few missing defines that are needed to make memory detection work on the
-RT5350.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/include/asm/mach-ralink/rt305x.h |    8 ++++++++
- 1 file changed, 8 insertions(+)
-
---- a/arch/mips/include/asm/mach-ralink/rt305x.h
-+++ b/arch/mips/include/asm/mach-ralink/rt305x.h
-@@ -97,6 +97,14 @@ static inline int soc_is_rt5350(void)
- #define RT5350_SYSCFG0_CPUCLK_320     0x2
- #define RT5350_SYSCFG0_CPUCLK_300     0x3
-+#define RT5350_SYSCFG0_DRAM_SIZE_SHIFT  12
-+#define RT5350_SYSCFG0_DRAM_SIZE_MASK   7
-+#define RT5350_SYSCFG0_DRAM_SIZE_2M     0
-+#define RT5350_SYSCFG0_DRAM_SIZE_8M     1
-+#define RT5350_SYSCFG0_DRAM_SIZE_16M    2
-+#define RT5350_SYSCFG0_DRAM_SIZE_32M    3
-+#define RT5350_SYSCFG0_DRAM_SIZE_64M    4
-+
- /* multi function gpio pins */
- #define RT305X_GPIO_I2C_SD            1
- #define RT305X_GPIO_I2C_SCLK          2
diff --git a/target/linux/ramips/patches-3.8/0103-MIPS-ralink-add-RT3352-usb-register-defines.patch b/target/linux/ramips/patches-3.8/0103-MIPS-ralink-add-RT3352-usb-register-defines.patch
deleted file mode 100644 (file)
index d99781b..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From 5157985fbc0f071276b0c3381ac8ed191878358a Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 19:01:49 +0100
-Subject: [PATCH 103/121] MIPS: ralink: add RT3352 usb register defines
-
-Add a few missing defines that are needed to make USB work on the RT3352
-and RT5350.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/include/asm/mach-ralink/rt305x.h |   11 +++++++++++
- 1 file changed, 11 insertions(+)
-
---- a/arch/mips/include/asm/mach-ralink/rt305x.h
-+++ b/arch/mips/include/asm/mach-ralink/rt305x.h
-@@ -144,4 +144,18 @@ static inline int soc_is_rt5350(void)
- #define RT305X_GPIO_MODE_SDRAM                BIT(8)
- #define RT305X_GPIO_MODE_RGMII                BIT(9)
-+#define RT3352_SYSC_REG_SYSCFG1         0x014
-+#define RT3352_SYSC_REG_CLKCFG1         0x030
-+#define RT3352_SYSC_REG_RSTCTRL         0x034
-+#define RT3352_SYSC_REG_USB_PS          0x05c
-+
-+#define RT3352_CLKCFG1_UPHY0_CLK_EN   BIT(18)
-+#define RT3352_CLKCFG1_UPHY1_CLK_EN   BIT(20)
-+#define RT3352_RSTCTRL_UHST           BIT(22)
-+#define RT3352_RSTCTRL_UDEV           BIT(25)
-+#define RT3352_SYSCFG1_USB0_HOST_MODE BIT(10)
-+
-+#define RT3352_SYSC_REG_SYSCFG0               0x010
-+#define       RT3352_CLKCFG0_XTAL_SEL         BIT(20)
-+
- #endif
diff --git a/target/linux/ramips/patches-3.8/0103-MIPS-ralink-fix-RT305x-clock-setup.patch b/target/linux/ramips/patches-3.8/0103-MIPS-ralink-fix-RT305x-clock-setup.patch
new file mode 100644 (file)
index 0000000..7d682e7
--- /dev/null
@@ -0,0 +1,47 @@
+From 845f786c561c0991d9b4088a2d77b8fd4831d487 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 22 Mar 2013 19:25:59 +0100
+Subject: [PATCH 103/137] MIPS: ralink: fix RT305x clock setup
+
+Add a few missing clocks.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5167/
+---
+ arch/mips/ralink/rt305x.c |   12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+--- a/arch/mips/ralink/rt305x.c
++++ b/arch/mips/ralink/rt305x.c
+@@ -124,6 +124,8 @@ struct ralink_pinmux gpio_pinmux = {
+ void __init ralink_clk_init(void)
+ {
+       unsigned long cpu_rate, sys_rate, wdt_rate, uart_rate;
++      unsigned long wmac_rate = 40000000;
++
+       u32 t = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG);
+       if (soc_is_rt305x() || soc_is_rt3350()) {
+@@ -176,11 +178,21 @@ void __init ralink_clk_init(void)
+               BUG();
+       }
++      if (soc_is_rt3352() || soc_is_rt5350()) {
++              u32 val = rt_sysc_r32(RT3352_SYSC_REG_SYSCFG0);
++
++              if (!(val & RT3352_CLKCFG0_XTAL_SEL))
++                      wmac_rate = 20000000;
++      }
++
+       ralink_clk_add("cpu", cpu_rate);
+       ralink_clk_add("10000b00.spi", sys_rate);
+       ralink_clk_add("10000100.timer", wdt_rate);
++      ralink_clk_add("10000120.watchdog", wdt_rate);
+       ralink_clk_add("10000500.uart", uart_rate);
+       ralink_clk_add("10000c00.uartlite", uart_rate);
++      ralink_clk_add("10100000.ethernet", sys_rate);
++      ralink_clk_add("10180000.wmac", wmac_rate);
+ }
+ void __init ralink_of_remap(void)
diff --git a/target/linux/ramips/patches-3.8/0104-MIPS-ralink-add-missing-comment-in-irq-driver.patch b/target/linux/ramips/patches-3.8/0104-MIPS-ralink-add-missing-comment-in-irq-driver.patch
new file mode 100644 (file)
index 0000000..3218384
--- /dev/null
@@ -0,0 +1,24 @@
+From 2747613b1bba0d4497ed2c4a77e2011d02029153 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Sat, 16 Mar 2013 16:28:54 +0100
+Subject: [PATCH 104/137] MIPS: ralink: add missing comment in irq driver
+
+Trivial patch that adds a comment that makes the code more readable.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5168/
+---
+ arch/mips/ralink/irq.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/arch/mips/ralink/irq.c
++++ b/arch/mips/ralink/irq.c
+@@ -166,6 +166,7 @@ static int __init intc_of_init(struct de
+       irq_set_chained_handler(irq, ralink_intc_irq_handler);
+       irq_set_handler_data(irq, domain);
++      /* tell the kernel which irq is used for performance monitoring */
+       cp0_perfcount_irq = irq_create_mapping(domain, 9);
+       return 0;
diff --git a/target/linux/ramips/patches-3.8/0104-MIPS-ralink-add-pinmux-driver.patch b/target/linux/ramips/patches-3.8/0104-MIPS-ralink-add-pinmux-driver.patch
deleted file mode 100644 (file)
index 3748947..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-From 806a489c720767f63bf5046c2ccd87ded9549c1c Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Sat, 16 Mar 2013 00:50:57 +0100
-Subject: [PATCH 104/121] MIPS: ralink: add pinmux driver
-
-Add code to setup the pinmux on ralonk SoC. The SoC has a single 32 bit register
-for this functionality with simple on/off bits. Building a full featured pinctrl
-driver would be overkill.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/Makefile |    2 +-
- arch/mips/ralink/common.h |    5 ++-
- arch/mips/ralink/of.c     |    2 ++
- arch/mips/ralink/pinmux.c |   76 +++++++++++++++++++++++++++++++++++++++++++++
- arch/mips/ralink/rt305x.c |    6 ++--
- 5 files changed, 85 insertions(+), 6 deletions(-)
- create mode 100644 arch/mips/ralink/pinmux.c
-
---- a/arch/mips/ralink/Makefile
-+++ b/arch/mips/ralink/Makefile
-@@ -6,7 +6,7 @@
- # Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
- # Copyright (C) 2013 John Crispin <blogic@openwrt.org>
--obj-y := prom.o of.o reset.o clk.o irq.o
-+obj-y := prom.o of.o reset.o clk.o irq.o pinmux.o
- obj-$(CONFIG_SOC_RT305X) += rt305x.o
---- a/arch/mips/ralink/common.h
-+++ b/arch/mips/ralink/common.h
-@@ -22,9 +22,10 @@ struct ralink_pinmux {
-       struct ralink_pinmux_grp *mode;
-       struct ralink_pinmux_grp *uart;
-       int uart_shift;
-+      u32 uart_mask;
-       void (*wdt_reset)(void);
- };
--extern struct ralink_pinmux gpio_pinmux;
-+extern struct ralink_pinmux rt_pinmux;
- struct ralink_soc_info {
-       unsigned char sys_type[RAMIPS_SYS_TYPE_LEN];
-@@ -41,4 +42,6 @@ extern void prom_soc_init(struct ralink_
- __iomem void *plat_of_remap_node(const char *node);
-+void ralink_pinmux(void);
-+
- #endif /* _RALINK_COMMON_H__ */
---- a/arch/mips/ralink/of.c
-+++ b/arch/mips/ralink/of.c
-@@ -101,6 +101,8 @@ static int __init plat_of_setup(void)
-       if (of_platform_populate(NULL, of_ids, NULL, NULL))
-               panic("failed to populate DT\n");
-+      ralink_pinmux();
-+
-       return 0;
- }
---- /dev/null
-+++ b/arch/mips/ralink/pinmux.c
-@@ -0,0 +1,76 @@
-+/*
-+ *  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) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/of.h>
-+
-+#include <asm/mach-ralink/ralink_regs.h>
-+
-+#include "common.h"
-+
-+#define SYSC_REG_GPIO_MODE    0x60
-+
-+static u32 ralink_mux_mask(const char *name, struct ralink_pinmux_grp *grps)
-+{
-+      for (; grps->name; grps++)
-+              if (!strcmp(grps->name, name))
-+                      return grps->mask;
-+
-+      return 0;
-+}
-+
-+void ralink_pinmux(void)
-+{
-+      const __be32 *wdt;
-+      struct device_node *np;
-+      struct property *prop;
-+      const char *uart, *pin;
-+      u32 mode = 0;
-+
-+      np = of_find_compatible_node(NULL, NULL, "ralink,rt3050-sysc");
-+      if (!np)
-+              return;
-+
-+      of_property_for_each_string(np, "ralink,gpiomux", prop, pin) {
-+              int m = ralink_mux_mask(pin, rt_pinmux.mode);
-+              if (m) {
-+                      mode |= m;
-+                      pr_debug("pinmux: registered gpiomux \"%s\"\n", pin);
-+              } else {
-+                      pr_err("pinmux: failed to load \"%s\"\n", pin);
-+              }
-+      }
-+
-+      of_property_for_each_string(np, "ralink,pinmux", prop, pin) {
-+              int m = ralink_mux_mask(pin, rt_pinmux.mode);
-+              if (m) {
-+                      mode &= ~m;
-+                      pr_debug("pinmux: registered pinmux \"%s\"\n", pin);
-+              } else {
-+                      pr_err("pinmux: failed to load group \"%s\"\n", pin);
-+              }
-+      }
-+
-+      of_property_read_string(np, "ralink,uartmux", &uart);
-+      if (uart) {
-+              int m = ralink_mux_mask(uart, rt_pinmux.uart);
-+              mode |= rt_pinmux.uart_mask << rt_pinmux.uart_shift;
-+              if (m) {
-+                      mode &= ~(m << rt_pinmux.uart_shift);
-+                      pr_debug("pinmux: registered uartmux \"%s\"\n", uart);
-+              } else {
-+                      pr_debug("pinmux: registered uartmux \"gpio\"\n");
-+              }
-+      }
-+
-+      wdt = of_get_property(np, "ralink,wdtmux", NULL);
-+      if (wdt && *wdt && rt_pinmux.wdt_reset)
-+              rt_pinmux.wdt_reset();
-+
-+      rt_sysc_w32(mode, SYSC_REG_GPIO_MODE);
-+}
---- a/arch/mips/ralink/rt305x.c
-+++ b/arch/mips/ralink/rt305x.c
-@@ -97,9 +97,6 @@ struct ralink_pinmux_grp uart_mux[] = {
-               .mask = RT305X_GPIO_MODE_GPIO_I2S,
-               .gpio_first = RT305X_GPIO_7,
-               .gpio_last = RT305X_GPIO_14,
--      }, {
--              .name = "gpio",
--              .mask = RT305X_GPIO_MODE_GPIO,
-       }, {0}
- };
-@@ -114,10 +111,11 @@ void rt305x_wdt_reset(void)
-       rt_sysc_w32(t, SYSC_REG_SYSTEM_CONFIG);
- }
--struct ralink_pinmux gpio_pinmux = {
-+struct ralink_pinmux rt_pinmux = {
-       .mode = mode_mux,
-       .uart = uart_mux,
-       .uart_shift = RT305X_GPIO_MODE_UART0_SHIFT,
-+      .uart_mask = RT305X_GPIO_MODE_GPIO,
-       .wdt_reset = rt305x_wdt_reset,
- };
diff --git a/target/linux/ramips/patches-3.8/0105-MIPS-extend-RT3050-dtsi-file.patch b/target/linux/ramips/patches-3.8/0105-MIPS-extend-RT3050-dtsi-file.patch
deleted file mode 100644 (file)
index 01aa70b..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-From 45e797ec7555c50775d9ac7fc7a17a544344aa3f Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 17:47:07 +0100
-Subject: [PATCH 105/121] MIPS: extend RT3050 dtsi file
-
-Add some additional properties to the dtsi file for ethernet and wifi.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/dts/rt3050.dtsi |   96 ++++++++++++++++++++++++++++++++------
- 1 file changed, 81 insertions(+), 15 deletions(-)
-
---- a/arch/mips/ralink/dts/rt3050.dtsi
-+++ b/arch/mips/ralink/dts/rt3050.dtsi
-@@ -1,7 +1,7 @@
- / {
-       #address-cells = <1>;
-       #size-cells = <1>;
--      compatible = "ralink,rt3050-soc", "ralink,rt3052-soc";
-+      compatible = "ralink,rt3050-soc", "ralink,rt3052-soc", "ralink,rt3350-soc";
-       cpus {
-               cpu@0 {
-@@ -23,7 +23,7 @@
-       palmbus@10000000 {
-               compatible = "palmbus";
-               reg = <0x10000000 0x200000>;
--                ranges = <0x0 0x10000000 0x1FFFFF>;
-+              ranges = <0x0 0x10000000 0x1FFFFF>;
-               #address-cells = <1>;
-               #size-cells = <1>;
-@@ -34,8 +34,18 @@
-               };
-               timer@100 {
-+                      compatible = "ralink,rt3052-timer", "ralink,rt2880-timer";
-+                      reg = <0x100 0x20>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <1>;
-+
-+                      status = "disabled";
-+              };
-+
-+              watchdog@120 {
-                       compatible = "ralink,rt3052-wdt", "ralink,rt2880-wdt";
--                      reg = <0x100 0x100>;
-+                      reg = <0x120 0x10>;
-               };
-               intc: intc@200 {
-@@ -61,10 +71,12 @@
-                       gpio-controller;
-                       #gpio-cells = <2>;
--                      ralink,ngpio = <24>;
--                      ralink,regs = [ 00 04 08 0c
--                                      20 24 28 2c
--                                      30 34 ];
-+                      ralink,num-gpios = <24>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              20 24 28 2c
-+                                              30 34 ];
-+
-+                      status = "disabled";
-               };
-               gpio1: gpio@638 {
-@@ -74,10 +86,12 @@
-                       gpio-controller;
-                       #gpio-cells = <2>;
--                      ralink,ngpio = <16>;
--                      ralink,regs = [ 00 04 08 0c
--                                      10 14 18 1c
--                                      20 24 ];
-+                      ralink,num-gpios = <16>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+
-+                      status = "disabled";
-               };
-               gpio2: gpio@660 {
-@@ -87,10 +101,21 @@
-                       gpio-controller;
-                       #gpio-cells = <2>;
--                      ralink,ngpio = <12>;
--                      ralink,regs = [ 00 04 08 0c
--                                      10 14 18 1c
--                                      20 24 ];
-+                      ralink,num-gpios = <12>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              spi@b00 {
-+                      compatible = "ralink,rt3050-spi", "ralink,rt2880-spi";
-+                      reg = <0xb00 0x100>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+
-+                      status = "disabled";
-               };
-               uartlite@c00 {
-@@ -102,5 +127,46 @@
-                       reg-shift = <2>;
-               };
-+
-+      };
-+
-+      ethernet@10100000 {
-+              compatible = "ralink,rt3050-eth";
-+              reg = <0x10100000 10000>;
-+
-+              interrupt-parent = <&cpuintc>;
-+              interrupts = <5>;
-+
-+              status = "disabled";
-+      };
-+
-+      esw@10110000 {
-+              compatible = "ralink,rt3050-esw";
-+              reg = <0x10110000 8000>;
-+
-+              interrupt-parent = <&intc>;
-+              interrupts = <17>;
-+
-+              status = "disabled";
-+      };
-+
-+      wmac@10180000 {
-+              compatible = "ralink,rt3050-wmac", "ralink,rt2880-wmac";
-+              reg = <0x10180000 40000>;
-+
-+              interrupt-parent = <&cpuintc>;
-+              interrupts = <6>;
-+
-+              status = "disabled";
-+      };
-+
-+      otg@101c0000 {
-+              compatible = "ralink,rt3050-otg";
-+              reg = <0x101c0000 40000>;
-+
-+              interrupt-parent = <&intc>;
-+              interrupts = <18>;
-+
-+              status = "disabled";
-       };
- };
diff --git a/target/linux/ramips/patches-3.8/0105-MIPS-ralink-add-RT5350-sdram-register-defines.patch b/target/linux/ramips/patches-3.8/0105-MIPS-ralink-add-RT5350-sdram-register-defines.patch
new file mode 100644 (file)
index 0000000..ccabcbd
--- /dev/null
@@ -0,0 +1,32 @@
+From 31f4b3ca1c9bb4bcbbebbe5db5a33ac82f130d9c Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Mon, 25 Mar 2013 11:19:58 +0100
+Subject: [PATCH 105/137] MIPS: ralink: add RT5350 sdram register defines
+
+Add a few missing defines that are needed to make memory detection work on the
+RT5350.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5169/
+---
+ arch/mips/include/asm/mach-ralink/rt305x.h |    8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/arch/mips/include/asm/mach-ralink/rt305x.h
++++ b/arch/mips/include/asm/mach-ralink/rt305x.h
+@@ -97,6 +97,14 @@ static inline int soc_is_rt5350(void)
+ #define RT5350_SYSCFG0_CPUCLK_320     0x2
+ #define RT5350_SYSCFG0_CPUCLK_300     0x3
++#define RT5350_SYSCFG0_DRAM_SIZE_SHIFT  12
++#define RT5350_SYSCFG0_DRAM_SIZE_MASK   7
++#define RT5350_SYSCFG0_DRAM_SIZE_2M     0
++#define RT5350_SYSCFG0_DRAM_SIZE_8M     1
++#define RT5350_SYSCFG0_DRAM_SIZE_16M    2
++#define RT5350_SYSCFG0_DRAM_SIZE_32M    3
++#define RT5350_SYSCFG0_DRAM_SIZE_64M    4
++
+ /* multi function gpio pins */
+ #define RT305X_GPIO_I2C_SD            1
+ #define RT305X_GPIO_I2C_SCLK          2
diff --git a/target/linux/ramips/patches-3.8/0106-MIPS-add-RT5350-dtsi-file.patch b/target/linux/ramips/patches-3.8/0106-MIPS-add-RT5350-dtsi-file.patch
deleted file mode 100644 (file)
index ee3c851..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-From 1238d973f3828a65ccf9aead437b4e04925b100e Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 17:47:24 +0100
-Subject: [PATCH 106/121] MIPS: add RT5350 dtsi file
-
-Add a dtsi file for RT5350 Soc. This SoC is almost the same as RT3050 but has
-OHCI/EHCI in favour of the Synopsis DWC2 core.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/dts/rt5350.dtsi |  181 ++++++++++++++++++++++++++++++++++++++
- 1 file changed, 181 insertions(+)
- create mode 100644 arch/mips/ralink/dts/rt5350.dtsi
-
---- /dev/null
-+++ b/arch/mips/ralink/dts/rt5350.dtsi
-@@ -0,0 +1,181 @@
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      compatible = "ralink,rt5350-soc";
-+
-+      cpus {
-+              cpu@0 {
-+                      compatible = "mips,mips24KEc";
-+              };
-+      };
-+
-+      chosen {
-+              bootargs = "console=ttyS0,57600 init=/init";
-+      };
-+
-+      cpuintc: cpuintc@0 {
-+              #address-cells = <0>;
-+              #interrupt-cells = <1>;
-+              interrupt-controller;
-+              compatible = "mti,cpu-interrupt-controller";
-+      };
-+
-+      palmbus@10000000 {
-+              compatible = "palmbus";
-+              reg = <0x10000000 0x200000>;
-+              ranges = <0x0 0x10000000 0x1FFFFF>;
-+
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+
-+              sysc@0 {
-+                      compatible = "ralink,rt5350-sysc", "ralink,rt3050-sysc";
-+                      reg = <0x0 0x100>;
-+              };
-+
-+              timer@100 {
-+                      compatible = "ralink,rt5350-timer", "ralink,rt2880-timer";
-+                      reg = <0x100 0x20>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <1>;
-+
-+                      status = "disabled";
-+              };
-+
-+              watchdog@120 {
-+                      compatible = "ralink,rt5350-wdt", "ralink,rt2880-wdt";
-+                      reg = <0x120 0x10>;
-+              };
-+
-+              intc: intc@200 {
-+                      compatible = "ralink,rt5350-intc", "ralink,rt2880-intc";
-+                      reg = <0x200 0x100>;
-+
-+                      interrupt-controller;
-+                      #interrupt-cells = <1>;
-+
-+                      interrupt-parent = <&cpuintc>;
-+                      interrupts = <2>;
-+              };
-+
-+              memc@300 {
-+                      compatible = "ralink,rt5350-memc", "ralink,rt3050-memc";
-+                      reg = <0x300 0x100>;
-+              };
-+
-+              gpio0: gpio@600 {
-+                      compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x600 0x34>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <24>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              20 24 28 2c
-+                                              30 34 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              gpio1: gpio@638 {
-+                      compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x638 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <16>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              gpio2: gpio@660 {
-+                      compatible = "ralink,rt5350-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x660 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <12>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              spi@b00 {
-+                      compatible = "ralink,rt5350-spi", "ralink,rt2880-spi";
-+                      reg = <0xb00 0x100>;
-+                      #address-cells = <1>;
-+                      #size-cells = <1>;
-+
-+                      status = "disabled";
-+              };
-+
-+              uartlite@c00 {
-+                      compatible = "ralink,rt5350-uart", "ralink,rt2880-uart", "ns16550a";
-+                      reg = <0xc00 0x100>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <12>;
-+
-+                      reg-shift = <2>;
-+              };
-+      };
-+
-+      ethernet@10100000 {
-+              compatible = "ralink,rt5350-eth", "ralink,rt3050-eth";
-+              reg = <0x10100000 10000>;
-+
-+              interrupt-parent = <&cpuintc>;
-+              interrupts = <5>;
-+
-+              status = "disabled";
-+      };
-+
-+      esw@10110000 {
-+              compatible = "ralink,rt5350-esw", "ralink,rt3050-esw";
-+              reg = <0x10110000 8000>;
-+
-+              interrupt-parent = <&intc>;
-+              interrupts = <17>;
-+
-+              status = "disabled";
-+      };
-+
-+      wmac@10180000 {
-+              compatible = "ralink,rt5350-wmac", "ralink,rt2880-wmac";
-+              reg = <0x10180000 40000>;
-+
-+              interrupt-parent = <&cpuintc>;
-+              interrupts = <6>;
-+
-+              status = "disabled";
-+      };
-+
-+      ehci@101c0000 {
-+              compatible = "ralink,rt5350-ehci", "ehci-platform";
-+              reg = <0x101c0000 0x1000>;
-+
-+              interrupt-parent = <&intc>;
-+              interrupts = <18>;
-+
-+              status = "disabled";
-+      };
-+
-+      ohci@101c1000 {
-+              compatible = "ralink,rt5350-ohci", "ohci-platform";
-+              reg = <0x101c1000 0x1000>;
-+
-+              interrupt-parent = <&intc>;
-+              interrupts = <18>;
-+
-+              status = "disabled";
-+      };
-+};
diff --git a/target/linux/ramips/patches-3.8/0106-MIPS-ralink-make-early_printk-work-on-RT2880.patch b/target/linux/ramips/patches-3.8/0106-MIPS-ralink-make-early_printk-work-on-RT2880.patch
new file mode 100644 (file)
index 0000000..4636862
--- /dev/null
@@ -0,0 +1,28 @@
+From d83e83a544258b68b4411232a31ccce134244a19 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Tue, 9 Apr 2013 18:31:15 +0200
+Subject: [PATCH 106/137] MIPS: ralink: make early_printk work on RT2880
+
+RT2880 has a different location for the early serial port.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5170/
+---
+ arch/mips/ralink/early_printk.c |    4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- a/arch/mips/ralink/early_printk.c
++++ b/arch/mips/ralink/early_printk.c
+@@ -11,7 +11,11 @@
+ #include <asm/addrspace.h>
++#ifdef CONFIG_SOC_RT288X
++#define EARLY_UART_BASE         0x300c00
++#else
+ #define EARLY_UART_BASE         0x10000c00
++#endif
+ #define UART_REG_RX             0x00
+ #define UART_REG_TX             0x04
diff --git a/target/linux/ramips/patches-3.8/0107-MIPS-ralink-adds-support-for-RT2880-SoC-family.patch b/target/linux/ramips/patches-3.8/0107-MIPS-ralink-adds-support-for-RT2880-SoC-family.patch
deleted file mode 100644 (file)
index 592f2af..0000000
+++ /dev/null
@@ -1,266 +0,0 @@
-From c4429f19cc66951962c171dba90b8747f95a654e Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Sun, 27 Jan 2013 09:17:20 +0100
-Subject: [PATCH V2 09/16] MIPS: ralink: adds support for RT2880 SoC family
-
-Add support code for rt2880 SOC.
-
-The code detects the SoC and registers the clk / pinmux settings.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/Kconfig                          |    2 +-
- arch/mips/include/asm/mach-ralink/rt288x.h |   49 ++++++++++
- arch/mips/ralink/Kconfig                   |    3 +
- arch/mips/ralink/Makefile                  |    1 +
- arch/mips/ralink/Platform                  |    5 +
- arch/mips/ralink/rt288x.c                  |  143 ++++++++++++++++++++++++++++
- 6 files changed, 202 insertions(+), 1 deletion(-)
- create mode 100644 arch/mips/include/asm/mach-ralink/rt288x.h
- create mode 100644 arch/mips/ralink/rt288x.c
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -1189,7 +1189,7 @@ config BOOT_ELF32
- config MIPS_L1_CACHE_SHIFT
-       int
--      default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL
-+      default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL || SOC_RT288X
-       default "6" if MIPS_CPU_SCACHE
-       default "7" if SGI_IP22 || SGI_IP27 || SGI_IP28 || SNI_RM || CPU_CAVIUM_OCTEON
-       default "5"
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ralink/rt288x.h
-@@ -0,0 +1,49 @@
-+/*
-+ * 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.
-+ *
-+ * Parts of this file are based on Ralink's 2.6.21 BSP
-+ *
-+ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
-+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#ifndef _RT288X_REGS_H_
-+#define _RT288X_REGS_H_
-+
-+#define RT2880_SYSC_BASE              0x00300000
-+
-+#define SYSC_REG_CHIP_NAME0           0x00
-+#define SYSC_REG_CHIP_NAME1           0x04
-+#define SYSC_REG_CHIP_ID              0x0c
-+#define SYSC_REG_SYSTEM_CONFIG                0x10
-+#define SYSC_REG_CLKCFG                       0x30
-+
-+#define RT2880_CHIP_NAME0             0x38325452
-+#define RT2880_CHIP_NAME1             0x20203038
-+
-+#define CHIP_ID_ID_MASK                       0xff
-+#define CHIP_ID_ID_SHIFT              8
-+#define CHIP_ID_REV_MASK              0xff
-+
-+#define SYSTEM_CONFIG_CPUCLK_SHIFT    20
-+#define SYSTEM_CONFIG_CPUCLK_MASK     0x3
-+#define SYSTEM_CONFIG_CPUCLK_250      0x0
-+#define SYSTEM_CONFIG_CPUCLK_266      0x1
-+#define SYSTEM_CONFIG_CPUCLK_280      0x2
-+#define SYSTEM_CONFIG_CPUCLK_300      0x3
-+
-+#define RT2880_GPIO_MODE_I2C          BIT(0)
-+#define RT2880_GPIO_MODE_UART0                BIT(1)
-+#define RT2880_GPIO_MODE_SPI          BIT(2)
-+#define RT2880_GPIO_MODE_UART1                BIT(3)
-+#define RT2880_GPIO_MODE_JTAG         BIT(4)
-+#define RT2880_GPIO_MODE_MDIO         BIT(5)
-+#define RT2880_GPIO_MODE_SDRAM                BIT(6)
-+#define RT2880_GPIO_MODE_PCI          BIT(7)
-+
-+#define CLKCFG_SRAM_CS_N_WDT          BIT(9)
-+
-+#endif
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -6,6 +6,9 @@ choice
-       help
-         Select Ralink MIPS SoC type.
-+      config SOC_RT288X
-+              bool "RT288x"
-+
-       config SOC_RT305X
-               bool "RT305x"
-               select USB_ARCH_HAS_HCD
---- a/arch/mips/ralink/Makefile
-+++ b/arch/mips/ralink/Makefile
-@@ -8,6 +8,7 @@
- obj-y := prom.o of.o reset.o clk.o irq.o pinmux.o
-+obj-$(CONFIG_SOC_RT288X) += rt288x.o
- obj-$(CONFIG_SOC_RT305X) += rt305x.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
---- a/arch/mips/ralink/Platform
-+++ b/arch/mips/ralink/Platform
-@@ -5,6 +5,11 @@ core-$(CONFIG_RALINK)         += arch/mips/rali
- cflags-$(CONFIG_RALINK)               += -I$(srctree)/arch/mips/include/asm/mach-ralink
- #
-+# Ralink RT288x
-+#
-+load-$(CONFIG_SOC_RT288X)     += 0xffffffff88000000
-+
-+#
- # Ralink RT305x
- #
- load-$(CONFIG_SOC_RT305X)     += 0xffffffff80000000
---- /dev/null
-+++ b/arch/mips/ralink/rt288x.c
-@@ -0,0 +1,143 @@
-+/*
-+ * 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.
-+ *
-+ * Parts of this file are based on Ralink's 2.6.21 BSP
-+ *
-+ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
-+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+
-+#include <asm/mipsregs.h>
-+#include <asm/mach-ralink/ralink_regs.h>
-+#include <asm/mach-ralink/rt288x.h>
-+
-+#include "common.h"
-+
-+struct ralink_pinmux_grp mode_mux[] = {
-+      {
-+              .name = "i2c",
-+              .mask = RT2880_GPIO_MODE_I2C,
-+              .gpio_first = 1,
-+              .gpio_last = 2,
-+      }, {
-+              .name = "spi",
-+              .mask = RT2880_GPIO_MODE_SPI,
-+              .gpio_first = 3,
-+              .gpio_last = 6,
-+      }, {
-+              .name = "uartlite",
-+              .mask = RT2880_GPIO_MODE_UART0,
-+              .gpio_first = 7,
-+              .gpio_last = 14,
-+      }, {
-+              .name = "jtag",
-+              .mask = RT2880_GPIO_MODE_JTAG,
-+              .gpio_first = 17,
-+              .gpio_last = 21,
-+      }, {
-+              .name = "mdio",
-+              .mask = RT2880_GPIO_MODE_MDIO,
-+              .gpio_first = 22,
-+              .gpio_last = 23,
-+      }, {
-+              .name = "sdram",
-+              .mask = RT2880_GPIO_MODE_SDRAM,
-+              .gpio_first = 24,
-+              .gpio_last = 39,
-+      }, {
-+              .name = "pci",
-+              .mask = RT2880_GPIO_MODE_PCI,
-+              .gpio_first = 40,
-+              .gpio_last = 71,
-+      }, {0}
-+};
-+
-+void rt288x_wdt_reset(void)
-+{
-+      u32 t;
-+
-+      /* enable WDT reset output on pin SRAM_CS_N */
-+      t = rt_sysc_r32(SYSC_REG_CLKCFG);
-+      t |= CLKCFG_SRAM_CS_N_WDT;
-+      rt_sysc_w32(t, SYSC_REG_CLKCFG);
-+}
-+
-+struct ralink_pinmux rt_pinmux = {
-+      .mode = mode_mux,
-+      .wdt_reset = rt288x_wdt_reset,
-+};
-+
-+void ralink_usb_platform(void)
-+{
-+}
-+
-+void __init ralink_clk_init(void)
-+{
-+      unsigned long cpu_rate;
-+      u32 t = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG);
-+      t = ((t >> SYSTEM_CONFIG_CPUCLK_SHIFT) & SYSTEM_CONFIG_CPUCLK_MASK);
-+
-+      switch (t) {
-+      case SYSTEM_CONFIG_CPUCLK_250:
-+              cpu_rate = 250000000;
-+              break;
-+      case SYSTEM_CONFIG_CPUCLK_266:
-+              cpu_rate = 266666667;
-+              break;
-+      case SYSTEM_CONFIG_CPUCLK_280:
-+              cpu_rate = 280000000;
-+              break;
-+      case SYSTEM_CONFIG_CPUCLK_300:
-+              cpu_rate = 300000000;
-+              break;
-+      }
-+
-+      ralink_clk_add("cpu", cpu_rate);
-+      ralink_clk_add("300100.timer", cpu_rate / 2);
-+      ralink_clk_add("300120.watchdog", cpu_rate / 2);
-+      ralink_clk_add("300500.uart", cpu_rate / 2);
-+      ralink_clk_add("300c00.uartlite", cpu_rate / 2);
-+      ralink_clk_add("400000.ethernet", cpu_rate / 2);
-+}
-+
-+void __init ralink_of_remap(void)
-+{
-+      rt_sysc_membase = plat_of_remap_node("ralink,rt2880-sysc");
-+      rt_memc_membase = plat_of_remap_node("ralink,rt2880-memc");
-+
-+      if (!rt_sysc_membase || !rt_memc_membase)
-+              panic("Failed to remap core resources");
-+}
-+
-+void prom_soc_init(struct ralink_soc_info *soc_info)
-+{
-+      void __iomem *sysc = (void __iomem *) KSEG1ADDR(RT2880_SYSC_BASE);
-+      const char *name;
-+      u32 n0;
-+      u32 n1;
-+      u32 id;
-+
-+      n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
-+      n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
-+      id = __raw_readl(sysc + SYSC_REG_CHIP_ID);
-+
-+      if (n0 == RT2880_CHIP_NAME0 && n1 == RT2880_CHIP_NAME1) {
-+              soc_info->compatible = "ralink,r2880-soc";
-+              name = "RT2880";
-+      } else {
-+              panic("rt288x: unknown SoC, n0:%08x n1:%08x", n0, n1);
-+      }
-+
-+      snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
-+              "Ralink %s id:%u rev:%u",
-+              name,
-+              (id >> CHIP_ID_ID_SHIFT) & CHIP_ID_ID_MASK,
-+              (id & CHIP_ID_REV_MASK));
-+}
diff --git a/target/linux/ramips/patches-3.8/0107-MIPS-ralink-rename-gpio_pinmux-to-rt_gpio_pinmux.patch b/target/linux/ramips/patches-3.8/0107-MIPS-ralink-rename-gpio_pinmux-to-rt_gpio_pinmux.patch
new file mode 100644 (file)
index 0000000..d10b159
--- /dev/null
@@ -0,0 +1,36 @@
+From b4c597bd073d5e4c9cee800ac5a25fb9ff1c0ef7 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 12 Apr 2013 22:12:09 +0200
+Subject: [PATCH 107/137] MIPS: ralink: rename gpio_pinmux to rt_gpio_pinmux
+
+Add proper namespacing to the variable.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5171/
+---
+ arch/mips/ralink/common.h |    2 +-
+ arch/mips/ralink/rt305x.c |    2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/arch/mips/ralink/common.h
++++ b/arch/mips/ralink/common.h
+@@ -24,7 +24,7 @@ struct ralink_pinmux {
+       int uart_shift;
+       void (*wdt_reset)(void);
+ };
+-extern struct ralink_pinmux gpio_pinmux;
++extern struct ralink_pinmux rt_gpio_pinmux;
+ struct ralink_soc_info {
+       unsigned char sys_type[RAMIPS_SYS_TYPE_LEN];
+--- a/arch/mips/ralink/rt305x.c
++++ b/arch/mips/ralink/rt305x.c
+@@ -114,7 +114,7 @@ void rt305x_wdt_reset(void)
+       rt_sysc_w32(t, SYSC_REG_SYSTEM_CONFIG);
+ }
+-struct ralink_pinmux gpio_pinmux = {
++struct ralink_pinmux rt_gpio_pinmux = {
+       .mode = mode_mux,
+       .uart = uart_mux,
+       .uart_shift = RT305X_GPIO_MODE_UART0_SHIFT,
diff --git a/target/linux/ramips/patches-3.8/0108-MIPS-add-rt2880-dts-files.patch b/target/linux/ramips/patches-3.8/0108-MIPS-add-rt2880-dts-files.patch
deleted file mode 100644 (file)
index f0a39ce..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-From b72ae753b73cbc4b488dcdbf997faec199c8bb3f Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 18:29:02 +0100
-Subject: [PATCH 108/121] MIPS: add rt2880 dts files
-
-Add a dtsi file for RT2880 SoC and a sample dts file. This SoC is first one that
-was released in this SoC family.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/Kconfig             |    4 ++
- arch/mips/ralink/dts/Makefile        |    1 +
- arch/mips/ralink/dts/rt2880.dtsi     |  116 ++++++++++++++++++++++++++++++++++
- arch/mips/ralink/dts/rt2880_eval.dts |   52 +++++++++++++++
- 4 files changed, 173 insertions(+)
- create mode 100644 arch/mips/ralink/dts/rt2880.dtsi
- create mode 100644 arch/mips/ralink/dts/rt2880_eval.dts
-
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -26,6 +26,10 @@ choice
-       config DTB_RT_NONE
-               bool "None"
-+      config DTB_RT2880_EVAL
-+              bool "RT2880 eval kit"
-+              depends on SOC_RT288X
-+
-       config DTB_RT305X_EVAL
-               bool "RT305x eval kit"
-               depends on SOC_RT305X
---- a/arch/mips/ralink/dts/Makefile
-+++ b/arch/mips/ralink/dts/Makefile
-@@ -1 +1,2 @@
-+obj-$(CONFIG_DTB_RT2880_EVAL) := rt2880_eval.dtb.o
- obj-$(CONFIG_DTB_RT305X_EVAL) := rt3052_eval.dtb.o
---- /dev/null
-+++ b/arch/mips/ralink/dts/rt2880.dtsi
-@@ -0,0 +1,116 @@
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      compatible = "ralink,rt2880-soc";
-+
-+      cpus {
-+              cpu@0 {
-+                      compatible = "mips,mips24KEc";
-+              };
-+      };
-+
-+      chosen {
-+              bootargs = "console=ttyS0,57600 init=/init";
-+      };
-+
-+      cpuintc: cpuintc@0 {
-+              #address-cells = <0>;
-+              #interrupt-cells = <1>;
-+              interrupt-controller;
-+              compatible = "mti,cpu-interrupt-controller";
-+      };
-+
-+      palmbus@10000000 {
-+              compatible = "palmbus";
-+              reg = <0x10000000 0x200000>;
-+                ranges = <0x0 0x10000000 0x1FFFFF>;
-+
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+
-+              sysc@300000 {
-+                      compatible = "ralink,rt2880-sysc";
-+                      reg = <0x300000 0x100>;
-+              };
-+
-+              timer@300100 {
-+                      compatible = "ralink,rt2880-timer";
-+                      reg = <0x300100 0x20>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <1>;
-+
-+                      status = "disabled";
-+              };
-+
-+              watchdog@300120 {
-+                      compatible = "ralink,rt2880-wdt";
-+                      reg = <0x300120 0x10>;
-+              };
-+
-+              intc: intc@300200 {
-+                      compatible = "ralink,rt2880-intc";
-+                      reg = <0x300200 0x100>;
-+
-+                      interrupt-controller;
-+                      #interrupt-cells = <1>;
-+
-+                      interrupt-parent = <&cpuintc>;
-+                      interrupts = <2>;
-+              };
-+
-+              memc@300300 {
-+                      compatible = "ralink,rt2880-memc";
-+                      reg = <0x300300 0x100>;
-+              };
-+
-+              gpio0: gpio@300600 {
-+                      compatible = "ralink,rt2880-gpio";
-+                      reg = <0x300600 0x34>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <24>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              20 24 28 2c
-+                                              30 34 ];
-+              };
-+
-+              gpio1: gpio@300638 {
-+                      compatible = "ralink,rt2880-gpio";
-+                      reg = <0x300638 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <16>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+              };
-+
-+              gpio2: gpio@300660 {
-+                      compatible = "ralink,rt2880-gpio";
-+                      reg = <0x300660 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <32>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+              };
-+
-+              uartlite@300c00 {
-+                      compatible = "ralink,rt2880-uart", "ns16550a";
-+                      reg = <0x300c00 0x100>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <12>;
-+
-+                      reg-shift = <2>;
-+              };
-+      };
-+};
---- /dev/null
-+++ b/arch/mips/ralink/dts/rt2880_eval.dts
-@@ -0,0 +1,52 @@
-+/dts-v1/;
-+
-+/include/ "rt2880.dtsi"
-+
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      compatible = "ralink,rt2880-eval-board", "ralink,rt2880-soc";
-+      model = "Ralink RT2880 evaluation board";
-+
-+      memory@8000000 {
-+              reg = <0x0 0x2000000>;
-+      };
-+
-+      palmbus@10000000 {
-+              sysc@300000 {
-+                      ralink,pinmux = "uartlite", "spi";
-+                      ralink,uartmux = "gpio";
-+                      ralink,wdtmux = <0>;
-+              };
-+      };
-+
-+      cfi@1f000000 {
-+              compatible = "cfi-flash";
-+              reg = <0x1f000000 0x800000>;
-+
-+              bank-width = <2>;
-+              device-width = <2>;
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+
-+              partition@0 {
-+                      label = "uboot";
-+                      reg = <0x0 0x30000>;
-+                      read-only;
-+              };
-+              partition@30000 {
-+                      label = "uboot-env";
-+                      reg = <0x30000 0x10000>;
-+                      read-only;
-+              };
-+              partition@40000 {
-+                      label = "calibration";
-+                      reg = <0x40000 0x10000>;
-+                      read-only;
-+              };
-+              partition@50000 {
-+                      label = "linux";
-+                      reg = <0x50000 0x7b0000>;
-+              };
-+      };
-+};
diff --git a/target/linux/ramips/patches-3.8/0108-MIPS-ralink-make-the-RT305x-pinmuxing-structure-stat.patch b/target/linux/ramips/patches-3.8/0108-MIPS-ralink-make-the-RT305x-pinmuxing-structure-stat.patch
new file mode 100644 (file)
index 0000000..f09d57f
--- /dev/null
@@ -0,0 +1,44 @@
+From 96eba63bf18cd3d96ded62fb809c8cf7e0f2e2c1 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 12 Apr 2013 22:16:12 +0200
+Subject: [PATCH 108/137] MIPS: ralink: make the RT305x pinmuxing structure
+ static
+
+These structures are exported via struct ralink_pinmux rt_gpio_pinmux and can
+hence be static.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5172/
+---
+ arch/mips/ralink/rt305x.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/arch/mips/ralink/rt305x.c
++++ b/arch/mips/ralink/rt305x.c
+@@ -22,7 +22,7 @@
+ enum rt305x_soc_type rt305x_soc;
+-struct ralink_pinmux_grp mode_mux[] = {
++static struct ralink_pinmux_grp mode_mux[] = {
+       {
+               .name = "i2c",
+               .mask = RT305X_GPIO_MODE_I2C,
+@@ -61,7 +61,7 @@ struct ralink_pinmux_grp mode_mux[] = {
+       }, {0}
+ };
+-struct ralink_pinmux_grp uart_mux[] = {
++static struct ralink_pinmux_grp uart_mux[] = {
+       {
+               .name = "uartf",
+               .mask = RT305X_GPIO_MODE_UARTF,
+@@ -103,7 +103,7 @@ struct ralink_pinmux_grp uart_mux[] = {
+       }, {0}
+ };
+-void rt305x_wdt_reset(void)
++static void rt305x_wdt_reset(void)
+ {
+       u32 t;
diff --git a/target/linux/ramips/patches-3.8/0109-MIPS-ralink-add-pci-group-to-struct-ralink_pinmux.patch b/target/linux/ramips/patches-3.8/0109-MIPS-ralink-add-pci-group-to-struct-ralink_pinmux.patch
new file mode 100644 (file)
index 0000000..36e187d
--- /dev/null
@@ -0,0 +1,26 @@
+From 61d50d9625dcb454759950ebd45a335c3aaacf84 Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Fri, 12 Apr 2013 12:40:23 +0200
+Subject: [PATCH 109/137] MIPS: ralink: add pci group to struct ralink_pinmux
+
+This will be used for RT3662/RT3883.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Acked-by: John Crispin <blogic@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5173/
+---
+ arch/mips/ralink/common.h |    3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/arch/mips/ralink/common.h
++++ b/arch/mips/ralink/common.h
+@@ -23,6 +23,9 @@ struct ralink_pinmux {
+       struct ralink_pinmux_grp *uart;
+       int uart_shift;
+       void (*wdt_reset)(void);
++      struct ralink_pinmux_grp *pci;
++      int pci_shift;
++      u32 pci_mask;
+ };
+ extern struct ralink_pinmux rt_gpio_pinmux;
diff --git a/target/linux/ramips/patches-3.8/0109-MIPS-ralink-adds-support-for-RT3883-SoC-family.patch b/target/linux/ramips/patches-3.8/0109-MIPS-ralink-adds-support-for-RT3883-SoC-family.patch
deleted file mode 100644 (file)
index 3d822f4..0000000
+++ /dev/null
@@ -1,515 +0,0 @@
-From 45a8644332a85e8b099df9d467a719ded741e749 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Sun, 27 Jan 2013 09:39:02 +0100
-Subject: [PATCH 109/121] MIPS: ralink: adds support for RT3883 SoC family
-
-Add support code for rt3883 SOC.
-
-The code detects the SoC and registers the clk / pinmux settings.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/include/asm/mach-ralink/rt3883.h |  247 ++++++++++++++++++++++++++++
- arch/mips/ralink/Kconfig                   |    5 +
- arch/mips/ralink/Makefile                  |    1 +
- arch/mips/ralink/Platform                  |    5 +
- arch/mips/ralink/rt3883.c                  |  207 +++++++++++++++++++++++
- 5 files changed, 465 insertions(+)
- create mode 100644 arch/mips/include/asm/mach-ralink/rt3883.h
- create mode 100644 arch/mips/ralink/rt3883.c
-
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ralink/rt3883.h
-@@ -0,0 +1,247 @@
-+/*
-+ * Ralink RT3662/RT3883 SoC register definitions
-+ *
-+ * Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation.
-+ */
-+
-+#ifndef _RT3883_REGS_H_
-+#define _RT3883_REGS_H_
-+
-+#include <linux/bitops.h>
-+
-+#define RT3883_SDRAM_BASE     0x00000000
-+#define RT3883_SYSC_BASE      0x10000000
-+#define RT3883_TIMER_BASE     0x10000100
-+#define RT3883_INTC_BASE      0x10000200
-+#define RT3883_MEMC_BASE      0x10000300
-+#define RT3883_UART0_BASE     0x10000500
-+#define RT3883_PIO_BASE               0x10000600
-+#define RT3883_FSCC_BASE      0x10000700
-+#define RT3883_NANDC_BASE     0x10000810
-+#define RT3883_I2C_BASE               0x10000900
-+#define RT3883_I2S_BASE               0x10000a00
-+#define RT3883_SPI_BASE               0x10000b00
-+#define RT3883_UART1_BASE     0x10000c00
-+#define RT3883_PCM_BASE               0x10002000
-+#define RT3883_GDMA_BASE      0x10002800
-+#define RT3883_CODEC1_BASE    0x10003000
-+#define RT3883_CODEC2_BASE    0x10003800
-+#define RT3883_FE_BASE                0x10100000
-+#define RT3883_ROM_BASE               0x10118000
-+#define RT3883_USBDEV_BASE    0x10112000
-+#define RT3883_PCI_BASE               0x10140000
-+#define RT3883_WLAN_BASE      0x10180000
-+#define RT3883_USBHOST_BASE   0x101c0000
-+#define RT3883_BOOT_BASE      0x1c000000
-+#define RT3883_SRAM_BASE      0x1e000000
-+#define RT3883_PCIMEM_BASE    0x20000000
-+
-+#define RT3883_EHCI_BASE      (RT3883_USBHOST_BASE)
-+#define RT3883_OHCI_BASE      (RT3883_USBHOST_BASE + 0x1000)
-+
-+#define RT3883_SYSC_SIZE      0x100
-+#define RT3883_TIMER_SIZE     0x100
-+#define RT3883_INTC_SIZE      0x100
-+#define RT3883_MEMC_SIZE      0x100
-+#define RT3883_UART0_SIZE     0x100
-+#define RT3883_UART1_SIZE     0x100
-+#define RT3883_PIO_SIZE               0x100
-+#define RT3883_FSCC_SIZE      0x100
-+#define RT3883_NANDC_SIZE     0x0f0
-+#define RT3883_I2C_SIZE               0x100
-+#define RT3883_I2S_SIZE               0x100
-+#define RT3883_SPI_SIZE               0x100
-+#define RT3883_PCM_SIZE               0x800
-+#define RT3883_GDMA_SIZE      0x800
-+#define RT3883_CODEC1_SIZE    0x800
-+#define RT3883_CODEC2_SIZE    0x800
-+#define RT3883_FE_SIZE                0x10000
-+#define RT3883_ROM_SIZE               0x4000
-+#define RT3883_USBDEV_SIZE    0x4000
-+#define RT3883_PCI_SIZE               0x40000
-+#define RT3883_WLAN_SIZE      0x40000
-+#define RT3883_USBHOST_SIZE   0x40000
-+#define RT3883_BOOT_SIZE      (32 * 1024 * 1024)
-+#define RT3883_SRAM_SIZE      (32 * 1024 * 1024)
-+
-+/* SYSC registers */
-+#define RT3883_SYSC_REG_CHIPID0_3     0x00    /* Chip ID 0 */
-+#define RT3883_SYSC_REG_CHIPID4_7     0x04    /* Chip ID 1 */
-+#define RT3883_SYSC_REG_REVID         0x0c    /* Chip Revision Identification */
-+#define RT3883_SYSC_REG_SYSCFG0               0x10    /* System Configuration 0 */
-+#define RT3883_SYSC_REG_SYSCFG1               0x14    /* System Configuration 1 */
-+#define RT3883_SYSC_REG_CLKCFG0               0x2c    /* Clock Configuration 0 */
-+#define RT3883_SYSC_REG_CLKCFG1               0x30    /* Clock Configuration 1 */
-+#define RT3883_SYSC_REG_RSTCTRL               0x34    /* Reset Control*/
-+#define RT3883_SYSC_REG_RSTSTAT               0x38    /* Reset Status*/
-+#define RT3883_SYSC_REG_USB_PS                0x5c    /* USB Power saving control */
-+#define RT3883_SYSC_REG_GPIO_MODE     0x60    /* GPIO Purpose Select */
-+#define RT3883_SYSC_REG_PCIE_CLK_GEN0 0x7c
-+#define RT3883_SYSC_REG_PCIE_CLK_GEN1 0x80
-+#define RT3883_SYSC_REG_PCIE_CLK_GEN2 0x84
-+#define RT3883_SYSC_REG_PMU           0x88
-+#define RT3883_SYSC_REG_PMU1          0x8c
-+
-+#define RT3883_CHIP_NAME0             0x38335452
-+#define RT3883_CHIP_NAME1             0x20203338
-+
-+#define RT3883_REVID_VER_ID_MASK      0x0f
-+#define RT3883_REVID_VER_ID_SHIFT     8
-+#define RT3883_REVID_ECO_ID_MASK      0x0f
-+
-+#define RT3883_SYSCFG0_DRAM_TYPE_DDR2 BIT(17)
-+#define RT3883_SYSCFG0_CPUCLK_SHIFT   8
-+#define RT3883_SYSCFG0_CPUCLK_MASK    0x3
-+#define RT3883_SYSCFG0_CPUCLK_250     0x0
-+#define RT3883_SYSCFG0_CPUCLK_384     0x1
-+#define RT3883_SYSCFG0_CPUCLK_480     0x2
-+#define RT3883_SYSCFG0_CPUCLK_500     0x3
-+
-+#define RT3883_SYSCFG1_USB0_HOST_MODE BIT(10)
-+#define RT3883_SYSCFG1_PCIE_RC_MODE   BIT(8)
-+#define RT3883_SYSCFG1_PCI_HOST_MODE  BIT(7)
-+#define RT3883_SYSCFG1_PCI_66M_MODE   BIT(6)
-+#define RT3883_SYSCFG1_GPIO2_AS_WDT_OUT       BIT(2)
-+
-+#define RT3883_CLKCFG1_PCIE_CLK_EN    BIT(21)
-+#define RT3883_CLKCFG1_UPHY1_CLK_EN   BIT(20)
-+#define RT3883_CLKCFG1_PCI_CLK_EN     BIT(19)
-+#define RT3883_CLKCFG1_UPHY0_CLK_EN   BIT(18)
-+
-+#define RT3883_GPIO_MODE_I2C          BIT(0)
-+#define RT3883_GPIO_MODE_SPI          BIT(1)
-+#define RT3883_GPIO_MODE_UART0_SHIFT  2
-+#define RT3883_GPIO_MODE_UART0_MASK   0x7
-+#define RT3883_GPIO_MODE_UART0(x)     ((x) << RT3883_GPIO_MODE_UART0_SHIFT)
-+#define RT3883_GPIO_MODE_UARTF                0x0
-+#define RT3883_GPIO_MODE_PCM_UARTF    0x1
-+#define RT3883_GPIO_MODE_PCM_I2S      0x2
-+#define RT3883_GPIO_MODE_I2S_UARTF    0x3
-+#define RT3883_GPIO_MODE_PCM_GPIO     0x4
-+#define RT3883_GPIO_MODE_GPIO_UARTF   0x5
-+#define RT3883_GPIO_MODE_GPIO_I2S     0x6
-+#define RT3883_GPIO_MODE_GPIO         0x7
-+#define RT3883_GPIO_MODE_UART1                BIT(5)
-+#define RT3883_GPIO_MODE_JTAG         BIT(6)
-+#define RT3883_GPIO_MODE_MDIO         BIT(7)
-+#define RT3883_GPIO_MODE_GE1          BIT(9)
-+#define RT3883_GPIO_MODE_GE2          BIT(10)
-+#define RT3883_GPIO_MODE_PCI_SHIFT    11
-+#define RT3883_GPIO_MODE_PCI_MASK     0x7
-+#define RT3883_GPIO_MODE_PCI          (RT3883_GPIO_MODE_PCI_MASK << RT3883_GPIO_MODE_PCI_SHIFT)
-+#define RT3883_GPIO_MODE_LNA_A_SHIFT  16
-+#define RT3883_GPIO_MODE_LNA_A_MASK   0x3
-+#define _RT3883_GPIO_MODE_LNA_A(_x)   ((_x) << RT3883_GPIO_MODE_LNA_A_SHIFT)
-+#define RT3883_GPIO_MODE_LNA_A_GPIO   0x3
-+#define RT3883_GPIO_MODE_LNA_A                _RT3883_GPIO_MODE_LNA_A(RT3883_GPIO_MODE_LNA_A_MASK)
-+#define RT3883_GPIO_MODE_LNA_G_SHIFT  18
-+#define RT3883_GPIO_MODE_LNA_G_MASK   0x3
-+#define _RT3883_GPIO_MODE_LNA_G(_x)   ((_x) << RT3883_GPIO_MODE_LNA_G_SHIFT)
-+#define RT3883_GPIO_MODE_LNA_G_GPIO   0x3
-+#define RT3883_GPIO_MODE_LNA_G                _RT3883_GPIO_MODE_LNA_G(RT3883_GPIO_MODE_LNA_G_MASK)
-+
-+#define RT3883_GPIO_I2C_SD            1
-+#define RT3883_GPIO_I2C_SCLK          2
-+#define RT3883_GPIO_SPI_CS0           3
-+#define RT3883_GPIO_SPI_CLK           4
-+#define RT3883_GPIO_SPI_MOSI          5
-+#define RT3883_GPIO_SPI_MISO          6
-+#define RT3883_GPIO_7                 7
-+#define RT3883_GPIO_10                        10
-+#define RT3883_GPIO_14                        14
-+#define RT3883_GPIO_UART1_TXD         15
-+#define RT3883_GPIO_UART1_RXD         16
-+#define RT3883_GPIO_JTAG_TDO          17
-+#define RT3883_GPIO_JTAG_TDI          18
-+#define RT3883_GPIO_JTAG_TMS          19
-+#define RT3883_GPIO_JTAG_TCLK         20
-+#define RT3883_GPIO_JTAG_TRST_N               21
-+#define RT3883_GPIO_MDIO_MDC          22
-+#define RT3883_GPIO_MDIO_MDIO         23
-+#define RT3883_GPIO_LNA_PE_A0         32
-+#define RT3883_GPIO_LNA_PE_A1         33
-+#define RT3883_GPIO_LNA_PE_A2         34
-+#define RT3883_GPIO_LNA_PE_G0         35
-+#define RT3883_GPIO_LNA_PE_G1         36
-+#define RT3883_GPIO_LNA_PE_G2         37
-+#define RT3883_GPIO_PCI_AD0           40
-+#define RT3883_GPIO_PCI_AD31          71
-+#define RT3883_GPIO_GE2_TXD0          72
-+#define RT3883_GPIO_GE2_TXD1          73
-+#define RT3883_GPIO_GE2_TXD2          74
-+#define RT3883_GPIO_GE2_TXD3          75
-+#define RT3883_GPIO_GE2_TXEN          76
-+#define RT3883_GPIO_GE2_TXCLK         77
-+#define RT3883_GPIO_GE2_RXD0          78
-+#define RT3883_GPIO_GE2_RXD1          79
-+#define RT3883_GPIO_GE2_RXD2          80
-+#define RT3883_GPIO_GE2_RXD3          81
-+#define RT3883_GPIO_GE2_RXDV          82
-+#define RT3883_GPIO_GE2_RXCLK         83
-+#define RT3883_GPIO_GE1_TXD0          84
-+#define RT3883_GPIO_GE1_TXD1          85
-+#define RT3883_GPIO_GE1_TXD2          86
-+#define RT3883_GPIO_GE1_TXD3          87
-+#define RT3883_GPIO_GE1_TXEN          88
-+#define RT3883_GPIO_GE1_TXCLK         89
-+#define RT3883_GPIO_GE1_RXD0          90
-+#define RT3883_GPIO_GE1_RXD1          91
-+#define RT3883_GPIO_GE1_RXD2          92
-+#define RT3883_GPIO_GE1_RXD3          93
-+#define RT3883_GPIO_GE1_RXDV          94
-+#define RT3883_GPIO_GE1_RXCLK 95
-+
-+#define RT3883_RSTCTRL_PCIE_PCI_PDM   BIT(27)
-+#define RT3883_RSTCTRL_FLASH          BIT(26)
-+#define RT3883_RSTCTRL_UDEV           BIT(25)
-+#define RT3883_RSTCTRL_PCI            BIT(24)
-+#define RT3883_RSTCTRL_PCIE           BIT(23)
-+#define RT3883_RSTCTRL_UHST           BIT(22)
-+#define RT3883_RSTCTRL_FE             BIT(21)
-+#define RT3883_RSTCTRL_WLAN           BIT(20)
-+#define RT3883_RSTCTRL_UART1          BIT(29)
-+#define RT3883_RSTCTRL_SPI            BIT(18)
-+#define RT3883_RSTCTRL_I2S            BIT(17)
-+#define RT3883_RSTCTRL_I2C            BIT(16)
-+#define RT3883_RSTCTRL_NAND           BIT(15)
-+#define RT3883_RSTCTRL_DMA            BIT(14)
-+#define RT3883_RSTCTRL_PIO            BIT(13)
-+#define RT3883_RSTCTRL_UART           BIT(12)
-+#define RT3883_RSTCTRL_PCM            BIT(11)
-+#define RT3883_RSTCTRL_MC             BIT(10)
-+#define RT3883_RSTCTRL_INTC           BIT(9)
-+#define RT3883_RSTCTRL_TIMER          BIT(8)
-+#define RT3883_RSTCTRL_SYS            BIT(0)
-+
-+#define RT3883_INTC_INT_SYSCTL        BIT(0)
-+#define RT3883_INTC_INT_TIMER0        BIT(1)
-+#define RT3883_INTC_INT_TIMER1        BIT(2)
-+#define RT3883_INTC_INT_IA    BIT(3)
-+#define RT3883_INTC_INT_PCM   BIT(4)
-+#define RT3883_INTC_INT_UART0 BIT(5)
-+#define RT3883_INTC_INT_PIO   BIT(6)
-+#define RT3883_INTC_INT_DMA   BIT(7)
-+#define RT3883_INTC_INT_NAND  BIT(8)
-+#define RT3883_INTC_INT_PERFC BIT(9)
-+#define RT3883_INTC_INT_I2S   BIT(10)
-+#define RT3883_INTC_INT_UART1 BIT(12)
-+#define RT3883_INTC_INT_UHST  BIT(18)
-+#define RT3883_INTC_INT_UDEV  BIT(19)
-+
-+/* FLASH/SRAM/Codec Controller registers */
-+#define RT3883_FSCC_REG_FLASH_CFG0    0x00
-+#define RT3883_FSCC_REG_FLASH_CFG1    0x04
-+#define RT3883_FSCC_REG_CODEC_CFG0    0x40
-+#define RT3883_FSCC_REG_CODEC_CFG1    0x44
-+
-+#define RT3883_FLASH_CFG_WIDTH_SHIFT  26
-+#define RT3883_FLASH_CFG_WIDTH_MASK   0x3
-+#define RT3883_FLASH_CFG_WIDTH_8BIT   0x0
-+#define RT3883_FLASH_CFG_WIDTH_16BIT  0x1
-+#define RT3883_FLASH_CFG_WIDTH_32BIT  0x2
-+
-+#endif /* _RT3883_REGS_H_ */
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -15,6 +15,11 @@ choice
-               select USB_ARCH_HAS_OHCI
-               select USB_ARCH_HAS_EHCI
-+      config SOC_RT3883
-+              bool "RT3883"
-+              select USB_ARCH_HAS_OHCI
-+              select USB_ARCH_HAS_EHCI
-+
- endchoice
- choice
---- a/arch/mips/ralink/Makefile
-+++ b/arch/mips/ralink/Makefile
-@@ -10,6 +10,7 @@ obj-y := prom.o of.o reset.o clk.o irq.o
- obj-$(CONFIG_SOC_RT288X) += rt288x.o
- obj-$(CONFIG_SOC_RT305X) += rt305x.o
-+obj-$(CONFIG_SOC_RT3883) += rt3883.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
---- a/arch/mips/ralink/Platform
-+++ b/arch/mips/ralink/Platform
-@@ -13,3 +13,8 @@ load-$(CONFIG_SOC_RT288X)    += 0xffffffff8
- # Ralink RT305x
- #
- load-$(CONFIG_SOC_RT305X)     += 0xffffffff80000000
-+
-+#
-+# Ralink RT3883
-+#
-+load-$(CONFIG_SOC_RT3883)     += 0xffffffff80000000
---- /dev/null
-+++ b/arch/mips/ralink/rt3883.c
-@@ -0,0 +1,207 @@
-+/*
-+ * 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.
-+ *
-+ * Parts of this file are based on Ralink's 2.6.21 BSP
-+ *
-+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
-+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+
-+#include <asm/mipsregs.h>
-+#include <asm/mach-ralink/ralink_regs.h>
-+#include <asm/mach-ralink/rt3883.h>
-+
-+#include "common.h"
-+
-+struct ralink_pinmux_grp mode_mux[] = {
-+      {
-+              .name = "i2c",
-+              .mask = RT3883_GPIO_MODE_I2C,
-+              .gpio_first = RT3883_GPIO_I2C_SD,
-+              .gpio_last = RT3883_GPIO_I2C_SCLK,
-+      }, {
-+              .name = "spi",
-+              .mask = RT3883_GPIO_MODE_SPI,
-+              .gpio_first = RT3883_GPIO_SPI_CS0,
-+              .gpio_last = RT3883_GPIO_SPI_MISO,
-+      }, {
-+              .name = "uartlite",
-+              .mask = RT3883_GPIO_MODE_UART1,
-+              .gpio_first = RT3883_GPIO_UART1_TXD,
-+              .gpio_last = RT3883_GPIO_UART1_RXD,
-+      }, {
-+              .name = "jtag",
-+              .mask = RT3883_GPIO_MODE_JTAG,
-+              .gpio_first = RT3883_GPIO_JTAG_TDO,
-+              .gpio_last = RT3883_GPIO_JTAG_TCLK,
-+      }, {
-+              .name = "mdio",
-+              .mask = RT3883_GPIO_MODE_MDIO,
-+              .gpio_first = RT3883_GPIO_MDIO_MDC,
-+              .gpio_last = RT3883_GPIO_MDIO_MDIO,
-+      }, {
-+              .name = "ge1",
-+              .mask = RT3883_GPIO_MODE_GE1,
-+              .gpio_first = RT3883_GPIO_GE1_TXD0,
-+              .gpio_last = RT3883_GPIO_GE1_RXCLK,
-+      }, {
-+              .name = "ge2",
-+              .mask = RT3883_GPIO_MODE_GE2,
-+              .gpio_first = RT3883_GPIO_GE2_TXD0,
-+              .gpio_last = RT3883_GPIO_GE2_RXCLK,
-+      }, {
-+              .name = "pci",
-+              .mask = RT3883_GPIO_MODE_PCI,
-+              .gpio_first = RT3883_GPIO_PCI_AD0,
-+              .gpio_last = RT3883_GPIO_PCI_AD31,
-+      }, {
-+              .name = "lna a",
-+              .mask = RT3883_GPIO_MODE_LNA_A,
-+              .gpio_first = RT3883_GPIO_LNA_PE_A0,
-+              .gpio_last = RT3883_GPIO_LNA_PE_A2,
-+      }, {
-+              .name = "lna g",
-+              .mask = RT3883_GPIO_MODE_LNA_G,
-+              .gpio_first = RT3883_GPIO_LNA_PE_G0,
-+              .gpio_last = RT3883_GPIO_LNA_PE_G2,
-+      }, {0}
-+};
-+
-+struct ralink_pinmux_grp uart_mux[] = {
-+      {
-+              .name = "uartf",
-+              .mask = RT3883_GPIO_MODE_UARTF,
-+              .gpio_first = RT3883_GPIO_7,
-+              .gpio_last = RT3883_GPIO_14,
-+      }, {
-+              .name = "pcm uartf",
-+              .mask = RT3883_GPIO_MODE_PCM_UARTF,
-+              .gpio_first = RT3883_GPIO_7,
-+              .gpio_last = RT3883_GPIO_14,
-+      }, {
-+              .name = "pcm i2s",
-+              .mask = RT3883_GPIO_MODE_PCM_I2S,
-+              .gpio_first = RT3883_GPIO_7,
-+              .gpio_last = RT3883_GPIO_14,
-+      }, {
-+              .name = "i2s uartf",
-+              .mask = RT3883_GPIO_MODE_I2S_UARTF,
-+              .gpio_first = RT3883_GPIO_7,
-+              .gpio_last = RT3883_GPIO_14,
-+      }, {
-+              .name = "pcm gpio",
-+              .mask = RT3883_GPIO_MODE_PCM_GPIO,
-+              .gpio_first = RT3883_GPIO_10,
-+              .gpio_last = RT3883_GPIO_14,
-+      }, {
-+              .name = "gpio uartf",
-+              .mask = RT3883_GPIO_MODE_GPIO_UARTF,
-+              .gpio_first = RT3883_GPIO_7,
-+              .gpio_last = RT3883_GPIO_14,
-+      }, {
-+              .name = "gpio i2s",
-+              .mask = RT3883_GPIO_MODE_GPIO_I2S,
-+              .gpio_first = RT3883_GPIO_7,
-+              .gpio_last = RT3883_GPIO_14,
-+      }, {0}
-+};
-+
-+static void rt3883_wdt_reset(void)
-+{
-+      u32 t;
-+
-+      /* enable WDT reset output on GPIO 2 */
-+      t = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG1);
-+      t |= RT3883_SYSCFG1_GPIO2_AS_WDT_OUT;
-+      rt_sysc_w32(t, RT3883_SYSC_REG_SYSCFG1);
-+}
-+
-+struct ralink_pinmux rt_pinmux = {
-+      .mode = mode_mux,
-+      .uart = uart_mux,
-+      .uart_shift = RT3883_GPIO_MODE_UART0_SHIFT,
-+      .uart_mask = RT3883_GPIO_MODE_GPIO,
-+      .wdt_reset = rt3883_wdt_reset,
-+};
-+
-+void __init ralink_clk_init(void)
-+{
-+      unsigned long cpu_rate, sys_rate;
-+      u32 syscfg0;
-+      u32 clksel;
-+      u32 ddr2;
-+
-+      syscfg0 = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG0);
-+      clksel = ((syscfg0 >> RT3883_SYSCFG0_CPUCLK_SHIFT) &
-+              RT3883_SYSCFG0_CPUCLK_MASK);
-+      ddr2 = syscfg0 & RT3883_SYSCFG0_DRAM_TYPE_DDR2;
-+
-+      switch (clksel) {
-+      case RT3883_SYSCFG0_CPUCLK_250:
-+              cpu_rate = 250000000;
-+              sys_rate = (ddr2) ? 125000000 : 83000000;
-+              break;
-+      case RT3883_SYSCFG0_CPUCLK_384:
-+              cpu_rate = 384000000;
-+              sys_rate = (ddr2) ? 128000000 : 96000000;
-+              break;
-+      case RT3883_SYSCFG0_CPUCLK_480:
-+              cpu_rate = 480000000;
-+              sys_rate = (ddr2) ? 160000000 : 120000000;
-+              break;
-+      case RT3883_SYSCFG0_CPUCLK_500:
-+              cpu_rate = 500000000;
-+              sys_rate = (ddr2) ? 166000000 : 125000000;
-+              break;
-+      }
-+
-+      ralink_clk_add("cpu", cpu_rate);
-+      ralink_clk_add("10000100.timer", sys_rate);
-+      ralink_clk_add("10000120.watchdog", sys_rate);
-+      ralink_clk_add("10000500.uart", 40000000);
-+      ralink_clk_add("10000b00.spi", sys_rate);
-+      ralink_clk_add("10000c00.uartlite", 40000000);
-+      ralink_clk_add("10100000.ethernet", sys_rate);
-+}
-+
-+void __init ralink_of_remap(void)
-+{
-+      rt_sysc_membase = plat_of_remap_node("ralink,rt3883-sysc");
-+      rt_memc_membase = plat_of_remap_node("ralink,rt3883-memc");
-+
-+      if (!rt_sysc_membase || !rt_memc_membase)
-+              panic("Failed to remap core resources");
-+}
-+
-+void prom_soc_init(struct ralink_soc_info *soc_info)
-+{
-+      void __iomem *sysc = (void __iomem *) KSEG1ADDR(RT3883_SYSC_BASE);
-+      const char *name;
-+      u32 n0;
-+      u32 n1;
-+      u32 id;
-+
-+      n0 = __raw_readl(sysc + RT3883_SYSC_REG_CHIPID0_3);
-+      n1 = __raw_readl(sysc + RT3883_SYSC_REG_CHIPID4_7);
-+      id = __raw_readl(sysc + RT3883_SYSC_REG_REVID);
-+
-+      if (n0 == RT3883_CHIP_NAME0 && n1 == RT3883_CHIP_NAME1) {
-+              soc_info->compatible = "ralink,rt3883-soc";
-+              name = "RT3883";
-+      } else {
-+              panic("rt3883: unknown SoC, n0:%08x n1:%08x", n0, n1);
-+      }
-+
-+      snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
-+              "Ralink %s ver:%u eco:%u",
-+              name,
-+              (id >> RT3883_REVID_VER_ID_SHIFT) & RT3883_REVID_VER_ID_MASK,
-+              (id & RT3883_REVID_ECO_ID_MASK));
-+}
diff --git a/target/linux/ramips/patches-3.8/0110-MIPS-add-rt3883-dts-files.patch b/target/linux/ramips/patches-3.8/0110-MIPS-add-rt3883-dts-files.patch
deleted file mode 100644 (file)
index a99a1ec..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-From 9d13fedc08f4e2cd9640983c2af8b9e9c64c094b Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 18:37:00 +0100
-Subject: [PATCH 110/121] MIPS: add rt3883 dts files
-
-Add a dtsi file for RT3883 SoC. This SoC is almost the same as RT3050 but has
-OHCI/EHCI in favour of the Synopsis DWC2 core. There is also a 3x3 802.11n
-wifi core.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/Kconfig             |    4 +
- arch/mips/ralink/dts/Makefile        |    1 +
- arch/mips/ralink/dts/rt3883.dtsi     |  186 ++++++++++++++++++++++++++++++++++
- arch/mips/ralink/dts/rt3883_eval.dts |   52 ++++++++++
- 4 files changed, 243 insertions(+)
- create mode 100644 arch/mips/ralink/dts/rt3883.dtsi
- create mode 100644 arch/mips/ralink/dts/rt3883_eval.dts
-
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -39,6 +39,10 @@ choice
-               bool "RT305x eval kit"
-               depends on SOC_RT305X
-+      config DTB_RT3883_EVAL
-+              bool "RT3883 eval kit"
-+              depends on SOC_RT3883
-+
- endchoice
- endif
---- a/arch/mips/ralink/dts/Makefile
-+++ b/arch/mips/ralink/dts/Makefile
-@@ -1,2 +1,3 @@
- obj-$(CONFIG_DTB_RT2880_EVAL) := rt2880_eval.dtb.o
- obj-$(CONFIG_DTB_RT305X_EVAL) := rt3052_eval.dtb.o
-+obj-$(CONFIG_DTB_RT3883_EVAL) := rt3883_eval.dtb.o
---- /dev/null
-+++ b/arch/mips/ralink/dts/rt3883.dtsi
-@@ -0,0 +1,186 @@
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      compatible = "ralink,rt3883-soc";
-+
-+      cpus {
-+              cpu@0 {
-+                      compatible = "mips,mips74Kc";
-+              };
-+      };
-+
-+      chosen {
-+              bootargs = "console=ttyS0,57600 init=/init";
-+      };
-+
-+      cpuintc: cpuintc@0 {
-+              #address-cells = <0>;
-+              #interrupt-cells = <1>;
-+              interrupt-controller;
-+              compatible = "mti,cpu-interrupt-controller";
-+      };
-+
-+      palmbus@10000000 {
-+              compatible = "palmbus";
-+              reg = <0x10000000 0x200000>;
-+              ranges = <0x0 0x10000000 0x1FFFFF>;
-+
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+
-+              sysc@0 {
-+                      compatible = "ralink,rt3883-sysc", "ralink,rt3050-sysc";
-+                      reg = <0x0 0x100>;
-+              };
-+
-+              timer@100 {
-+                      compatible = "ralink,rt3883-timer", "ralink,rt2880-timer";
-+                      reg = <0x100 0x20>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <1>;
-+
-+                      status = "disabled";
-+              };
-+
-+              watchdog@120 {
-+                      compatible = "ralink,rt3883-wdt", "ralink,rt2880-wdt";
-+                      reg = <0x120 0x10>;
-+              };
-+
-+              intc: intc@200 {
-+                      compatible = "ralink,rt3883-intc", "ralink,rt2880-intc";
-+                      reg = <0x200 0x100>;
-+
-+                      interrupt-controller;
-+                      #interrupt-cells = <1>;
-+
-+                      interrupt-parent = <&cpuintc>;
-+                      interrupts = <2>;
-+              };
-+
-+              memc@300 {
-+                      compatible = "ralink,rt3883-memc", "ralink,rt3050-memc";
-+                      reg = <0x300 0x100>;
-+              };
-+
-+              gpio0: gpio@600 {
-+                      compatible = "ralink,rt3883-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x600 0x34>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <24>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              20 24 28 2c
-+                                              30 34 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              gpio1: gpio@638 {
-+                      compatible = "ralink,rt3883-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x638 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <16>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              gpio2: gpio@660 {
-+                      compatible = "ralink,rt3883-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x660 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <32>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              gpio3: gpio@688 {
-+                      compatible = "ralink,rt3883-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x688 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <24>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+
-+                      status = "disabled";
-+              };
-+
-+              spi@b00 {
-+                      compatible = "ralink,rt3883-spi", "ralink,rt2880-spi";
-+                      reg = <0xb00 0x100>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+
-+                      status = "disabled";
-+              };
-+
-+              uartlite@c00 {
-+                      compatible = "ralink,rt3883-uart", "ralink,rt2880-uart", "ns16550a";
-+                      reg = <0xc00 0x100>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <12>;
-+
-+                      reg-shift = <2>;
-+              };
-+      };
-+
-+      ethernet@10100000 {
-+              compatible = "ralink,rt3883-eth";
-+              reg = <0x10100000 10000>;
-+
-+              interrupt-parent = <&cpuintc>;
-+              interrupts = <5>;
-+
-+              status = "disabled";
-+      };
-+
-+      wmac@10180000 {
-+              compatible = "ralink,rt3883-wmac", "ralink,rt2880-wmac";
-+              reg = <0x10180000 40000>;
-+
-+              interrupt-parent = <&cpuintc>;
-+              interrupts = <6>;
-+
-+              status = "disabled";
-+      };
-+
-+      ehci@101c0000 {
-+              compatible = "ralink,rt3883-ehci", "ehci-platform";
-+              reg = <0x101c0000 0x1000>;
-+
-+              interrupt-parent = <&intc>;
-+              interrupts = <18>;
-+
-+              status = "disabled";
-+      };
-+
-+      ohci@101c1000 {
-+              compatible = "ralink,rt3883-ohci", "ohci-platform";
-+              reg = <0x101c1000 0x1000>;
-+
-+              interrupt-parent = <&intc>;
-+              interrupts = <18>;
-+
-+              status = "disabled";
-+      };
-+};
---- /dev/null
-+++ b/arch/mips/ralink/dts/rt3883_eval.dts
-@@ -0,0 +1,52 @@
-+/dts-v1/;
-+
-+/include/ "rt3883.dtsi"
-+
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      compatible = "ralink,rt3883-eval-board", "ralink,rt3883-soc";
-+      model = "Ralink RT3883 evaluation board";
-+
-+      memory@0 {
-+              reg = <0x0 0x4000000>;
-+      };
-+
-+      palmbus@10000000 {
-+              sysc@0 {
-+                      ralink,pinmux = "uartlite", "spi";
-+                      ralink,uartmux = "gpio";
-+                      ralink,wdtmux = <0>;
-+              };
-+      };
-+
-+      cfi@1f000000 {
-+              compatible = "cfi-flash";
-+              reg = <0x1f000000 0x800000>;
-+
-+              bank-width = <2>;
-+              device-width = <2>;
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+
-+              partition@0 {
-+                      label = "uboot";
-+                      reg = <0x0 0x30000>;
-+                      read-only;
-+              };
-+              partition@30000 {
-+                      label = "uboot-env";
-+                      reg = <0x30000 0x10000>;
-+                      read-only;
-+              };
-+              partition@40000 {
-+                      label = "calibration";
-+                      reg = <0x40000 0x10000>;
-+                      read-only;
-+              };
-+              partition@50000 {
-+                      label = "linux";
-+                      reg = <0x50000 0x7b0000>;
-+              };
-+      };
-+};
diff --git a/target/linux/ramips/patches-3.8/0110-MIPS-ralink-add-uart-mask-to-struct-ralink_pinmux.patch b/target/linux/ramips/patches-3.8/0110-MIPS-ralink-add-uart-mask-to-struct-ralink_pinmux.patch
new file mode 100644 (file)
index 0000000..d4474e1
--- /dev/null
@@ -0,0 +1,49 @@
+From faf5989efed503b2ee689dad82bb2d60da718d99 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 12 Apr 2013 12:45:27 +0200
+Subject: [PATCH 110/137] MIPS: ralink: add uart mask to struct ralink_pinmux
+
+Add a field for the uart muxing mask and set it inside the rt305x setup code.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5744/
+---
+ arch/mips/ralink/common.h |    1 +
+ arch/mips/ralink/rt305x.c |    5 +++--
+ 2 files changed, 4 insertions(+), 2 deletions(-)
+
+--- a/arch/mips/ralink/common.h
++++ b/arch/mips/ralink/common.h
+@@ -22,6 +22,7 @@ struct ralink_pinmux {
+       struct ralink_pinmux_grp *mode;
+       struct ralink_pinmux_grp *uart;
+       int uart_shift;
++      u32 uart_mask;
+       void (*wdt_reset)(void);
+       struct ralink_pinmux_grp *pci;
+       int pci_shift;
+--- a/arch/mips/ralink/rt305x.c
++++ b/arch/mips/ralink/rt305x.c
+@@ -91,12 +91,12 @@ static struct ralink_pinmux_grp uart_mux
+               .name = "gpio uartf",
+               .mask = RT305X_GPIO_MODE_GPIO_UARTF,
+               .gpio_first = RT305X_GPIO_7,
+-              .gpio_last = RT305X_GPIO_14,
++              .gpio_last = RT305X_GPIO_10,
+       }, {
+               .name = "gpio i2s",
+               .mask = RT305X_GPIO_MODE_GPIO_I2S,
+               .gpio_first = RT305X_GPIO_7,
+-              .gpio_last = RT305X_GPIO_14,
++              .gpio_last = RT305X_GPIO_10,
+       }, {
+               .name = "gpio",
+               .mask = RT305X_GPIO_MODE_GPIO,
+@@ -118,6 +118,7 @@ struct ralink_pinmux rt_gpio_pinmux = {
+       .mode = mode_mux,
+       .uart = uart_mux,
+       .uart_shift = RT305X_GPIO_MODE_UART0_SHIFT,
++      .uart_mask = RT305X_GPIO_MODE_UART0_MASK,
+       .wdt_reset = rt305x_wdt_reset,
+ };
diff --git a/target/linux/ramips/patches-3.8/0111-MIPS-ralink-adds-support-for-MT7620-SoC-family.patch b/target/linux/ramips/patches-3.8/0111-MIPS-ralink-adds-support-for-MT7620-SoC-family.patch
deleted file mode 100644 (file)
index 948d78c..0000000
+++ /dev/null
@@ -1,340 +0,0 @@
-From 8831277e0167cdcf3dc3ecc5d5a67d4fd9d0ed77 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 17:49:02 +0100
-Subject: [PATCH 111/121] MIPS: ralink: adds support for MT7620 SoC family
-
-Add support code for mt7620 SOC.
-
-The code detects the SoC and registers the clk / pinmux settings.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/include/asm/mach-ralink/mt7620.h |   66 +++++++++
- arch/mips/ralink/Kconfig                   |    3 +
- arch/mips/ralink/Makefile                  |    1 +
- arch/mips/ralink/Platform                  |    5 +
- arch/mips/ralink/mt7620.c                  |  215 ++++++++++++++++++++++++++++
- 5 files changed, 290 insertions(+)
- create mode 100644 arch/mips/include/asm/mach-ralink/mt7620.h
- create mode 100644 arch/mips/ralink/mt7620.c
-
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ralink/mt7620.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.
-+ *
-+ * Parts of this file are based on Ralink's 2.6.21 BSP
-+ *
-+ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
-+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#ifndef _MT7620_REGS_H_
-+#define _MT7620_REGS_H_
-+
-+#define MT7620_SYSC_BASE              0x10000000
-+
-+#define SYSC_REG_CHIP_NAME0           0x00
-+#define SYSC_REG_CHIP_NAME1           0x04
-+#define SYSC_REG_CHIP_REV             0x0c
-+#define SYSC_REG_SYSTEM_CONFIG0               0x10
-+#define SYSC_REG_SYSTEM_CONFIG1               0x14
-+#define SYSC_REG_CPLL_CONFIG0         0x54
-+#define SYSC_REG_CPLL_CONFIG1         0x58
-+
-+#define MT7620N_CHIP_NAME0            0x33365452
-+#define MT7620N_CHIP_NAME1            0x20203235
-+
-+#define MT7620A_CHIP_NAME0            0x3637544d
-+#define MT7620A_CHIP_NAME1            0x20203032
-+
-+#define CHIP_REV_PKG_MASK             0x1
-+#define CHIP_REV_PKG_SHIFT            16
-+#define CHIP_REV_VER_MASK             0xf
-+#define CHIP_REV_VER_SHIFT            8
-+#define CHIP_REV_ECO_MASK             0xf
-+
-+#define MT7620_CPLL_SW_CONFIG_SHIFT   31
-+#define MT7620_CPLL_SW_CONFIG_MASK    0x1
-+#define MT7620_CPLL_CPU_CLK_SHIFT     24
-+#define MT7620_CPLL_CPU_CLK_MASK      0x1
-+
-+#define MT7620_GPIO_MODE_I2C          BIT(0)
-+#define MT7620_GPIO_MODE_UART0_SHIFT  2
-+#define MT7620_GPIO_MODE_UART0_MASK   0x7
-+#define MT7620_GPIO_MODE_UART0(x)     ((x) << MT7620_GPIO_MODE_UART0_SHIFT)
-+#define MT7620_GPIO_MODE_UARTF                0x0
-+#define MT7620_GPIO_MODE_PCM_UARTF    0x1
-+#define MT7620_GPIO_MODE_PCM_I2S      0x2
-+#define MT7620_GPIO_MODE_I2S_UARTF    0x3
-+#define MT7620_GPIO_MODE_PCM_GPIO     0x4
-+#define MT7620_GPIO_MODE_GPIO_UARTF   0x5
-+#define MT7620_GPIO_MODE_GPIO_I2S     0x6
-+#define MT7620_GPIO_MODE_GPIO         0x7
-+#define MT7620_GPIO_MODE_UART1                BIT(5)
-+#define MT7620_GPIO_MODE_MDIO         BIT(8)
-+#define MT7620_GPIO_MODE_RGMII1               BIT(9)
-+#define MT7620_GPIO_MODE_RGMII2               BIT(10)
-+#define MT7620_GPIO_MODE_SPI          BIT(11)
-+#define MT7620_GPIO_MODE_SPI_REF_CLK  BIT(12)
-+#define MT7620_GPIO_MODE_WLED         BIT(13)
-+#define MT7620_GPIO_MODE_JTAG         BIT(15)
-+#define MT7620_GPIO_MODE_EPHY         BIT(15)
-+#define MT7620_GPIO_MODE_WDT          BIT(22)
-+
-+#endif
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -20,6 +20,9 @@ choice
-               select USB_ARCH_HAS_OHCI
-               select USB_ARCH_HAS_EHCI
-+      config SOC_MT7620
-+              bool "MT7620"
-+
- endchoice
- choice
---- a/arch/mips/ralink/Makefile
-+++ b/arch/mips/ralink/Makefile
-@@ -11,6 +11,7 @@ obj-y := prom.o of.o reset.o clk.o irq.o
- obj-$(CONFIG_SOC_RT288X) += rt288x.o
- obj-$(CONFIG_SOC_RT305X) += rt305x.o
- obj-$(CONFIG_SOC_RT3883) += rt3883.o
-+obj-$(CONFIG_SOC_MT7620) += mt7620.o
- obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
---- a/arch/mips/ralink/Platform
-+++ b/arch/mips/ralink/Platform
-@@ -18,3 +18,8 @@ load-$(CONFIG_SOC_RT305X)    += 0xffffffff8
- # Ralink RT3883
- #
- load-$(CONFIG_SOC_RT3883)     += 0xffffffff80000000
-+
-+#
-+# Ralink MT7620
-+#
-+load-$(CONFIG_SOC_MT7620)     += 0xffffffff80000000
---- /dev/null
-+++ b/arch/mips/ralink/mt7620.c
-@@ -0,0 +1,215 @@
-+/*
-+ * 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.
-+ *
-+ * Parts of this file are based on Ralink's 2.6.21 BSP
-+ *
-+ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
-+ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+
-+#include <asm/mipsregs.h>
-+#include <asm/mach-ralink/ralink_regs.h>
-+#include <asm/mach-ralink/mt7620.h>
-+
-+#include "common.h"
-+
-+
-+struct ralink_pinmux_grp mode_mux[] = {
-+      {
-+              .name = "i2c",
-+              .mask = MT7620_GPIO_MODE_I2C,
-+              .gpio_first = 1,
-+              .gpio_last = 2,
-+      }, {
-+              .name = "spi",
-+              .mask = MT7620_GPIO_MODE_SPI,
-+              .gpio_first = 3,
-+              .gpio_last = 6,
-+      }, {
-+              .name = "uartlite",
-+              .mask = MT7620_GPIO_MODE_UART1,
-+              .gpio_first = 15,
-+              .gpio_last = 16,
-+      }, {
-+              .name = "wdt",
-+              .mask = MT7620_GPIO_MODE_WDT,
-+              .gpio_first = 17,
-+              .gpio_last = 17,
-+      }, {
-+              .name = "mdio",
-+              .mask = MT7620_GPIO_MODE_MDIO,
-+              .gpio_first = 22,
-+              .gpio_last = 23,
-+      }, {
-+              .name = "rgmii1",
-+              .mask = MT7620_GPIO_MODE_RGMII1,
-+              .gpio_first = 24,
-+              .gpio_last = 35,
-+      }, {
-+              .name = "spi refclk",
-+              .mask = MT7620_GPIO_MODE_SPI_REF_CLK,
-+              .gpio_first = 37,
-+              .gpio_last = 39,
-+      }, {
-+              .name = "jtag",
-+              .mask = MT7620_GPIO_MODE_JTAG,
-+              .gpio_first = 40,
-+              .gpio_last = 44,
-+      }, {
-+              /* shared lines with jtag */
-+              .name = "ephy",
-+              .mask = MT7620_GPIO_MODE_EPHY,
-+              .gpio_first = 40,
-+              .gpio_last = 44,
-+      }, {
-+              .name = "nand",
-+              .mask = MT7620_GPIO_MODE_JTAG,
-+              .gpio_first = 45,
-+              .gpio_last = 59,
-+      }, {
-+              .name = "rgmii2",
-+              .mask = MT7620_GPIO_MODE_RGMII2,
-+              .gpio_first = 60,
-+              .gpio_last = 71,
-+      }, {
-+              .name = "wled",
-+              .mask = MT7620_GPIO_MODE_WLED,
-+              .gpio_first = 72,
-+              .gpio_last = 72,
-+      }, {0}
-+};
-+
-+
-+struct ralink_pinmux_grp uart_mux[] = {
-+      {
-+              .name = "uartf",
-+              .mask = MT7620_GPIO_MODE_UARTF,
-+              .gpio_first = 7,
-+              .gpio_last = 14,
-+      }, {
-+              .name = "pcm uartf",
-+              .mask = MT7620_GPIO_MODE_PCM_UARTF,
-+              .gpio_first = 7,
-+              .gpio_last = 14,
-+      }, {
-+              .name = "pcm i2s",
-+              .mask = MT7620_GPIO_MODE_PCM_I2S,
-+              .gpio_first = 7,
-+              .gpio_last = 14,
-+      }, {
-+              .name = "i2s uartf",
-+              .mask = MT7620_GPIO_MODE_I2S_UARTF,
-+              .gpio_first = 7,
-+              .gpio_last = 14,
-+      }, {
-+              .name = "pcm gpio",
-+              .mask = MT7620_GPIO_MODE_PCM_GPIO,
-+              .gpio_first = 11,
-+              .gpio_last = 14,
-+      }, {
-+              .name = "gpio uartf",
-+              .mask = MT7620_GPIO_MODE_GPIO_UARTF,
-+              .gpio_first = 7,
-+              .gpio_last = 10,
-+      }, {
-+              .name = "gpio i2s",
-+              .mask = MT7620_GPIO_MODE_GPIO_I2S,
-+              .gpio_first = 7,
-+              .gpio_last = 10,
-+      }, {
-+              .name = "gpio",
-+              .mask = MT7620_GPIO_MODE_GPIO,
-+      }, {0}
-+};
-+/*
-+void rt305x_wdt_reset(void)
-+{
-+      u32 t;
-+
-+      t = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG);
-+      t |= RT305X_SYSCFG_SRAM_CS0_MODE_WDT <<
-+              RT305X_SYSCFG_SRAM_CS0_MODE_SHIFT;
-+      rt_sysc_w32(t, SYSC_REG_SYSTEM_CONFIG);
-+}
-+*/
-+struct ralink_pinmux rt_pinmux = {
-+      .mode = mode_mux,
-+      .uart = uart_mux,
-+      .uart_shift = MT7620_GPIO_MODE_UART0_SHIFT,
-+//    .wdt_reset = rt305x_wdt_reset,
-+};
-+
-+void __init ralink_clk_init(void)
-+{
-+      unsigned long cpu_rate, sys_rate;
-+      u32 c0 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0);
-+      u32 c1 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1);
-+
-+      c0 = (c0 >> MT7620_CPLL_SW_CONFIG_SHIFT) &
-+              MT7620_CPLL_SW_CONFIG_MASK;
-+      c1 = (c1 >> MT7620_CPLL_CPU_CLK_SHIFT) &
-+           MT7620_CPLL_CPU_CLK_MASK;
-+      if (c1 == 0x01) {
-+              cpu_rate = 480000000;
-+      } else {
-+              if (c1 == 0x0) {
-+                      cpu_rate = 600000000;
-+              } else {
-+                      /* TODO calculate custom clock from pll settings */
-+                      BUG();
-+              }
-+      }
-+      /* FIXME  SDR - 4, DDR - 3 */
-+      sys_rate = cpu_rate / 4;
-+
-+      ralink_clk_add("cpu", cpu_rate);
-+      ralink_clk_add("10000100.timer", 40000000);
-+      ralink_clk_add("10000500.uart", 40000000);
-+      ralink_clk_add("10000c00.uartlite", 40000000);
-+}
-+
-+void __init ralink_of_remap(void)
-+{
-+      rt_sysc_membase = plat_of_remap_node("ralink,mt7620-sysc");
-+      rt_memc_membase = plat_of_remap_node("ralink,mt7620-memc");
-+
-+      if (!rt_sysc_membase || !rt_memc_membase)
-+              panic("Failed to remap core resources");
-+}
-+
-+void prom_soc_init(struct ralink_soc_info *soc_info)
-+{
-+      void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7620_SYSC_BASE);
-+      unsigned char *name = NULL;
-+      u32 n0;
-+      u32 n1;
-+      u32 rev;
-+
-+      n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
-+      n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
-+
-+      if (n0 == MT7620N_CHIP_NAME0 && n1 == MT7620N_CHIP_NAME1) {
-+              name = "MT7620N";
-+              soc_info->compatible = "ralink,mt7620n-soc";
-+      } else if (n0 == MT7620A_CHIP_NAME0 && n1 == MT7620A_CHIP_NAME1) {
-+              name = "MT7620A";
-+              soc_info->compatible = "ralink,mt7620a-soc";
-+      } else {
-+              printk("mt7620: unknown SoC, n0:%08x n1:%08x\n", n0, n1);
-+      }
-+
-+      rev = __raw_readl(sysc + SYSC_REG_CHIP_REV);
-+
-+      snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
-+              "Ralink %s ver:%u eco:%u",
-+              name,
-+              (rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK,
-+              (rev & CHIP_REV_ECO_MASK));
-+}
diff --git a/target/linux/ramips/patches-3.8/0111-MIPS-ralink-adds-support-for-RT2880-SoC-family.patch b/target/linux/ramips/patches-3.8/0111-MIPS-ralink-adds-support-for-RT2880-SoC-family.patch
new file mode 100644 (file)
index 0000000..9cfa509
--- /dev/null
@@ -0,0 +1,264 @@
+From cccb9a7b42227a442ca42d590c838c8b6fa0eba1 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Sun, 27 Jan 2013 09:17:20 +0100
+Subject: [PATCH 111/137] MIPS: ralink: adds support for RT2880 SoC family
+
+Add support code for rt2880 SOC.
+
+The code detects the SoC and registers the clk / pinmux settings.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5176/
+---
+ arch/mips/Kconfig                          |    2 +-
+ arch/mips/include/asm/mach-ralink/rt288x.h |   49 ++++++++++
+ arch/mips/ralink/Kconfig                   |    3 +
+ arch/mips/ralink/Makefile                  |    1 +
+ arch/mips/ralink/Platform                  |    5 +
+ arch/mips/ralink/rt288x.c                  |  139 ++++++++++++++++++++++++++++
+ 6 files changed, 198 insertions(+), 1 deletion(-)
+ create mode 100644 arch/mips/include/asm/mach-ralink/rt288x.h
+ create mode 100644 arch/mips/ralink/rt288x.c
+
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -1189,7 +1189,7 @@ config BOOT_ELF32
+ config MIPS_L1_CACHE_SHIFT
+       int
+-      default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL
++      default "4" if MACH_DECSTATION || MIKROTIK_RB532 || PMC_MSP4200_EVAL || SOC_RT288X
+       default "6" if MIPS_CPU_SCACHE
+       default "7" if SGI_IP22 || SGI_IP27 || SGI_IP28 || SNI_RM || CPU_CAVIUM_OCTEON
+       default "5"
+--- /dev/null
++++ b/arch/mips/include/asm/mach-ralink/rt288x.h
+@@ -0,0 +1,49 @@
++/*
++ * 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.
++ *
++ * Parts of this file are based on Ralink's 2.6.21 BSP
++ *
++ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _RT288X_REGS_H_
++#define _RT288X_REGS_H_
++
++#define RT2880_SYSC_BASE              0x00300000
++
++#define SYSC_REG_CHIP_NAME0           0x00
++#define SYSC_REG_CHIP_NAME1           0x04
++#define SYSC_REG_CHIP_ID              0x0c
++#define SYSC_REG_SYSTEM_CONFIG                0x10
++#define SYSC_REG_CLKCFG                       0x30
++
++#define RT2880_CHIP_NAME0             0x38325452
++#define RT2880_CHIP_NAME1             0x20203038
++
++#define CHIP_ID_ID_MASK                       0xff
++#define CHIP_ID_ID_SHIFT              8
++#define CHIP_ID_REV_MASK              0xff
++
++#define SYSTEM_CONFIG_CPUCLK_SHIFT    20
++#define SYSTEM_CONFIG_CPUCLK_MASK     0x3
++#define SYSTEM_CONFIG_CPUCLK_250      0x0
++#define SYSTEM_CONFIG_CPUCLK_266      0x1
++#define SYSTEM_CONFIG_CPUCLK_280      0x2
++#define SYSTEM_CONFIG_CPUCLK_300      0x3
++
++#define RT2880_GPIO_MODE_I2C          BIT(0)
++#define RT2880_GPIO_MODE_UART0                BIT(1)
++#define RT2880_GPIO_MODE_SPI          BIT(2)
++#define RT2880_GPIO_MODE_UART1                BIT(3)
++#define RT2880_GPIO_MODE_JTAG         BIT(4)
++#define RT2880_GPIO_MODE_MDIO         BIT(5)
++#define RT2880_GPIO_MODE_SDRAM                BIT(6)
++#define RT2880_GPIO_MODE_PCI          BIT(7)
++
++#define CLKCFG_SRAM_CS_N_WDT          BIT(9)
++
++#endif
+--- a/arch/mips/ralink/Kconfig
++++ b/arch/mips/ralink/Kconfig
+@@ -6,6 +6,9 @@ choice
+       help
+         Select Ralink MIPS SoC type.
++      config SOC_RT288X
++              bool "RT288x"
++
+       config SOC_RT305X
+               bool "RT305x"
+               select USB_ARCH_HAS_HCD
+--- a/arch/mips/ralink/Makefile
++++ b/arch/mips/ralink/Makefile
+@@ -8,6 +8,7 @@
+ obj-y := prom.o of.o reset.o clk.o irq.o
++obj-$(CONFIG_SOC_RT288X) += rt288x.o
+ obj-$(CONFIG_SOC_RT305X) += rt305x.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+--- a/arch/mips/ralink/Platform
++++ b/arch/mips/ralink/Platform
+@@ -5,6 +5,11 @@ core-$(CONFIG_RALINK)         += arch/mips/rali
+ cflags-$(CONFIG_RALINK)               += -I$(srctree)/arch/mips/include/asm/mach-ralink
+ #
++# Ralink RT288x
++#
++load-$(CONFIG_SOC_RT288X)     += 0xffffffff88000000
++
++#
+ # Ralink RT305x
+ #
+ load-$(CONFIG_SOC_RT305X)     += 0xffffffff80000000
+--- /dev/null
++++ b/arch/mips/ralink/rt288x.c
+@@ -0,0 +1,139 @@
++/*
++ * 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.
++ *
++ * Parts of this file are based on Ralink's 2.6.21 BSP
++ *
++ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++
++#include <asm/mipsregs.h>
++#include <asm/mach-ralink/ralink_regs.h>
++#include <asm/mach-ralink/rt288x.h>
++
++#include "common.h"
++
++static struct ralink_pinmux_grp mode_mux[] = {
++      {
++              .name = "i2c",
++              .mask = RT2880_GPIO_MODE_I2C,
++              .gpio_first = 1,
++              .gpio_last = 2,
++      }, {
++              .name = "spi",
++              .mask = RT2880_GPIO_MODE_SPI,
++              .gpio_first = 3,
++              .gpio_last = 6,
++      }, {
++              .name = "uartlite",
++              .mask = RT2880_GPIO_MODE_UART0,
++              .gpio_first = 7,
++              .gpio_last = 14,
++      }, {
++              .name = "jtag",
++              .mask = RT2880_GPIO_MODE_JTAG,
++              .gpio_first = 17,
++              .gpio_last = 21,
++      }, {
++              .name = "mdio",
++              .mask = RT2880_GPIO_MODE_MDIO,
++              .gpio_first = 22,
++              .gpio_last = 23,
++      }, {
++              .name = "sdram",
++              .mask = RT2880_GPIO_MODE_SDRAM,
++              .gpio_first = 24,
++              .gpio_last = 39,
++      }, {
++              .name = "pci",
++              .mask = RT2880_GPIO_MODE_PCI,
++              .gpio_first = 40,
++              .gpio_last = 71,
++      }, {0}
++};
++
++static void rt288x_wdt_reset(void)
++{
++      u32 t;
++
++      /* enable WDT reset output on pin SRAM_CS_N */
++      t = rt_sysc_r32(SYSC_REG_CLKCFG);
++      t |= CLKCFG_SRAM_CS_N_WDT;
++      rt_sysc_w32(t, SYSC_REG_CLKCFG);
++}
++
++struct ralink_pinmux rt_gpio_pinmux = {
++      .mode = mode_mux,
++      .wdt_reset = rt288x_wdt_reset,
++};
++
++void __init ralink_clk_init(void)
++{
++      unsigned long cpu_rate;
++      u32 t = rt_sysc_r32(SYSC_REG_SYSTEM_CONFIG);
++      t = ((t >> SYSTEM_CONFIG_CPUCLK_SHIFT) & SYSTEM_CONFIG_CPUCLK_MASK);
++
++      switch (t) {
++      case SYSTEM_CONFIG_CPUCLK_250:
++              cpu_rate = 250000000;
++              break;
++      case SYSTEM_CONFIG_CPUCLK_266:
++              cpu_rate = 266666667;
++              break;
++      case SYSTEM_CONFIG_CPUCLK_280:
++              cpu_rate = 280000000;
++              break;
++      case SYSTEM_CONFIG_CPUCLK_300:
++              cpu_rate = 300000000;
++              break;
++      }
++
++      ralink_clk_add("cpu", cpu_rate);
++      ralink_clk_add("300100.timer", cpu_rate / 2);
++      ralink_clk_add("300120.watchdog", cpu_rate / 2);
++      ralink_clk_add("300500.uart", cpu_rate / 2);
++      ralink_clk_add("300c00.uartlite", cpu_rate / 2);
++      ralink_clk_add("400000.ethernet", cpu_rate / 2);
++}
++
++void __init ralink_of_remap(void)
++{
++      rt_sysc_membase = plat_of_remap_node("ralink,rt2880-sysc");
++      rt_memc_membase = plat_of_remap_node("ralink,rt2880-memc");
++
++      if (!rt_sysc_membase || !rt_memc_membase)
++              panic("Failed to remap core resources");
++}
++
++void prom_soc_init(struct ralink_soc_info *soc_info)
++{
++      void __iomem *sysc = (void __iomem *) KSEG1ADDR(RT2880_SYSC_BASE);
++      const char *name;
++      u32 n0;
++      u32 n1;
++      u32 id;
++
++      n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
++      n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
++      id = __raw_readl(sysc + SYSC_REG_CHIP_ID);
++
++      if (n0 == RT2880_CHIP_NAME0 && n1 == RT2880_CHIP_NAME1) {
++              soc_info->compatible = "ralink,r2880-soc";
++              name = "RT2880";
++      } else {
++              panic("rt288x: unknown SoC, n0:%08x n1:%08x", n0, n1);
++      }
++
++      snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
++              "Ralink %s id:%u rev:%u",
++              name,
++              (id >> CHIP_ID_ID_SHIFT) & CHIP_ID_ID_MASK,
++              (id & CHIP_ID_REV_MASK));
++}
diff --git a/target/linux/ramips/patches-3.8/0112-MIPS-add-MT7620-dts-files.patch b/target/linux/ramips/patches-3.8/0112-MIPS-add-MT7620-dts-files.patch
deleted file mode 100644 (file)
index 3ed8efc..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-From 9c83b58b49f88a48565fad6acea921a0ae222856 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 17:50:05 +0100
-Subject: [PATCH 112/121] MIPS: add MT7620 dts files
-
-Adds the dtsi file for MT7620 SoC. This is the latest and greatest SoC shipped
-by Mediatek.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/Kconfig             |    4 +
- arch/mips/ralink/dts/Makefile        |    1 +
- arch/mips/ralink/dts/mt7620.dtsi     |  138 ++++++++++++++++++++++++++++++++++
- arch/mips/ralink/dts/mt7620_eval.dts |   22 ++++++
- 4 files changed, 165 insertions(+)
- create mode 100644 arch/mips/ralink/dts/mt7620.dtsi
- create mode 100644 arch/mips/ralink/dts/mt7620_eval.dts
-
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -46,6 +46,10 @@ choice
-               bool "RT3883 eval kit"
-               depends on SOC_RT3883
-+      config DTB_MT7620_EVAL
-+              bool "MT7620 eval kit"
-+              depends on SOC_MT7620
-+
- endchoice
- endif
---- a/arch/mips/ralink/dts/Makefile
-+++ b/arch/mips/ralink/dts/Makefile
-@@ -1,3 +1,4 @@
- obj-$(CONFIG_DTB_RT2880_EVAL) := rt2880_eval.dtb.o
- obj-$(CONFIG_DTB_RT305X_EVAL) := rt3052_eval.dtb.o
- obj-$(CONFIG_DTB_RT3883_EVAL) := rt3883_eval.dtb.o
-+obj-$(CONFIG_DTB_MT7620_EVAL) := mt7620_eval.dtb.o
---- /dev/null
-+++ b/arch/mips/ralink/dts/mt7620.dtsi
-@@ -0,0 +1,138 @@
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      compatible = "ralink,mtk7620n-soc", "ralink,mt7620-soc";
-+
-+      cpus {
-+              cpu@0 {
-+                      compatible = "mips,mips24KEc";
-+              };
-+      };
-+
-+      chosen {
-+              bootargs = "console=ttyS0,57600 init=/init";
-+      };
-+
-+      cpuintc: cpuintc@0 {
-+              #address-cells = <0>;
-+              #interrupt-cells = <1>;
-+              interrupt-controller;
-+              compatible = "mti,cpu-interrupt-controller";
-+      };
-+
-+      palmbus@10000000 {
-+              compatible = "palmbus";
-+              reg = <0x10000000 0x200000>;
-+                ranges = <0x0 0x10000000 0x1FFFFF>;
-+
-+              #address-cells = <1>;
-+              #size-cells = <1>;
-+
-+              sysc@0 {
-+                      compatible = "ralink,mt7620-sysc", "ralink,mt7620n-sysc";
-+                      reg = <0x0 0x100>;
-+              };
-+
-+              timer@100 {
-+                      compatible = "ralink,mt7620-timer", "ralink,rt2880-timer";
-+                      reg = <0x100 0x20>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <1>;
-+
-+                      status = "disabled";
-+              };
-+
-+              watchdog@120 {
-+                      compatible = "ralink,mt7620-wdt", "ralink,rt2880-wdt";
-+                      reg = <0x120 0x10>;
-+              };
-+
-+              intc: intc@200 {
-+                      compatible = "ralink,mt7620-intc", "ralink,rt2880-intc";
-+                      reg = <0x200 0x100>;
-+
-+                      interrupt-controller;
-+                      #interrupt-cells = <1>;
-+
-+                      interrupt-parent = <&cpuintc>;
-+                      interrupts = <2>;
-+              };
-+
-+              memc@300 {
-+                      compatible = "ralink,mt7620-memc", "ralink,rt3050-memc";
-+                      reg = <0x300 0x100>;
-+              };
-+
-+              gpio0: gpio@600 {
-+                      compatible = "ralink,mt7620-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x600 0x34>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <24>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              20 24 28 2c
-+                                              30 34 ];
-+              };
-+
-+              gpio1: gpio@638 {
-+                      compatible = "ralink,mt7620-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x638 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <16>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+              };
-+
-+              gpio2: gpio@660 {
-+                      compatible = "ralink,mt7620-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x660 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <32>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+              };
-+
-+              gpio3: gpio@688 {
-+                      compatible = "ralink,mt7620-gpio", "ralink,rt2880-gpio";
-+                      reg = <0x688 0x24>;
-+
-+                      gpio-controller;
-+                      #gpio-cells = <2>;
-+
-+                      ralink,num-gpios = <1>;
-+                      ralink,register-map = [ 00 04 08 0c
-+                                              10 14 18 1c
-+                                              20 24 ];
-+              };
-+
-+              spi@b00 {
-+                      compatible = "ralink,rt3883-spi", "ralink,rt2880-spi";
-+                      reg = <0xb00 0x100>;
-+                      #address-cells = <1>;
-+                      #size-cells = <0>;
-+
-+                      status = "disabled";
-+              };
-+
-+              uartlite@c00 {
-+                      compatible = "ralink,mt7620-uart", "ralink,rt2880-uart", "ns16550a";
-+                      reg = <0xc00 0x100>;
-+
-+                      interrupt-parent = <&intc>;
-+                      interrupts = <12>;
-+
-+                      reg-shift = <2>;
-+              };
-+      };
-+};
---- /dev/null
-+++ b/arch/mips/ralink/dts/mt7620_eval.dts
-@@ -0,0 +1,22 @@
-+/dts-v1/;
-+
-+/include/ "mt7620.dtsi"
-+
-+/ {
-+      #address-cells = <1>;
-+      #size-cells = <1>;
-+      compatible = "ralink,mt7620a-eval-board", "ralink,mt7620a-soc";
-+      model = "Ralink MT7620 evaluation board";
-+
-+      memory@0 {
-+              reg = <0x0 0x4000000>;
-+      };
-+
-+      palmbus@10000000 {
-+              sysc@0 {
-+                      ralink,pinmux = "uartlite", "spi";
-+                      ralink,uartmux = "gpio";
-+                      ralink,wdtmux = <0>;
-+              };
-+      };
-+};
diff --git a/target/linux/ramips/patches-3.8/0112-MIPS-ralink-adds-support-for-RT3883-SoC-family.patch b/target/linux/ramips/patches-3.8/0112-MIPS-ralink-adds-support-for-RT3883-SoC-family.patch
new file mode 100644 (file)
index 0000000..f744e62
--- /dev/null
@@ -0,0 +1,552 @@
+From 5eb4dfe5072595e0706de3364f2da45378dbaca6 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Sun, 27 Jan 2013 09:39:02 +0100
+Subject: [PATCH 112/137] MIPS: ralink: adds support for RT3883 SoC family
+
+Add support code for rt3883 SOC.
+
+The code detects the SoC and registers the clk / pinmux settings.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5185/
+---
+ arch/mips/include/asm/mach-ralink/rt3883.h |  247 ++++++++++++++++++++++++++++
+ arch/mips/ralink/Kconfig                   |    5 +
+ arch/mips/ralink/Makefile                  |    1 +
+ arch/mips/ralink/Platform                  |    5 +
+ arch/mips/ralink/rt3883.c                  |  242 +++++++++++++++++++++++++++
+ 5 files changed, 500 insertions(+)
+ create mode 100644 arch/mips/include/asm/mach-ralink/rt3883.h
+ create mode 100644 arch/mips/ralink/rt3883.c
+
+--- /dev/null
++++ b/arch/mips/include/asm/mach-ralink/rt3883.h
+@@ -0,0 +1,247 @@
++/*
++ * Ralink RT3662/RT3883 SoC register definitions
++ *
++ * Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ */
++
++#ifndef _RT3883_REGS_H_
++#define _RT3883_REGS_H_
++
++#include <linux/bitops.h>
++
++#define RT3883_SDRAM_BASE     0x00000000
++#define RT3883_SYSC_BASE      0x10000000
++#define RT3883_TIMER_BASE     0x10000100
++#define RT3883_INTC_BASE      0x10000200
++#define RT3883_MEMC_BASE      0x10000300
++#define RT3883_UART0_BASE     0x10000500
++#define RT3883_PIO_BASE               0x10000600
++#define RT3883_FSCC_BASE      0x10000700
++#define RT3883_NANDC_BASE     0x10000810
++#define RT3883_I2C_BASE               0x10000900
++#define RT3883_I2S_BASE               0x10000a00
++#define RT3883_SPI_BASE               0x10000b00
++#define RT3883_UART1_BASE     0x10000c00
++#define RT3883_PCM_BASE               0x10002000
++#define RT3883_GDMA_BASE      0x10002800
++#define RT3883_CODEC1_BASE    0x10003000
++#define RT3883_CODEC2_BASE    0x10003800
++#define RT3883_FE_BASE                0x10100000
++#define RT3883_ROM_BASE               0x10118000
++#define RT3883_USBDEV_BASE    0x10112000
++#define RT3883_PCI_BASE               0x10140000
++#define RT3883_WLAN_BASE      0x10180000
++#define RT3883_USBHOST_BASE   0x101c0000
++#define RT3883_BOOT_BASE      0x1c000000
++#define RT3883_SRAM_BASE      0x1e000000
++#define RT3883_PCIMEM_BASE    0x20000000
++
++#define RT3883_EHCI_BASE      (RT3883_USBHOST_BASE)
++#define RT3883_OHCI_BASE      (RT3883_USBHOST_BASE + 0x1000)
++
++#define RT3883_SYSC_SIZE      0x100
++#define RT3883_TIMER_SIZE     0x100
++#define RT3883_INTC_SIZE      0x100
++#define RT3883_MEMC_SIZE      0x100
++#define RT3883_UART0_SIZE     0x100
++#define RT3883_UART1_SIZE     0x100
++#define RT3883_PIO_SIZE               0x100
++#define RT3883_FSCC_SIZE      0x100
++#define RT3883_NANDC_SIZE     0x0f0
++#define RT3883_I2C_SIZE               0x100
++#define RT3883_I2S_SIZE               0x100
++#define RT3883_SPI_SIZE               0x100
++#define RT3883_PCM_SIZE               0x800
++#define RT3883_GDMA_SIZE      0x800
++#define RT3883_CODEC1_SIZE    0x800
++#define RT3883_CODEC2_SIZE    0x800
++#define RT3883_FE_SIZE                0x10000
++#define RT3883_ROM_SIZE               0x4000
++#define RT3883_USBDEV_SIZE    0x4000
++#define RT3883_PCI_SIZE               0x40000
++#define RT3883_WLAN_SIZE      0x40000
++#define RT3883_USBHOST_SIZE   0x40000
++#define RT3883_BOOT_SIZE      (32 * 1024 * 1024)
++#define RT3883_SRAM_SIZE      (32 * 1024 * 1024)
++
++/* SYSC registers */
++#define RT3883_SYSC_REG_CHIPID0_3     0x00    /* Chip ID 0 */
++#define RT3883_SYSC_REG_CHIPID4_7     0x04    /* Chip ID 1 */
++#define RT3883_SYSC_REG_REVID         0x0c    /* Chip Revision Identification */
++#define RT3883_SYSC_REG_SYSCFG0               0x10    /* System Configuration 0 */
++#define RT3883_SYSC_REG_SYSCFG1               0x14    /* System Configuration 1 */
++#define RT3883_SYSC_REG_CLKCFG0               0x2c    /* Clock Configuration 0 */
++#define RT3883_SYSC_REG_CLKCFG1               0x30    /* Clock Configuration 1 */
++#define RT3883_SYSC_REG_RSTCTRL               0x34    /* Reset Control*/
++#define RT3883_SYSC_REG_RSTSTAT               0x38    /* Reset Status*/
++#define RT3883_SYSC_REG_USB_PS                0x5c    /* USB Power saving control */
++#define RT3883_SYSC_REG_GPIO_MODE     0x60    /* GPIO Purpose Select */
++#define RT3883_SYSC_REG_PCIE_CLK_GEN0 0x7c
++#define RT3883_SYSC_REG_PCIE_CLK_GEN1 0x80
++#define RT3883_SYSC_REG_PCIE_CLK_GEN2 0x84
++#define RT3883_SYSC_REG_PMU           0x88
++#define RT3883_SYSC_REG_PMU1          0x8c
++
++#define RT3883_CHIP_NAME0             0x38335452
++#define RT3883_CHIP_NAME1             0x20203338
++
++#define RT3883_REVID_VER_ID_MASK      0x0f
++#define RT3883_REVID_VER_ID_SHIFT     8
++#define RT3883_REVID_ECO_ID_MASK      0x0f
++
++#define RT3883_SYSCFG0_DRAM_TYPE_DDR2 BIT(17)
++#define RT3883_SYSCFG0_CPUCLK_SHIFT   8
++#define RT3883_SYSCFG0_CPUCLK_MASK    0x3
++#define RT3883_SYSCFG0_CPUCLK_250     0x0
++#define RT3883_SYSCFG0_CPUCLK_384     0x1
++#define RT3883_SYSCFG0_CPUCLK_480     0x2
++#define RT3883_SYSCFG0_CPUCLK_500     0x3
++
++#define RT3883_SYSCFG1_USB0_HOST_MODE BIT(10)
++#define RT3883_SYSCFG1_PCIE_RC_MODE   BIT(8)
++#define RT3883_SYSCFG1_PCI_HOST_MODE  BIT(7)
++#define RT3883_SYSCFG1_PCI_66M_MODE   BIT(6)
++#define RT3883_SYSCFG1_GPIO2_AS_WDT_OUT       BIT(2)
++
++#define RT3883_CLKCFG1_PCIE_CLK_EN    BIT(21)
++#define RT3883_CLKCFG1_UPHY1_CLK_EN   BIT(20)
++#define RT3883_CLKCFG1_PCI_CLK_EN     BIT(19)
++#define RT3883_CLKCFG1_UPHY0_CLK_EN   BIT(18)
++
++#define RT3883_GPIO_MODE_I2C          BIT(0)
++#define RT3883_GPIO_MODE_SPI          BIT(1)
++#define RT3883_GPIO_MODE_UART0_SHIFT  2
++#define RT3883_GPIO_MODE_UART0_MASK   0x7
++#define RT3883_GPIO_MODE_UART0(x)     ((x) << RT3883_GPIO_MODE_UART0_SHIFT)
++#define RT3883_GPIO_MODE_UARTF                0x0
++#define RT3883_GPIO_MODE_PCM_UARTF    0x1
++#define RT3883_GPIO_MODE_PCM_I2S      0x2
++#define RT3883_GPIO_MODE_I2S_UARTF    0x3
++#define RT3883_GPIO_MODE_PCM_GPIO     0x4
++#define RT3883_GPIO_MODE_GPIO_UARTF   0x5
++#define RT3883_GPIO_MODE_GPIO_I2S     0x6
++#define RT3883_GPIO_MODE_GPIO         0x7
++#define RT3883_GPIO_MODE_UART1                BIT(5)
++#define RT3883_GPIO_MODE_JTAG         BIT(6)
++#define RT3883_GPIO_MODE_MDIO         BIT(7)
++#define RT3883_GPIO_MODE_GE1          BIT(9)
++#define RT3883_GPIO_MODE_GE2          BIT(10)
++#define RT3883_GPIO_MODE_PCI_SHIFT    11
++#define RT3883_GPIO_MODE_PCI_MASK     0x7
++#define RT3883_GPIO_MODE_PCI          (RT3883_GPIO_MODE_PCI_MASK << RT3883_GPIO_MODE_PCI_SHIFT)
++#define RT3883_GPIO_MODE_LNA_A_SHIFT  16
++#define RT3883_GPIO_MODE_LNA_A_MASK   0x3
++#define _RT3883_GPIO_MODE_LNA_A(_x)   ((_x) << RT3883_GPIO_MODE_LNA_A_SHIFT)
++#define RT3883_GPIO_MODE_LNA_A_GPIO   0x3
++#define RT3883_GPIO_MODE_LNA_A                _RT3883_GPIO_MODE_LNA_A(RT3883_GPIO_MODE_LNA_A_MASK)
++#define RT3883_GPIO_MODE_LNA_G_SHIFT  18
++#define RT3883_GPIO_MODE_LNA_G_MASK   0x3
++#define _RT3883_GPIO_MODE_LNA_G(_x)   ((_x) << RT3883_GPIO_MODE_LNA_G_SHIFT)
++#define RT3883_GPIO_MODE_LNA_G_GPIO   0x3
++#define RT3883_GPIO_MODE_LNA_G                _RT3883_GPIO_MODE_LNA_G(RT3883_GPIO_MODE_LNA_G_MASK)
++
++#define RT3883_GPIO_I2C_SD            1
++#define RT3883_GPIO_I2C_SCLK          2
++#define RT3883_GPIO_SPI_CS0           3
++#define RT3883_GPIO_SPI_CLK           4
++#define RT3883_GPIO_SPI_MOSI          5
++#define RT3883_GPIO_SPI_MISO          6
++#define RT3883_GPIO_7                 7
++#define RT3883_GPIO_10                        10
++#define RT3883_GPIO_14                        14
++#define RT3883_GPIO_UART1_TXD         15
++#define RT3883_GPIO_UART1_RXD         16
++#define RT3883_GPIO_JTAG_TDO          17
++#define RT3883_GPIO_JTAG_TDI          18
++#define RT3883_GPIO_JTAG_TMS          19
++#define RT3883_GPIO_JTAG_TCLK         20
++#define RT3883_GPIO_JTAG_TRST_N               21
++#define RT3883_GPIO_MDIO_MDC          22
++#define RT3883_GPIO_MDIO_MDIO         23
++#define RT3883_GPIO_LNA_PE_A0         32
++#define RT3883_GPIO_LNA_PE_A1         33
++#define RT3883_GPIO_LNA_PE_A2         34
++#define RT3883_GPIO_LNA_PE_G0         35
++#define RT3883_GPIO_LNA_PE_G1         36
++#define RT3883_GPIO_LNA_PE_G2         37
++#define RT3883_GPIO_PCI_AD0           40
++#define RT3883_GPIO_PCI_AD31          71
++#define RT3883_GPIO_GE2_TXD0          72
++#define RT3883_GPIO_GE2_TXD1          73
++#define RT3883_GPIO_GE2_TXD2          74
++#define RT3883_GPIO_GE2_TXD3          75
++#define RT3883_GPIO_GE2_TXEN          76
++#define RT3883_GPIO_GE2_TXCLK         77
++#define RT3883_GPIO_GE2_RXD0          78
++#define RT3883_GPIO_GE2_RXD1          79
++#define RT3883_GPIO_GE2_RXD2          80
++#define RT3883_GPIO_GE2_RXD3          81
++#define RT3883_GPIO_GE2_RXDV          82
++#define RT3883_GPIO_GE2_RXCLK         83
++#define RT3883_GPIO_GE1_TXD0          84
++#define RT3883_GPIO_GE1_TXD1          85
++#define RT3883_GPIO_GE1_TXD2          86
++#define RT3883_GPIO_GE1_TXD3          87
++#define RT3883_GPIO_GE1_TXEN          88
++#define RT3883_GPIO_GE1_TXCLK         89
++#define RT3883_GPIO_GE1_RXD0          90
++#define RT3883_GPIO_GE1_RXD1          91
++#define RT3883_GPIO_GE1_RXD2          92
++#define RT3883_GPIO_GE1_RXD3          93
++#define RT3883_GPIO_GE1_RXDV          94
++#define RT3883_GPIO_GE1_RXCLK 95
++
++#define RT3883_RSTCTRL_PCIE_PCI_PDM   BIT(27)
++#define RT3883_RSTCTRL_FLASH          BIT(26)
++#define RT3883_RSTCTRL_UDEV           BIT(25)
++#define RT3883_RSTCTRL_PCI            BIT(24)
++#define RT3883_RSTCTRL_PCIE           BIT(23)
++#define RT3883_RSTCTRL_UHST           BIT(22)
++#define RT3883_RSTCTRL_FE             BIT(21)
++#define RT3883_RSTCTRL_WLAN           BIT(20)
++#define RT3883_RSTCTRL_UART1          BIT(29)
++#define RT3883_RSTCTRL_SPI            BIT(18)
++#define RT3883_RSTCTRL_I2S            BIT(17)
++#define RT3883_RSTCTRL_I2C            BIT(16)
++#define RT3883_RSTCTRL_NAND           BIT(15)
++#define RT3883_RSTCTRL_DMA            BIT(14)
++#define RT3883_RSTCTRL_PIO            BIT(13)
++#define RT3883_RSTCTRL_UART           BIT(12)
++#define RT3883_RSTCTRL_PCM            BIT(11)
++#define RT3883_RSTCTRL_MC             BIT(10)
++#define RT3883_RSTCTRL_INTC           BIT(9)
++#define RT3883_RSTCTRL_TIMER          BIT(8)
++#define RT3883_RSTCTRL_SYS            BIT(0)
++
++#define RT3883_INTC_INT_SYSCTL        BIT(0)
++#define RT3883_INTC_INT_TIMER0        BIT(1)
++#define RT3883_INTC_INT_TIMER1        BIT(2)
++#define RT3883_INTC_INT_IA    BIT(3)
++#define RT3883_INTC_INT_PCM   BIT(4)
++#define RT3883_INTC_INT_UART0 BIT(5)
++#define RT3883_INTC_INT_PIO   BIT(6)
++#define RT3883_INTC_INT_DMA   BIT(7)
++#define RT3883_INTC_INT_NAND  BIT(8)
++#define RT3883_INTC_INT_PERFC BIT(9)
++#define RT3883_INTC_INT_I2S   BIT(10)
++#define RT3883_INTC_INT_UART1 BIT(12)
++#define RT3883_INTC_INT_UHST  BIT(18)
++#define RT3883_INTC_INT_UDEV  BIT(19)
++
++/* FLASH/SRAM/Codec Controller registers */
++#define RT3883_FSCC_REG_FLASH_CFG0    0x00
++#define RT3883_FSCC_REG_FLASH_CFG1    0x04
++#define RT3883_FSCC_REG_CODEC_CFG0    0x40
++#define RT3883_FSCC_REG_CODEC_CFG1    0x44
++
++#define RT3883_FLASH_CFG_WIDTH_SHIFT  26
++#define RT3883_FLASH_CFG_WIDTH_MASK   0x3
++#define RT3883_FLASH_CFG_WIDTH_8BIT   0x0
++#define RT3883_FLASH_CFG_WIDTH_16BIT  0x1
++#define RT3883_FLASH_CFG_WIDTH_32BIT  0x2
++
++#endif /* _RT3883_REGS_H_ */
+--- a/arch/mips/ralink/Kconfig
++++ b/arch/mips/ralink/Kconfig
+@@ -15,6 +15,11 @@ choice
+               select USB_ARCH_HAS_OHCI
+               select USB_ARCH_HAS_EHCI
++      config SOC_RT3883
++              bool "RT3883"
++              select USB_ARCH_HAS_OHCI
++              select USB_ARCH_HAS_EHCI
++
+ endchoice
+ choice
+--- a/arch/mips/ralink/Makefile
++++ b/arch/mips/ralink/Makefile
+@@ -10,6 +10,7 @@ obj-y := prom.o of.o reset.o clk.o irq.o
+ obj-$(CONFIG_SOC_RT288X) += rt288x.o
+ obj-$(CONFIG_SOC_RT305X) += rt305x.o
++obj-$(CONFIG_SOC_RT3883) += rt3883.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+--- a/arch/mips/ralink/Platform
++++ b/arch/mips/ralink/Platform
+@@ -13,3 +13,8 @@ load-$(CONFIG_SOC_RT288X)    += 0xffffffff8
+ # Ralink RT305x
+ #
+ load-$(CONFIG_SOC_RT305X)     += 0xffffffff80000000
++
++#
++# Ralink RT3883
++#
++load-$(CONFIG_SOC_RT3883)     += 0xffffffff80000000
+--- /dev/null
++++ b/arch/mips/ralink/rt3883.c
+@@ -0,0 +1,242 @@
++/*
++ * 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.
++ *
++ * Parts of this file are based on Ralink's 2.6.21 BSP
++ *
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++
++#include <asm/mipsregs.h>
++#include <asm/mach-ralink/ralink_regs.h>
++#include <asm/mach-ralink/rt3883.h>
++
++#include "common.h"
++
++static struct ralink_pinmux_grp mode_mux[] = {
++      {
++              .name = "i2c",
++              .mask = RT3883_GPIO_MODE_I2C,
++              .gpio_first = RT3883_GPIO_I2C_SD,
++              .gpio_last = RT3883_GPIO_I2C_SCLK,
++      }, {
++              .name = "spi",
++              .mask = RT3883_GPIO_MODE_SPI,
++              .gpio_first = RT3883_GPIO_SPI_CS0,
++              .gpio_last = RT3883_GPIO_SPI_MISO,
++      }, {
++              .name = "uartlite",
++              .mask = RT3883_GPIO_MODE_UART1,
++              .gpio_first = RT3883_GPIO_UART1_TXD,
++              .gpio_last = RT3883_GPIO_UART1_RXD,
++      }, {
++              .name = "jtag",
++              .mask = RT3883_GPIO_MODE_JTAG,
++              .gpio_first = RT3883_GPIO_JTAG_TDO,
++              .gpio_last = RT3883_GPIO_JTAG_TCLK,
++      }, {
++              .name = "mdio",
++              .mask = RT3883_GPIO_MODE_MDIO,
++              .gpio_first = RT3883_GPIO_MDIO_MDC,
++              .gpio_last = RT3883_GPIO_MDIO_MDIO,
++      }, {
++              .name = "ge1",
++              .mask = RT3883_GPIO_MODE_GE1,
++              .gpio_first = RT3883_GPIO_GE1_TXD0,
++              .gpio_last = RT3883_GPIO_GE1_RXCLK,
++      }, {
++              .name = "ge2",
++              .mask = RT3883_GPIO_MODE_GE2,
++              .gpio_first = RT3883_GPIO_GE2_TXD0,
++              .gpio_last = RT3883_GPIO_GE2_RXCLK,
++      }, {
++              .name = "pci",
++              .mask = RT3883_GPIO_MODE_PCI,
++              .gpio_first = RT3883_GPIO_PCI_AD0,
++              .gpio_last = RT3883_GPIO_PCI_AD31,
++      }, {
++              .name = "lna a",
++              .mask = RT3883_GPIO_MODE_LNA_A,
++              .gpio_first = RT3883_GPIO_LNA_PE_A0,
++              .gpio_last = RT3883_GPIO_LNA_PE_A2,
++      }, {
++              .name = "lna g",
++              .mask = RT3883_GPIO_MODE_LNA_G,
++              .gpio_first = RT3883_GPIO_LNA_PE_G0,
++              .gpio_last = RT3883_GPIO_LNA_PE_G2,
++      }, {0}
++};
++
++static struct ralink_pinmux_grp uart_mux[] = {
++      {
++              .name = "uartf",
++              .mask = RT3883_GPIO_MODE_UARTF,
++              .gpio_first = RT3883_GPIO_7,
++              .gpio_last = RT3883_GPIO_14,
++      }, {
++              .name = "pcm uartf",
++              .mask = RT3883_GPIO_MODE_PCM_UARTF,
++              .gpio_first = RT3883_GPIO_7,
++              .gpio_last = RT3883_GPIO_14,
++      }, {
++              .name = "pcm i2s",
++              .mask = RT3883_GPIO_MODE_PCM_I2S,
++              .gpio_first = RT3883_GPIO_7,
++              .gpio_last = RT3883_GPIO_14,
++      }, {
++              .name = "i2s uartf",
++              .mask = RT3883_GPIO_MODE_I2S_UARTF,
++              .gpio_first = RT3883_GPIO_7,
++              .gpio_last = RT3883_GPIO_14,
++      }, {
++              .name = "pcm gpio",
++              .mask = RT3883_GPIO_MODE_PCM_GPIO,
++              .gpio_first = RT3883_GPIO_11,
++              .gpio_last = RT3883_GPIO_14,
++      }, {
++              .name = "gpio uartf",
++              .mask = RT3883_GPIO_MODE_GPIO_UARTF,
++              .gpio_first = RT3883_GPIO_7,
++              .gpio_last = RT3883_GPIO_10,
++      }, {
++              .name = "gpio i2s",
++              .mask = RT3883_GPIO_MODE_GPIO_I2S,
++              .gpio_first = RT3883_GPIO_7,
++              .gpio_last = RT3883_GPIO_10,
++      }, {
++              .name = "gpio",
++              .mask = RT3883_GPIO_MODE_GPIO,
++      }, {0}
++};
++
++static struct ralink_pinmux_grp pci_mux[] = {
++      {
++              .name = "pci-dev",
++              .mask = 0,
++              .gpio_first = RT3883_GPIO_PCI_AD0,
++              .gpio_last = RT3883_GPIO_PCI_AD31,
++      }, {
++              .name = "pci-host2",
++              .mask = 1,
++              .gpio_first = RT3883_GPIO_PCI_AD0,
++              .gpio_last = RT3883_GPIO_PCI_AD31,
++      }, {
++              .name = "pci-host1",
++              .mask = 2,
++              .gpio_first = RT3883_GPIO_PCI_AD0,
++              .gpio_last = RT3883_GPIO_PCI_AD31,
++      }, {
++              .name = "pci-fnc",
++              .mask = 3,
++              .gpio_first = RT3883_GPIO_PCI_AD0,
++              .gpio_last = RT3883_GPIO_PCI_AD31,
++      }, {
++              .name = "pci-gpio",
++              .mask = 7,
++              .gpio_first = RT3883_GPIO_PCI_AD0,
++              .gpio_last = RT3883_GPIO_PCI_AD31,
++      }, {0}
++};
++
++static void rt3883_wdt_reset(void)
++{
++      u32 t;
++
++      /* enable WDT reset output on GPIO 2 */
++      t = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG1);
++      t |= RT3883_SYSCFG1_GPIO2_AS_WDT_OUT;
++      rt_sysc_w32(t, RT3883_SYSC_REG_SYSCFG1);
++}
++
++struct ralink_pinmux rt_gpio_pinmux = {
++      .mode = mode_mux,
++      .uart = uart_mux,
++      .uart_shift = RT3883_GPIO_MODE_UART0_SHIFT,
++      .uart_mask = RT3883_GPIO_MODE_GPIO,
++      .wdt_reset = rt3883_wdt_reset,
++      .pci = pci_mux,
++      .pci_shift = RT3883_GPIO_MODE_PCI_SHIFT,
++      .pci_mask = RT3883_GPIO_MODE_PCI_MASK,
++};
++
++void __init ralink_clk_init(void)
++{
++      unsigned long cpu_rate, sys_rate;
++      u32 syscfg0;
++      u32 clksel;
++      u32 ddr2;
++
++      syscfg0 = rt_sysc_r32(RT3883_SYSC_REG_SYSCFG0);
++      clksel = ((syscfg0 >> RT3883_SYSCFG0_CPUCLK_SHIFT) &
++              RT3883_SYSCFG0_CPUCLK_MASK);
++      ddr2 = syscfg0 & RT3883_SYSCFG0_DRAM_TYPE_DDR2;
++
++      switch (clksel) {
++      case RT3883_SYSCFG0_CPUCLK_250:
++              cpu_rate = 250000000;
++              sys_rate = (ddr2) ? 125000000 : 83000000;
++              break;
++      case RT3883_SYSCFG0_CPUCLK_384:
++              cpu_rate = 384000000;
++              sys_rate = (ddr2) ? 128000000 : 96000000;
++              break;
++      case RT3883_SYSCFG0_CPUCLK_480:
++              cpu_rate = 480000000;
++              sys_rate = (ddr2) ? 160000000 : 120000000;
++              break;
++      case RT3883_SYSCFG0_CPUCLK_500:
++              cpu_rate = 500000000;
++              sys_rate = (ddr2) ? 166000000 : 125000000;
++              break;
++      }
++
++      ralink_clk_add("cpu", cpu_rate);
++      ralink_clk_add("10000100.timer", sys_rate);
++      ralink_clk_add("10000120.watchdog", sys_rate);
++      ralink_clk_add("10000500.uart", 40000000);
++      ralink_clk_add("10000b00.spi", sys_rate);
++      ralink_clk_add("10000c00.uartlite", 40000000);
++      ralink_clk_add("10100000.ethernet", sys_rate);
++}
++
++void __init ralink_of_remap(void)
++{
++      rt_sysc_membase = plat_of_remap_node("ralink,rt3883-sysc");
++      rt_memc_membase = plat_of_remap_node("ralink,rt3883-memc");
++
++      if (!rt_sysc_membase || !rt_memc_membase)
++              panic("Failed to remap core resources");
++}
++
++void prom_soc_init(struct ralink_soc_info *soc_info)
++{
++      void __iomem *sysc = (void __iomem *) KSEG1ADDR(RT3883_SYSC_BASE);
++      const char *name;
++      u32 n0;
++      u32 n1;
++      u32 id;
++
++      n0 = __raw_readl(sysc + RT3883_SYSC_REG_CHIPID0_3);
++      n1 = __raw_readl(sysc + RT3883_SYSC_REG_CHIPID4_7);
++      id = __raw_readl(sysc + RT3883_SYSC_REG_REVID);
++
++      if (n0 == RT3883_CHIP_NAME0 && n1 == RT3883_CHIP_NAME1) {
++              soc_info->compatible = "ralink,rt3883-soc";
++              name = "RT3883";
++      } else {
++              panic("rt3883: unknown SoC, n0:%08x n1:%08x", n0, n1);
++      }
++
++      snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
++              "Ralink %s ver:%u eco:%u",
++              name,
++              (id >> RT3883_REVID_VER_ID_SHIFT) & RT3883_REVID_VER_ID_MASK,
++              (id & RT3883_REVID_ECO_ID_MASK));
++}
diff --git a/target/linux/ramips/patches-3.8/0113-MIPS-ralink-add-support-for-periodic-timer-irq.patch b/target/linux/ramips/patches-3.8/0113-MIPS-ralink-add-support-for-periodic-timer-irq.patch
deleted file mode 100644 (file)
index 128a606..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-From cdbc5a9dbd78a771edb6c211edbc677596cbd17f Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Sat, 23 Mar 2013 19:44:41 +0100
-Subject: [PATCH 113/121] MIPS: ralink: add support for periodic timer irq
-
-Adds a driver for the periodic timer found on Ralink SoC.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/ralink/Makefile |    2 +-
- arch/mips/ralink/timer.c  |  192 +++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 193 insertions(+), 1 deletion(-)
- create mode 100644 arch/mips/ralink/timer.c
-
---- a/arch/mips/ralink/Makefile
-+++ b/arch/mips/ralink/Makefile
-@@ -6,7 +6,7 @@
- # Copyright (C) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
- # Copyright (C) 2013 John Crispin <blogic@openwrt.org>
--obj-y := prom.o of.o reset.o clk.o irq.o pinmux.o
-+obj-y := prom.o of.o reset.o clk.o irq.o pinmux.o timer.o
- obj-$(CONFIG_SOC_RT288X) += rt288x.o
- obj-$(CONFIG_SOC_RT305X) += rt305x.o
---- /dev/null
-+++ b/arch/mips/ralink/timer.c
-@@ -0,0 +1,192 @@
-+/*
-+ * 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) 2013 John Crispin <blogic@openwrt.org>
-+*/
-+
-+#include <linux/module.h>
-+#include <linux/platform_device.h>
-+#include <linux/interrupt.h>
-+#include <linux/timer.h>
-+#include <linux/of_gpio.h>
-+#include <linux/clk.h>
-+
-+#include <asm/mach-ralink/ralink_regs.h>
-+
-+#define TIMER_REG_TMRSTAT             0x00
-+#define TIMER_REG_TMR0LOAD            0x10
-+#define TIMER_REG_TMR0CTL             0x18
-+
-+#define TMRSTAT_TMR0INT                       BIT(0)
-+
-+#define TMR0CTL_ENABLE                        BIT(7)
-+#define TMR0CTL_MODE_PERIODIC         BIT(4)
-+#define TMR0CTL_PRESCALER             1
-+#define TMR0CTL_PRESCALE_VAL          (0xf - TMR0CTL_PRESCALER)
-+#define TMR0CTL_PRESCALE_DIV          (65536 / BIT(TMR0CTL_PRESCALER))
-+
-+struct rt_timer {
-+      struct device   *dev;
-+      void __iomem    *membase;
-+      int             irq;
-+      unsigned long   timer_freq;
-+      unsigned long   timer_div;
-+};
-+
-+static inline void rt_timer_w32(struct rt_timer *rt, u8 reg, u32 val)
-+{
-+      __raw_writel(val, rt->membase + reg);
-+}
-+
-+static inline u32 rt_timer_r32(struct rt_timer *rt, u8 reg)
-+{
-+      return __raw_readl(rt->membase + reg);
-+}
-+
-+static irqreturn_t rt_timer_irq(int irq, void *_rt)
-+{
-+      struct rt_timer *rt =  (struct rt_timer *) _rt;
-+
-+      rt_timer_w32(rt, TIMER_REG_TMR0LOAD, rt->timer_freq / rt->timer_div);
-+      rt_timer_w32(rt, TIMER_REG_TMRSTAT, TMRSTAT_TMR0INT);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+
-+static int rt_timer_request(struct rt_timer *rt)
-+{
-+      int err = request_irq(rt->irq, rt_timer_irq, IRQF_DISABLED,
-+                                              dev_name(rt->dev), rt);
-+      if (err) {
-+              dev_err(rt->dev, "failed to request irq\n");
-+      } else {
-+              u32 t = TMR0CTL_MODE_PERIODIC | TMR0CTL_PRESCALE_VAL;
-+              rt_timer_w32(rt, TIMER_REG_TMR0CTL, t);
-+      }
-+      return err;
-+}
-+
-+static void rt_timer_free(struct rt_timer *rt)
-+{
-+      free_irq(rt->irq, rt);
-+}
-+
-+static int rt_timer_config(struct rt_timer *rt, unsigned long divisor)
-+{
-+      if (rt->timer_freq < divisor)
-+              rt->timer_div = rt->timer_freq;
-+      else
-+              rt->timer_div = divisor;
-+
-+      rt_timer_w32(rt, TIMER_REG_TMR0LOAD, rt->timer_freq / rt->timer_div);
-+
-+      return 0;
-+}
-+
-+static int rt_timer_enable(struct rt_timer *rt)
-+{
-+      u32 t;
-+
-+      rt_timer_w32(rt, TIMER_REG_TMR0LOAD, rt->timer_freq / rt->timer_div);
-+
-+      t = rt_timer_r32(rt, TIMER_REG_TMR0CTL);
-+      t |= TMR0CTL_ENABLE;
-+      rt_timer_w32(rt, TIMER_REG_TMR0CTL, t);
-+
-+      return 0;
-+}
-+
-+static void rt_timer_disable(struct rt_timer *rt)
-+{
-+      u32 t;
-+
-+      t = rt_timer_r32(rt, TIMER_REG_TMR0CTL);
-+      t &= ~TMR0CTL_ENABLE;
-+      rt_timer_w32(rt, TIMER_REG_TMR0CTL, t);
-+}
-+
-+static int rt_timer_probe(struct platform_device *pdev)
-+{
-+      struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+      struct rt_timer *rt;
-+      struct clk *clk;
-+
-+      if (!res) {
-+              dev_err(&pdev->dev, "no memory resource found\n");
-+              return -EINVAL;
-+      }
-+
-+      rt = devm_kzalloc(&pdev->dev, sizeof(*rt), GFP_KERNEL);
-+      if (!rt) {
-+              dev_err(&pdev->dev, "failed to allocate memory\n");
-+              return -ENOMEM;
-+      }
-+
-+      rt->irq = platform_get_irq(pdev, 0);
-+      if (!rt->irq) {
-+              dev_err(&pdev->dev, "failed to load irq\n");
-+              return -ENOENT;
-+      }
-+
-+      rt->membase = devm_request_and_ioremap(&pdev->dev, res);
-+      if (!rt->membase) {
-+              dev_err(&pdev->dev, "failed to ioremap\n");
-+              return -ENOMEM;
-+      }
-+
-+      clk = devm_clk_get(&pdev->dev, NULL);
-+      if (IS_ERR(clk)) {
-+              dev_err(&pdev->dev, "failed get clock rate\n");
-+              return PTR_ERR(clk);
-+      }
-+
-+      rt->timer_freq = clk_get_rate(clk) / TMR0CTL_PRESCALE_DIV;
-+      if (!rt->timer_freq)
-+              return -EINVAL;
-+
-+      rt->dev = &pdev->dev;
-+      platform_set_drvdata(pdev, rt);
-+
-+      rt_timer_request(rt);
-+      rt_timer_config(rt, 2);
-+      rt_timer_enable(rt);
-+
-+      dev_info(&pdev->dev, "maximum frequncy is %luHz\n", rt->timer_freq);
-+
-+      return 0;
-+}
-+
-+static int rt_timer_remove(struct platform_device *pdev)
-+{
-+      struct rt_timer *rt = platform_get_drvdata(pdev);
-+
-+      rt_timer_disable(rt);
-+      rt_timer_free(rt);
-+
-+      return 0;
-+}
-+
-+static const struct of_device_id rt_timer_match[] = {
-+      { .compatible = "ralink,rt2880-timer" },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, rt_timer_match);
-+
-+static struct platform_driver rt_timer_driver = {
-+      .probe = rt_timer_probe,
-+      .remove = rt_timer_remove,
-+      .driver = {
-+              .name           = "rt-timer",
-+              .owner          = THIS_MODULE,
-+              .of_match_table = rt_timer_match
-+      },
-+};
-+
-+module_platform_driver(rt_timer_driver);
-+
-+MODULE_DESCRIPTION("Ralink RT2880 timer");
-+MODULE_AUTHOR("John Crispin <blogic@openwrt.org");
-+MODULE_LICENSE("GPL");
diff --git a/target/linux/ramips/patches-3.8/0113-MIPS-ralink-adds-support-for-MT7620-SoC-family.patch b/target/linux/ramips/patches-3.8/0113-MIPS-ralink-adds-support-for-MT7620-SoC-family.patch
new file mode 100644 (file)
index 0000000..d528034
--- /dev/null
@@ -0,0 +1,351 @@
+From a8d7045a9530d0a9e0c65c0f81852bd57ebde53c Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Thu, 21 Mar 2013 17:49:02 +0100
+Subject: [PATCH 113/137] MIPS: ralink: adds support for MT7620 SoC family
+
+Add support code for mt7620 SOC.
+
+The code detects the SoC and registers the clk / pinmux settings.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Gabor Juhos <juhosg@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5177/
+---
+ arch/mips/include/asm/mach-ralink/mt7620.h |   76 ++++++++++
+ arch/mips/ralink/Kconfig                   |    3 +
+ arch/mips/ralink/Makefile                  |    1 +
+ arch/mips/ralink/Platform                  |    5 +
+ arch/mips/ralink/mt7620.c                  |  214 ++++++++++++++++++++++++++++
+ 5 files changed, 299 insertions(+)
+ create mode 100644 arch/mips/include/asm/mach-ralink/mt7620.h
+ create mode 100644 arch/mips/ralink/mt7620.c
+
+--- /dev/null
++++ b/arch/mips/include/asm/mach-ralink/mt7620.h
+@@ -0,0 +1,76 @@
++/*
++ * 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.
++ *
++ * Parts of this file are based on Ralink's 2.6.21 BSP
++ *
++ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _MT7620_REGS_H_
++#define _MT7620_REGS_H_
++
++#define MT7620_SYSC_BASE              0x10000000
++
++#define SYSC_REG_CHIP_NAME0           0x00
++#define SYSC_REG_CHIP_NAME1           0x04
++#define SYSC_REG_CHIP_REV             0x0c
++#define SYSC_REG_SYSTEM_CONFIG0               0x10
++#define SYSC_REG_SYSTEM_CONFIG1               0x14
++#define SYSC_REG_CPLL_CONFIG0         0x54
++#define SYSC_REG_CPLL_CONFIG1         0x58
++
++#define MT7620N_CHIP_NAME0            0x33365452
++#define MT7620N_CHIP_NAME1            0x20203235
++
++#define MT7620A_CHIP_NAME0            0x3637544d
++#define MT7620A_CHIP_NAME1            0x20203032
++
++#define CHIP_REV_PKG_MASK             0x1
++#define CHIP_REV_PKG_SHIFT            16
++#define CHIP_REV_VER_MASK             0xf
++#define CHIP_REV_VER_SHIFT            8
++#define CHIP_REV_ECO_MASK             0xf
++
++#define CPLL_SW_CONFIG_SHIFT          31
++#define CPLL_SW_CONFIG_MASK           0x1
++#define CPLL_CPU_CLK_SHIFT            24
++#define CPLL_CPU_CLK_MASK             0x1
++#define CPLL_MULT_RATIO_SHIFT           16
++#define CPLL_MULT_RATIO                 0x7
++#define CPLL_DIV_RATIO_SHIFT            10
++#define CPLL_DIV_RATIO                  0x3
++
++#define SYSCFG0_DRAM_TYPE_MASK                0x3
++#define SYSCFG0_DRAM_TYPE_SHIFT               4
++#define SYSCFG0_DRAM_TYPE_SDRAM               0
++#define SYSCFG0_DRAM_TYPE_DDR1                1
++#define SYSCFG0_DRAM_TYPE_DDR2                2
++
++#define MT7620_GPIO_MODE_I2C          BIT(0)
++#define MT7620_GPIO_MODE_UART0_SHIFT  2
++#define MT7620_GPIO_MODE_UART0_MASK   0x7
++#define MT7620_GPIO_MODE_UART0(x)     ((x) << MT7620_GPIO_MODE_UART0_SHIFT)
++#define MT7620_GPIO_MODE_UARTF                0x0
++#define MT7620_GPIO_MODE_PCM_UARTF    0x1
++#define MT7620_GPIO_MODE_PCM_I2S      0x2
++#define MT7620_GPIO_MODE_I2S_UARTF    0x3
++#define MT7620_GPIO_MODE_PCM_GPIO     0x4
++#define MT7620_GPIO_MODE_GPIO_UARTF   0x5
++#define MT7620_GPIO_MODE_GPIO_I2S     0x6
++#define MT7620_GPIO_MODE_GPIO         0x7
++#define MT7620_GPIO_MODE_UART1                BIT(5)
++#define MT7620_GPIO_MODE_MDIO         BIT(8)
++#define MT7620_GPIO_MODE_RGMII1               BIT(9)
++#define MT7620_GPIO_MODE_RGMII2               BIT(10)
++#define MT7620_GPIO_MODE_SPI          BIT(11)
++#define MT7620_GPIO_MODE_SPI_REF_CLK  BIT(12)
++#define MT7620_GPIO_MODE_WLED         BIT(13)
++#define MT7620_GPIO_MODE_JTAG         BIT(15)
++#define MT7620_GPIO_MODE_EPHY         BIT(15)
++#define MT7620_GPIO_MODE_WDT          BIT(22)
++
++#endif
+--- a/arch/mips/ralink/Kconfig
++++ b/arch/mips/ralink/Kconfig
+@@ -20,6 +20,9 @@ choice
+               select USB_ARCH_HAS_OHCI
+               select USB_ARCH_HAS_EHCI
++      config SOC_MT7620
++              bool "MT7620"
++
+ endchoice
+ choice
+--- a/arch/mips/ralink/Makefile
++++ b/arch/mips/ralink/Makefile
+@@ -11,6 +11,7 @@ obj-y := prom.o of.o reset.o clk.o irq.o
+ obj-$(CONFIG_SOC_RT288X) += rt288x.o
+ obj-$(CONFIG_SOC_RT305X) += rt305x.o
+ obj-$(CONFIG_SOC_RT3883) += rt3883.o
++obj-$(CONFIG_SOC_MT7620) += mt7620.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+--- a/arch/mips/ralink/Platform
++++ b/arch/mips/ralink/Platform
+@@ -18,3 +18,8 @@ load-$(CONFIG_SOC_RT305X)    += 0xffffffff8
+ # Ralink RT3883
+ #
+ load-$(CONFIG_SOC_RT3883)     += 0xffffffff80000000
++
++#
++# Ralink MT7620
++#
++load-$(CONFIG_SOC_MT7620)     += 0xffffffff80000000
+--- /dev/null
++++ b/arch/mips/ralink/mt7620.c
+@@ -0,0 +1,214 @@
++/*
++ * 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.
++ *
++ * Parts of this file are based on Ralink's 2.6.21 BSP
++ *
++ * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/module.h>
++
++#include <asm/mipsregs.h>
++#include <asm/mach-ralink/ralink_regs.h>
++#include <asm/mach-ralink/mt7620.h>
++
++#include "common.h"
++
++/* does the board have sdram or ddram */
++static int dram_type;
++
++/* the pll dividers */
++static u32 mt7620_clk_divider[] = { 2, 3, 4, 8 };
++
++static struct ralink_pinmux_grp mode_mux[] = {
++      {
++              .name = "i2c",
++              .mask = MT7620_GPIO_MODE_I2C,
++              .gpio_first = 1,
++              .gpio_last = 2,
++      }, {
++              .name = "spi",
++              .mask = MT7620_GPIO_MODE_SPI,
++              .gpio_first = 3,
++              .gpio_last = 6,
++      }, {
++              .name = "uartlite",
++              .mask = MT7620_GPIO_MODE_UART1,
++              .gpio_first = 15,
++              .gpio_last = 16,
++      }, {
++              .name = "wdt",
++              .mask = MT7620_GPIO_MODE_WDT,
++              .gpio_first = 17,
++              .gpio_last = 17,
++      }, {
++              .name = "mdio",
++              .mask = MT7620_GPIO_MODE_MDIO,
++              .gpio_first = 22,
++              .gpio_last = 23,
++      }, {
++              .name = "rgmii1",
++              .mask = MT7620_GPIO_MODE_RGMII1,
++              .gpio_first = 24,
++              .gpio_last = 35,
++      }, {
++              .name = "spi refclk",
++              .mask = MT7620_GPIO_MODE_SPI_REF_CLK,
++              .gpio_first = 37,
++              .gpio_last = 39,
++      }, {
++              .name = "jtag",
++              .mask = MT7620_GPIO_MODE_JTAG,
++              .gpio_first = 40,
++              .gpio_last = 44,
++      }, {
++              /* shared lines with jtag */
++              .name = "ephy",
++              .mask = MT7620_GPIO_MODE_EPHY,
++              .gpio_first = 40,
++              .gpio_last = 44,
++      }, {
++              .name = "nand",
++              .mask = MT7620_GPIO_MODE_JTAG,
++              .gpio_first = 45,
++              .gpio_last = 59,
++      }, {
++              .name = "rgmii2",
++              .mask = MT7620_GPIO_MODE_RGMII2,
++              .gpio_first = 60,
++              .gpio_last = 71,
++      }, {
++              .name = "wled",
++              .mask = MT7620_GPIO_MODE_WLED,
++              .gpio_first = 72,
++              .gpio_last = 72,
++      }, {0}
++};
++
++static struct ralink_pinmux_grp uart_mux[] = {
++      {
++              .name = "uartf",
++              .mask = MT7620_GPIO_MODE_UARTF,
++              .gpio_first = 7,
++              .gpio_last = 14,
++      }, {
++              .name = "pcm uartf",
++              .mask = MT7620_GPIO_MODE_PCM_UARTF,
++              .gpio_first = 7,
++              .gpio_last = 14,
++      }, {
++              .name = "pcm i2s",
++              .mask = MT7620_GPIO_MODE_PCM_I2S,
++              .gpio_first = 7,
++              .gpio_last = 14,
++      }, {
++              .name = "i2s uartf",
++              .mask = MT7620_GPIO_MODE_I2S_UARTF,
++              .gpio_first = 7,
++              .gpio_last = 14,
++      }, {
++              .name = "pcm gpio",
++              .mask = MT7620_GPIO_MODE_PCM_GPIO,
++              .gpio_first = 11,
++              .gpio_last = 14,
++      }, {
++              .name = "gpio uartf",
++              .mask = MT7620_GPIO_MODE_GPIO_UARTF,
++              .gpio_first = 7,
++              .gpio_last = 10,
++      }, {
++              .name = "gpio i2s",
++              .mask = MT7620_GPIO_MODE_GPIO_I2S,
++              .gpio_first = 7,
++              .gpio_last = 10,
++      }, {
++              .name = "gpio",
++              .mask = MT7620_GPIO_MODE_GPIO,
++      }, {0}
++};
++
++struct ralink_pinmux rt_gpio_pinmux = {
++      .mode = mode_mux,
++      .uart = uart_mux,
++      .uart_shift = MT7620_GPIO_MODE_UART0_SHIFT,
++      .uart_mask = MT7620_GPIO_MODE_GPIO,
++};
++
++void __init ralink_clk_init(void)
++{
++      unsigned long cpu_rate, sys_rate;
++      u32 c0 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG0);
++      u32 c1 = rt_sysc_r32(SYSC_REG_CPLL_CONFIG1);
++      u32 swconfig = (c0 >> CPLL_SW_CONFIG_SHIFT) & CPLL_SW_CONFIG_MASK;
++      u32 cpu_clk = (c1 >> CPLL_CPU_CLK_SHIFT) & CPLL_CPU_CLK_MASK;
++
++      if (cpu_clk) {
++              cpu_rate = 480000000;
++      } else if (!swconfig) {
++              cpu_rate = 600000000;
++      } else {
++              u32 m = (c0 >> CPLL_MULT_RATIO_SHIFT) & CPLL_MULT_RATIO;
++              u32 d = (c0 >> CPLL_DIV_RATIO_SHIFT) & CPLL_DIV_RATIO;
++
++              cpu_rate = ((40 * (m + 24)) / mt7620_clk_divider[d]) * 1000000;
++      }
++
++      if (dram_type == SYSCFG0_DRAM_TYPE_SDRAM)
++              sys_rate = cpu_rate / 4;
++      else
++              sys_rate = cpu_rate / 3;
++
++      ralink_clk_add("cpu", cpu_rate);
++      ralink_clk_add("10000100.timer", 40000000);
++      ralink_clk_add("10000500.uart", 40000000);
++      ralink_clk_add("10000c00.uartlite", 40000000);
++}
++
++void __init ralink_of_remap(void)
++{
++      rt_sysc_membase = plat_of_remap_node("ralink,mt7620a-sysc");
++      rt_memc_membase = plat_of_remap_node("ralink,mt7620a-memc");
++
++      if (!rt_sysc_membase || !rt_memc_membase)
++              panic("Failed to remap core resources");
++}
++
++void prom_soc_init(struct ralink_soc_info *soc_info)
++{
++      void __iomem *sysc = (void __iomem *) KSEG1ADDR(MT7620_SYSC_BASE);
++      unsigned char *name = NULL;
++      u32 n0;
++      u32 n1;
++      u32 rev;
++      u32 cfg0;
++
++      n0 = __raw_readl(sysc + SYSC_REG_CHIP_NAME0);
++      n1 = __raw_readl(sysc + SYSC_REG_CHIP_NAME1);
++
++      if (n0 == MT7620N_CHIP_NAME0 && n1 == MT7620N_CHIP_NAME1) {
++              name = "MT7620N";
++              soc_info->compatible = "ralink,mt7620n-soc";
++      } else if (n0 == MT7620A_CHIP_NAME0 && n1 == MT7620A_CHIP_NAME1) {
++              name = "MT7620A";
++              soc_info->compatible = "ralink,mt7620a-soc";
++      } else {
++              panic("mt7620: unknown SoC, n0:%08x n1:%08x\n", n0, n1);
++      }
++
++      rev = __raw_readl(sysc + SYSC_REG_CHIP_REV);
++
++      snprintf(soc_info->sys_type, RAMIPS_SYS_TYPE_LEN,
++              "Ralink %s ver:%u eco:%u",
++              name,
++              (rev >> CHIP_REV_VER_SHIFT) & CHIP_REV_VER_MASK,
++              (rev & CHIP_REV_ECO_MASK));
++
++      cfg0 = __raw_readl(sysc + SYSC_REG_SYSTEM_CONFIG0);
++      dram_type = (cfg0 >> SYSCFG0_DRAM_TYPE_SHIFT) & SYSCFG0_DRAM_TYPE_MASK;
++}
diff --git a/target/linux/ramips/patches-3.8/0114-GPIO-MIPS-ralink-adds-ralink-gpio-support.patch b/target/linux/ramips/patches-3.8/0114-GPIO-MIPS-ralink-adds-ralink-gpio-support.patch
deleted file mode 100644 (file)
index b0ea011..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-From f22c157f44c93d61058d2e2aa5626ee2899fde5a Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Tue, 22 Jan 2013 18:24:34 +0100
-Subject: [PATCH 114/121] GPIO: MIPS: ralink: adds ralink gpio support
-
-Add gpio driver for Ralink SoC. This driver makes the gpio core on
-RT2880, RT305x, rt3352, rt3662, rt3883, rt5350 and mt7620 work.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/Kconfig                        |    1 +
- arch/mips/include/asm/mach-ralink/gpio.h |   24 ++++
- drivers/gpio/Kconfig                     |    6 +
- drivers/gpio/Makefile                    |    1 +
- drivers/gpio/gpio-ralink.c               |  176 ++++++++++++++++++++++++++++++
- 5 files changed, 208 insertions(+)
- create mode 100644 arch/mips/include/asm/mach-ralink/gpio.h
- create mode 100644 drivers/gpio/gpio-ralink.c
-
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -449,6 +449,7 @@ config RALINK
-       select SYS_HAS_EARLY_PRINTK
-       select HAVE_MACH_CLKDEV
-       select CLKDEV_LOOKUP
-+      select ARCH_REQUIRE_GPIOLIB
- config SGI_IP22
-       bool "SGI IP22 (Indy/Indigo2)"
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ralink/gpio.h
-@@ -0,0 +1,24 @@
-+/*
-+ *  Ralink SoC GPIO API support
-+ *
-+ *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
-+ *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ *
-+ */
-+
-+#ifndef __ASM_MACH_RALINK_GPIO_H
-+#define __ASM_MACH_RALINK_GPIO_H
-+
-+#define ARCH_NR_GPIOS 128
-+#include <asm-generic/gpio.h>
-+
-+#define gpio_get_value        __gpio_get_value
-+#define gpio_set_value        __gpio_set_value
-+#define gpio_cansleep __gpio_cansleep
-+#define gpio_to_irq   __gpio_to_irq
-+
-+#endif /* __ASM_MACH_RALINK_GPIO_H */
---- a/drivers/gpio/Kconfig
-+++ b/drivers/gpio/Kconfig
-@@ -201,6 +201,12 @@ config GPIO_PXA
-       help
-         Say yes here to support the PXA GPIO device
-+config GPIO_RALINK
-+      bool "Ralink GPIO Support"
-+      depends on RALINK
-+      help
-+        Say yes here to support the Ralink SoC GPIO device
-+
- config GPIO_SPEAR_SPICS
-       bool "ST SPEAr13xx SPI Chip Select as GPIO support"
-       depends on PLAT_SPEAR
---- a/drivers/gpio/Makefile
-+++ b/drivers/gpio/Makefile
-@@ -54,6 +54,7 @@ obj-$(CONFIG_GPIO_PCF857X)   += gpio-pcf85
- obj-$(CONFIG_GPIO_PCH)                += gpio-pch.o
- obj-$(CONFIG_GPIO_PL061)      += gpio-pl061.o
- obj-$(CONFIG_GPIO_PXA)                += gpio-pxa.o
-+obj-$(CONFIG_GPIO_RALINK)     += gpio-ralink.o
- obj-$(CONFIG_GPIO_RC5T583)    += gpio-rc5t583.o
- obj-$(CONFIG_GPIO_RDC321X)    += gpio-rdc321x.o
- obj-$(CONFIG_PLAT_SAMSUNG)    += gpio-samsung.o
---- /dev/null
-+++ b/drivers/gpio/gpio-ralink.c
-@@ -0,0 +1,176 @@
-+/*
-+ * 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) 2009-2011 Gabor Juhos <juhosg@openwrt.org>
-+ * Copyright (C) 2013 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/io.h>
-+#include <linux/gpio.h>
-+#include <linux/spinlock.h>
-+#include <linux/platform_device.h>
-+
-+enum ralink_gpio_reg {
-+      GPIO_REG_INT = 0,
-+      GPIO_REG_EDGE,
-+      GPIO_REG_RENA,
-+      GPIO_REG_FENA,
-+      GPIO_REG_DATA,
-+      GPIO_REG_DIR,
-+      GPIO_REG_POL,
-+      GPIO_REG_SET,
-+      GPIO_REG_RESET,
-+      GPIO_REG_TOGGLE,
-+      GPIO_REG_MAX
-+};
-+
-+struct ralink_gpio_chip {
-+      struct gpio_chip chip;
-+      u8 regs[GPIO_REG_MAX];
-+
-+      spinlock_t lock;
-+      void __iomem *membase;
-+};
-+
-+static inline struct ralink_gpio_chip *to_ralink_gpio(struct gpio_chip *chip)
-+{
-+      struct ralink_gpio_chip *rg;
-+
-+      rg = container_of(chip, struct ralink_gpio_chip, chip);
-+      return rg;
-+}
-+
-+static inline void rt_gpio_w32(struct ralink_gpio_chip *rg, u8 reg, u32 val)
-+{
-+      iowrite32(val, rg->membase + rg->regs[reg]);
-+}
-+
-+static inline u32 rt_gpio_r32(struct ralink_gpio_chip *rg, u8 reg)
-+{
-+      return ioread32(rg->membase + rg->regs[reg]);
-+}
-+
-+static void ralink_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
-+{
-+      struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
-+
-+      rt_gpio_w32(rg, (value) ? GPIO_REG_SET : GPIO_REG_RESET, BIT(offset));
-+}
-+
-+static int ralink_gpio_get(struct gpio_chip *chip, unsigned offset)
-+{
-+      struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
-+
-+      return !!(rt_gpio_r32(rg, GPIO_REG_DATA) & BIT(offset));
-+}
-+
-+static int ralink_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
-+{
-+      struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
-+      unsigned long flags;
-+      u32 t;
-+
-+      spin_lock_irqsave(&rg->lock, flags);
-+      t = rt_gpio_r32(rg, GPIO_REG_DIR);
-+      t &= ~BIT(offset);
-+      rt_gpio_w32(rg, GPIO_REG_DIR, t);
-+      spin_unlock_irqrestore(&rg->lock, flags);
-+
-+      return 0;
-+}
-+
-+static int ralink_gpio_direction_output(struct gpio_chip *chip,
-+                                      unsigned offset, int value)
-+{
-+      struct ralink_gpio_chip *rg = to_ralink_gpio(chip);
-+      unsigned long flags;
-+      u32 t;
-+
-+      spin_lock_irqsave(&rg->lock, flags);
-+      ralink_gpio_set(chip, offset, value);
-+      t = rt_gpio_r32(rg, GPIO_REG_DIR);
-+      t |= BIT(offset);
-+      rt_gpio_w32(rg, GPIO_REG_DIR, t);
-+      spin_unlock_irqrestore(&rg->lock, flags);
-+
-+      return 0;
-+}
-+
-+static int ralink_gpio_probe(struct platform_device *pdev)
-+{
-+      struct device_node *np = pdev->dev.of_node;
-+      struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+      struct ralink_gpio_chip *gc;
-+      const __be32 *ngpio;
-+
-+      if (!res) {
-+              dev_err(&pdev->dev, "failed to find resource\n");
-+              return -ENOMEM;
-+      }
-+
-+      gc = devm_kzalloc(&pdev->dev,
-+                              sizeof(struct ralink_gpio_chip), GFP_KERNEL);
-+      if (!gc)
-+              return -ENOMEM;
-+
-+      gc->membase = devm_request_and_ioremap(&pdev->dev, res);
-+      if (!gc->membase) {
-+              dev_err(&pdev->dev, "cannot remap I/O memory region\n");
-+              return -ENOMEM;
-+      }
-+
-+      if (of_property_read_u8_array(np, "ralink,register-map",
-+                      gc->regs, GPIO_REG_MAX)) {
-+              dev_err(&pdev->dev, "failed to read register definition\n");
-+              return -EINVAL;
-+      }
-+
-+      ngpio = of_get_property(np, "ralink,num-gpios", NULL);
-+      if (!ngpio) {
-+              dev_err(&pdev->dev, "failed to read number of pins\n");
-+              return -EINVAL;
-+      }
-+
-+      spin_lock_init(&gc->lock);
-+
-+      gc->chip.label = dev_name(&pdev->dev);
-+      gc->chip.of_node = np;
-+      gc->chip.base = -1;
-+      gc->chip.ngpio = be32_to_cpu(*ngpio);
-+      gc->chip.direction_input = ralink_gpio_direction_input;
-+      gc->chip.direction_output = ralink_gpio_direction_output;
-+      gc->chip.get = ralink_gpio_get;
-+      gc->chip.set = ralink_gpio_set;
-+
-+      /* set polarity to low for all lines */
-+      rt_gpio_w32(gc, GPIO_REG_POL, 0);
-+
-+      dev_info(&pdev->dev, "registering %d gpios\n", gc->chip.ngpio);
-+
-+      return gpiochip_add(&gc->chip);
-+}
-+
-+static const struct of_device_id ralink_gpio_match[] = {
-+      { .compatible = "ralink,rt2880-gpio" },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, ralink_gpio_match);
-+
-+static struct platform_driver ralink_gpio_driver = {
-+      .probe = ralink_gpio_probe,
-+      .driver = {
-+              .name = "rt2880_gpio",
-+              .owner = THIS_MODULE,
-+              .of_match_table = ralink_gpio_match,
-+      },
-+};
-+
-+static int __init ralink_gpio_init(void)
-+{
-+      return platform_driver_register(&ralink_gpio_driver);
-+}
-+
-+subsys_initcall(ralink_gpio_init);
diff --git a/target/linux/ramips/patches-3.8/0114-MIPS-ralink-add-cpu-feature-overrides.h.patch b/target/linux/ramips/patches-3.8/0114-MIPS-ralink-add-cpu-feature-overrides.h.patch
new file mode 100644 (file)
index 0000000..dc5dab9
--- /dev/null
@@ -0,0 +1,218 @@
+From 33c525913af22d1b799a7218ee48579c22a50cf8 Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Wed, 10 Apr 2013 09:19:07 +0200
+Subject: [PATCH 114/137] MIPS: ralink: add cpu-feature-overrides.h
+
+Add cpu-feature-overrides.h for RT288x, RT305x and RT3883.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Patchwork: http://patchwork.linux-mips.org/patch/5175/
+---
+ .../asm/mach-ralink/rt288x/cpu-feature-overrides.h |   56 ++++++++++++++++++++
+ .../asm/mach-ralink/rt305x/cpu-feature-overrides.h |   56 ++++++++++++++++++++
+ .../asm/mach-ralink/rt3883/cpu-feature-overrides.h |   55 +++++++++++++++++++
+ arch/mips/ralink/Platform                          |    3 ++
+ 4 files changed, 170 insertions(+)
+ create mode 100644 arch/mips/include/asm/mach-ralink/rt288x/cpu-feature-overrides.h
+ create mode 100644 arch/mips/include/asm/mach-ralink/rt305x/cpu-feature-overrides.h
+ create mode 100644 arch/mips/include/asm/mach-ralink/rt3883/cpu-feature-overrides.h
+
+--- /dev/null
++++ b/arch/mips/include/asm/mach-ralink/rt288x/cpu-feature-overrides.h
+@@ -0,0 +1,56 @@
++/*
++ * Ralink RT288x specific CPU feature overrides
++ *
++ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ *
++ * This file was derived from: include/asm-mips/cpu-features.h
++ *    Copyright (C) 2003, 2004 Ralf Baechle
++ *    Copyright (C) 2004 Maciej W. Rozycki
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ *
++ */
++#ifndef _RT288X_CPU_FEATURE_OVERRIDES_H
++#define _RT288X_CPU_FEATURE_OVERRIDES_H
++
++#define cpu_has_tlb           1
++#define cpu_has_4kex          1
++#define cpu_has_3k_cache      0
++#define cpu_has_4k_cache      1
++#define cpu_has_tx39_cache    0
++#define cpu_has_sb1_cache     0
++#define cpu_has_fpu           0
++#define cpu_has_32fpr         0
++#define cpu_has_counter               1
++#define cpu_has_watch         1
++#define cpu_has_divec         1
++
++#define cpu_has_prefetch      1
++#define cpu_has_ejtag         1
++#define cpu_has_llsc          1
++
++#define cpu_has_mips16                1
++#define cpu_has_mdmx          0
++#define cpu_has_mips3d                0
++#define cpu_has_smartmips     0
++
++#define cpu_has_mips32r1      1
++#define cpu_has_mips32r2      1
++#define cpu_has_mips64r1      0
++#define cpu_has_mips64r2      0
++
++#define cpu_has_dsp           0
++#define cpu_has_mipsmt                0
++
++#define cpu_has_64bits                0
++#define cpu_has_64bit_zero_reg        0
++#define cpu_has_64bit_gp_regs 0
++#define cpu_has_64bit_addresses       0
++
++#define cpu_dcache_line_size()        16
++#define cpu_icache_line_size()        16
++
++#endif /* _RT288X_CPU_FEATURE_OVERRIDES_H */
+--- /dev/null
++++ b/arch/mips/include/asm/mach-ralink/rt305x/cpu-feature-overrides.h
+@@ -0,0 +1,56 @@
++/*
++ * Ralink RT305x specific CPU feature overrides
++ *
++ * Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
++ * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
++ *
++ * This file was derived from: include/asm-mips/cpu-features.h
++ *    Copyright (C) 2003, 2004 Ralf Baechle
++ *    Copyright (C) 2004 Maciej W. Rozycki
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ *
++ */
++#ifndef _RT305X_CPU_FEATURE_OVERRIDES_H
++#define _RT305X_CPU_FEATURE_OVERRIDES_H
++
++#define cpu_has_tlb           1
++#define cpu_has_4kex          1
++#define cpu_has_3k_cache      0
++#define cpu_has_4k_cache      1
++#define cpu_has_tx39_cache    0
++#define cpu_has_sb1_cache     0
++#define cpu_has_fpu           0
++#define cpu_has_32fpr         0
++#define cpu_has_counter               1
++#define cpu_has_watch         1
++#define cpu_has_divec         1
++
++#define cpu_has_prefetch      1
++#define cpu_has_ejtag         1
++#define cpu_has_llsc          1
++
++#define cpu_has_mips16                1
++#define cpu_has_mdmx          0
++#define cpu_has_mips3d                0
++#define cpu_has_smartmips     0
++
++#define cpu_has_mips32r1      1
++#define cpu_has_mips32r2      1
++#define cpu_has_mips64r1      0
++#define cpu_has_mips64r2      0
++
++#define cpu_has_dsp           1
++#define cpu_has_mipsmt                0
++
++#define cpu_has_64bits                0
++#define cpu_has_64bit_zero_reg        0
++#define cpu_has_64bit_gp_regs 0
++#define cpu_has_64bit_addresses       0
++
++#define cpu_dcache_line_size()        32
++#define cpu_icache_line_size()        32
++
++#endif /* _RT305X_CPU_FEATURE_OVERRIDES_H */
+--- /dev/null
++++ b/arch/mips/include/asm/mach-ralink/rt3883/cpu-feature-overrides.h
+@@ -0,0 +1,55 @@
++/*
++ * Ralink RT3662/RT3883 specific CPU feature overrides
++ *
++ * Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
++ *
++ * This file was derived from: include/asm-mips/cpu-features.h
++ *    Copyright (C) 2003, 2004 Ralf Baechle
++ *    Copyright (C) 2004 Maciej W. Rozycki
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License version 2 as published
++ * by the Free Software Foundation.
++ *
++ */
++#ifndef _RT3883_CPU_FEATURE_OVERRIDES_H
++#define _RT3883_CPU_FEATURE_OVERRIDES_H
++
++#define cpu_has_tlb           1
++#define cpu_has_4kex          1
++#define cpu_has_3k_cache      0
++#define cpu_has_4k_cache      1
++#define cpu_has_tx39_cache    0
++#define cpu_has_sb1_cache     0
++#define cpu_has_fpu           0
++#define cpu_has_32fpr         0
++#define cpu_has_counter               1
++#define cpu_has_watch         1
++#define cpu_has_divec         1
++
++#define cpu_has_prefetch      1
++#define cpu_has_ejtag         1
++#define cpu_has_llsc          1
++
++#define cpu_has_mips16                1
++#define cpu_has_mdmx          0
++#define cpu_has_mips3d                0
++#define cpu_has_smartmips     0
++
++#define cpu_has_mips32r1      1
++#define cpu_has_mips32r2      1
++#define cpu_has_mips64r1      0
++#define cpu_has_mips64r2      0
++
++#define cpu_has_dsp           1
++#define cpu_has_mipsmt                0
++
++#define cpu_has_64bits                0
++#define cpu_has_64bit_zero_reg        0
++#define cpu_has_64bit_gp_regs 0
++#define cpu_has_64bit_addresses       0
++
++#define cpu_dcache_line_size()        32
++#define cpu_icache_line_size()        32
++
++#endif /* _RT3883_CPU_FEATURE_OVERRIDES_H */
+--- a/arch/mips/ralink/Platform
++++ b/arch/mips/ralink/Platform
+@@ -8,16 +8,19 @@ cflags-$(CONFIG_RALINK)              += -I$(srctree)
+ # Ralink RT288x
+ #
+ load-$(CONFIG_SOC_RT288X)     += 0xffffffff88000000
++cflags-$(CONFIG_SOC_RT288X)   += -I$(srctree)/arch/mips/include/asm/mach-ralink/rt288x
+ #
+ # Ralink RT305x
+ #
+ load-$(CONFIG_SOC_RT305X)     += 0xffffffff80000000
++cflags-$(CONFIG_SOC_RT305X)   += -I$(srctree)/arch/mips/include/asm/mach-ralink/rt305x
+ #
+ # Ralink RT3883
+ #
+ load-$(CONFIG_SOC_RT3883)     += 0xffffffff80000000
++cflags-$(CONFIG_SOC_RT3883)   += -I$(srctree)/arch/mips/include/asm/mach-ralink/rt3883
+ #
+ # Ralink MT7620
diff --git a/target/linux/ramips/patches-3.8/0115-DT-add-vendor-prefixes-for-Ralink.patch b/target/linux/ramips/patches-3.8/0115-DT-add-vendor-prefixes-for-Ralink.patch
new file mode 100644 (file)
index 0000000..a9a99b4
--- /dev/null
@@ -0,0 +1,21 @@
+From 9377ecb9f1fb5da25a0fbd324e7add7644b1d43d Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Sat, 13 Apr 2013 10:11:51 +0200
+Subject: [PATCH 115/137] DT: add vendor prefixes for Ralink
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Grant Likely <grant.likely@secretlab.ca>
+---
+ Documentation/devicetree/bindings/vendor-prefixes.txt |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
++++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
+@@ -40,6 +40,7 @@ onnn ON Semiconductor Corp.
+ picochip      Picochip Ltd
+ powervr       PowerVR (deprecated, use img)
+ qcom  Qualcomm, Inc.
++ralink        Mediatek/Ralink Technology Corp.
+ ramtron       Ramtron International
+ realtek Realtek Semiconductor Corp.
+ samsung       Samsung Semiconductor
diff --git a/target/linux/ramips/patches-3.8/0115-SPI-ralink-add-Ralink-SoC-spi-driver.patch b/target/linux/ramips/patches-3.8/0115-SPI-ralink-add-Ralink-SoC-spi-driver.patch
deleted file mode 100644 (file)
index b2717d1..0000000
+++ /dev/null
@@ -1,515 +0,0 @@
-e8c5ebbd743dac63178807c0f68fe1b75680474a3 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Wed, 30 Jan 2013 17:58:15 +0100
-Subject: [PATCH 115/121] SPI: ralink: add Ralink SoC spi driver
-
-Add the driver needed to make SPI work on Ralink SoC.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- drivers/spi/Kconfig      |    6 +
- drivers/spi/Makefile     |    1 +
- drivers/spi/spi-ralink.c |  472 ++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 479 insertions(+)
- create mode 100644 drivers/spi/spi-ralink.c
-
---- a/drivers/spi/Kconfig
-+++ b/drivers/spi/Kconfig
-@@ -324,6 +324,12 @@ config SPI_RSPI
-       help
-         SPI driver for Renesas RSPI blocks.
-+config SPI_RALINK
-+      tristate "Ralink RT288x/RT305x/RT3662 SPI Controller"
-+      depends on (SOC_RT288X || SOC_RT305X || SOC_RT3883)
-+      help
-+        This selects a driver for the Ralink RT288x/RT305x SPI Controller.
-+
- config SPI_S3C24XX
-       tristate "Samsung S3C24XX series SPI"
-       depends on ARCH_S3C24XX && EXPERIMENTAL
---- a/drivers/spi/Makefile
-+++ b/drivers/spi/Makefile
-@@ -51,6 +51,7 @@ obj-$(CONFIG_SPI_PPC4xx)             += spi-ppc4xx.
- obj-$(CONFIG_SPI_PXA2XX)              += spi-pxa2xx.o
- obj-$(CONFIG_SPI_PXA2XX_PCI)          += spi-pxa2xx-pci.o
- obj-$(CONFIG_SPI_RSPI)                        += spi-rspi.o
-+obj-$(CONFIG_SPI_RALINK)              += spi-ralink.o
- obj-$(CONFIG_SPI_S3C24XX)             += spi-s3c24xx-hw.o
- spi-s3c24xx-hw-y                      := spi-s3c24xx.o
- spi-s3c24xx-hw-$(CONFIG_SPI_S3C24XX_FIQ) += spi-s3c24xx-fiq.o
---- /dev/null
-+++ b/drivers/spi/spi-ralink.c
-@@ -0,0 +1,472 @@
-+/*
-+ * spi-ralink.c -- Ralink RT288x/RT305x SPI controller driver
-+ *
-+ * Copyright (C) 2011 Sergiy <piratfm@gmail.com>
-+ * Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ * Some parts are based on spi-orion.c:
-+ *   Author: Shadi Ammouri <shadi@marvell.com>
-+ *   Copyright (C) 2007-2008 Marvell Ltd.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/clk.h>
-+#include <linux/err.h>
-+#include <linux/delay.h>
-+#include <linux/platform_device.h>
-+#include <linux/io.h>
-+#include <linux/spi/spi.h>
-+
-+#define DRIVER_NAME                   "spi-ralink"
-+#define RALINK_NUM_CHIPSELECTS                1 /* only one slave is supported*/
-+#define RALINK_SPI_WAIT_RDY_MAX_LOOP  2000 /* in usec */
-+
-+#define RAMIPS_SPI_STAT                       0x00
-+#define RAMIPS_SPI_CFG                        0x10
-+#define RAMIPS_SPI_CTL                        0x14
-+#define RAMIPS_SPI_DATA                       0x20
-+
-+/* SPISTAT register bit field */
-+#define SPISTAT_BUSY                  BIT(0)
-+
-+/* SPICFG register bit field */
-+#define SPICFG_LSBFIRST                       0
-+#define SPICFG_MSBFIRST                       BIT(8)
-+#define SPICFG_SPICLKPOL              BIT(6)
-+#define SPICFG_RXCLKEDGE_FALLING      BIT(5)
-+#define SPICFG_TXCLKEDGE_FALLING      BIT(4)
-+#define SPICFG_SPICLK_PRESCALE_MASK   0x7
-+#define SPICFG_SPICLK_DIV2            0
-+#define SPICFG_SPICLK_DIV4            1
-+#define SPICFG_SPICLK_DIV8            2
-+#define SPICFG_SPICLK_DIV16           3
-+#define SPICFG_SPICLK_DIV32           4
-+#define SPICFG_SPICLK_DIV64           5
-+#define SPICFG_SPICLK_DIV128          6
-+#define SPICFG_SPICLK_DISABLE         7
-+
-+/* SPICTL register bit field */
-+#define SPICTL_HIZSDO                 BIT(3)
-+#define SPICTL_STARTWR                        BIT(2)
-+#define SPICTL_STARTRD                        BIT(1)
-+#define SPICTL_SPIENA                 BIT(0)
-+
-+#ifdef DEBUG
-+#define spi_debug(args...) printk(args)
-+#else
-+#define spi_debug(args...)
-+#endif
-+
-+struct ralink_spi {
-+      struct spi_master       *master;
-+      void __iomem            *base;
-+      unsigned int            sys_freq;
-+      unsigned int            speed;
-+      struct clk              *clk;
-+};
-+
-+static inline struct ralink_spi *spidev_to_ralink_spi(struct spi_device *spi)
-+{
-+      return spi_master_get_devdata(spi->master);
-+}
-+
-+static inline u32 ralink_spi_read(struct ralink_spi *rs, u32 reg)
-+{
-+      return ioread32(rs->base + reg);
-+}
-+
-+static inline void ralink_spi_write(struct ralink_spi *rs, u32 reg, u32 val)
-+{
-+      iowrite32(val, rs->base + reg);
-+}
-+
-+static inline void ralink_spi_setbits(struct ralink_spi *rs, u32 reg, u32 mask)
-+{
-+      void __iomem *addr = rs->base + reg;
-+      u32 val;
-+
-+      val = ioread32(addr);
-+      val |= mask;
-+      iowrite32(val, addr);
-+}
-+
-+static inline void ralink_spi_clrbits(struct ralink_spi *rs, u32 reg, u32 mask)
-+{
-+      void __iomem *addr = rs->base + reg;
-+      u32 val;
-+
-+      val = ioread32(addr);
-+      val &= ~mask;
-+      iowrite32(val, addr);
-+}
-+
-+static int ralink_spi_baudrate_set(struct spi_device *spi, unsigned int speed)
-+{
-+      struct ralink_spi *rs = spidev_to_ralink_spi(spi);
-+      u32 rate;
-+      u32 prescale;
-+      u32 reg;
-+
-+      spi_debug("%s: speed:%u\n", __func__, speed);
-+
-+      /*
-+       * the supported rates are: 2, 4, 8, ... 128
-+       * round up as we look for equal or less speed
-+       */
-+      rate = DIV_ROUND_UP(rs->sys_freq, speed);
-+      spi_debug("%s: rate-1:%u\n", __func__, rate);
-+      rate = roundup_pow_of_two(rate);
-+      spi_debug("%s: rate-2:%u\n", __func__, rate);
-+
-+      /* check if requested speed is too small */
-+      if (rate > 128)
-+              return -EINVAL;
-+
-+      if (rate < 2)
-+              rate = 2;
-+
-+      /* Convert the rate to SPI clock divisor value. */
-+      prescale = ilog2(rate/2);
-+      spi_debug("%s: prescale:%u\n", __func__, prescale);
-+
-+      reg = ralink_spi_read(rs, RAMIPS_SPI_CFG);
-+      reg = ((reg & ~SPICFG_SPICLK_PRESCALE_MASK) | prescale);
-+      ralink_spi_write(rs, RAMIPS_SPI_CFG, reg);
-+      rs->speed = speed;
-+      return 0;
-+}
-+
-+/*
-+ * called only when no transfer is active on the bus
-+ */
-+static int
-+ralink_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
-+{
-+      struct ralink_spi *rs = spidev_to_ralink_spi(spi);
-+      unsigned int speed = spi->max_speed_hz;
-+      int rc;
-+      unsigned int bits_per_word = 8;
-+
-+      if ((t != NULL) && t->speed_hz)
-+              speed = t->speed_hz;
-+
-+      if ((t != NULL) && t->bits_per_word)
-+              bits_per_word = t->bits_per_word;
-+
-+      if (rs->speed != speed) {
-+              spi_debug("%s: speed_hz:%u\n", __func__, speed);
-+              rc = ralink_spi_baudrate_set(spi, speed);
-+              if (rc)
-+                      return rc;
-+      }
-+
-+      if (bits_per_word != 8) {
-+              spi_debug("%s: bad bits_per_word: %u\n", __func__,
-+                        bits_per_word);
-+              return -EINVAL;
-+      }
-+
-+      return 0;
-+}
-+
-+static void ralink_spi_set_cs(struct ralink_spi *rs, int enable)
-+{
-+      if (enable)
-+              ralink_spi_clrbits(rs, RAMIPS_SPI_CTL, SPICTL_SPIENA);
-+      else
-+              ralink_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_SPIENA);
-+}
-+
-+static inline int ralink_spi_wait_till_ready(struct ralink_spi *rs)
-+{
-+      int i;
-+
-+      for (i = 0; i < RALINK_SPI_WAIT_RDY_MAX_LOOP; i++) {
-+              u32 status;
-+
-+              status = ralink_spi_read(rs, RAMIPS_SPI_STAT);
-+              if ((status & SPISTAT_BUSY) == 0)
-+                      return 0;
-+
-+              udelay(1);
-+      }
-+
-+      return -ETIMEDOUT;
-+}
-+
-+static unsigned int
-+ralink_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
-+{
-+      struct ralink_spi *rs = spidev_to_ralink_spi(spi);
-+      unsigned count = 0;
-+      u8 *rx = xfer->rx_buf;
-+      const u8 *tx = xfer->tx_buf;
-+      int err;
-+
-+      spi_debug("%s(%d): %s %s\n", __func__, xfer->len,
-+                (tx != NULL) ? "tx" : "  ",
-+                (rx != NULL) ? "rx" : "  ");
-+
-+      if (tx) {
-+              for (count = 0; count < xfer->len; count++) {
-+                      ralink_spi_write(rs, RAMIPS_SPI_DATA, tx[count]);
-+                      ralink_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_STARTWR);
-+                      err = ralink_spi_wait_till_ready(rs);
-+                      if (err) {
-+                              dev_err(&spi->dev, "TX failed, err=%d\n", err);
-+                              goto out;
-+                      }
-+              }
-+      }
-+
-+      if (rx) {
-+              for (count = 0; count < xfer->len; count++) {
-+                      ralink_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_STARTRD);
-+                      err = ralink_spi_wait_till_ready(rs);
-+                      if (err) {
-+                              dev_err(&spi->dev, "RX failed, err=%d\n", err);
-+                              goto out;
-+                      }
-+                      rx[count] = (u8) ralink_spi_read(rs, RAMIPS_SPI_DATA);
-+              }
-+      }
-+
-+out:
-+      return count;
-+}
-+
-+static int ralink_spi_transfer_one_message(struct spi_master *master,
-+                                         struct spi_message *m)
-+{
-+      struct ralink_spi *rs = spi_master_get_devdata(master);
-+      struct spi_device *spi = m->spi;
-+      struct spi_transfer *t = NULL;
-+      int par_override = 0;
-+      int status = 0;
-+      int cs_active = 0;
-+
-+      /* Load defaults */
-+      status = ralink_spi_setup_transfer(spi, NULL);
-+      if (status < 0)
-+              goto msg_done;
-+
-+      list_for_each_entry(t, &m->transfers, transfer_list) {
-+              unsigned int bits_per_word = spi->bits_per_word;
-+
-+              if (t->tx_buf == NULL && t->rx_buf == NULL && t->len) {
-+                      dev_err(&spi->dev,
-+                              "message rejected: invalid transfer data buffers\n");
-+                      status = -EIO;
-+                      goto msg_done;
-+              }
-+
-+              if (t->bits_per_word)
-+                      bits_per_word = t->bits_per_word;
-+
-+              if (bits_per_word != 8) {
-+                      dev_err(&spi->dev,
-+                              "message rejected: invalid transfer bits_per_word (%d bits)\n",
-+                              bits_per_word);
-+                      status = -EIO;
-+                      goto msg_done;
-+              }
-+
-+              if (t->speed_hz && t->speed_hz < (rs->sys_freq / 128)) {
-+                      dev_err(&spi->dev,
-+                              "message rejected: device min speed (%d Hz) exceeds required transfer speed (%d Hz)\n",
-+                              (rs->sys_freq / 128), t->speed_hz);
-+                      status = -EIO;
-+                      goto msg_done;
-+              }
-+
-+              if (par_override || t->speed_hz || t->bits_per_word) {
-+                      par_override = 1;
-+                      status = ralink_spi_setup_transfer(spi, t);
-+                      if (status < 0)
-+                              goto msg_done;
-+                      if (!t->speed_hz && !t->bits_per_word)
-+                              par_override = 0;
-+              }
-+
-+              if (!cs_active) {
-+                      ralink_spi_set_cs(rs, 1);
-+                      cs_active = 1;
-+              }
-+
-+              if (t->len)
-+                      m->actual_length += ralink_spi_write_read(spi, t);
-+
-+              if (t->delay_usecs)
-+                      udelay(t->delay_usecs);
-+
-+              if (t->cs_change) {
-+                      ralink_spi_set_cs(rs, 0);
-+                      cs_active = 0;
-+              }
-+      }
-+
-+msg_done:
-+      if (cs_active)
-+              ralink_spi_set_cs(rs, 0);
-+
-+      m->status = status;
-+      spi_finalize_current_message(master);
-+
-+      return 0;
-+}
-+
-+static int ralink_spi_setup(struct spi_device *spi)
-+{
-+      struct ralink_spi *rs = spidev_to_ralink_spi(spi);
-+
-+      if ((spi->max_speed_hz == 0) ||
-+          (spi->max_speed_hz > (rs->sys_freq / 2)))
-+              spi->max_speed_hz = (rs->sys_freq / 2);
-+
-+      if (spi->max_speed_hz < (rs->sys_freq / 128)) {
-+              dev_err(&spi->dev, "setup: requested speed is too low %d Hz\n",
-+                      spi->max_speed_hz);
-+              return -EINVAL;
-+      }
-+
-+      if (spi->bits_per_word != 0 && spi->bits_per_word != 8) {
-+              dev_err(&spi->dev,
-+                      "setup: requested bits per words - os wrong %d bpw\n",
-+                      spi->bits_per_word);
-+              return -EINVAL;
-+      }
-+
-+      if (spi->bits_per_word == 0)
-+              spi->bits_per_word = 8;
-+
-+      /*
-+       * baudrate & width will be set ralink_spi_setup_transfer
-+       */
-+      return 0;
-+}
-+
-+static void ralink_spi_reset(struct ralink_spi *rs)
-+{
-+      ralink_spi_write(rs, RAMIPS_SPI_CFG,
-+                       SPICFG_MSBFIRST | SPICFG_TXCLKEDGE_FALLING |
-+                       SPICFG_SPICLK_DIV16 | SPICFG_SPICLKPOL);
-+      ralink_spi_write(rs, RAMIPS_SPI_CTL, SPICTL_HIZSDO | SPICTL_SPIENA);
-+}
-+
-+static int ralink_spi_probe(struct platform_device *pdev)
-+{
-+      struct spi_master *master;
-+      struct ralink_spi *rs;
-+      struct resource *r;
-+      int status = 0;
-+
-+      master = spi_alloc_master(&pdev->dev, sizeof(*rs));
-+      if (master == NULL) {
-+              dev_dbg(&pdev->dev, "master allocation failed\n");
-+              return -ENOMEM;
-+      }
-+
-+      //if (pdev->id != -1)
-+              master->bus_num = 0;
-+
-+      /* we support only mode 0, and no options */
-+      master->mode_bits = 0;
-+
-+      master->setup = ralink_spi_setup;
-+      master->transfer_one_message = ralink_spi_transfer_one_message;
-+      master->num_chipselect = RALINK_NUM_CHIPSELECTS;
-+      master->dev.of_node = pdev->dev.of_node;
-+
-+      dev_set_drvdata(&pdev->dev, master);
-+
-+      rs = spi_master_get_devdata(master);
-+      rs->master = master;
-+
-+      rs->clk = clk_get(&pdev->dev, NULL);
-+      if (IS_ERR(rs->clk)) {
-+              status = PTR_ERR(rs->clk);
-+              dev_err(&pdev->dev, "unable to get SYS clock, err=%d\n",
-+                      status);
-+              goto out_put_master;
-+      }
-+
-+      status = clk_enable(rs->clk);
-+      if (status)
-+              goto out_put_clk;
-+
-+      rs->sys_freq = clk_get_rate(rs->clk);
-+      spi_debug("%s: sys_freq: %u\n", __func__, rs->sys_freq);
-+
-+      r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+      if (r == NULL) {
-+              status = -ENODEV;
-+              goto out_disable_clk;
-+      }
-+
-+      rs->base = devm_request_and_ioremap(&pdev->dev, r);
-+      if (!rs->base) {
-+              status = -EADDRNOTAVAIL;
-+              goto out_disable_clk;
-+      }
-+
-+      ralink_spi_reset(rs);
-+
-+      status = spi_register_master(master);
-+      if (status)
-+              goto out_disable_clk;
-+
-+      return 0;
-+
-+out_disable_clk:
-+      clk_disable(rs->clk);
-+out_put_clk:
-+      clk_put(rs->clk);
-+out_put_master:
-+      spi_master_put(master);
-+      return status;
-+}
-+
-+static int ralink_spi_remove(struct platform_device *pdev)
-+{
-+      struct spi_master *master;
-+      struct ralink_spi *rs;
-+
-+      master = dev_get_drvdata(&pdev->dev);
-+      rs = spi_master_get_devdata(master);
-+
-+      clk_disable(rs->clk);
-+      clk_put(rs->clk);
-+      spi_unregister_master(master);
-+
-+      return 0;
-+}
-+
-+MODULE_ALIAS("platform:" DRIVER_NAME);
-+
-+static const struct of_device_id ralink_spi_match[] = {
-+      { .compatible = "ralink,rt2880-spi" },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, ralink_spi_match);
-+
-+static struct platform_driver ralink_spi_driver = {
-+      .driver = {
-+              .name = DRIVER_NAME,
-+              .owner = THIS_MODULE,
-+              .of_match_table = ralink_spi_match,
-+      },
-+      .probe = ralink_spi_probe,
-+      .remove = ralink_spi_remove,
-+};
-+
-+module_platform_driver(ralink_spi_driver);
-+
-+MODULE_DESCRIPTION("Ralink SPI driver");
-+MODULE_AUTHOR("Sergiy <piratfm@gmail.com>");
-+MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
-+MODULE_LICENSE("GPL");
diff --git a/target/linux/ramips/patches-3.8/0116-DT-add-documentation-for-the-Ralink-MIPS-SoCs.patch b/target/linux/ramips/patches-3.8/0116-DT-add-documentation-for-the-Ralink-MIPS-SoCs.patch
new file mode 100644 (file)
index 0000000..f9463c4
--- /dev/null
@@ -0,0 +1,38 @@
+From fed1ff0d85b481bb3dbebf31e0720d65ce4170c9 Mon Sep 17 00:00:00 2001
+From: Gabor Juhos <juhosg@openwrt.org>
+Date: Sat, 13 Apr 2013 09:02:40 +0200
+Subject: [PATCH 116/137] DT: add documentation for the Ralink MIPS SoCs
+
+This patch adds binding documentation for the
+compatible values of the Ralink MIPS SoCs.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Grant Likely <grant.likely@secretlab.ca>
+Patchwork: http://patchwork.linux-mips.org/patch/5187/
+---
+ Documentation/devicetree/bindings/mips/ralink.txt |   18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+ create mode 100644 Documentation/devicetree/bindings/mips/ralink.txt
+
+--- /dev/null
++++ b/Documentation/devicetree/bindings/mips/ralink.txt
+@@ -0,0 +1,18 @@
++Ralink MIPS SoC device tree bindings
++
++1. SoCs
++
++Each device tree must specify a compatible value for the Ralink SoC
++it uses in the compatible property of the root node. The compatible
++value must be one of the following values:
++
++  ralink,rt2880-soc
++  ralink,rt3050-soc
++  ralink,rt3052-soc
++  ralink,rt3350-soc
++  ralink,rt3352-soc
++  ralink,rt3883-soc
++  ralink,rt5350-soc
++  ralink,mt7620a-soc
++  ralink,mt7620n-soc
++
diff --git a/target/linux/ramips/patches-3.8/0116-serial-of-allow-au1x00-and-rt288x-to-load-from-OF.patch b/target/linux/ramips/patches-3.8/0116-serial-of-allow-au1x00-and-rt288x-to-load-from-OF.patch
deleted file mode 100644 (file)
index a5a3770..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-From 6ffb42870411ca082e8e46d96d72bc5d8881ce8d Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Tue, 22 Jan 2013 16:01:07 +0100
-Subject: [PATCH 116/121] serial: of: allow au1x00 and rt288x to load from OF
-
-In order to make serial_8250 loadable via OF on Au1x00 and Ralink WiSoC we need
-to default the iotype to UPIO_AU.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- drivers/tty/serial/of_serial.c |    5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
---- a/drivers/tty/serial/of_serial.c
-+++ b/drivers/tty/serial/of_serial.c
-@@ -97,7 +97,10 @@ static int of_platform_serial_setup(stru
-               port->regshift = prop;
-       port->irq = irq_of_parse_and_map(np, 0);
--      port->iotype = UPIO_MEM;
-+      if (of_device_is_compatible(np, "ralink,rt2880-uart"))
-+              port->iotype = UPIO_AU;
-+      else
-+              port->iotype = UPIO_MEM;
-       if (of_property_read_u32(np, "reg-io-width", &prop) == 0) {
-               switch (prop) {
-               case 1:
diff --git a/target/linux/ramips/patches-3.8/0117-DT-MIPS-ralink-clean-up-RT3050-dtsi-and-dts-file.patch b/target/linux/ramips/patches-3.8/0117-DT-MIPS-ralink-clean-up-RT3050-dtsi-and-dts-file.patch
new file mode 100644 (file)
index 0000000..1328b43
--- /dev/null
@@ -0,0 +1,117 @@
+From 7a30e00a278fe94ac8e42d0967ffde99d1ab74ee Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Thu, 21 Mar 2013 17:47:07 +0100
+Subject: [PATCH 117/137] DT: MIPS: ralink: clean up RT3050 dtsi and dts file
+
+* remove nodes for cores whose drivers are not upstream yet
+* add compat string for an additional soc
+* fix a whitespace error
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Grant Likely <grant.likely@secretlab.ca>
+Patchwork: http://patchwork.linux-mips.org/patch/5186/
+---
+ arch/mips/ralink/dts/rt3050.dtsi     |   52 ++--------------------------------
+ arch/mips/ralink/dts/rt3052_eval.dts |   10 ++-----
+ 2 files changed, 4 insertions(+), 58 deletions(-)
+
+--- a/arch/mips/ralink/dts/rt3050.dtsi
++++ b/arch/mips/ralink/dts/rt3050.dtsi
+@@ -1,7 +1,7 @@
+ / {
+       #address-cells = <1>;
+       #size-cells = <1>;
+-      compatible = "ralink,rt3050-soc", "ralink,rt3052-soc";
++      compatible = "ralink,rt3050-soc", "ralink,rt3052-soc", "ralink,rt3350-soc";
+       cpus {
+               cpu@0 {
+@@ -9,10 +9,6 @@
+               };
+       };
+-      chosen {
+-              bootargs = "console=ttyS0,57600 init=/init";
+-      };
+-
+       cpuintc: cpuintc@0 {
+               #address-cells = <0>;
+               #interrupt-cells = <1>;
+@@ -23,7 +19,7 @@
+       palmbus@10000000 {
+               compatible = "palmbus";
+               reg = <0x10000000 0x200000>;
+-                ranges = <0x0 0x10000000 0x1FFFFF>;
++              ranges = <0x0 0x10000000 0x1FFFFF>;
+               #address-cells = <1>;
+               #size-cells = <1>;
+@@ -33,11 +29,6 @@
+                       reg = <0x0 0x100>;
+               };
+-              timer@100 {
+-                      compatible = "ralink,rt3052-wdt", "ralink,rt2880-wdt";
+-                      reg = <0x100 0x100>;
+-              };
+-
+               intc: intc@200 {
+                       compatible = "ralink,rt3052-intc", "ralink,rt2880-intc";
+                       reg = <0x200 0x100>;
+@@ -54,45 +45,6 @@
+                       reg = <0x300 0x100>;
+               };
+-              gpio0: gpio@600 {
+-                      compatible = "ralink,rt3052-gpio", "ralink,rt2880-gpio";
+-                      reg = <0x600 0x34>;
+-
+-                      gpio-controller;
+-                      #gpio-cells = <2>;
+-
+-                      ralink,ngpio = <24>;
+-                      ralink,regs = [ 00 04 08 0c
+-                                      20 24 28 2c
+-                                      30 34 ];
+-              };
+-
+-              gpio1: gpio@638 {
+-                      compatible = "ralink,rt3052-gpio", "ralink,rt2880-gpio";
+-                      reg = <0x638 0x24>;
+-
+-                      gpio-controller;
+-                      #gpio-cells = <2>;
+-
+-                      ralink,ngpio = <16>;
+-                      ralink,regs = [ 00 04 08 0c
+-                                      10 14 18 1c
+-                                      20 24 ];
+-              };
+-
+-              gpio2: gpio@660 {
+-                      compatible = "ralink,rt3052-gpio", "ralink,rt2880-gpio";
+-                      reg = <0x660 0x24>;
+-
+-                      gpio-controller;
+-                      #gpio-cells = <2>;
+-
+-                      ralink,ngpio = <12>;
+-                      ralink,regs = [ 00 04 08 0c
+-                                      10 14 18 1c
+-                                      20 24 ];
+-              };
+-
+               uartlite@c00 {
+                       compatible = "ralink,rt3052-uart", "ralink,rt2880-uart", "ns16550a";
+                       reg = <0xc00 0x100>;
+--- a/arch/mips/ralink/dts/rt3052_eval.dts
++++ b/arch/mips/ralink/dts/rt3052_eval.dts
+@@ -3,8 +3,6 @@
+ /include/ "rt3050.dtsi"
+ / {
+-      #address-cells = <1>;
+-      #size-cells = <1>;
+       compatible = "ralink,rt3052-eval-board", "ralink,rt3052-soc";
+       model = "Ralink RT3052 evaluation board";
diff --git a/target/linux/ramips/patches-3.8/0117-serial-ralink-adds-mt7620-serial.patch b/target/linux/ramips/patches-3.8/0117-serial-ralink-adds-mt7620-serial.patch
deleted file mode 100644 (file)
index 745a236..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-From c1e24bf32404bec0032221b9ea37d6fd8c45dbdd Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Fri, 15 Mar 2013 18:16:01 +0100
-Subject: [PATCH 117/121] serial: ralink: adds mt7620 serial
-
-Add the config symbol for Mediatek7620 SoC to SERIAL_8250_RT288X
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- drivers/tty/serial/8250/Kconfig |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/tty/serial/8250/Kconfig
-+++ b/drivers/tty/serial/8250/Kconfig
-@@ -280,7 +280,7 @@ config SERIAL_8250_EM
- config SERIAL_8250_RT288X
-       bool "Ralink RT288x/RT305x/RT3662/RT3883 serial port support"
--      depends on SERIAL_8250 && (SOC_RT288X || SOC_RT305X || SOC_RT3883)
-+      depends on SERIAL_8250 && (SOC_RT288X || SOC_RT305X || SOC_RT3883 || SOC_MT7620)
-       help
-         If you have a Ralink RT288x/RT305x SoC based board and want to use the
-         serial port, say Y to this option. The driver can handle up to 2 serial
diff --git a/target/linux/ramips/patches-3.8/0118-DT-MIPS-ralink-add-RT2880-dts-files.patch b/target/linux/ramips/patches-3.8/0118-DT-MIPS-ralink-add-RT2880-dts-files.patch
new file mode 100644 (file)
index 0000000..8ad9b18
--- /dev/null
@@ -0,0 +1,147 @@
+From b39e659770cb71939765de8c9e73c0a0cfa832db Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 12 Apr 2013 06:27:37 +0000
+Subject: [PATCH 118/137] DT: MIPS: ralink: add RT2880 dts files
+
+Add a dtsi file for RT2880 SoC and a sample dts file.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Grant Likely <grant.likely@secretlab.ca>
+Patchwork: http://patchwork.linux-mips.org/patch/5188/
+---
+ arch/mips/ralink/Kconfig             |    4 +++
+ arch/mips/ralink/dts/Makefile        |    1 +
+ arch/mips/ralink/dts/rt2880.dtsi     |   58 ++++++++++++++++++++++++++++++++++
+ arch/mips/ralink/dts/rt2880_eval.dts |   46 +++++++++++++++++++++++++++
+ 4 files changed, 109 insertions(+)
+ create mode 100644 arch/mips/ralink/dts/rt2880.dtsi
+ create mode 100644 arch/mips/ralink/dts/rt2880_eval.dts
+
+--- a/arch/mips/ralink/Kconfig
++++ b/arch/mips/ralink/Kconfig
+@@ -34,6 +34,10 @@ choice
+       config DTB_RT_NONE
+               bool "None"
++      config DTB_RT2880_EVAL
++              bool "RT2880 eval kit"
++              depends on SOC_RT288X
++
+       config DTB_RT305X_EVAL
+               bool "RT305x eval kit"
+               depends on SOC_RT305X
+--- a/arch/mips/ralink/dts/Makefile
++++ b/arch/mips/ralink/dts/Makefile
+@@ -1 +1,2 @@
++obj-$(CONFIG_DTB_RT2880_EVAL) := rt2880_eval.dtb.o
+ obj-$(CONFIG_DTB_RT305X_EVAL) := rt3052_eval.dtb.o
+--- /dev/null
++++ b/arch/mips/ralink/dts/rt2880.dtsi
+@@ -0,0 +1,58 @@
++/ {
++      #address-cells = <1>;
++      #size-cells = <1>;
++      compatible = "ralink,rt2880-soc";
++
++      cpus {
++              cpu@0 {
++                      compatible = "mips,mips4KEc";
++              };
++      };
++
++      cpuintc: cpuintc@0 {
++              #address-cells = <0>;
++              #interrupt-cells = <1>;
++              interrupt-controller;
++              compatible = "mti,cpu-interrupt-controller";
++      };
++
++      palmbus@300000 {
++              compatible = "palmbus";
++              reg = <0x300000 0x200000>;
++                ranges = <0x0 0x300000 0x1FFFFF>;
++
++              #address-cells = <1>;
++              #size-cells = <1>;
++
++              sysc@0 {
++                      compatible = "ralink,rt2880-sysc";
++                      reg = <0x0 0x100>;
++              };
++
++              intc: intc@200 {
++                      compatible = "ralink,rt2880-intc";
++                      reg = <0x200 0x100>;
++
++                      interrupt-controller;
++                      #interrupt-cells = <1>;
++
++                      interrupt-parent = <&cpuintc>;
++                      interrupts = <2>;
++              };
++
++              memc@300 {
++                      compatible = "ralink,rt2880-memc";
++                      reg = <0x300 0x100>;
++              };
++
++              uartlite@c00 {
++                      compatible = "ralink,rt2880-uart", "ns16550a";
++                      reg = <0xc00 0x100>;
++
++                      interrupt-parent = <&intc>;
++                      interrupts = <8>;
++
++                      reg-shift = <2>;
++              };
++      };
++};
+--- /dev/null
++++ b/arch/mips/ralink/dts/rt2880_eval.dts
+@@ -0,0 +1,46 @@
++/dts-v1/;
++
++/include/ "rt2880.dtsi"
++
++/ {
++      compatible = "ralink,rt2880-eval-board", "ralink,rt2880-soc";
++      model = "Ralink RT2880 evaluation board";
++
++      memory@0 {
++              reg = <0x8000000 0x2000000>;
++      };
++
++      chosen {
++              bootargs = "console=ttyS0,57600";
++      };
++
++      cfi@1f000000 {
++              compatible = "cfi-flash";
++              reg = <0x1f000000 0x400000>;
++
++              bank-width = <2>;
++              device-width = <2>;
++              #address-cells = <1>;
++              #size-cells = <1>;
++
++              partition@0 {
++                      label = "uboot";
++                      reg = <0x0 0x30000>;
++                      read-only;
++              };
++              partition@30000 {
++                      label = "uboot-env";
++                      reg = <0x30000 0x10000>;
++                      read-only;
++              };
++              partition@40000 {
++                      label = "calibration";
++                      reg = <0x40000 0x10000>;
++                      read-only;
++              };
++              partition@50000 {
++                      label = "linux";
++                      reg = <0x50000 0x3b0000>;
++              };
++      };
++};
diff --git a/target/linux/ramips/patches-3.8/0118-PCI-MIPS-adds-rt2880-pci-support.patch b/target/linux/ramips/patches-3.8/0118-PCI-MIPS-adds-rt2880-pci-support.patch
deleted file mode 100644 (file)
index dc06228..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-From 028f340b63bf722e8807b31ef955484acf2cce47 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 18:27:29 +0100
-Subject: [PATCH 118/121] PCI: MIPS: adds rt2880 pci support
-
-Add support for the pci found on the rt2880 SoC.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/pci/Makefile     |    1 +
- arch/mips/pci/pci-rt2880.c |  281 ++++++++++++++++++++++++++++++++++++++++++++
- arch/mips/ralink/Kconfig   |    1 +
- 3 files changed, 283 insertions(+)
- create mode 100644 arch/mips/pci/pci-rt2880.c
-
---- a/arch/mips/pci/Makefile
-+++ b/arch/mips/pci/Makefile
-@@ -42,6 +42,7 @@ obj-$(CONFIG_SIBYTE_BCM1x80) += pci-bcm1
- obj-$(CONFIG_SNI_RM)          += fixup-sni.o ops-sni.o
- obj-$(CONFIG_LANTIQ)          += fixup-lantiq.o
- obj-$(CONFIG_PCI_LANTIQ)      += pci-lantiq.o ops-lantiq.o
-+obj-$(CONFIG_SOC_RT2880)      += pci-rt2880.o
- obj-$(CONFIG_TANBAC_TB0219)   += fixup-tb0219.o
- obj-$(CONFIG_TANBAC_TB0226)   += fixup-tb0226.o
- obj-$(CONFIG_TANBAC_TB0287)   += fixup-tb0287.o
---- /dev/null
-+++ b/arch/mips/pci/pci-rt2880.c
-@@ -0,0 +1,281 @@
-+/*
-+ *  Ralink RT288x SoC PCI register definitions
-+ *
-+ *  Copyright (C) 2009 John Crispin <blogic@openwrt.org>
-+ *  Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  Parts of this file are based on Ralink's 2.6.21 BSP
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/pci.h>
-+#include <linux/io.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+#include <linux/of_platform.h>
-+#include <linux/of_irq.h>
-+#include <linux/of_pci.h>
-+
-+#include <asm/mach-ralink/rt288x.h>
-+
-+#define RT2880_PCI_BASE               0x00440000
-+#define RT288X_CPU_IRQ_PCI    4
-+
-+#define RT2880_PCI_MEM_BASE   0x20000000
-+#define RT2880_PCI_MEM_SIZE   0x10000000
-+#define RT2880_PCI_IO_BASE    0x00460000
-+#define RT2880_PCI_IO_SIZE    0x00010000
-+
-+#define RT2880_PCI_REG_PCICFG_ADDR    0x00
-+#define RT2880_PCI_REG_PCIMSK_ADDR    0x0c
-+#define RT2880_PCI_REG_BAR0SETUP_ADDR 0x10
-+#define RT2880_PCI_REG_IMBASEBAR0_ADDR        0x18
-+#define RT2880_PCI_REG_CONFIG_ADDR    0x20
-+#define RT2880_PCI_REG_CONFIG_DATA    0x24
-+#define RT2880_PCI_REG_MEMBASE                0x28
-+#define RT2880_PCI_REG_IOBASE         0x2c
-+#define RT2880_PCI_REG_ID             0x30
-+#define RT2880_PCI_REG_CLASS          0x34
-+#define RT2880_PCI_REG_SUBID          0x38
-+#define RT2880_PCI_REG_ARBCTL         0x80
-+
-+static void __iomem *rt2880_pci_base;
-+static DEFINE_SPINLOCK(rt2880_pci_lock);
-+
-+static u32 rt2880_pci_reg_read(u32 reg)
-+{
-+      return readl(rt2880_pci_base + reg);
-+}
-+
-+static void rt2880_pci_reg_write(u32 val, u32 reg)
-+{
-+      writel(val, rt2880_pci_base + reg);
-+}
-+
-+static inline u32 rt2880_pci_get_cfgaddr(unsigned int bus, unsigned int slot,
-+                                       unsigned int func, unsigned int where)
-+{
-+      return ((bus << 16) | (slot << 11) | (func << 8) | (where & 0xfc) |
-+              0x80000000);
-+}
-+
-+static int rt2880_pci_config_read(struct pci_bus *bus, unsigned int devfn,
-+                                int where, int size, u32 *val)
-+{
-+      unsigned long flags;
-+      u32 address;
-+      u32 data;
-+
-+      address = rt2880_pci_get_cfgaddr(bus->number, PCI_SLOT(devfn),
-+                                       PCI_FUNC(devfn), where);
-+
-+      spin_lock_irqsave(&rt2880_pci_lock, flags);
-+      rt2880_pci_reg_write(address, RT2880_PCI_REG_CONFIG_ADDR);
-+      data = rt2880_pci_reg_read(RT2880_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt2880_pci_lock, flags);
-+
-+      switch (size) {
-+      case 1:
-+              *val = (data >> ((where & 3) << 3)) & 0xff;
-+              break;
-+      case 2:
-+              *val = (data >> ((where & 3) << 3)) & 0xffff;
-+              break;
-+      case 4:
-+              *val = data;
-+              break;
-+      }
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static int rt2880_pci_config_write(struct pci_bus *bus, unsigned int devfn,
-+                                 int where, int size, u32 val)
-+{
-+      unsigned long flags;
-+      u32 address;
-+      u32 data;
-+
-+      address = rt2880_pci_get_cfgaddr(bus->number, PCI_SLOT(devfn),
-+                                       PCI_FUNC(devfn), where);
-+
-+      spin_lock_irqsave(&rt2880_pci_lock, flags);
-+      rt2880_pci_reg_write(address, RT2880_PCI_REG_CONFIG_ADDR);
-+      data = rt2880_pci_reg_read(RT2880_PCI_REG_CONFIG_DATA);
-+
-+      switch (size) {
-+      case 1:
-+              data = (data & ~(0xff << ((where & 3) << 3))) |
-+                     (val << ((where & 3) << 3));
-+              break;
-+      case 2:
-+              data = (data & ~(0xffff << ((where & 3) << 3))) |
-+                     (val << ((where & 3) << 3));
-+              break;
-+      case 4:
-+              data = val;
-+              break;
-+      }
-+
-+      rt2880_pci_reg_write(data, RT2880_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt2880_pci_lock, flags);
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static struct pci_ops rt2880_pci_ops = {
-+      .read   = rt2880_pci_config_read,
-+      .write  = rt2880_pci_config_write,
-+};
-+
-+static struct resource rt2880_pci_mem_resource = {
-+      .name   = "PCI MEM space",
-+      .start  = RT2880_PCI_MEM_BASE,
-+      .end    = RT2880_PCI_MEM_BASE + RT2880_PCI_MEM_SIZE - 1,
-+      .flags  = IORESOURCE_MEM,
-+};
-+
-+static struct resource rt2880_pci_io_resource = {
-+      .name   = "PCI IO space",
-+      .start  = RT2880_PCI_IO_BASE,
-+      .end    = RT2880_PCI_IO_BASE + RT2880_PCI_IO_SIZE - 1,
-+      .flags  = IORESOURCE_IO,
-+};
-+
-+static struct pci_controller rt2880_pci_controller = {
-+      .pci_ops        = &rt2880_pci_ops,
-+      .mem_resource   = &rt2880_pci_mem_resource,
-+      .io_resource    = &rt2880_pci_io_resource,
-+};
-+
-+static inline u32 rt2880_pci_read_u32(unsigned long reg)
-+{
-+      unsigned long flags;
-+      u32 address;
-+      u32 ret;
-+
-+      address = rt2880_pci_get_cfgaddr(0, 0, 0, reg);
-+
-+      spin_lock_irqsave(&rt2880_pci_lock, flags);
-+      rt2880_pci_reg_write(address, RT2880_PCI_REG_CONFIG_ADDR);
-+      ret = rt2880_pci_reg_read(RT2880_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt2880_pci_lock, flags);
-+
-+      return ret;
-+}
-+
-+static inline void rt2880_pci_write_u32(unsigned long reg, u32 val)
-+{
-+      unsigned long flags;
-+      u32 address;
-+
-+      address = rt2880_pci_get_cfgaddr(0, 0, 0, reg);
-+
-+      spin_lock_irqsave(&rt2880_pci_lock, flags);
-+      rt2880_pci_reg_write(address, RT2880_PCI_REG_CONFIG_ADDR);
-+      rt2880_pci_reg_write(val, RT2880_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt2880_pci_lock, flags);
-+}
-+
-+int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+      u16 cmd;
-+      int irq = -1;
-+
-+      if (dev->bus->number != 0)
-+              return irq;
-+
-+      switch (PCI_SLOT(dev->devfn)) {
-+      case 0x00:
-+              rt2880_pci_write_u32(PCI_BASE_ADDRESS_0, 0x08000000);
-+              (void) rt2880_pci_read_u32(PCI_BASE_ADDRESS_0);
-+              break;
-+      case 0x11:
-+              irq = RT288X_CPU_IRQ_PCI;
-+              break;
-+      default:
-+              printk("%s:%s[%d] trying to alloc unknown pci irq\n",
-+                     __FILE__, __func__, __LINE__);
-+              BUG();
-+              break;
-+      }
-+
-+      pci_write_config_byte((struct pci_dev*)dev, PCI_CACHE_LINE_SIZE, 0x14);
-+      pci_write_config_byte((struct pci_dev*)dev, PCI_LATENCY_TIMER, 0xFF);
-+      pci_read_config_word((struct pci_dev*)dev, PCI_COMMAND, &cmd);
-+      cmd |= PCI_COMMAND_MASTER | PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
-+             PCI_COMMAND_INVALIDATE | PCI_COMMAND_FAST_BACK |
-+             PCI_COMMAND_SERR | PCI_COMMAND_WAIT | PCI_COMMAND_PARITY;
-+      pci_write_config_word((struct pci_dev*)dev, PCI_COMMAND, cmd);
-+      pci_write_config_byte((struct pci_dev*)dev, PCI_INTERRUPT_LINE,
-+                            dev->irq);
-+      return irq;
-+}
-+
-+static int rt288x_pci_probe(struct platform_device *pdev)
-+{
-+      void __iomem *io_map_base;
-+      int i;
-+
-+      rt2880_pci_base = ioremap_nocache(RT2880_PCI_BASE, PAGE_SIZE);
-+
-+      io_map_base = ioremap(RT2880_PCI_IO_BASE, RT2880_PCI_IO_SIZE);
-+      rt2880_pci_controller.io_map_base = (unsigned long) io_map_base;
-+      set_io_port_base((unsigned long) io_map_base);
-+
-+      ioport_resource.start = RT2880_PCI_IO_BASE;
-+      ioport_resource.end = RT2880_PCI_IO_BASE + RT2880_PCI_IO_SIZE - 1;
-+
-+      rt2880_pci_reg_write(0, RT2880_PCI_REG_PCICFG_ADDR);
-+      for(i = 0; i < 0xfffff; i++) {}
-+
-+      rt2880_pci_reg_write(0x79, RT2880_PCI_REG_ARBCTL);
-+      rt2880_pci_reg_write(0x07FF0001, RT2880_PCI_REG_BAR0SETUP_ADDR);
-+      rt2880_pci_reg_write(RT2880_PCI_MEM_BASE, RT2880_PCI_REG_MEMBASE);
-+      rt2880_pci_reg_write(RT2880_PCI_IO_BASE, RT2880_PCI_REG_IOBASE);
-+      rt2880_pci_reg_write(0x08000000, RT2880_PCI_REG_IMBASEBAR0_ADDR);
-+      rt2880_pci_reg_write(0x08021814, RT2880_PCI_REG_ID);
-+      rt2880_pci_reg_write(0x00800001, RT2880_PCI_REG_CLASS);
-+      rt2880_pci_reg_write(0x28801814, RT2880_PCI_REG_SUBID);
-+      rt2880_pci_reg_write(0x000c0000, RT2880_PCI_REG_PCIMSK_ADDR);
-+
-+      rt2880_pci_write_u32(PCI_BASE_ADDRESS_0, 0x08000000);
-+      (void) rt2880_pci_read_u32(PCI_BASE_ADDRESS_0);
-+
-+      register_pci_controller(&rt2880_pci_controller);
-+      return 0;
-+}
-+
-+int pcibios_plat_dev_init(struct pci_dev *dev)
-+{
-+      return 0;
-+}
-+
-+static const struct of_device_id rt288x_pci_match[] = {
-+      { .compatible = "ralink,rt288x-pci" },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, rt288x_pci_match);
-+
-+static struct platform_driver rt288x_pci_driver = {
-+      .probe = rt288x_pci_probe,
-+      .driver = {
-+              .name = "rt288x-pci",
-+              .owner = THIS_MODULE,
-+              .of_match_table = rt288x_pci_match,
-+      },
-+};
-+
-+int __init pcibios_init(void)
-+{
-+      int ret = platform_driver_register(&rt288x_pci_driver);
-+      if (ret)
-+              pr_info("rt288x-pci: Error registering platform driver!");
-+      return ret;
-+}
-+
-+arch_initcall(pcibios_init);
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -8,6 +8,7 @@ choice
-       config SOC_RT288X
-               bool "RT288x"
-+              select HW_HAS_PCI
-       config SOC_RT305X
-               bool "RT305x"
diff --git a/target/linux/ramips/patches-3.8/0119-DT-MIPS-ralink-add-RT3883-dts-files.patch b/target/linux/ramips/patches-3.8/0119-DT-MIPS-ralink-add-RT3883-dts-files.patch
new file mode 100644 (file)
index 0000000..90b50ed
--- /dev/null
@@ -0,0 +1,118 @@
+From 8b02459b5aa171dc8726698c4b19341a4e441bb8 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 12 Apr 2013 06:27:39 +0000
+Subject: [PATCH 119/137] DT: MIPS: ralink: add RT3883 dts files
+
+Add a dtsi file for RT3883 SoC and a sample dts file.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Grant Likely <grant.likely@secretlab.ca>
+Patchwork: http://patchwork.linux-mips.org/patch/5189/
+---
+ arch/mips/ralink/Kconfig             |    4 +++
+ arch/mips/ralink/dts/Makefile        |    1 +
+ arch/mips/ralink/dts/rt3883.dtsi     |   58 ++++++++++++++++++++++++++++++++++
+ arch/mips/ralink/dts/rt3883_eval.dts |   16 ++++++++++
+ 4 files changed, 79 insertions(+)
+ create mode 100644 arch/mips/ralink/dts/rt3883.dtsi
+ create mode 100644 arch/mips/ralink/dts/rt3883_eval.dts
+
+--- a/arch/mips/ralink/Kconfig
++++ b/arch/mips/ralink/Kconfig
+@@ -42,6 +42,10 @@ choice
+               bool "RT305x eval kit"
+               depends on SOC_RT305X
++      config DTB_RT3883_EVAL
++              bool "RT3883 eval kit"
++              depends on SOC_RT3883
++
+ endchoice
+ endif
+--- a/arch/mips/ralink/dts/Makefile
++++ b/arch/mips/ralink/dts/Makefile
+@@ -1,2 +1,3 @@
+ obj-$(CONFIG_DTB_RT2880_EVAL) := rt2880_eval.dtb.o
+ obj-$(CONFIG_DTB_RT305X_EVAL) := rt3052_eval.dtb.o
++obj-$(CONFIG_DTB_RT3883_EVAL) := rt3883_eval.dtb.o
+--- /dev/null
++++ b/arch/mips/ralink/dts/rt3883.dtsi
+@@ -0,0 +1,58 @@
++/ {
++      #address-cells = <1>;
++      #size-cells = <1>;
++      compatible = "ralink,rt3883-soc";
++
++      cpus {
++              cpu@0 {
++                      compatible = "mips,mips74Kc";
++              };
++      };
++
++      cpuintc: cpuintc@0 {
++              #address-cells = <0>;
++              #interrupt-cells = <1>;
++              interrupt-controller;
++              compatible = "mti,cpu-interrupt-controller";
++      };
++
++      palmbus@10000000 {
++              compatible = "palmbus";
++              reg = <0x10000000 0x200000>;
++              ranges = <0x0 0x10000000 0x1FFFFF>;
++
++              #address-cells = <1>;
++              #size-cells = <1>;
++
++              sysc@0 {
++                      compatible = "ralink,rt3883-sysc", "ralink,rt3050-sysc";
++                      reg = <0x0 0x100>;
++              };
++
++              intc: intc@200 {
++                      compatible = "ralink,rt3883-intc", "ralink,rt2880-intc";
++                      reg = <0x200 0x100>;
++
++                      interrupt-controller;
++                      #interrupt-cells = <1>;
++
++                      interrupt-parent = <&cpuintc>;
++                      interrupts = <2>;
++              };
++
++              memc@300 {
++                      compatible = "ralink,rt3883-memc", "ralink,rt3050-memc";
++                      reg = <0x300 0x100>;
++              };
++
++              uartlite@c00 {
++                      compatible = "ralink,rt3883-uart", "ralink,rt2880-uart", "ns16550a";
++                      reg = <0xc00 0x100>;
++
++                      interrupt-parent = <&intc>;
++                      interrupts = <12>;
++
++                      reg-shift = <2>;
++              };
++      };
++};
+--- /dev/null
++++ b/arch/mips/ralink/dts/rt3883_eval.dts
+@@ -0,0 +1,16 @@
++/dts-v1/;
++
++/include/ "rt3883.dtsi"
++
++/ {
++      compatible = "ralink,rt3883-eval-board", "ralink,rt3883-soc";
++      model = "Ralink RT3883 evaluation board";
++
++      memory@0 {
++              reg = <0x0 0x2000000>;
++      };
++
++      chosen {
++              bootargs = "console=ttyS0,57600";
++      };
++};
diff --git a/target/linux/ramips/patches-3.8/0119-PCI-MIPS-adds-rt3883-pci-support.patch b/target/linux/ramips/patches-3.8/0119-PCI-MIPS-adds-rt3883-pci-support.patch
deleted file mode 100644 (file)
index 32fd209..0000000
+++ /dev/null
@@ -1,525 +0,0 @@
-From f01830fcc57273bd9ec5f6733ab3d28adeb71955 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Thu, 21 Mar 2013 17:34:08 +0100
-Subject: [PATCH 119/121] PCI: MIPS: adds rt3883 pci support
-
-Add support for the pcie found on the rt3883 SoC.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- arch/mips/pci/Makefile     |    1 +
- arch/mips/pci/pci-rt3883.c |  487 ++++++++++++++++++++++++++++++++++++++++++++
- arch/mips/ralink/Kconfig   |    1 +
- 3 files changed, 489 insertions(+)
- create mode 100644 arch/mips/pci/pci-rt3883.c
-
---- a/arch/mips/pci/Makefile
-+++ b/arch/mips/pci/Makefile
-@@ -43,6 +43,7 @@ obj-$(CONFIG_SNI_RM)         += fixup-sni.o ops
- obj-$(CONFIG_LANTIQ)          += fixup-lantiq.o
- obj-$(CONFIG_PCI_LANTIQ)      += pci-lantiq.o ops-lantiq.o
- obj-$(CONFIG_SOC_RT2880)      += pci-rt2880.o
-+obj-$(CONFIG_SOC_RT3883)      += pci-rt3883.o
- obj-$(CONFIG_TANBAC_TB0219)   += fixup-tb0219.o
- obj-$(CONFIG_TANBAC_TB0226)   += fixup-tb0226.o
- obj-$(CONFIG_TANBAC_TB0287)   += fixup-tb0287.o
---- /dev/null
-+++ b/arch/mips/pci/pci-rt3883.c
-@@ -0,0 +1,487 @@
-+/*
-+ *  Ralink RT3883 SoC PCI support
-+ *
-+ *  Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  Parts of this file are based on Ralink's 2.6.21 BSP
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/pci.h>
-+#include <linux/io.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/mach-ralink/rt3883.h>
-+#include <asm/mach-ralink/rt3883_regs.h>
-+
-+#define RT3883_MEMORY_BASE            0x00000000
-+#define RT3883_MEMORY_SIZE            0x02000000
-+
-+#define RT3883_PCI_MEM_BASE           0x20000000
-+#define RT3883_PCI_MEM_SIZE           0x10000000
-+#define RT3883_PCI_IO_BASE            0x10160000
-+#define RT3883_PCI_IO_SIZE            0x00010000
-+
-+#define RT3883_PCI_REG_PCICFG_ADDR    0x00
-+#define RT3883_PCI_REG_PCIRAW_ADDR    0x04
-+#define RT3883_PCI_REG_PCIINT_ADDR    0x08
-+#define RT3883_PCI_REG_PCIMSK_ADDR    0x0c
-+#define   RT3833_PCI_PCIINT_PCIE      BIT(20)
-+#define   RT3833_PCI_PCIINT_PCI1      BIT(19)
-+#define   RT3833_PCI_PCIINT_PCI0      BIT(18)
-+
-+#define RT3883_PCI_REG_CONFIG_ADDR    0x20
-+#define RT3883_PCI_REG_CONFIG_DATA    0x24
-+#define RT3883_PCI_REG_MEMBASE                0x28
-+#define RT3883_PCI_REG_IOBASE         0x2c
-+#define RT3883_PCI_REG_ARBCTL         0x80
-+
-+#define RT3883_PCI_REG_BASE(_x)               (0x1000 + (_x) * 0x1000)
-+#define RT3883_PCI_REG_BAR0SETUP_ADDR(_x) (RT3883_PCI_REG_BASE((_x)) + 0x10)
-+#define RT3883_PCI_REG_IMBASEBAR0_ADDR(_x) (RT3883_PCI_REG_BASE((_x)) + 0x18)
-+#define RT3883_PCI_REG_ID(_x)         (RT3883_PCI_REG_BASE((_x)) + 0x30)
-+#define RT3883_PCI_REG_CLASS(_x)      (RT3883_PCI_REG_BASE((_x)) + 0x34)
-+#define RT3883_PCI_REG_SUBID(_x)      (RT3883_PCI_REG_BASE((_x)) + 0x38)
-+#define RT3883_PCI_REG_STATUS(_x)     (RT3883_PCI_REG_BASE((_x)) + 0x50)
-+
-+static int (*rt3883_pci_plat_dev_init)(struct pci_dev *dev);
-+static void __iomem *rt3883_pci_base;
-+static DEFINE_SPINLOCK(rt3883_pci_lock);
-+
-+static inline u32 rt3883_pci_rr(unsigned reg)
-+{
-+      return readl(rt3883_pci_base + reg);
-+}
-+
-+static inline void rt3883_pci_wr(u32 val, unsigned reg)
-+{
-+      writel(val, rt3883_pci_base + reg);
-+}
-+
-+static inline u32 rt3883_pci_get_cfgaddr(unsigned int bus, unsigned int slot,
-+                                       unsigned int func, unsigned int where)
-+{
-+      return ((bus << 16) | (slot << 11) | (func << 8) | (where & 0xfc) |
-+              0x80000000);
-+}
-+
-+static u32 rt3883_pci_read_u32(unsigned bus, unsigned slot,
-+                             unsigned func, unsigned reg)
-+{
-+      unsigned long flags;
-+      u32 address;
-+      u32 ret;
-+
-+      address = rt3883_pci_get_cfgaddr(bus, slot, func, reg);
-+
-+      spin_lock_irqsave(&rt3883_pci_lock, flags);
-+      rt3883_pci_wr(address, RT3883_PCI_REG_CONFIG_ADDR);
-+      ret = rt3883_pci_rr(RT3883_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt3883_pci_lock, flags);
-+
-+      return ret;
-+}
-+
-+static void rt3883_pci_write_u32(unsigned bus, unsigned slot,
-+                               unsigned func, unsigned reg, u32 val)
-+{
-+      unsigned long flags;
-+      u32 address;
-+
-+      address = rt3883_pci_get_cfgaddr(bus, slot, func, reg);
-+
-+      spin_lock_irqsave(&rt3883_pci_lock, flags);
-+      rt3883_pci_wr(address, RT3883_PCI_REG_CONFIG_ADDR);
-+      rt3883_pci_wr(val, RT3883_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt3883_pci_lock, flags);
-+}
-+
-+static void rt3883_pci_irq_handler(unsigned int irq, struct irq_desc *desc)
-+{
-+      u32 pending;
-+
-+      pending = rt3883_pci_rr(RT3883_PCI_REG_PCIINT_ADDR) &
-+                rt3883_pci_rr(RT3883_PCI_REG_PCIMSK_ADDR);
-+
-+      if (!pending) {
-+              spurious_interrupt();
-+              return;
-+      }
-+
-+      if (pending & RT3833_PCI_PCIINT_PCI0)
-+              generic_handle_irq(RT3883_PCI_IRQ_PCI0);
-+
-+      if (pending & RT3833_PCI_PCIINT_PCI1)
-+              generic_handle_irq(RT3883_PCI_IRQ_PCI1);
-+
-+      if (pending & RT3833_PCI_PCIINT_PCIE)
-+              generic_handle_irq(RT3883_PCI_IRQ_PCIE);
-+}
-+
-+static void rt3883_pci_irq_unmask(struct irq_data *d)
-+{
-+      int irq = d->irq;
-+      u32 mask;
-+      u32 t;
-+
-+      switch (irq) {
-+      case RT3883_PCI_IRQ_PCI0:
-+              mask = RT3833_PCI_PCIINT_PCI0;
-+              break;
-+      case RT3883_PCI_IRQ_PCI1:
-+              mask = RT3833_PCI_PCIINT_PCI1;
-+              break;
-+      case RT3883_PCI_IRQ_PCIE:
-+              mask = RT3833_PCI_PCIINT_PCIE;
-+              break;
-+      default:
-+              BUG();
-+      }
-+
-+      t = rt3883_pci_rr(RT3883_PCI_REG_PCIMSK_ADDR);
-+      rt3883_pci_wr(t | mask, RT3883_PCI_REG_PCIMSK_ADDR);
-+      /* flush write */
-+      rt3883_pci_rr(RT3883_PCI_REG_PCIMSK_ADDR);
-+}
-+
-+static void rt3883_pci_irq_mask(struct irq_data *d)
-+{
-+      int irq = d->irq;
-+      u32 mask;
-+      u32 t;
-+
-+      switch (irq) {
-+      case RT3883_PCI_IRQ_PCI0:
-+              mask = RT3833_PCI_PCIINT_PCI0;
-+              break;
-+      case RT3883_PCI_IRQ_PCI1:
-+              mask = RT3833_PCI_PCIINT_PCI1;
-+              break;
-+      case RT3883_PCI_IRQ_PCIE:
-+              mask = RT3833_PCI_PCIINT_PCIE;
-+              break;
-+      default:
-+              BUG();
-+      }
-+
-+      t = rt3883_pci_rr(RT3883_PCI_REG_PCIMSK_ADDR);
-+      rt3883_pci_wr(t & ~mask, RT3883_PCI_REG_PCIMSK_ADDR);
-+      /* flush write */
-+      rt3883_pci_rr(RT3883_PCI_REG_PCIMSK_ADDR);
-+}
-+
-+static struct irq_chip rt3883_pci_irq_chip = {
-+      .name           = "RT3883 PCI",
-+      .irq_mask       = rt3883_pci_irq_mask,
-+      .irq_unmask     = rt3883_pci_irq_unmask,
-+      .irq_mask_ack   = rt3883_pci_irq_mask,
-+};
-+
-+static void __init rt3883_pci_irq_init(void)
-+{
-+      int i;
-+
-+      /* disable all interrupts */
-+      rt3883_pci_wr(0, RT3883_PCI_REG_PCIMSK_ADDR);
-+
-+      for (i = RT3883_PCI_IRQ_BASE;
-+           i < RT3883_PCI_IRQ_BASE + RT3883_PCI_IRQ_COUNT; i++) {
-+              irq_set_chip_and_handler(i, &rt3883_pci_irq_chip,
-+                                       handle_level_irq);
-+      }
-+
-+      irq_set_chained_handler(RT3883_CPU_IRQ_PCI, rt3883_pci_irq_handler);
-+}
-+
-+static int rt3883_pci_config_read(struct pci_bus *bus, unsigned int devfn,
-+                                int where, int size, u32 *val)
-+{
-+      unsigned long flags;
-+      u32 address;
-+      u32 data;
-+
-+      address = rt3883_pci_get_cfgaddr(bus->number, PCI_SLOT(devfn),
-+                                       PCI_FUNC(devfn), where);
-+
-+      spin_lock_irqsave(&rt3883_pci_lock, flags);
-+      rt3883_pci_wr(address, RT3883_PCI_REG_CONFIG_ADDR);
-+      data = rt3883_pci_rr(RT3883_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt3883_pci_lock, flags);
-+
-+      switch (size) {
-+      case 1:
-+              *val = (data >> ((where & 3) << 3)) & 0xff;
-+              break;
-+      case 2:
-+              *val = (data >> ((where & 3) << 3)) & 0xffff;
-+              break;
-+      case 4:
-+              *val = data;
-+              break;
-+      }
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static int rt3883_pci_config_write(struct pci_bus *bus, unsigned int devfn,
-+                                 int where, int size, u32 val)
-+{
-+      unsigned long flags;
-+      u32 address;
-+      u32 data;
-+
-+      address = rt3883_pci_get_cfgaddr(bus->number, PCI_SLOT(devfn),
-+                                       PCI_FUNC(devfn), where);
-+
-+      spin_lock_irqsave(&rt3883_pci_lock, flags);
-+      rt3883_pci_wr(address, RT3883_PCI_REG_CONFIG_ADDR);
-+      data = rt3883_pci_rr(RT3883_PCI_REG_CONFIG_DATA);
-+
-+      switch (size) {
-+      case 1:
-+              data = (data & ~(0xff << ((where & 3) << 3))) |
-+                     (val << ((where & 3) << 3));
-+              break;
-+      case 2:
-+              data = (data & ~(0xffff << ((where & 3) << 3))) |
-+                     (val << ((where & 3) << 3));
-+              break;
-+      case 4:
-+              data = val;
-+              break;
-+      }
-+
-+      rt3883_pci_wr(data, RT3883_PCI_REG_CONFIG_DATA);
-+      spin_unlock_irqrestore(&rt3883_pci_lock, flags);
-+
-+      return PCIBIOS_SUCCESSFUL;
-+}
-+
-+static struct pci_ops rt3883_pci_ops = {
-+      .read   = rt3883_pci_config_read,
-+      .write  = rt3883_pci_config_write,
-+};
-+
-+static struct resource rt3883_pci_mem_resource = {
-+      .name   = "PCI MEM space",
-+      .start  = RT3883_PCI_MEM_BASE,
-+      .end    = RT3883_PCI_MEM_BASE + RT3883_PCI_MEM_SIZE - 1,
-+      .flags  = IORESOURCE_MEM,
-+};
-+
-+static struct resource rt3883_pci_io_resource = {
-+      .name   = "PCI IO space",
-+      .start  = RT3883_PCI_IO_BASE,
-+      .end    = RT3883_PCI_IO_BASE + RT3883_PCI_IO_SIZE - 1,
-+      .flags  = IORESOURCE_IO,
-+};
-+
-+static struct pci_controller rt3883_pci_controller = {
-+      .pci_ops        = &rt3883_pci_ops,
-+      .mem_resource   = &rt3883_pci_mem_resource,
-+      .io_resource    = &rt3883_pci_io_resource,
-+};
-+
-+static void rt3883_pci_preinit(unsigned mode)
-+{
-+      u32 syscfg1;
-+      u32 rstctrl;
-+      u32 clkcfg1;
-+
-+      if (mode & RT3883_PCI_MODE_PCIE) {
-+              u32 val;
-+
-+              val = rt3883_sysc_rr(RT3883_SYSC_REG_SYSCFG1);
-+              val &= ~(0x30);
-+              val |= (2 << 4);
-+              rt3883_sysc_wr(val, RT3883_SYSC_REG_SYSCFG1);
-+
-+              val = rt3883_sysc_rr(RT3883_SYSC_REG_PCIE_CLK_GEN0);
-+              val &= ~BIT(31);
-+              rt3883_sysc_wr(val, RT3883_SYSC_REG_PCIE_CLK_GEN0);
-+
-+              val = rt3883_sysc_rr(RT3883_SYSC_REG_PCIE_CLK_GEN1);
-+              val &= 0x80ffffff;
-+              rt3883_sysc_wr(val, RT3883_SYSC_REG_PCIE_CLK_GEN1);
-+
-+              val = rt3883_sysc_rr(RT3883_SYSC_REG_PCIE_CLK_GEN1);
-+              val |= 0xa << 24;
-+              rt3883_sysc_wr(val, RT3883_SYSC_REG_PCIE_CLK_GEN1);
-+
-+              val = rt3883_sysc_rr(RT3883_SYSC_REG_PCIE_CLK_GEN0);
-+              val |= BIT(31);
-+              rt3883_sysc_wr(val, RT3883_SYSC_REG_PCIE_CLK_GEN0);
-+
-+              msleep(50);
-+      }
-+
-+      syscfg1 = rt3883_sysc_rr(RT3883_SYSC_REG_SYSCFG1);
-+      syscfg1 &= ~(RT3883_SYSCFG1_PCIE_RC_MODE |
-+                   RT3883_SYSCFG1_PCI_HOST_MODE);
-+
-+      rstctrl = rt3883_sysc_rr(RT3883_SYSC_REG_RSTCTRL);
-+      rstctrl |= (RT3883_RSTCTRL_PCI | RT3883_RSTCTRL_PCIE);
-+
-+      clkcfg1 = rt3883_sysc_rr(RT3883_SYSC_REG_CLKCFG1);
-+      clkcfg1 &= ~(RT3883_CLKCFG1_PCI_CLK_EN |
-+                   RT3883_CLKCFG1_PCIE_CLK_EN);
-+
-+      if (mode & RT3883_PCI_MODE_PCI) {
-+              syscfg1 |= RT3883_SYSCFG1_PCI_HOST_MODE;
-+              clkcfg1 |= RT3883_CLKCFG1_PCI_CLK_EN;
-+              rstctrl &= ~RT3883_RSTCTRL_PCI;
-+      }
-+      if (mode & RT3883_PCI_MODE_PCIE) {
-+              syscfg1 |= RT3883_SYSCFG1_PCI_HOST_MODE |
-+                         RT3883_SYSCFG1_PCIE_RC_MODE;
-+              clkcfg1 |= RT3883_CLKCFG1_PCIE_CLK_EN;
-+              rstctrl &= ~RT3883_RSTCTRL_PCIE;
-+      }
-+
-+      rt3883_sysc_wr(syscfg1, RT3883_SYSC_REG_SYSCFG1);
-+      rt3883_sysc_wr(rstctrl, RT3883_SYSC_REG_RSTCTRL);
-+      rt3883_sysc_wr(clkcfg1, RT3883_SYSC_REG_CLKCFG1);
-+
-+      msleep(500);
-+}
-+
-+static int rt3883_pcie_ready(void)
-+{
-+      u32 status;
-+
-+      msleep(500);
-+
-+      status = rt3883_pci_rr(RT3883_PCI_REG_STATUS(1));
-+      if (status & BIT(0))
-+              return 0;
-+
-+      /* TODO: reset PCIe and turn off PCIe clock */
-+
-+      return -ENODEV;
-+}
-+
-+void __init rt3883_pci_init(unsigned mode)
-+{
-+      u32 val;
-+      int err;
-+
-+      rt3883_pci_preinit(mode);
-+
-+      rt3883_pci_base = ioremap(RT3883_PCI_BASE, PAGE_SIZE);
-+      if (rt3883_pci_base == NULL) {
-+              pr_err("failed to ioremap PCI registers\n");
-+              return;
-+      }
-+
-+      rt3883_pci_wr(0, RT3883_PCI_REG_PCICFG_ADDR);
-+      if (mode & RT3883_PCI_MODE_PCI)
-+              rt3883_pci_wr(BIT(16), RT3883_PCI_REG_PCICFG_ADDR);
-+
-+      msleep(500);
-+
-+      if (mode & RT3883_PCI_MODE_PCIE) {
-+              err = rt3883_pcie_ready();
-+              if (err)
-+                      return;
-+      }
-+
-+      if (mode & RT3883_PCI_MODE_PCI)
-+              rt3883_pci_wr(0x79, RT3883_PCI_REG_ARBCTL);
-+
-+      rt3883_pci_wr(RT3883_PCI_MEM_BASE, RT3883_PCI_REG_MEMBASE);
-+      rt3883_pci_wr(RT3883_PCI_IO_BASE, RT3883_PCI_REG_IOBASE);
-+
-+      /* PCI */
-+      rt3883_pci_wr(0x03ff0000, RT3883_PCI_REG_BAR0SETUP_ADDR(0));
-+      rt3883_pci_wr(RT3883_MEMORY_BASE, RT3883_PCI_REG_IMBASEBAR0_ADDR(0));
-+      rt3883_pci_wr(0x08021814, RT3883_PCI_REG_ID(0));
-+      rt3883_pci_wr(0x00800001, RT3883_PCI_REG_CLASS(0));
-+      rt3883_pci_wr(0x28801814, RT3883_PCI_REG_SUBID(0));
-+
-+      /* PCIe */
-+      rt3883_pci_wr(0x01ff0000, RT3883_PCI_REG_BAR0SETUP_ADDR(1));
-+      rt3883_pci_wr(RT3883_MEMORY_BASE, RT3883_PCI_REG_IMBASEBAR0_ADDR(1));
-+      rt3883_pci_wr(0x08021814, RT3883_PCI_REG_ID(1));
-+      rt3883_pci_wr(0x06040001, RT3883_PCI_REG_CLASS(1));
-+      rt3883_pci_wr(0x28801814, RT3883_PCI_REG_SUBID(1));
-+
-+      rt3883_pci_irq_init();
-+
-+      /* PCIe */
-+      val = rt3883_pci_read_u32(0, 0x01, 0, PCI_COMMAND);
-+      val |= 0x7;
-+      rt3883_pci_write_u32(0, 0x01, 0, PCI_COMMAND, val);
-+
-+      /* PCI */
-+      val = rt3883_pci_read_u32(0, 0x00, 0, PCI_COMMAND);
-+      val |= 0x7;
-+      rt3883_pci_write_u32(0, 0x00, 0, PCI_COMMAND, val);
-+
-+      ioport_resource.start = rt3883_pci_io_resource.start;
-+      ioport_resource.end = rt3883_pci_io_resource.end;
-+
-+      register_pci_controller(&rt3883_pci_controller);
-+}
-+
-+int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
-+{
-+      int irq = -1;
-+
-+      switch (dev->bus->number) {
-+      case 0:
-+              switch (PCI_SLOT(dev->devfn)) {
-+              case 0x00:
-+                      rt3883_pci_wr(0x03ff0001,
-+                                           RT3883_PCI_REG_BAR0SETUP_ADDR(0));
-+                      rt3883_pci_wr(0x03ff0001,
-+                                           RT3883_PCI_REG_BAR0SETUP_ADDR(1));
-+
-+                      rt3883_pci_write_u32(0, 0x00, 0, PCI_BASE_ADDRESS_0,
-+                                           RT3883_MEMORY_BASE);
-+                      rt3883_pci_read_u32(0, 0x00, 0, PCI_BASE_ADDRESS_0);
-+
-+                      irq = RT3883_CPU_IRQ_PCI;
-+                      break;
-+              case 0x01:
-+                      rt3883_pci_write_u32(0, 0x01, 0, PCI_IO_BASE,
-+                                           0x00000101);
-+                      break;
-+              case 0x11:
-+                      irq = RT3883_PCI_IRQ_PCI0;
-+                      break;
-+              case 0x12:
-+                      irq = RT3883_PCI_IRQ_PCI1;
-+                      break;
-+              }
-+              break;
-+
-+      case 1:
-+              irq = RT3883_PCI_IRQ_PCIE;
-+              break;
-+
-+      default:
-+              dev_err(&dev->dev, "no IRQ specified\n");
-+              return irq;
-+      }
-+
-+      return irq;
-+}
-+
-+void __init rt3883_pci_set_plat_dev_init(int (*f)(struct pci_dev *dev))
-+{
-+      rt3883_pci_plat_dev_init = f;
-+}
-+
-+int pcibios_plat_dev_init(struct pci_dev *dev)
-+{
-+      if (rt3883_pci_plat_dev_init)
-+              return rt3883_pci_plat_dev_init(dev);
-+
-+      return 0;
-+}
---- a/arch/mips/ralink/Kconfig
-+++ b/arch/mips/ralink/Kconfig
-@@ -20,6 +20,7 @@ choice
-               bool "RT3883"
-               select USB_ARCH_HAS_OHCI
-               select USB_ARCH_HAS_EHCI
-+              select HW_HAS_PCI
-       config SOC_MT7620
-               bool "MT7620"
diff --git a/target/linux/ramips/patches-3.8/0120-DT-MIPS-ralink-add-MT7620A-dts-files.patch b/target/linux/ramips/patches-3.8/0120-DT-MIPS-ralink-add-MT7620A-dts-files.patch
new file mode 100644 (file)
index 0000000..82a3086
--- /dev/null
@@ -0,0 +1,119 @@
+From 07741f61fc94fad3c3d21fa1a2ad6f01455cc1dd Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 12 Apr 2013 06:27:41 +0000
+Subject: [PATCH 120/137] DT: MIPS: ralink: add MT7620A dts files
+
+Add a dtsi file for MT7620A SoC and a sample dts file.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Acked-by: Grant Likely <grant.likely@secretlab.ca>
+Patchwork: http://patchwork.linux-mips.org/patch/5190/
+---
+ arch/mips/ralink/Kconfig              |    4 +++
+ arch/mips/ralink/dts/Makefile         |    1 +
+ arch/mips/ralink/dts/mt7620a.dtsi     |   58 +++++++++++++++++++++++++++++++++
+ arch/mips/ralink/dts/mt7620a_eval.dts |   16 +++++++++
+ 4 files changed, 79 insertions(+)
+ create mode 100644 arch/mips/ralink/dts/mt7620a.dtsi
+ create mode 100644 arch/mips/ralink/dts/mt7620a_eval.dts
+
+--- a/arch/mips/ralink/Kconfig
++++ b/arch/mips/ralink/Kconfig
+@@ -46,6 +46,10 @@ choice
+               bool "RT3883 eval kit"
+               depends on SOC_RT3883
++      config DTB_MT7620A_EVAL
++              bool "MT7620A eval kit"
++              depends on SOC_MT7620
++
+ endchoice
+ endif
+--- a/arch/mips/ralink/dts/Makefile
++++ b/arch/mips/ralink/dts/Makefile
+@@ -1,3 +1,4 @@
+ obj-$(CONFIG_DTB_RT2880_EVAL) := rt2880_eval.dtb.o
+ obj-$(CONFIG_DTB_RT305X_EVAL) := rt3052_eval.dtb.o
+ obj-$(CONFIG_DTB_RT3883_EVAL) := rt3883_eval.dtb.o
++obj-$(CONFIG_DTB_MT7620A_EVAL) := mt7620a_eval.dtb.o
+--- /dev/null
++++ b/arch/mips/ralink/dts/mt7620a.dtsi
+@@ -0,0 +1,58 @@
++/ {
++      #address-cells = <1>;
++      #size-cells = <1>;
++      compatible = "ralink,mtk7620a-soc";
++
++      cpus {
++              cpu@0 {
++                      compatible = "mips,mips24KEc";
++              };
++      };
++
++      cpuintc: cpuintc@0 {
++              #address-cells = <0>;
++              #interrupt-cells = <1>;
++              interrupt-controller;
++              compatible = "mti,cpu-interrupt-controller";
++      };
++
++      palmbus@10000000 {
++              compatible = "palmbus";
++              reg = <0x10000000 0x200000>;
++                ranges = <0x0 0x10000000 0x1FFFFF>;
++
++              #address-cells = <1>;
++              #size-cells = <1>;
++
++              sysc@0 {
++                      compatible = "ralink,mt7620a-sysc";
++                      reg = <0x0 0x100>;
++              };
++
++              intc: intc@200 {
++                      compatible = "ralink,mt7620a-intc", "ralink,rt2880-intc";
++                      reg = <0x200 0x100>;
++
++                      interrupt-controller;
++                      #interrupt-cells = <1>;
++
++                      interrupt-parent = <&cpuintc>;
++                      interrupts = <2>;
++              };
++
++              memc@300 {
++                      compatible = "ralink,mt7620a-memc", "ralink,rt3050-memc";
++                      reg = <0x300 0x100>;
++              };
++
++              uartlite@c00 {
++                      compatible = "ralink,mt7620a-uart", "ralink,rt2880-uart", "ns16550a";
++                      reg = <0xc00 0x100>;
++
++                      interrupt-parent = <&intc>;
++                      interrupts = <12>;
++
++                      reg-shift = <2>;
++              };
++      };
++};
+--- /dev/null
++++ b/arch/mips/ralink/dts/mt7620a_eval.dts
+@@ -0,0 +1,16 @@
++/dts-v1/;
++
++/include/ "mt7620a.dtsi"
++
++/ {
++      compatible = "ralink,mt7620a-eval-board", "ralink,mt7620a-soc";
++      model = "Ralink MT7620A evaluation board";
++
++      memory@0 {
++              reg = <0x0 0x2000000>;
++      };
++
++      chosen {
++              bootargs = "console=ttyS0,57600";
++      };
++};
diff --git a/target/linux/ramips/patches-3.8/0120-NET-MIPS-add-ralink-SoC-ethernet-driver.patch b/target/linux/ramips/patches-3.8/0120-NET-MIPS-add-ralink-SoC-ethernet-driver.patch
deleted file mode 100644 (file)
index b992650..0000000
+++ /dev/null
@@ -1,3141 +0,0 @@
-From 1c31c288bc1e853e3226ba593a13a0492b39c9e8 Mon Sep 17 00:00:00 2001
-From: John Crispin <blogic@openwrt.org>
-Date: Fri, 15 Mar 2013 19:07:05 +0100
-Subject: [PATCH 120/121] NET: MIPS: add ralink SoC ethernet driver
-
-Add support for Ralink FE and ESW.
-
-Signed-off-by: John Crispin <blogic@openwrt.org>
----
- .../include/asm/mach-ralink/rt305x_esw_platform.h  |   27 +
- arch/mips/ralink/rt305x.c                          |    1 +
- drivers/net/ethernet/Kconfig                       |    1 +
- drivers/net/ethernet/Makefile                      |    1 +
- drivers/net/ethernet/ramips/Kconfig                |   18 +
- drivers/net/ethernet/ramips/Makefile               |    9 +
- drivers/net/ethernet/ramips/ramips_debugfs.c       |  127 ++
- drivers/net/ethernet/ramips/ramips_esw.c           | 1220 +++++++++++++++++++
- drivers/net/ethernet/ramips/ramips_eth.h           |  375 ++++++
- drivers/net/ethernet/ramips/ramips_main.c          | 1285 ++++++++++++++++++++
- 10 files changed, 3064 insertions(+)
- create mode 100644 arch/mips/include/asm/mach-ralink/rt305x_esw_platform.h
- create mode 100644 drivers/net/ethernet/ramips/Kconfig
- create mode 100644 drivers/net/ethernet/ramips/Makefile
- create mode 100644 drivers/net/ethernet/ramips/ramips_debugfs.c
- create mode 100644 drivers/net/ethernet/ramips/ramips_esw.c
- create mode 100644 drivers/net/ethernet/ramips/ramips_eth.h
- create mode 100644 drivers/net/ethernet/ramips/ramips_main.c
-
---- /dev/null
-+++ b/arch/mips/include/asm/mach-ralink/rt305x_esw_platform.h
-@@ -0,0 +1,27 @@
-+/*
-+ *  Ralink RT305x SoC platform device registration
-+ *
-+ *  Copyright (C) 2010 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#ifndef _RT305X_ESW_PLATFORM_H
-+#define _RT305X_ESW_PLATFORM_H
-+
-+enum {
-+      RT305X_ESW_VLAN_CONFIG_NONE = 0,
-+      RT305X_ESW_VLAN_CONFIG_LLLLW,
-+      RT305X_ESW_VLAN_CONFIG_WLLLL,
-+};
-+
-+struct rt305x_esw_platform_data
-+{
-+      u8 vlan_config;
-+      u32 reg_initval_fct2;
-+      u32 reg_initval_fpa2;
-+};
-+
-+#endif /* _RT305X_ESW_PLATFORM_H */
---- a/arch/mips/ralink/rt305x.c
-+++ b/arch/mips/ralink/rt305x.c
-@@ -182,6 +182,7 @@ void __init ralink_clk_init(void)
-       }
-       ralink_clk_add("cpu", cpu_rate);
-+      ralink_clk_add("sys", sys_rate);
-       ralink_clk_add("10000b00.spi", sys_rate);
-       ralink_clk_add("10000100.timer", wdt_rate);
-       ralink_clk_add("10000120.watchdog", wdt_rate);
---- a/drivers/net/ethernet/Kconfig
-+++ b/drivers/net/ethernet/Kconfig
-@@ -136,6 +136,7 @@ source "drivers/net/ethernet/packetengin
- source "drivers/net/ethernet/pasemi/Kconfig"
- source "drivers/net/ethernet/qlogic/Kconfig"
- source "drivers/net/ethernet/racal/Kconfig"
-+source "drivers/net/ethernet/ramips/Kconfig"
- source "drivers/net/ethernet/realtek/Kconfig"
- source "drivers/net/ethernet/renesas/Kconfig"
- source "drivers/net/ethernet/rdc/Kconfig"
---- a/drivers/net/ethernet/Makefile
-+++ b/drivers/net/ethernet/Makefile
-@@ -54,6 +54,7 @@ obj-$(CONFIG_NET_PACKET_ENGINE) += packe
- obj-$(CONFIG_NET_VENDOR_PASEMI) += pasemi/
- obj-$(CONFIG_NET_VENDOR_QLOGIC) += qlogic/
- obj-$(CONFIG_NET_VENDOR_RACAL) += racal/
-+obj-$(CONFIG_NET_RAMIPS) += ramips/
- obj-$(CONFIG_NET_VENDOR_REALTEK) += realtek/
- obj-$(CONFIG_SH_ETH) += renesas/
- obj-$(CONFIG_NET_VENDOR_RDC) += rdc/
---- /dev/null
-+++ b/drivers/net/ethernet/ramips/Kconfig
-@@ -0,0 +1,18 @@
-+config NET_RAMIPS
-+       tristate "Ralink RT288X/RT3X5X/RT3662/RT3883 ethernet driver"
-+       depends on RALINK
-+       select PHYLIB if (SOC_RT288X || SOC_RT3883)
-+       select SWCONFIG if SOC_RT305X
-+       help
-+         This driver supports the etehrnet mac inside the ralink wisocs
-+
-+if NET_RAMIPS
-+
-+config NET_RAMIPS_DEBUG
-+       bool "Enable debug messages in the Ralink ethernet driver"
-+
-+config NET_RAMIPS_DEBUG_FS
-+      bool "Enable debugfs support for the Ralink ethernet driver"
-+      depends on DEBUG_FS
-+
-+endif
---- /dev/null
-+++ b/drivers/net/ethernet/ramips/Makefile
-@@ -0,0 +1,9 @@
-+#
-+# Makefile for the Ramips SoCs built-in ethernet macs
-+#
-+
-+ramips-y      += ramips_main.o
-+
-+ramips-$(CONFIG_NET_RAMIPS_DEBUG_FS)  += ramips_debugfs.o
-+
-+obj-$(CONFIG_NET_RAMIPS)      += ramips.o
---- /dev/null
-+++ b/drivers/net/ethernet/ramips/ramips_debugfs.c
-@@ -0,0 +1,127 @@
-+/*
-+ *  Ralink SoC ethernet driver debugfs code
-+ *
-+ *  Copyright (C) 2011-2012 Gabor Juhos <juhosg@openwrt.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify it
-+ *  under the terms of the GNU General Public License version 2 as published
-+ *  by the Free Software Foundation.
-+ */
-+
-+#include <linux/debugfs.h>
-+#include <linux/module.h>
-+#include <linux/phy.h>
-+
-+#include "ramips_eth.h"
-+
-+static struct dentry *raeth_debugfs_root;
-+
-+static int raeth_debugfs_generic_open(struct inode *inode, struct file *file)
-+{
-+      file->private_data = inode->i_private;
-+      return 0;
-+}
-+
-+void raeth_debugfs_update_int_stats(struct raeth_priv *re, u32 status)
-+{
-+      re->debug.int_stats.total += !!status;
-+
-+      re->debug.int_stats.rx_delayed += !!(status & RAMIPS_RX_DLY_INT);
-+      re->debug.int_stats.rx_done0 += !!(status & RAMIPS_RX_DONE_INT0);
-+      re->debug.int_stats.rx_coherent += !!(status & RAMIPS_RX_COHERENT);
-+
-+      re->debug.int_stats.tx_delayed += !!(status & RAMIPS_TX_DLY_INT);
-+      re->debug.int_stats.tx_done0 += !!(status & RAMIPS_TX_DONE_INT0);
-+      re->debug.int_stats.tx_done1 += !!(status & RAMIPS_TX_DONE_INT1);
-+      re->debug.int_stats.tx_done2 += !!(status & RAMIPS_TX_DONE_INT2);
-+      re->debug.int_stats.tx_done3 += !!(status & RAMIPS_TX_DONE_INT3);
-+      re->debug.int_stats.tx_coherent += !!(status & RAMIPS_TX_COHERENT);
-+
-+      re->debug.int_stats.pse_fq_empty += !!(status & RAMIPS_PSE_FQ_EMPTY);
-+      re->debug.int_stats.pse_p0_fc += !!(status & RAMIPS_PSE_P0_FC);
-+      re->debug.int_stats.pse_p1_fc += !!(status & RAMIPS_PSE_P1_FC);
-+      re->debug.int_stats.pse_p2_fc += !!(status & RAMIPS_PSE_P2_FC);
-+      re->debug.int_stats.pse_buf_drop += !!(status & RAMIPS_PSE_BUF_DROP);
-+}
-+
-+static ssize_t read_file_int_stats(struct file *file, char __user *user_buf,
-+                                 size_t count, loff_t *ppos)
-+{
-+#define PR_INT_STAT(_label, _field)                                   \
-+      len += snprintf(buf + len, sizeof(buf) - len,                   \
-+              "%-18s: %10lu\n", _label, re->debug.int_stats._field);
-+
-+      struct raeth_priv *re = file->private_data;
-+      char buf[512];
-+      unsigned int len = 0;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&re->page_lock, flags);
-+
-+      PR_INT_STAT("RX Delayed", rx_delayed);
-+      PR_INT_STAT("RX Done 0", rx_done0);
-+      PR_INT_STAT("RX Coherent", rx_coherent);
-+
-+      PR_INT_STAT("TX Delayed", tx_delayed);
-+      PR_INT_STAT("TX Done 0", tx_done0);
-+      PR_INT_STAT("TX Done 1", tx_done1);
-+      PR_INT_STAT("TX Done 2", tx_done2);
-+      PR_INT_STAT("TX Done 3", tx_done3);
-+      PR_INT_STAT("TX Coherent", tx_coherent);
-+
-+      PR_INT_STAT("PSE FQ empty", pse_fq_empty);
-+      PR_INT_STAT("CDMA Flow control", pse_p0_fc);
-+      PR_INT_STAT("GDMA1 Flow control", pse_p1_fc);
-+      PR_INT_STAT("GDMA2 Flow control", pse_p2_fc);
-+      PR_INT_STAT("PSE discard", pse_buf_drop);
-+
-+      len += snprintf(buf + len, sizeof(buf) - len, "\n");
-+      PR_INT_STAT("Total", total);
-+
-+      spin_unlock_irqrestore(&re->page_lock, flags);
-+
-+      return simple_read_from_buffer(user_buf, count, ppos, buf, len);
-+#undef PR_INT_STAT
-+}
-+
-+static const struct file_operations raeth_fops_int_stats = {
-+      .open   = raeth_debugfs_generic_open,
-+      .read   = read_file_int_stats,
-+      .owner  = THIS_MODULE
-+};
-+
-+void raeth_debugfs_exit(struct raeth_priv *re)
-+{
-+      debugfs_remove_recursive(re->debug.debugfs_dir);
-+}
-+
-+int raeth_debugfs_init(struct raeth_priv *re)
-+{
-+      re->debug.debugfs_dir = debugfs_create_dir(re->netdev->name,
-+                                                 raeth_debugfs_root);
-+      if (!re->debug.debugfs_dir)
-+              return -ENOMEM;
-+
-+      debugfs_create_file("int_stats", S_IRUGO, re->debug.debugfs_dir,
-+                          re, &raeth_fops_int_stats);
-+
-+      return 0;
-+}
-+
-+int raeth_debugfs_root_init(void)
-+{
-+      if (raeth_debugfs_root)
-+              return -EBUSY;
-+
-+      raeth_debugfs_root = debugfs_create_dir("raeth", NULL);
-+      if (!raeth_debugfs_root)
-+              return -ENOENT;
-+
-+      return 0;
-+}
-+
-+void raeth_debugfs_root_exit(void)
-+{
-+      debugfs_remove(raeth_debugfs_root);
-+      raeth_debugfs_root = NULL;
-+}
---- /dev/null
-+++ b/drivers/net/ethernet/ramips/ramips_esw.c
-@@ -0,0 +1,1221 @@
-+#include <linux/ioport.h>
-+#include <linux/switch.h>
-+#include <linux/mii.h>
-+
-+#include <ralink_regs.h>
-+#include <rt305x.h>
-+#include <rt305x_esw_platform.h>
-+
-+/*
-+ * HW limitations for this switch:
-+ * - No large frame support (PKT_MAX_LEN at most 1536)
-+ * - Can't have untagged vlan and tagged vlan on one port at the same time,
-+ *   though this might be possible using the undocumented PPE.
-+ */
-+
-+#define RT305X_ESW_REG_ISR            0x00
-+#define RT305X_ESW_REG_IMR            0x04
-+#define RT305X_ESW_REG_FCT0           0x08
-+#define RT305X_ESW_REG_PFC1           0x14
-+#define RT305X_ESW_REG_ATS            0x24
-+#define RT305X_ESW_REG_ATS0           0x28
-+#define RT305X_ESW_REG_ATS1           0x2c
-+#define RT305X_ESW_REG_ATS2           0x30
-+#define RT305X_ESW_REG_PVIDC(_n)      (0x40 + 4 * (_n))
-+#define RT305X_ESW_REG_VLANI(_n)      (0x50 + 4 * (_n))
-+#define RT305X_ESW_REG_VMSC(_n)               (0x70 + 4 * (_n))
-+#define RT305X_ESW_REG_POA            0x80
-+#define RT305X_ESW_REG_FPA            0x84
-+#define RT305X_ESW_REG_SOCPC          0x8c
-+#define RT305X_ESW_REG_POC0           0x90
-+#define RT305X_ESW_REG_POC1           0x94
-+#define RT305X_ESW_REG_POC2           0x98
-+#define RT305X_ESW_REG_SGC            0x9c
-+#define RT305X_ESW_REG_STRT           0xa0
-+#define RT305X_ESW_REG_PCR0           0xc0
-+#define RT305X_ESW_REG_PCR1           0xc4
-+#define RT305X_ESW_REG_FPA2           0xc8
-+#define RT305X_ESW_REG_FCT2           0xcc
-+#define RT305X_ESW_REG_SGC2           0xe4
-+#define RT305X_ESW_REG_P0LED          0xa4
-+#define RT305X_ESW_REG_P1LED          0xa8
-+#define RT305X_ESW_REG_P2LED          0xac
-+#define RT305X_ESW_REG_P3LED          0xb0
-+#define RT305X_ESW_REG_P4LED          0xb4
-+#define RT305X_ESW_REG_P0PC           0xe8
-+#define RT305X_ESW_REG_P1PC           0xec
-+#define RT305X_ESW_REG_P2PC           0xf0
-+#define RT305X_ESW_REG_P3PC           0xf4
-+#define RT305X_ESW_REG_P4PC           0xf8
-+#define RT305X_ESW_REG_P5PC           0xfc
-+
-+#define RT305X_ESW_LED_LINK           0
-+#define RT305X_ESW_LED_100M           1
-+#define RT305X_ESW_LED_DUPLEX         2
-+#define RT305X_ESW_LED_ACTIVITY               3
-+#define RT305X_ESW_LED_COLLISION      4
-+#define RT305X_ESW_LED_LINKACT                5
-+#define RT305X_ESW_LED_DUPLCOLL               6
-+#define RT305X_ESW_LED_10MACT         7
-+#define RT305X_ESW_LED_100MACT                8
-+/* Additional led states not in datasheet: */
-+#define RT305X_ESW_LED_BLINK          10
-+#define RT305X_ESW_LED_ON             12
-+
-+#define RT305X_ESW_LINK_S             25
-+#define RT305X_ESW_DUPLEX_S           9
-+#define RT305X_ESW_SPD_S              0
-+
-+#define RT305X_ESW_PCR0_WT_NWAY_DATA_S        16
-+#define RT305X_ESW_PCR0_WT_PHY_CMD    BIT(13)
-+#define RT305X_ESW_PCR0_CPU_PHY_REG_S 8
-+
-+#define RT305X_ESW_PCR1_WT_DONE               BIT(0)
-+
-+#define RT305X_ESW_ATS_TIMEOUT                (5 * HZ)
-+#define RT305X_ESW_PHY_TIMEOUT                (5 * HZ)
-+
-+#define RT305X_ESW_PVIDC_PVID_M               0xfff
-+#define RT305X_ESW_PVIDC_PVID_S               12
-+
-+#define RT305X_ESW_VLANI_VID_M                0xfff
-+#define RT305X_ESW_VLANI_VID_S                12
-+
-+#define RT305X_ESW_VMSC_MSC_M         0xff
-+#define RT305X_ESW_VMSC_MSC_S         8
-+
-+#define RT305X_ESW_SOCPC_DISUN2CPU_S  0
-+#define RT305X_ESW_SOCPC_DISMC2CPU_S  8
-+#define RT305X_ESW_SOCPC_DISBC2CPU_S  16
-+#define RT305X_ESW_SOCPC_CRC_PADDING  BIT(25)
-+
-+#define RT305X_ESW_POC0_EN_BP_S               0
-+#define RT305X_ESW_POC0_EN_FC_S               8
-+#define RT305X_ESW_POC0_DIS_RMC2CPU_S 16
-+#define RT305X_ESW_POC0_DIS_PORT_M    0x7f
-+#define RT305X_ESW_POC0_DIS_PORT_S    23
-+
-+#define RT305X_ESW_POC2_UNTAG_EN_M    0xff
-+#define RT305X_ESW_POC2_UNTAG_EN_S    0
-+#define RT305X_ESW_POC2_ENAGING_S     8
-+#define RT305X_ESW_POC2_DIS_UC_PAUSE_S        16
-+
-+#define RT305X_ESW_SGC2_DOUBLE_TAG_M  0x7f
-+#define RT305X_ESW_SGC2_DOUBLE_TAG_S  0
-+#define RT305X_ESW_SGC2_LAN_PMAP_M    0x3f
-+#define RT305X_ESW_SGC2_LAN_PMAP_S    24
-+
-+#define RT305X_ESW_PFC1_EN_VLAN_M     0xff
-+#define RT305X_ESW_PFC1_EN_VLAN_S     16
-+#define RT305X_ESW_PFC1_EN_TOS_S      24
-+
-+#define RT305X_ESW_VLAN_NONE          0xfff
-+
-+#define RT305X_ESW_POA_LINK_MASK      0x1f
-+#define RT305X_ESW_POA_LINK_SHIFT     25
-+
-+#define RT305X_ESW_PORT_ST_CHG                BIT(26)
-+#define RT305X_ESW_PORT0              0
-+#define RT305X_ESW_PORT1              1
-+#define RT305X_ESW_PORT2              2
-+#define RT305X_ESW_PORT3              3
-+#define RT305X_ESW_PORT4              4
-+#define RT305X_ESW_PORT5              5
-+#define RT305X_ESW_PORT6              6
-+
-+#define RT305X_ESW_PORTS_NONE         0
-+
-+#define RT305X_ESW_PMAP_LLLLLL                0x3f
-+#define RT305X_ESW_PMAP_LLLLWL                0x2f
-+#define RT305X_ESW_PMAP_WLLLLL                0x3e
-+
-+#define RT305X_ESW_PORTS_INTERNAL                                     \
-+              (BIT(RT305X_ESW_PORT0) | BIT(RT305X_ESW_PORT1) |        \
-+               BIT(RT305X_ESW_PORT2) | BIT(RT305X_ESW_PORT3) |        \
-+               BIT(RT305X_ESW_PORT4))
-+
-+#define RT305X_ESW_PORTS_NOCPU                                                \
-+              (RT305X_ESW_PORTS_INTERNAL | BIT(RT305X_ESW_PORT5))
-+
-+#define RT305X_ESW_PORTS_CPU  BIT(RT305X_ESW_PORT6)
-+
-+#define RT305X_ESW_PORTS_ALL                                          \
-+              (RT305X_ESW_PORTS_NOCPU | RT305X_ESW_PORTS_CPU)
-+
-+#define RT305X_ESW_NUM_VLANS          16
-+#define RT305X_ESW_NUM_VIDS           4096
-+#define RT305X_ESW_NUM_PORTS          7
-+#define RT305X_ESW_NUM_LANWAN         6
-+#define RT305X_ESW_NUM_LEDS           5
-+
-+enum {
-+      /* Global attributes. */
-+      RT305X_ESW_ATTR_ENABLE_VLAN,
-+      RT305X_ESW_ATTR_ALT_VLAN_DISABLE,
-+      /* Port attributes. */
-+      RT305X_ESW_ATTR_PORT_DISABLE,
-+      RT305X_ESW_ATTR_PORT_DOUBLETAG,
-+      RT305X_ESW_ATTR_PORT_UNTAG,
-+      RT305X_ESW_ATTR_PORT_LED,
-+      RT305X_ESW_ATTR_PORT_LAN,
-+      RT305X_ESW_ATTR_PORT_RECV_BAD,
-+      RT305X_ESW_ATTR_PORT_RECV_GOOD,
-+};
-+
-+struct rt305x_esw_port {
-+      bool    disable;
-+      bool    doubletag;
-+      bool    untag;
-+      u8      led;
-+      u16     pvid;
-+};
-+
-+struct rt305x_esw_vlan {
-+      u8      ports;
-+      u16     vid;
-+};
-+
-+struct rt305x_esw {
-+      struct device           *dev;
-+      void __iomem            *base;
-+      int                     irq;
-+      const struct rt305x_esw_platform_data *pdata;
-+      /* Protects against concurrent register rmw operations. */
-+      spinlock_t              reg_rw_lock;
-+
-+      unsigned char           port_map;
-+      unsigned int            reg_initval_fct2;
-+      unsigned int            reg_initval_fpa2;
-+
-+
-+      struct switch_dev       swdev;
-+      bool                    global_vlan_enable;
-+      bool                    alt_vlan_disable;
-+      struct rt305x_esw_vlan vlans[RT305X_ESW_NUM_VLANS];
-+      struct rt305x_esw_port ports[RT305X_ESW_NUM_PORTS];
-+
-+};
-+
-+static inline void
-+rt305x_esw_wr(struct rt305x_esw *esw, u32 val, unsigned reg)
-+{
-+      __raw_writel(val, esw->base + reg);
-+}
-+
-+static inline u32
-+rt305x_esw_rr(struct rt305x_esw *esw, unsigned reg)
-+{
-+      return __raw_readl(esw->base + reg);
-+}
-+
-+static inline void
-+rt305x_esw_rmw_raw(struct rt305x_esw *esw, unsigned reg, unsigned long mask,
-+                 unsigned long val)
-+{
-+      unsigned long t;
-+
-+      t = __raw_readl(esw->base + reg) & ~mask;
-+      __raw_writel(t | val, esw->base + reg);
-+}
-+
-+static void
-+rt305x_esw_rmw(struct rt305x_esw *esw, unsigned reg, unsigned long mask,
-+             unsigned long val)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&esw->reg_rw_lock, flags);
-+      rt305x_esw_rmw_raw(esw, reg, mask, val);
-+      spin_unlock_irqrestore(&esw->reg_rw_lock, flags);
-+}
-+
-+static u32
-+rt305x_mii_write(struct rt305x_esw *esw, u32 phy_addr, u32 phy_register,
-+               u32 write_data)
-+{
-+      unsigned long t_start = jiffies;
-+      int ret = 0;
-+
-+      while (1) {
-+              if (!(rt305x_esw_rr(esw, RT305X_ESW_REG_PCR1) &
-+                    RT305X_ESW_PCR1_WT_DONE))
-+                      break;
-+              if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
-+                      ret = 1;
-+                      goto out;
-+              }
-+      }
-+
-+      write_data &= 0xffff;
-+      rt305x_esw_wr(esw,
-+                    (write_data << RT305X_ESW_PCR0_WT_NWAY_DATA_S) |
-+                    (phy_register << RT305X_ESW_PCR0_CPU_PHY_REG_S) |
-+                    (phy_addr) | RT305X_ESW_PCR0_WT_PHY_CMD,
-+                    RT305X_ESW_REG_PCR0);
-+
-+      t_start = jiffies;
-+      while (1) {
-+              if (rt305x_esw_rr(esw, RT305X_ESW_REG_PCR1) &
-+                  RT305X_ESW_PCR1_WT_DONE)
-+                      break;
-+
-+              if (time_after(jiffies, t_start + RT305X_ESW_PHY_TIMEOUT)) {
-+                      ret = 1;
-+                      break;
-+              }
-+      }
-+out:
-+      if (ret)
-+              printk(KERN_ERR "ramips_eth: MDIO timeout\n");
-+      return ret;
-+}
-+
-+static unsigned
-+rt305x_esw_get_vlan_id(struct rt305x_esw *esw, unsigned vlan)
-+{
-+      unsigned s;
-+      unsigned val;
-+
-+      s = RT305X_ESW_VLANI_VID_S * (vlan % 2);
-+      val = rt305x_esw_rr(esw, RT305X_ESW_REG_VLANI(vlan / 2));
-+      val = (val >> s) & RT305X_ESW_VLANI_VID_M;
-+
-+      return val;
-+}
-+
-+static void
-+rt305x_esw_set_vlan_id(struct rt305x_esw *esw, unsigned vlan, unsigned vid)
-+{
-+      unsigned s;
-+
-+      s = RT305X_ESW_VLANI_VID_S * (vlan % 2);
-+      rt305x_esw_rmw(esw,
-+                     RT305X_ESW_REG_VLANI(vlan / 2),
-+                     RT305X_ESW_VLANI_VID_M << s,
-+                     (vid & RT305X_ESW_VLANI_VID_M) << s);
-+}
-+
-+static unsigned
-+rt305x_esw_get_pvid(struct rt305x_esw *esw, unsigned port)
-+{
-+      unsigned s, val;
-+
-+      s = RT305X_ESW_PVIDC_PVID_S * (port % 2);
-+      val = rt305x_esw_rr(esw, RT305X_ESW_REG_PVIDC(port / 2));
-+      return (val >> s) & RT305X_ESW_PVIDC_PVID_M;
-+}
-+
-+static void
-+rt305x_esw_set_pvid(struct rt305x_esw *esw, unsigned port, unsigned pvid)
-+{
-+      unsigned s;
-+
-+      s = RT305X_ESW_PVIDC_PVID_S * (port % 2);
-+      rt305x_esw_rmw(esw,
-+                     RT305X_ESW_REG_PVIDC(port / 2),
-+                     RT305X_ESW_PVIDC_PVID_M << s,
-+                     (pvid & RT305X_ESW_PVIDC_PVID_M) << s);
-+}
-+
-+static unsigned
-+rt305x_esw_get_vmsc(struct rt305x_esw *esw, unsigned vlan)
-+{
-+      unsigned s, val;
-+
-+      s = RT305X_ESW_VMSC_MSC_S * (vlan % 4);
-+      val = rt305x_esw_rr(esw, RT305X_ESW_REG_VMSC(vlan / 4));
-+      val = (val >> s) & RT305X_ESW_VMSC_MSC_M;
-+
-+      return val;
-+}
-+
-+static void
-+rt305x_esw_set_vmsc(struct rt305x_esw *esw, unsigned vlan, unsigned msc)
-+{
-+      unsigned s;
-+
-+      s = RT305X_ESW_VMSC_MSC_S * (vlan % 4);
-+      rt305x_esw_rmw(esw,
-+                     RT305X_ESW_REG_VMSC(vlan / 4),
-+                     RT305X_ESW_VMSC_MSC_M << s,
-+                     (msc & RT305X_ESW_VMSC_MSC_M) << s);
-+}
-+
-+static unsigned
-+rt305x_esw_get_port_disable(struct rt305x_esw *esw)
-+{
-+      unsigned reg;
-+      reg = rt305x_esw_rr(esw, RT305X_ESW_REG_POC0);
-+      return (reg >> RT305X_ESW_POC0_DIS_PORT_S) &
-+             RT305X_ESW_POC0_DIS_PORT_M;
-+}
-+
-+static void
-+rt305x_esw_set_port_disable(struct rt305x_esw *esw, unsigned disable_mask)
-+{
-+      unsigned old_mask;
-+      unsigned enable_mask;
-+      unsigned changed;
-+      int i;
-+
-+      old_mask = rt305x_esw_get_port_disable(esw);
-+      changed = old_mask ^ disable_mask;
-+      enable_mask = old_mask & disable_mask;
-+
-+      /* enable before writing to MII */
-+      rt305x_esw_rmw(esw, RT305X_ESW_REG_POC0,
-+                     (RT305X_ESW_POC0_DIS_PORT_M <<
-+                      RT305X_ESW_POC0_DIS_PORT_S),
-+                     enable_mask << RT305X_ESW_POC0_DIS_PORT_S);
-+
-+      for (i = 0; i < RT305X_ESW_NUM_LEDS; i++) {
-+              if (!(changed & (1 << i)))
-+                      continue;
-+              if (disable_mask & (1 << i)) {
-+                      /* disable */
-+                      rt305x_mii_write(esw, i, MII_BMCR,
-+                                       BMCR_PDOWN);
-+              } else {
-+                      /* enable */
-+                      rt305x_mii_write(esw, i, MII_BMCR,
-+                                       BMCR_FULLDPLX |
-+                                       BMCR_ANENABLE |
-+                                       BMCR_ANRESTART |
-+                                       BMCR_SPEED100);
-+              }
-+      }
-+
-+      /* disable after writing to MII */
-+      rt305x_esw_rmw(esw, RT305X_ESW_REG_POC0,
-+                     (RT305X_ESW_POC0_DIS_PORT_M <<
-+                      RT305X_ESW_POC0_DIS_PORT_S),
-+                     disable_mask << RT305X_ESW_POC0_DIS_PORT_S);
-+}
-+
-+static int
-+rt305x_esw_apply_config(struct switch_dev *dev);
-+
-+static void
-+rt305x_esw_hw_init(struct rt305x_esw *esw)
-+{
-+      int i;
-+      u8 port_disable = 0;
-+      u8 port_map = RT305X_ESW_PMAP_LLLLLL;
-+
-+      /* vodoo from original driver */
-+      rt305x_esw_wr(esw, 0xC8A07850, RT305X_ESW_REG_FCT0);
-+      rt305x_esw_wr(esw, 0x00000000, RT305X_ESW_REG_SGC2);
-+      /* Port priority 1 for all ports, vlan enabled. */
-+      rt305x_esw_wr(esw, 0x00005555 |
-+                    (RT305X_ESW_PORTS_ALL << RT305X_ESW_PFC1_EN_VLAN_S),
-+                    RT305X_ESW_REG_PFC1);
-+
-+      /* Enable Back Pressure, and Flow Control */
-+      rt305x_esw_wr(esw,
-+                    ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC0_EN_BP_S) |
-+                     (RT305X_ESW_PORTS_ALL << RT305X_ESW_POC0_EN_FC_S)),
-+                    RT305X_ESW_REG_POC0);
-+
-+      /* Enable Aging, and VLAN TAG removal */
-+      rt305x_esw_wr(esw,
-+                    ((RT305X_ESW_PORTS_ALL << RT305X_ESW_POC2_ENAGING_S) |
-+                     (RT305X_ESW_PORTS_NOCPU << RT305X_ESW_POC2_UNTAG_EN_S)),
-+                    RT305X_ESW_REG_POC2);
-+
-+      if (esw->reg_initval_fct2)
-+              rt305x_esw_wr(esw, esw->reg_initval_fct2, RT305X_ESW_REG_FCT2);
-+      else
-+              rt305x_esw_wr(esw, esw->pdata->reg_initval_fct2, RT305X_ESW_REG_FCT2);
-+
-+      /*
-+       * 300s aging timer, max packet len 1536, broadcast storm prevention
-+       * disabled, disable collision abort, mac xor48 hash, 10 packet back
-+       * pressure jam, GMII disable was_transmit, back pressure disabled,
-+       * 30ms led flash, unmatched IGMP as broadcast, rmc tb fault to all
-+       * ports.
-+       */
-+      rt305x_esw_wr(esw, 0x0008a301, RT305X_ESW_REG_SGC);
-+
-+      /* Setup SoC Port control register */
-+      rt305x_esw_wr(esw,
-+                    (RT305X_ESW_SOCPC_CRC_PADDING |
-+                     (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISUN2CPU_S) |
-+                     (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISMC2CPU_S) |
-+                     (RT305X_ESW_PORTS_CPU << RT305X_ESW_SOCPC_DISBC2CPU_S)),
-+                    RT305X_ESW_REG_SOCPC);
-+
-+      if (esw->reg_initval_fpa2)
-+              rt305x_esw_wr(esw, esw->reg_initval_fpa2, RT305X_ESW_REG_FPA2);
-+      else
-+              rt305x_esw_wr(esw, esw->pdata->reg_initval_fpa2, RT305X_ESW_REG_FPA2);
-+      rt305x_esw_wr(esw, 0x00000000, RT305X_ESW_REG_FPA);
-+
-+      /* Force Link/Activity on ports */
-+      rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P0LED);
-+      rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P1LED);
-+      rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P2LED);
-+      rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P3LED);
-+      rt305x_esw_wr(esw, 0x00000005, RT305X_ESW_REG_P4LED);
-+
-+      /* Copy disabled port configuration from bootloader setup */
-+      port_disable = rt305x_esw_get_port_disable(esw);
-+      for (i = 0; i < 6; i++)
-+              esw->ports[i].disable = (port_disable & (1 << i)) != 0;
-+
-+      rt305x_mii_write(esw, 0, 31, 0x8000);
-+      for (i = 0; i < 5; i++) {
-+              if (esw->ports[i].disable) {
-+                      rt305x_mii_write(esw, i, MII_BMCR, BMCR_PDOWN);
-+              } else {
-+                      rt305x_mii_write(esw, i, MII_BMCR,
-+                                       BMCR_FULLDPLX |
-+                                       BMCR_ANENABLE |
-+                                       BMCR_SPEED100);
-+              }
-+              /* TX10 waveform coefficient */
-+              rt305x_mii_write(esw, i, 26, 0x1601);
-+              /* TX100/TX10 AD/DA current bias */
-+              rt305x_mii_write(esw, i, 29, 0x7058);
-+              /* TX100 slew rate control */
-+              rt305x_mii_write(esw, i, 30, 0x0018);
-+      }
-+
-+      /* PHY IOT */
-+      /* select global register */
-+      rt305x_mii_write(esw, 0, 31, 0x0);
-+      /* tune TP_IDL tail and head waveform */
-+      rt305x_mii_write(esw, 0, 22, 0x052f);
-+      /* set TX10 signal amplitude threshold to minimum */
-+      rt305x_mii_write(esw, 0, 17, 0x0fe0);
-+      /* set squelch amplitude to higher threshold */
-+      rt305x_mii_write(esw, 0, 18, 0x40ba);
-+      /* longer TP_IDL tail length */
-+      rt305x_mii_write(esw, 0, 14, 0x65);
-+      /* select local register */
-+      rt305x_mii_write(esw, 0, 31, 0x8000);
-+
-+      if (esw->port_map)
-+              port_map = esw->port_map;
-+      else
-+              port_map = RT305X_ESW_PMAP_LLLLLL;
-+
-+      /*
-+       * Unused HW feature, but still nice to be consistent here...
-+       * This is also exported to userspace ('lan' attribute) so it's
-+       * conveniently usable to decide which ports go into the wan vlan by
-+       * default.
-+       */
-+      rt305x_esw_rmw(esw, RT305X_ESW_REG_SGC2,
-+                     RT305X_ESW_SGC2_LAN_PMAP_M << RT305X_ESW_SGC2_LAN_PMAP_S,
-+                     port_map << RT305X_ESW_SGC2_LAN_PMAP_S);
-+
-+      /* make the switch leds blink */
-+      for (i = 0; i < RT305X_ESW_NUM_LEDS; i++)
-+              esw->ports[i].led = 0x05;
-+
-+      /* Apply the empty config. */
-+      rt305x_esw_apply_config(&esw->swdev);
-+}
-+
-+static irqreturn_t
-+rt305x_esw_interrupt(int irq, void *_esw)
-+{
-+      struct rt305x_esw *esw = (struct rt305x_esw *) _esw;
-+      u32 status;
-+
-+      status = rt305x_esw_rr(esw, RT305X_ESW_REG_ISR);
-+      if (status & RT305X_ESW_PORT_ST_CHG) {
-+              u32 link = rt305x_esw_rr(esw, RT305X_ESW_REG_POA);
-+              link >>= RT305X_ESW_POA_LINK_SHIFT;
-+              link &= RT305X_ESW_POA_LINK_MASK;
-+              dev_info(esw->dev, "link changed 0x%02X\n", link);
-+      }
-+      rt305x_esw_wr(esw, RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_ISR);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static void
-+rt305x_esw_request_irq(struct rt305x_esw *esw)
-+{
-+      /* Only unmask the port change interrupt */
-+      rt305x_esw_wr(esw, ~RT305X_ESW_PORT_ST_CHG, RT305X_ESW_REG_IMR);
-+
-+      /* request the irq handler */
-+      request_irq(esw->irq, rt305x_esw_interrupt, 0, "esw", esw);
-+}
-+
-+static int
-+rt305x_esw_apply_config(struct switch_dev *dev)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      int i;
-+      u8 disable = 0;
-+      u8 doubletag = 0;
-+      u8 en_vlan = 0;
-+      u8 untag = 0;
-+
-+      for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
-+              u32 vid, vmsc;
-+              if (esw->global_vlan_enable) {
-+                      vid = esw->vlans[i].vid;
-+                      vmsc = esw->vlans[i].ports;
-+              } else {
-+                      vid = RT305X_ESW_VLAN_NONE;
-+                      vmsc = RT305X_ESW_PORTS_NONE;
-+              }
-+              rt305x_esw_set_vlan_id(esw, i, vid);
-+              rt305x_esw_set_vmsc(esw, i, vmsc);
-+      }
-+
-+      for (i = 0; i < RT305X_ESW_NUM_PORTS; i++) {
-+              u32 pvid;
-+              disable |= esw->ports[i].disable << i;
-+              if (esw->global_vlan_enable) {
-+                      doubletag |= esw->ports[i].doubletag << i;
-+                      en_vlan   |= 1                       << i;
-+                      untag     |= esw->ports[i].untag     << i;
-+                      pvid       = esw->ports[i].pvid;
-+              } else {
-+                      int x = esw->alt_vlan_disable ? 0 : 1;
-+                      doubletag |= x << i;
-+                      en_vlan   |= x << i;
-+                      untag     |= x << i;
-+                      pvid       = 0;
-+              }
-+              rt305x_esw_set_pvid(esw, i, pvid);
-+              if (i < RT305X_ESW_NUM_LEDS)
-+                      rt305x_esw_wr(esw, esw->ports[i].led,
-+                                    RT305X_ESW_REG_P0LED + 4*i);
-+      }
-+
-+      rt305x_esw_set_port_disable(esw, disable);
-+      rt305x_esw_rmw(esw, RT305X_ESW_REG_SGC2,
-+                     (RT305X_ESW_SGC2_DOUBLE_TAG_M <<
-+                      RT305X_ESW_SGC2_DOUBLE_TAG_S),
-+                     doubletag << RT305X_ESW_SGC2_DOUBLE_TAG_S);
-+      rt305x_esw_rmw(esw, RT305X_ESW_REG_PFC1,
-+                     RT305X_ESW_PFC1_EN_VLAN_M << RT305X_ESW_PFC1_EN_VLAN_S,
-+                     en_vlan << RT305X_ESW_PFC1_EN_VLAN_S);
-+      rt305x_esw_rmw(esw, RT305X_ESW_REG_POC2,
-+                     RT305X_ESW_POC2_UNTAG_EN_M << RT305X_ESW_POC2_UNTAG_EN_S,
-+                     untag << RT305X_ESW_POC2_UNTAG_EN_S);
-+
-+      if (!esw->global_vlan_enable) {
-+              /*
-+               * Still need to put all ports into vlan 0 or they'll be
-+               * isolated.
-+               * NOTE: vlan 0 is special, no vlan tag is prepended
-+               */
-+              rt305x_esw_set_vlan_id(esw, 0, 0);
-+              rt305x_esw_set_vmsc(esw, 0, RT305X_ESW_PORTS_ALL);
-+      }
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_reset_switch(struct switch_dev *dev)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      esw->global_vlan_enable = 0;
-+      memset(esw->ports, 0, sizeof(esw->ports));
-+      memset(esw->vlans, 0, sizeof(esw->vlans));
-+      rt305x_esw_hw_init(esw);
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_vlan_enable(struct switch_dev *dev,
-+                         const struct switch_attr *attr,
-+                         struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+
-+      val->value.i = esw->global_vlan_enable;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_set_vlan_enable(struct switch_dev *dev,
-+                         const struct switch_attr *attr,
-+                         struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+
-+      esw->global_vlan_enable = val->value.i != 0;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_alt_vlan_disable(struct switch_dev *dev,
-+                              const struct switch_attr *attr,
-+                              struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+
-+      val->value.i = esw->alt_vlan_disable;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_set_alt_vlan_disable(struct switch_dev *dev,
-+                              const struct switch_attr *attr,
-+                              struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+
-+      esw->alt_vlan_disable = val->value.i != 0;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_port_link(struct switch_dev *dev,
-+                       int port,
-+                       struct switch_port_link *link)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      u32 speed, poa;
-+
-+      if (port < 0 || port >= RT305X_ESW_NUM_PORTS)
-+              return -EINVAL;
-+
-+      poa = rt305x_esw_rr(esw, RT305X_ESW_REG_POA) >> port;
-+
-+      link->link = (poa >> RT305X_ESW_LINK_S) & 1;
-+      link->duplex = (poa >> RT305X_ESW_DUPLEX_S) & 1;
-+      if (port < RT305X_ESW_NUM_LEDS) {
-+              speed = (poa >> RT305X_ESW_SPD_S) & 1;
-+      } else {
-+              if (port == RT305X_ESW_NUM_PORTS - 1)
-+                      poa >>= 1;
-+              speed = (poa >> RT305X_ESW_SPD_S) & 3;
-+      }
-+      switch (speed) {
-+      case 0:
-+              link->speed = SWITCH_PORT_SPEED_10;
-+              break;
-+      case 1:
-+              link->speed = SWITCH_PORT_SPEED_100;
-+              break;
-+      case 2:
-+      case 3: /* forced gige speed can be 2 or 3 */
-+              link->speed = SWITCH_PORT_SPEED_1000;
-+              break;
-+      default:
-+              link->speed = SWITCH_PORT_SPEED_UNKNOWN;
-+              break;
-+      }
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_port_bool(struct switch_dev *dev,
-+                       const struct switch_attr *attr,
-+                       struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      int idx = val->port_vlan;
-+      u32 x, reg, shift;
-+
-+      if (idx < 0 || idx >= RT305X_ESW_NUM_PORTS)
-+              return -EINVAL;
-+
-+      switch (attr->id) {
-+      case RT305X_ESW_ATTR_PORT_DISABLE:
-+              reg = RT305X_ESW_REG_POC0;
-+              shift = RT305X_ESW_POC0_DIS_PORT_S;
-+              break;
-+      case RT305X_ESW_ATTR_PORT_DOUBLETAG:
-+              reg = RT305X_ESW_REG_SGC2;
-+              shift = RT305X_ESW_SGC2_DOUBLE_TAG_S;
-+              break;
-+      case RT305X_ESW_ATTR_PORT_UNTAG:
-+              reg = RT305X_ESW_REG_POC2;
-+              shift = RT305X_ESW_POC2_UNTAG_EN_S;
-+              break;
-+      case RT305X_ESW_ATTR_PORT_LAN:
-+              reg = RT305X_ESW_REG_SGC2;
-+              shift = RT305X_ESW_SGC2_LAN_PMAP_S;
-+              if (idx >= RT305X_ESW_NUM_LANWAN)
-+                      return -EINVAL;
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+
-+      x = rt305x_esw_rr(esw, reg);
-+      val->value.i = (x >> (idx + shift)) & 1;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_set_port_bool(struct switch_dev *dev,
-+                       const struct switch_attr *attr,
-+                       struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      int idx = val->port_vlan;
-+
-+      if (idx < 0 || idx >= RT305X_ESW_NUM_PORTS ||
-+          val->value.i < 0 || val->value.i > 1)
-+              return -EINVAL;
-+
-+      switch (attr->id) {
-+      case RT305X_ESW_ATTR_PORT_DISABLE:
-+              esw->ports[idx].disable = val->value.i;
-+              break;
-+      case RT305X_ESW_ATTR_PORT_DOUBLETAG:
-+              esw->ports[idx].doubletag = val->value.i;
-+              break;
-+      case RT305X_ESW_ATTR_PORT_UNTAG:
-+              esw->ports[idx].untag = val->value.i;
-+              break;
-+      default:
-+              return -EINVAL;
-+      }
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_port_recv_badgood(struct switch_dev *dev,
-+                               const struct switch_attr *attr,
-+                               struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      int idx = val->port_vlan;
-+      int shift = attr->id == RT305X_ESW_ATTR_PORT_RECV_GOOD ? 0 : 16;
-+      u32 reg;
-+
-+      if (idx < 0 || idx >= RT305X_ESW_NUM_LANWAN)
-+              return -EINVAL;
-+
-+      reg = rt305x_esw_rr(esw, RT305X_ESW_REG_P0PC + 4*idx);
-+      val->value.i = (reg >> shift) & 0xffff;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_port_led(struct switch_dev *dev,
-+                      const struct switch_attr *attr,
-+                      struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      int idx = val->port_vlan;
-+
-+      if (idx < 0 || idx >= RT305X_ESW_NUM_PORTS ||
-+          idx >= RT305X_ESW_NUM_LEDS)
-+              return -EINVAL;
-+
-+      val->value.i = rt305x_esw_rr(esw, RT305X_ESW_REG_P0LED + 4*idx);
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_set_port_led(struct switch_dev *dev,
-+                      const struct switch_attr *attr,
-+                      struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      int idx = val->port_vlan;
-+
-+      if (idx < 0 || idx >= RT305X_ESW_NUM_LEDS)
-+              return -EINVAL;
-+
-+      esw->ports[idx].led = val->value.i;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_port_pvid(struct switch_dev *dev, int port, int *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+
-+      if (port >= RT305X_ESW_NUM_PORTS)
-+              return -EINVAL;
-+
-+      *val = rt305x_esw_get_pvid(esw, port);
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_set_port_pvid(struct switch_dev *dev, int port, int val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+
-+      if (port >= RT305X_ESW_NUM_PORTS)
-+              return -EINVAL;
-+
-+      esw->ports[port].pvid = val;
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      u32 vmsc, poc2;
-+      int vlan_idx = -1;
-+      int i;
-+
-+      val->len = 0;
-+
-+      if (val->port_vlan < 0 || val->port_vlan >= RT305X_ESW_NUM_VIDS)
-+              return -EINVAL;
-+
-+      /* valid vlan? */
-+      for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
-+              if (rt305x_esw_get_vlan_id(esw, i) == val->port_vlan &&
-+                  rt305x_esw_get_vmsc(esw, i) != RT305X_ESW_PORTS_NONE) {
-+                      vlan_idx = i;
-+                      break;
-+              }
-+      }
-+
-+      if (vlan_idx == -1)
-+              return -EINVAL;
-+
-+      vmsc = rt305x_esw_get_vmsc(esw, vlan_idx);
-+      poc2 = rt305x_esw_rr(esw, RT305X_ESW_REG_POC2);
-+
-+      for (i = 0; i < RT305X_ESW_NUM_PORTS; i++) {
-+              struct switch_port *p;
-+              int port_mask = 1 << i;
-+
-+              if (!(vmsc & port_mask))
-+                      continue;
-+
-+              p = &val->value.ports[val->len++];
-+              p->id = i;
-+              if (poc2 & (port_mask << RT305X_ESW_POC2_UNTAG_EN_S))
-+                      p->flags = 0;
-+              else
-+                      p->flags = 1 << SWITCH_PORT_FLAG_TAGGED;
-+      }
-+
-+      return 0;
-+}
-+
-+static int
-+rt305x_esw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
-+{
-+      struct rt305x_esw *esw = container_of(dev, struct rt305x_esw, swdev);
-+      int ports;
-+      int vlan_idx = -1;
-+      int i;
-+
-+      if (val->port_vlan < 0 || val->port_vlan >= RT305X_ESW_NUM_VIDS ||
-+          val->len > RT305X_ESW_NUM_PORTS)
-+              return -EINVAL;
-+
-+      /* one of the already defined vlans? */
-+      for (i = 0; i < RT305X_ESW_NUM_VLANS; i++) {
-+              if (esw->vlans[i].vid == val->port_vlan &&
-+                  esw->vlans[i].ports != RT305X_ESW_PORTS_NONE) {
-+                      vlan_idx = i;
-+                      break;
-+              }
-+      }
-+
-+      /* select a free slot */
-+      for (i = 0; vlan_idx == -1 && i < RT305X_ESW_NUM_VLANS; i++) {
-+              if (esw->vlans[i].ports == RT305X_ESW_PORTS_NONE)
-+                      vlan_idx = i;
-+      }
-+
-+      /* bail if all slots are in use */
-+      if (vlan_idx == -1)
-+              return -EINVAL;
-+
-+      ports = RT305X_ESW_PORTS_NONE;
-+      for (i = 0; i < val->len; i++) {
-+              struct switch_port *p = &val->value.ports[i];
-+              int port_mask = 1 << p->id;
-+              bool untagged = !(p->flags & (1 << SWITCH_PORT_FLAG_TAGGED));
-+
-+              if (p->id >= RT305X_ESW_NUM_PORTS)
-+                      return -EINVAL;
-+
-+              ports |= port_mask;
-+              esw->ports[p->id].untag = untagged;
-+      }
-+      esw->vlans[vlan_idx].ports = ports;
-+      if (ports == RT305X_ESW_PORTS_NONE)
-+              esw->vlans[vlan_idx].vid = RT305X_ESW_VLAN_NONE;
-+      else
-+              esw->vlans[vlan_idx].vid = val->port_vlan;
-+
-+      return 0;
-+}
-+
-+static const struct switch_attr rt305x_esw_global[] = {
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "enable_vlan",
-+              .description = "VLAN mode (1:enabled)",
-+              .max = 1,
-+              .id = RT305X_ESW_ATTR_ENABLE_VLAN,
-+              .get = rt305x_esw_get_vlan_enable,
-+              .set = rt305x_esw_set_vlan_enable,
-+      },
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "alternate_vlan_disable",
-+              .description = "Use en_vlan instead of doubletag to disable"
-+                              " VLAN mode",
-+              .max = 1,
-+              .id = RT305X_ESW_ATTR_ALT_VLAN_DISABLE,
-+              .get = rt305x_esw_get_alt_vlan_disable,
-+              .set = rt305x_esw_set_alt_vlan_disable,
-+      },
-+};
-+
-+static const struct switch_attr rt305x_esw_port[] = {
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "disable",
-+              .description = "Port state (1:disabled)",
-+              .max = 1,
-+              .id = RT305X_ESW_ATTR_PORT_DISABLE,
-+              .get = rt305x_esw_get_port_bool,
-+              .set = rt305x_esw_set_port_bool,
-+      },
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "doubletag",
-+              .description = "Double tagging for incoming vlan packets "
-+                              "(1:enabled)",
-+              .max = 1,
-+              .id = RT305X_ESW_ATTR_PORT_DOUBLETAG,
-+              .get = rt305x_esw_get_port_bool,
-+              .set = rt305x_esw_set_port_bool,
-+      },
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "untag",
-+              .description = "Untag (1:strip outgoing vlan tag)",
-+              .max = 1,
-+              .id = RT305X_ESW_ATTR_PORT_UNTAG,
-+              .get = rt305x_esw_get_port_bool,
-+              .set = rt305x_esw_set_port_bool,
-+      },
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "led",
-+              .description = "LED mode (0:link, 1:100m, 2:duplex, 3:activity,"
-+                              " 4:collision, 5:linkact, 6:duplcoll, 7:10mact,"
-+                              " 8:100mact, 10:blink, 12:on)",
-+              .max = 15,
-+              .id = RT305X_ESW_ATTR_PORT_LED,
-+              .get = rt305x_esw_get_port_led,
-+              .set = rt305x_esw_set_port_led,
-+      },
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "lan",
-+              .description = "HW port group (0:wan, 1:lan)",
-+              .max = 1,
-+              .id = RT305X_ESW_ATTR_PORT_LAN,
-+              .get = rt305x_esw_get_port_bool,
-+      },
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "recv_bad",
-+              .description = "Receive bad packet counter",
-+              .id = RT305X_ESW_ATTR_PORT_RECV_BAD,
-+              .get = rt305x_esw_get_port_recv_badgood,
-+      },
-+      {
-+              .type = SWITCH_TYPE_INT,
-+              .name = "recv_good",
-+              .description = "Receive good packet counter",
-+              .id = RT305X_ESW_ATTR_PORT_RECV_GOOD,
-+              .get = rt305x_esw_get_port_recv_badgood,
-+      },
-+};
-+
-+static const struct switch_attr rt305x_esw_vlan[] = {
-+};
-+
-+static const struct switch_dev_ops rt305x_esw_ops = {
-+      .attr_global = {
-+              .attr = rt305x_esw_global,
-+              .n_attr = ARRAY_SIZE(rt305x_esw_global),
-+      },
-+      .attr_port = {
-+              .attr = rt305x_esw_port,
-+              .n_attr = ARRAY_SIZE(rt305x_esw_port),
-+      },
-+      .attr_vlan = {
-+              .attr = rt305x_esw_vlan,
-+              .n_attr = ARRAY_SIZE(rt305x_esw_vlan),
-+      },
-+      .get_vlan_ports = rt305x_esw_get_vlan_ports,
-+      .set_vlan_ports = rt305x_esw_set_vlan_ports,
-+      .get_port_pvid = rt305x_esw_get_port_pvid,
-+      .set_port_pvid = rt305x_esw_set_port_pvid,
-+      .get_port_link = rt305x_esw_get_port_link,
-+      .apply_config = rt305x_esw_apply_config,
-+      .reset_switch = rt305x_esw_reset_switch,
-+};
-+
-+static struct rt305x_esw_platform_data rt3050_esw_data = {
-+      /* All ports are LAN ports. */
-+      .vlan_config            = RT305X_ESW_VLAN_CONFIG_NONE,
-+      .reg_initval_fct2       = 0x00d6500c,
-+      /*
-+       * ext phy base addr 31, enable port 5 polling, rx/tx clock skew 1,
-+       * turbo mii off, rgmi 3.3v off
-+       * port5: disabled
-+       * port6: enabled, gige, full-duplex, rx/tx-flow-control
-+       */
-+      .reg_initval_fpa2       = 0x3f502b28,
-+};
-+
-+static const struct of_device_id ralink_esw_match[] = {
-+      { .compatible = "ralink,rt3050-esw", .data = &rt3050_esw_data },
-+      {},
-+};
-+MODULE_DEVICE_TABLE(of, ralink_esw_match);
-+
-+static int
-+rt305x_esw_probe(struct platform_device *pdev)
-+{
-+      struct device_node *np = pdev->dev.of_node;
-+      const struct rt305x_esw_platform_data *pdata;
-+      const __be32 *port_map, *reg_init;
-+      struct rt305x_esw *esw;
-+      struct switch_dev *swdev;
-+      struct resource *res, *irq;
-+      int err;
-+
-+      pdata = pdev->dev.platform_data;
-+      if (!pdata) {
-+              const struct of_device_id *match;
-+              match = of_match_device(ralink_esw_match, &pdev->dev);
-+              if (match)
-+                      pdata = (struct rt305x_esw_platform_data *) match->data;
-+      }
-+      if (!pdata)
-+              return -EINVAL;
-+
-+      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+      if (!res) {
-+              dev_err(&pdev->dev, "no memory resource found\n");
-+              return -ENOMEM;
-+      }
-+
-+      irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
-+      if (!irq) {
-+              dev_err(&pdev->dev, "no irq resource found\n");
-+              return -ENOMEM;
-+      }
-+
-+      esw = kzalloc(sizeof(struct rt305x_esw), GFP_KERNEL);
-+      if (!esw) {
-+              dev_err(&pdev->dev, "no memory for private data\n");
-+              return -ENOMEM;
-+      }
-+
-+      esw->dev = &pdev->dev;
-+      esw->irq = irq->start;
-+      esw->base = ioremap(res->start, resource_size(res));
-+      if (!esw->base) {
-+              dev_err(&pdev->dev, "ioremap failed\n");
-+              err = -ENOMEM;
-+              goto free_esw;
-+      }
-+
-+      port_map = of_get_property(np, "ralink,portmap", NULL);
-+        if (port_map)
-+              esw->port_map = be32_to_cpu(*port_map);
-+
-+      reg_init = of_get_property(np, "ralink,fct2", NULL);
-+        if (reg_init)
-+              esw->reg_initval_fct2 = be32_to_cpu(*reg_init);
-+
-+      reg_init = of_get_property(np, "ralink,fpa2", NULL);
-+        if (reg_init)
-+              esw->reg_initval_fpa2 = be32_to_cpu(*reg_init);
-+
-+      swdev = &esw->swdev;
-+      swdev->of_node = pdev->dev.of_node;
-+      swdev->name = "rt305x-esw";
-+      swdev->alias = "rt305x";
-+      swdev->cpu_port = RT305X_ESW_PORT6;
-+      swdev->ports = RT305X_ESW_NUM_PORTS;
-+      swdev->vlans = RT305X_ESW_NUM_VIDS;
-+      swdev->ops = &rt305x_esw_ops;
-+
-+      err = register_switch(swdev, NULL);
-+      if (err < 0) {
-+              dev_err(&pdev->dev, "register_switch failed\n");
-+              goto unmap_base;
-+      }
-+
-+      platform_set_drvdata(pdev, esw);
-+
-+      esw->pdata = pdata;
-+      spin_lock_init(&esw->reg_rw_lock);
-+      rt305x_esw_hw_init(esw);
-+      rt305x_esw_request_irq(esw);
-+
-+      return 0;
-+
-+unmap_base:
-+      iounmap(esw->base);
-+free_esw:
-+      kfree(esw);
-+      return err;
-+}
-+
-+static int
-+rt305x_esw_remove(struct platform_device *pdev)
-+{
-+      struct rt305x_esw *esw;
-+
-+      esw = platform_get_drvdata(pdev);
-+      if (esw) {
-+              unregister_switch(&esw->swdev);
-+              platform_set_drvdata(pdev, NULL);
-+              iounmap(esw->base);
-+              kfree(esw);
-+      }
-+
-+      return 0;
-+}
-+
-+static struct platform_driver rt305x_esw_driver = {
-+      .probe = rt305x_esw_probe,
-+      .remove = rt305x_esw_remove,
-+      .driver = {
-+              .name = "rt305x-esw",
-+              .owner = THIS_MODULE,
-+              .of_match_table = ralink_esw_match,
-+      },
-+};
-+
-+static int __init
-+rt305x_esw_init(void)
-+{
-+      return platform_driver_register(&rt305x_esw_driver);
-+}
-+
-+static void
-+rt305x_esw_exit(void)
-+{
-+      platform_driver_unregister(&rt305x_esw_driver);
-+}
---- /dev/null
-+++ b/drivers/net/ethernet/ramips/ramips_eth.h
-@@ -0,0 +1,375 @@
-+/*
-+ *   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; version 2 of the License
-+ *
-+ *   This program is distributed in the hope that it will be useful,
-+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *   GNU General Public License for more details.
-+ *
-+ *   You should have received a copy of the GNU General Public License
-+ *   along with this program; if not, write to the Free Software
-+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
-+ *
-+ *   based on Ralink SDK3.3
-+ *   Copyright (C) 2009 John Crispin <blogic@openwrt.org>
-+ */
-+
-+#ifndef RAMIPS_ETH_H
-+#define RAMIPS_ETH_H
-+
-+#include <linux/mii.h>
-+#include <linux/interrupt.h>
-+#include <linux/netdevice.h>
-+#include <linux/dma-mapping.h>
-+
-+#define NUM_RX_DESC     256
-+#define NUM_TX_DESC     256
-+
-+#define RAMIPS_DELAY_EN_INT           0x80
-+#define RAMIPS_DELAY_MAX_INT          0x04
-+#define RAMIPS_DELAY_MAX_TOUT         0x04
-+#define RAMIPS_DELAY_CHAN             (((RAMIPS_DELAY_EN_INT | RAMIPS_DELAY_MAX_INT) << 8) | RAMIPS_DELAY_MAX_TOUT)
-+#define RAMIPS_DELAY_INIT             ((RAMIPS_DELAY_CHAN << 16) | RAMIPS_DELAY_CHAN)
-+#define RAMIPS_PSE_FQFC_CFG_INIT      0x80504000
-+
-+/* interrupt bits */
-+#define RAMIPS_CNT_PPE_AF             BIT(31)
-+#define RAMIPS_CNT_GDM_AF             BIT(29)
-+#define RAMIPS_PSE_P2_FC              BIT(26)
-+#define RAMIPS_PSE_BUF_DROP           BIT(24)
-+#define RAMIPS_GDM_OTHER_DROP         BIT(23)
-+#define RAMIPS_PSE_P1_FC              BIT(22)
-+#define RAMIPS_PSE_P0_FC              BIT(21)
-+#define RAMIPS_PSE_FQ_EMPTY           BIT(20)
-+#define RAMIPS_GE1_STA_CHG            BIT(18)
-+#define RAMIPS_TX_COHERENT            BIT(17)
-+#define RAMIPS_RX_COHERENT            BIT(16)
-+#define RAMIPS_TX_DONE_INT3           BIT(11)
-+#define RAMIPS_TX_DONE_INT2           BIT(10)
-+#define RAMIPS_TX_DONE_INT1           BIT(9)
-+#define RAMIPS_TX_DONE_INT0           BIT(8)
-+#define RAMIPS_RX_DONE_INT0           BIT(2)
-+#define RAMIPS_TX_DLY_INT             BIT(1)
-+#define RAMIPS_RX_DLY_INT             BIT(0)
-+
-+#define RT5350_RX_DLY_INT             BIT(30)
-+#define RT5350_TX_DLY_INT             BIT(28)
-+
-+/* registers */
-+#define RAMIPS_FE_OFFSET              0x0000
-+#define RAMIPS_GDMA_OFFSET            0x0020
-+#define RAMIPS_PSE_OFFSET             0x0040
-+#define RAMIPS_GDMA2_OFFSET           0x0060
-+#define RAMIPS_CDMA_OFFSET            0x0080
-+#define RAMIPS_PDMA_OFFSET            0x0100
-+#define RAMIPS_PPE_OFFSET             0x0200
-+#define RAMIPS_CMTABLE_OFFSET         0x0400
-+#define RAMIPS_POLICYTABLE_OFFSET     0x1000
-+
-+#define RT5350_PDMA_OFFSET            0x0800
-+#define RT5350_SDM_OFFSET             0x0c00
-+
-+#define RAMIPS_MDIO_ACCESS            (RAMIPS_FE_OFFSET + 0x00)
-+#define RAMIPS_MDIO_CFG                       (RAMIPS_FE_OFFSET + 0x04)
-+#define RAMIPS_FE_GLO_CFG             (RAMIPS_FE_OFFSET + 0x08)
-+#define RAMIPS_FE_RST_GL              (RAMIPS_FE_OFFSET + 0x0C)
-+#define RAMIPS_FE_INT_STATUS          (RAMIPS_FE_OFFSET + 0x10)
-+#define RAMIPS_FE_INT_ENABLE          (RAMIPS_FE_OFFSET + 0x14)
-+#define RAMIPS_MDIO_CFG2              (RAMIPS_FE_OFFSET + 0x18)
-+#define RAMIPS_FOC_TS_T                       (RAMIPS_FE_OFFSET + 0x1C)
-+
-+#define       RAMIPS_GDMA1_FWD_CFG            (RAMIPS_GDMA_OFFSET + 0x00)
-+#define RAMIPS_GDMA1_SCH_CFG          (RAMIPS_GDMA_OFFSET + 0x04)
-+#define RAMIPS_GDMA1_SHPR_CFG         (RAMIPS_GDMA_OFFSET + 0x08)
-+#define RAMIPS_GDMA1_MAC_ADRL         (RAMIPS_GDMA_OFFSET + 0x0C)
-+#define RAMIPS_GDMA1_MAC_ADRH         (RAMIPS_GDMA_OFFSET + 0x10)
-+
-+#define       RAMIPS_GDMA2_FWD_CFG            (RAMIPS_GDMA2_OFFSET + 0x00)
-+#define RAMIPS_GDMA2_SCH_CFG          (RAMIPS_GDMA2_OFFSET + 0x04)
-+#define RAMIPS_GDMA2_SHPR_CFG         (RAMIPS_GDMA2_OFFSET + 0x08)
-+#define RAMIPS_GDMA2_MAC_ADRL         (RAMIPS_GDMA2_OFFSET + 0x0C)
-+#define RAMIPS_GDMA2_MAC_ADRH         (RAMIPS_GDMA2_OFFSET + 0x10)
-+
-+#define RAMIPS_PSE_FQ_CFG             (RAMIPS_PSE_OFFSET + 0x00)
-+#define RAMIPS_CDMA_FC_CFG            (RAMIPS_PSE_OFFSET + 0x04)
-+#define RAMIPS_GDMA1_FC_CFG           (RAMIPS_PSE_OFFSET + 0x08)
-+#define RAMIPS_GDMA2_FC_CFG           (RAMIPS_PSE_OFFSET + 0x0C)
-+
-+#define RAMIPS_CDMA_CSG_CFG           (RAMIPS_CDMA_OFFSET + 0x00)
-+#define RAMIPS_CDMA_SCH_CFG           (RAMIPS_CDMA_OFFSET + 0x04)
-+
-+#define RT5350_TX_BASE_PTR0           (RT5350_PDMA_OFFSET + 0x00)
-+#define RT5350_TX_MAX_CNT0            (RT5350_PDMA_OFFSET + 0x04)
-+#define RT5350_TX_CTX_IDX0            (RT5350_PDMA_OFFSET + 0x08)
-+#define RT5350_TX_DTX_IDX0            (RT5350_PDMA_OFFSET + 0x0C)
-+#define RT5350_TX_BASE_PTR1           (RT5350_PDMA_OFFSET + 0x10)
-+#define RT5350_TX_MAX_CNT1            (RT5350_PDMA_OFFSET + 0x14)
-+#define RT5350_TX_CTX_IDX1            (RT5350_PDMA_OFFSET + 0x18)
-+#define RT5350_TX_DTX_IDX1            (RT5350_PDMA_OFFSET + 0x1C)
-+#define RT5350_TX_BASE_PTR2           (RT5350_PDMA_OFFSET + 0x20)
-+#define RT5350_TX_MAX_CNT2            (RT5350_PDMA_OFFSET + 0x24)
-+#define RT5350_TX_CTX_IDX2            (RT5350_PDMA_OFFSET + 0x28)
-+#define RT5350_TX_DTX_IDX2            (RT5350_PDMA_OFFSET + 0x2C)
-+#define RT5350_TX_BASE_PTR3           (RT5350_PDMA_OFFSET + 0x30)
-+#define RT5350_TX_MAX_CNT3            (RT5350_PDMA_OFFSET + 0x34)
-+#define RT5350_TX_CTX_IDX3            (RT5350_PDMA_OFFSET + 0x38)
-+#define RT5350_TX_DTX_IDX3            (RT5350_PDMA_OFFSET + 0x3C)
-+#define RT5350_RX_BASE_PTR0           (RT5350_PDMA_OFFSET + 0x100)
-+#define RT5350_RX_MAX_CNT0            (RT5350_PDMA_OFFSET + 0x104)
-+#define RT5350_RX_CALC_IDX0           (RT5350_PDMA_OFFSET + 0x108)
-+#define RT5350_RX_DRX_IDX0            (RT5350_PDMA_OFFSET + 0x10C)
-+#define RT5350_RX_BASE_PTR1           (RT5350_PDMA_OFFSET + 0x110)
-+#define RT5350_RX_MAX_CNT1            (RT5350_PDMA_OFFSET + 0x114)
-+#define RT5350_RX_CALC_IDX1           (RT5350_PDMA_OFFSET + 0x118)
-+#define RT5350_RX_DRX_IDX1            (RT5350_PDMA_OFFSET + 0x11C)
-+#define RT5350_PDMA_GLO_CFG           (RT5350_PDMA_OFFSET + 0x204)
-+#define RT5350_PDMA_RST_CFG           (RT5350_PDMA_OFFSET + 0x208)
-+#define RT5350_DLY_INT_CFG            (RT5350_PDMA_OFFSET + 0x20c)
-+#define RT5350_FE_INT_STATUS          (RT5350_PDMA_OFFSET + 0x220)
-+#define RT5350_FE_INT_ENABLE          (RT5350_PDMA_OFFSET + 0x228)
-+#define RT5350_PDMA_SCH_CFG           (RT5350_PDMA_OFFSET + 0x280)
-+
-+
-+#define RAMIPS_PDMA_GLO_CFG           (RAMIPS_PDMA_OFFSET + 0x00)
-+#define RAMIPS_PDMA_RST_CFG           (RAMIPS_PDMA_OFFSET + 0x04)
-+#define RAMIPS_PDMA_SCH_CFG           (RAMIPS_PDMA_OFFSET + 0x08)
-+#define RAMIPS_DLY_INT_CFG            (RAMIPS_PDMA_OFFSET + 0x0C)
-+#define RAMIPS_TX_BASE_PTR0           (RAMIPS_PDMA_OFFSET + 0x10)
-+#define RAMIPS_TX_MAX_CNT0            (RAMIPS_PDMA_OFFSET + 0x14)
-+#define RAMIPS_TX_CTX_IDX0            (RAMIPS_PDMA_OFFSET + 0x18)
-+#define RAMIPS_TX_DTX_IDX0            (RAMIPS_PDMA_OFFSET + 0x1C)
-+#define RAMIPS_TX_BASE_PTR1           (RAMIPS_PDMA_OFFSET + 0x20)
-+#define RAMIPS_TX_MAX_CNT1            (RAMIPS_PDMA_OFFSET + 0x24)
-+#define RAMIPS_TX_CTX_IDX1            (RAMIPS_PDMA_OFFSET + 0x28)
-+#define RAMIPS_TX_DTX_IDX1            (RAMIPS_PDMA_OFFSET + 0x2C)
-+#define RAMIPS_RX_BASE_PTR0           (RAMIPS_PDMA_OFFSET + 0x30)
-+#define RAMIPS_RX_MAX_CNT0            (RAMIPS_PDMA_OFFSET + 0x34)
-+#define RAMIPS_RX_CALC_IDX0           (RAMIPS_PDMA_OFFSET + 0x38)
-+#define RAMIPS_RX_DRX_IDX0            (RAMIPS_PDMA_OFFSET + 0x3C)
-+#define RAMIPS_TX_BASE_PTR2           (RAMIPS_PDMA_OFFSET + 0x40)
-+#define RAMIPS_TX_MAX_CNT2            (RAMIPS_PDMA_OFFSET + 0x44)
-+#define RAMIPS_TX_CTX_IDX2            (RAMIPS_PDMA_OFFSET + 0x48)
-+#define RAMIPS_TX_DTX_IDX2            (RAMIPS_PDMA_OFFSET + 0x4C)
-+#define RAMIPS_TX_BASE_PTR3           (RAMIPS_PDMA_OFFSET + 0x50)
-+#define RAMIPS_TX_MAX_CNT3            (RAMIPS_PDMA_OFFSET + 0x54)
-+#define RAMIPS_TX_CTX_IDX3            (RAMIPS_PDMA_OFFSET + 0x58)
-+#define RAMIPS_TX_DTX_IDX3            (RAMIPS_PDMA_OFFSET + 0x5C)
-+#define RAMIPS_RX_BASE_PTR1           (RAMIPS_PDMA_OFFSET + 0x60)
-+#define RAMIPS_RX_MAX_CNT1            (RAMIPS_PDMA_OFFSET + 0x64)
-+#define RAMIPS_RX_CALC_IDX1           (RAMIPS_PDMA_OFFSET + 0x68)
-+#define RAMIPS_RX_DRX_IDX1            (RAMIPS_PDMA_OFFSET + 0x6C)
-+
-+#define RT5350_SDM_CFG                        (RT5350_SDM_OFFSET + 0x00)  //Switch DMA configuration
-+#define RT5350_SDM_RRING              (RT5350_SDM_OFFSET + 0x04)  //Switch DMA Rx Ring
-+#define RT5350_SDM_TRING              (RT5350_SDM_OFFSET + 0x08)  //Switch DMA Tx Ring
-+#define RT5350_SDM_MAC_ADRL           (RT5350_SDM_OFFSET + 0x0C)  //Switch MAC address LSB
-+#define RT5350_SDM_MAC_ADRH           (RT5350_SDM_OFFSET + 0x10)  //Switch MAC Address MSB
-+#define RT5350_SDM_TPCNT              (RT5350_SDM_OFFSET + 0x100) //Switch DMA Tx packet count
-+#define RT5350_SDM_TBCNT              (RT5350_SDM_OFFSET + 0x104) //Switch DMA Tx byte count
-+#define RT5350_SDM_RPCNT              (RT5350_SDM_OFFSET + 0x108) //Switch DMA rx packet count
-+#define RT5350_SDM_RBCNT              (RT5350_SDM_OFFSET + 0x10C) //Switch DMA rx byte count
-+#define RT5350_SDM_CS_ERR             (RT5350_SDM_OFFSET + 0x110) //Switch DMA rx checksum error count
-+
-+#define RT5350_SDM_ICS_EN             BIT(16)
-+#define RT5350_SDM_TCS_EN             BIT(17)
-+#define RT5350_SDM_UCS_EN             BIT(18)
-+
-+
-+/* MDIO_CFG register bits */
-+#define RAMIPS_MDIO_CFG_AUTO_POLL_EN  BIT(29)
-+#define RAMIPS_MDIO_CFG_GP1_BP_EN     BIT(16)
-+#define RAMIPS_MDIO_CFG_GP1_FRC_EN    BIT(15)
-+#define RAMIPS_MDIO_CFG_GP1_SPEED_10  (0 << 13)
-+#define RAMIPS_MDIO_CFG_GP1_SPEED_100 (1 << 13)
-+#define RAMIPS_MDIO_CFG_GP1_SPEED_1000        (2 << 13)
-+#define RAMIPS_MDIO_CFG_GP1_DUPLEX    BIT(12)
-+#define RAMIPS_MDIO_CFG_GP1_FC_TX     BIT(11)
-+#define RAMIPS_MDIO_CFG_GP1_FC_RX     BIT(10)
-+#define RAMIPS_MDIO_CFG_GP1_LNK_DWN   BIT(9)
-+#define RAMIPS_MDIO_CFG_GP1_AN_FAIL   BIT(8)
-+#define RAMIPS_MDIO_CFG_MDC_CLK_DIV_1 (0 << 6)
-+#define RAMIPS_MDIO_CFG_MDC_CLK_DIV_2 (1 << 6)
-+#define RAMIPS_MDIO_CFG_MDC_CLK_DIV_4 (2 << 6)
-+#define RAMIPS_MDIO_CFG_MDC_CLK_DIV_8 (3 << 6)
-+#define RAMIPS_MDIO_CFG_TURBO_MII_FREQ        BIT(5)
-+#define RAMIPS_MDIO_CFG_TURBO_MII_MODE        BIT(4)
-+#define RAMIPS_MDIO_CFG_RX_CLK_SKEW_0 (0 << 2)
-+#define RAMIPS_MDIO_CFG_RX_CLK_SKEW_200       (1 << 2)
-+#define RAMIPS_MDIO_CFG_RX_CLK_SKEW_400       (2 << 2)
-+#define RAMIPS_MDIO_CFG_RX_CLK_SKEW_INV       (3 << 2)
-+#define RAMIPS_MDIO_CFG_TX_CLK_SKEW_0 0
-+#define RAMIPS_MDIO_CFG_TX_CLK_SKEW_200       1
-+#define RAMIPS_MDIO_CFG_TX_CLK_SKEW_400       2
-+#define RAMIPS_MDIO_CFG_TX_CLK_SKEW_INV       3
-+
-+/* uni-cast port */
-+#define RAMIPS_GDM1_ICS_EN            BIT(22)
-+#define RAMIPS_GDM1_TCS_EN