add new lantiq target
authorblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 7 Jul 2011 19:56:18 +0000 (19:56 +0000)
committerblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Thu, 7 Jul 2011 19:56:18 +0000 (19:56 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@27546 3c298f89-4303-0410-b956-a3cf2f4a3e73

71 files changed:
target/linux/lantiq/Makefile [new file with mode: 0644]
target/linux/lantiq/ar9/config-2.6.32 [new file with mode: 0644]
target/linux/lantiq/ar9/profiles/000-generic.mk [new file with mode: 0644]
target/linux/lantiq/ar9/profiles/001-lantiq.mk [new file with mode: 0644]
target/linux/lantiq/ar9/profiles/002-netgear.mk [new file with mode: 0644]
target/linux/lantiq/ar9/target.mk [new file with mode: 0644]
target/linux/lantiq/ase/config-2.6.32 [new file with mode: 0644]
target/linux/lantiq/ase/profiles/000-generic.mk [new file with mode: 0644]
target/linux/lantiq/ase/profiles/001-lantiq.mk [new file with mode: 0644]
target/linux/lantiq/ase/target.mk [new file with mode: 0644]
target/linux/lantiq/base-files/etc/config/network [new file with mode: 0644]
target/linux/lantiq/base-files/etc/inittab [new file with mode: 0644]
target/linux/lantiq/base-files/lib/upgrade/platform.sh [new file with mode: 0755]
target/linux/lantiq/config-2.6.32 [new file with mode: 0644]
target/linux/lantiq/danube/config-2.6.32 [new file with mode: 0644]
target/linux/lantiq/danube/profiles/000-generic.mk [new file with mode: 0644]
target/linux/lantiq/danube/profiles/001-lantiq.mk [new file with mode: 0644]
target/linux/lantiq/danube/profiles/002-arcadyan.mk [new file with mode: 0644]
target/linux/lantiq/danube/profiles/003-gigaset.mk [new file with mode: 0644]
target/linux/lantiq/danube/target.mk [new file with mode: 0644]
target/linux/lantiq/falcon/config-default [new file with mode: 0644]
target/linux/lantiq/falcon/profiles/000-generic.mk [new file with mode: 0644]
target/linux/lantiq/falcon/profiles/001-lantiq.mk [new file with mode: 0644]
target/linux/lantiq/falcon/target.mk [new file with mode: 0644]
target/linux/lantiq/image/Makefile [new file with mode: 0644]
target/linux/lantiq/modules.mk [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0001-MIPS-Lantiq-Add-initial-support-for-Lantiq-SoCs.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0003-MIPS-Lantiq-Add-PCI-controller-support.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0004-MIPS-Lantiq-Add-NOR-flash-support.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0005-MIPS-Lantiq-Add-platform-device-support.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0006-MIPS-Lantiq-Add-mips_machine-support.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0007-MIPS-Lantiq-Add-machtypes-for-lantiq-eval-kits.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0008-MIPS-Lantiq-Add-more-gpio-drivers.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0009-SERIAL-Lantiq-Add-driver-for-MIPS-Lantiq-SOCs.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0010-MIPS-Lantiq-Add-DMA-support.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0011-MIPS-Lantiq-Add-ethernet-driver.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0012-MIPS-Lantiq-Add-etop-board-support.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0013-MIPS-Lantiq-Add-watchdog-support.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/0014-fix_mtd.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/100-falcon_header.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/110-falcon_board.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/120-falcon-i2c.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/130-falcon-spi-flash.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/140-falcon-easy98000-cpld-led.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/150-falcon-easy98020.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/160-falcon-95C3AM1.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/200-mach-arv45xx.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/210-mtd_uimage_split.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/220-atm_hack.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/230-cmdline_hack.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/240-udp_redirect.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/250-mt-vpe.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/260-ar9-cache-split.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/270-m25p80-fast-read.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/350-dm9000-polling.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/400-spi1.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/410-spi2.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/420-spi3.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/500-register_ebu.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/510-register_madwifi.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/520-register_buttons.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/530-register_tapi.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/540-gptu.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/550-dwc_otg.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/560-dev-leds-gpio.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/600-mach-dgn3500.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/700-mips-multi-machine-update.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/990-fix-asc-drv-timeout.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/990-fix-early_printk.patch [new file with mode: 0644]
target/linux/lantiq/patches-2.6.32/990-fix_include.patch [new file with mode: 0644]

diff --git a/target/linux/lantiq/Makefile b/target/linux/lantiq/Makefile
new file mode 100644 (file)
index 0000000..0c5413b
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# Copyright (C) 2007-2011 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+
+ARCH:=mips
+BOARD:=lantiq
+BOARDNAME:=Lantiq GPON/XWAY
+FEATURES:=squashfs jffs2
+SUBTARGETS:=falcon danube ar9 ase
+
+LINUX_VERSION:=2.6.32.33
+
+CFLAGS=-Os -pipe -mips32r2 -mtune=mips32r2 -fno-caller-saves
+
+define Target/Description
+       Build firmware images for Lantiq SoC
+endef
+
+include $(INCLUDE_DIR)/target.mk
+
+$(eval $(call BuildTarget))
diff --git a/target/linux/lantiq/ar9/config-2.6.32 b/target/linux/lantiq/ar9/config-2.6.32
new file mode 100644 (file)
index 0000000..eb81505
--- /dev/null
@@ -0,0 +1,30 @@
+CONFIG_ADM6996_PHY=y
+CONFIG_AR8216_PHY=y
+CONFIG_DEVPORT=y
+# CONFIG_DM9000 is not set
+CONFIG_HW_HAS_PCI=y
+# CONFIG_I2C_DESIGNWARE is not set
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_GPIO_BUTTONS is not set
+CONFIG_INPUT_POLLDEV=y
+# CONFIG_INPUT_YEALINK is not set
+# CONFIG_ISDN is not set
+CONFIG_LANTIQ_ETOP=y
+# CONFIG_LANTIQ_MACH_ARV45XX is not set
+# CONFIG_LANTIQ_MACH_EASY50712 is not set
+CONFIG_LANTIQ_MACH_NETGEAR=y
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_RTL8306_PHY=y
+# CONFIG_SOC_AMAZON_SE is not set
+# CONFIG_SOC_FALCON is not set
+CONFIG_SOC_TYPE_XWAY=y
+CONFIG_SOC_XWAY=y
+CONFIG_SPI=y
+CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_GPIO is not set
+CONFIG_SPI_MASTER=y
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_TC35815 is not set
+CONFIG_USB_SUPPORT=y
diff --git a/target/linux/lantiq/ar9/profiles/000-generic.mk b/target/linux/lantiq/ar9/profiles/000-generic.mk
new file mode 100644 (file)
index 0000000..787a74f
--- /dev/null
@@ -0,0 +1,6 @@
+define Profile/Generic
+  NAME:=Generic - all boards
+  PACKAGES:=kmod-leds-gpio button-hotplug
+endef
+
+$(eval $(call Profile,Generic))
diff --git a/target/linux/lantiq/ar9/profiles/001-lantiq.mk b/target/linux/lantiq/ar9/profiles/001-lantiq.mk
new file mode 100644 (file)
index 0000000..f55f223
--- /dev/null
@@ -0,0 +1,10 @@
+define Profile/EASY50812
+  NAME:=EASY50812
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio
+endef
+
+define Profile/EASY50812/Description
+       Lantiq EASY50812 evalkit
+endef
+
+$(eval $(call Profile,EASY50812))
diff --git a/target/linux/lantiq/ar9/profiles/002-netgear.mk b/target/linux/lantiq/ar9/profiles/002-netgear.mk
new file mode 100644 (file)
index 0000000..51a98bb
--- /dev/null
@@ -0,0 +1,11 @@
+define Profile/DGN3500B
+  NAME:=DGN3500B
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio
+endef
+
+define Profile/DGN3500B/Description
+       Netgear DGN3500B
+endef
+
+$(eval $(call Profile,DGN3500B))
+
diff --git a/target/linux/lantiq/ar9/target.mk b/target/linux/lantiq/ar9/target.mk
new file mode 100644 (file)
index 0000000..a04384e
--- /dev/null
@@ -0,0 +1,10 @@
+ARCH:=mips
+SUBTARGET:=ar9
+BOARDNAME:=AR9
+FEATURES:=squashfs jffs2 atm
+
+DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app swconfig
+
+define Target/Description
+       Lantiq XWAY (danube/twinpass/ar9)
+endef
diff --git a/target/linux/lantiq/ase/config-2.6.32 b/target/linux/lantiq/ase/config-2.6.32
new file mode 100644 (file)
index 0000000..eeea0be
--- /dev/null
@@ -0,0 +1,13 @@
+# CONFIG_DM9000 is not set
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_GPIO_BUTTONS is not set
+CONFIG_INPUT_POLLDEV=y
+# CONFIG_ISDN is not set
+CONFIG_LANTIQ_ETOP=y
+CONFIG_LANTIQ_MACH_EASY50601=y
+CONFIG_SOC_AMAZON_SE=y
+# CONFIG_SOC_FALCON is not set
+CONFIG_SOC_TYPE_XWAY=y
+# CONFIG_SOC_XWAY is not set
+# CONFIG_I2C_DESIGNWARE is not set
diff --git a/target/linux/lantiq/ase/profiles/000-generic.mk b/target/linux/lantiq/ase/profiles/000-generic.mk
new file mode 100644 (file)
index 0000000..787a74f
--- /dev/null
@@ -0,0 +1,6 @@
+define Profile/Generic
+  NAME:=Generic - all boards
+  PACKAGES:=kmod-leds-gpio button-hotplug
+endef
+
+$(eval $(call Profile,Generic))
diff --git a/target/linux/lantiq/ase/profiles/001-lantiq.mk b/target/linux/lantiq/ase/profiles/001-lantiq.mk
new file mode 100644 (file)
index 0000000..dd763bd
--- /dev/null
@@ -0,0 +1,10 @@
+define Profile/EASY50601
+  NAME:=EASY50601
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio
+endef
+
+define Profile/EASY50601/Description
+       Lantiq EASY50601 evalkit
+endef
+
+$(eval $(call Profile,EASY50601))
diff --git a/target/linux/lantiq/ase/target.mk b/target/linux/lantiq/ase/target.mk
new file mode 100644 (file)
index 0000000..343edf9
--- /dev/null
@@ -0,0 +1,10 @@
+ARCH:=mips
+SUBTARGET:=ase
+BOARDNAME:=Amazon-SE
+FEATURES:=squashfs jffs2 atm
+
+DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app
+
+define Target/Description
+       Lantiq ASE
+endef
diff --git a/target/linux/lantiq/base-files/etc/config/network b/target/linux/lantiq/base-files/etc/config/network
new file mode 100644 (file)
index 0000000..183e6bf
--- /dev/null
@@ -0,0 +1,26 @@
+config interface loopback
+       option ifname   lo
+       option proto    static
+       option ipaddr   127.0.0.1
+       option netmask  255.0.0.0
+
+config interface lan
+       option ifname   eth0
+       option type     bridge
+       option proto    static
+       option ipaddr   192.168.1.1
+       option netmask  255.255.255.0
+
+config atm-bridge
+       option unit             0
+       option encaps   llc
+       option vpi              1
+       option vci              32
+       option payload  bridged # some ISPs need this set to 'routed'
+
+config interface wan
+       option ifname   nas0
+       option proto    pppoe
+       option username ""
+       option password ""
+       option unit 0
diff --git a/target/linux/lantiq/base-files/etc/inittab b/target/linux/lantiq/base-files/etc/inittab
new file mode 100644 (file)
index 0000000..96afec9
--- /dev/null
@@ -0,0 +1,4 @@
+::sysinit:/etc/init.d/rcS S boot
+::shutdown:/etc/init.d/rcS K stop
+ttyLTQ0::askfirst:/bin/ash --login
+ttyLTQ1::askfirst:/bin/ash --login
diff --git a/target/linux/lantiq/base-files/lib/upgrade/platform.sh b/target/linux/lantiq/base-files/lib/upgrade/platform.sh
new file mode 100755 (executable)
index 0000000..247ba1a
--- /dev/null
@@ -0,0 +1,25 @@
+PART_NAME=linux
+
+platform_check_image() {
+       [ "$ARGC" -gt 1 ] && return 1
+
+       case "$(get_magic_word "$1")" in
+               # .trx files
+               2705) return 0;;
+               *)
+                       echo "Invalid image type"
+                       return 1
+               ;;
+       esac
+}
+
+# use default for platform_do_upgrade()
+
+disable_watchdog() {
+       killall watchdog
+       ( ps | grep -v 'grep' | grep '/dev/watchdog' ) && {
+               echo 'Could not disable watchdog'
+               return 1
+       }
+}
+append sysupgrade_pre_upgrade disable_watchdog
diff --git a/target/linux/lantiq/config-2.6.32 b/target/linux/lantiq/config-2.6.32
new file mode 100644 (file)
index 0000000..ecaff7e
--- /dev/null
@@ -0,0 +1,149 @@
+CONFIG_32BIT=y
+# CONFIG_64BIT is not set
+# CONFIG_ALCHEMY_GPIO_INDIRECT is not set
+# CONFIG_AR7 is not set
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+CONFIG_ARCH_HIBERNATION_POSSIBLE=y
+CONFIG_ARCH_POPULATES_NODE_MAP=y
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_ARCH_SUPPORTS_OPROFILE=y
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_BCM47XX is not set
+# CONFIG_BCM63XX is not set
+CONFIG_BITREVERSE=y
+CONFIG_BOOT_RAW=y
+# CONFIG_CAVIUM_OCTEON_REFERENCE_BOARD is not set
+# CONFIG_CAVIUM_OCTEON_SIMULATOR is not set
+CONFIG_CEVT_R4K=y
+CONFIG_CEVT_R4K_LIB=y
+CONFIG_CFG80211_DEFAULT_PS_VALUE=0
+CONFIG_CPU_BIG_ENDIAN=y
+# CONFIG_CPU_CAVIUM_OCTEON is not set
+CONFIG_CPU_HAS_PREFETCH=y
+CONFIG_CPU_HAS_SYNC=y
+# CONFIG_CPU_LITTLE_ENDIAN is not set
+# CONFIG_CPU_LOONGSON2E is not set
+CONFIG_CPU_MIPS32=y
+# CONFIG_CPU_MIPS32_R1 is not set
+CONFIG_CPU_MIPS32_R2=y
+# CONFIG_CPU_MIPS64_R1 is not set
+# CONFIG_CPU_MIPS64_R2 is not set
+CONFIG_CPU_MIPSR2=y
+# CONFIG_CPU_NEVADA is not set
+# CONFIG_CPU_R10000 is not set
+# CONFIG_CPU_R3000 is not set
+# CONFIG_CPU_R4300 is not set
+# CONFIG_CPU_R4X00 is not set
+# CONFIG_CPU_R5000 is not set
+# CONFIG_CPU_R5432 is not set
+# CONFIG_CPU_R5500 is not set
+# CONFIG_CPU_R6000 is not set
+# CONFIG_CPU_R8000 is not set
+# CONFIG_CPU_RM7000 is not set
+# CONFIG_CPU_RM9000 is not set
+# CONFIG_CPU_SB1 is not set
+CONFIG_CPU_SUPPORTS_32BIT_KERNEL=y
+CONFIG_CPU_SUPPORTS_HIGHMEM=y
+# CONFIG_CPU_TX39XX is not set
+# CONFIG_CPU_TX49XX is not set
+# CONFIG_CPU_VR41XX is not set
+CONFIG_CSRC_R4K=y
+CONFIG_CSRC_R4K_LIB=y
+CONFIG_DECOMPRESS_LZMA=y
+CONFIG_DMA_NEED_PCI_MAP_STATE=y
+CONFIG_DMA_NONCOHERENT=y
+CONFIG_EARLY_PRINTK=y
+# CONFIG_FSNOTIFY is not set
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_GENERIC_CMOS_UPDATE=y
+CONFIG_GENERIC_FIND_LAST_BIT=y
+CONFIG_GENERIC_FIND_NEXT_BIT=y
+CONFIG_GENERIC_GPIO=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_HARDWARE_WATCHPOINTS=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+CONFIG_HAVE_ARCH_KGDB=y
+CONFIG_HAVE_CLK=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_HAVE_IDE=y
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HW_RANDOM=y
+CONFIG_HZ=250
+# CONFIG_HZ_100 is not set
+CONFIG_HZ_250=y
+CONFIG_IFX_UDP_REDIRECT=y
+CONFIG_IMAGE_CMDLINE_HACK=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_IRQ_CPU=y
+CONFIG_LANTIQ=y
+CONFIG_LANTIQ_WDT=y
+CONFIG_LEDS_GPIO=y
+# CONFIG_MACH_ALCHEMY is not set
+# CONFIG_MACH_DECSTATION is not set
+# CONFIG_MACH_JAZZ is not set
+# CONFIG_MACH_LOONGSON is not set
+# CONFIG_MACH_TX39XX is not set
+# CONFIG_MACH_TX49XX is not set
+# CONFIG_MACH_VR41XX is not set
+# CONFIG_MIKROTIK_RB532 is not set
+CONFIG_MIPS=y
+# CONFIG_MIPS_COBALT is not set
+CONFIG_MIPS_L1_CACHE_SHIFT=5
+CONFIG_MIPS_MACHINE=y
+# CONFIG_MIPS_MALTA is not set
+CONFIG_MIPS_MT_DISABLED=y
+# CONFIG_MIPS_MT_SMP is not set
+# CONFIG_MIPS_MT_SMTC is not set
+# CONFIG_MIPS_SIM is not set
+# CONFIG_MIPS_VPE_LOADER is not set
+CONFIG_MTD_CFI_ADV_OPTIONS=y
+CONFIG_MTD_CFI_GEOMETRY=y
+CONFIG_MTD_CMDLINE_PARTS=y
+CONFIG_MTD_LANTIQ=y
+CONFIG_MTD_UIMAGE_SPLIT=y
+CONFIG_NLS=y
+# CONFIG_NO_IOPORT is not set
+# CONFIG_NXP_STB220 is not set
+# CONFIG_NXP_STB225 is not set
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_PHYLIB=y
+# CONFIG_PMC_MSP is not set
+# CONFIG_PMC_YOSEMITE is not set
+# CONFIG_PNX8550_JBS is not set
+# CONFIG_PNX8550_STB810 is not set
+CONFIG_SCHED_OMIT_FRAME_POINTER=y
+# CONFIG_SCSI_DMA is not set
+# CONFIG_SERIAL_8250 is not set
+CONFIG_SERIAL_LANTIQ=y
+# CONFIG_SGI_IP22 is not set
+# CONFIG_SGI_IP27 is not set
+# CONFIG_SGI_IP28 is not set
+# CONFIG_SGI_IP32 is not set
+# CONFIG_SIBYTE_BIGSUR is not set
+# CONFIG_SIBYTE_CARMEL is not set
+# CONFIG_SIBYTE_CRHINE is not set
+# CONFIG_SIBYTE_CRHONE is not set
+# CONFIG_SIBYTE_LITTLESUR is not set
+# CONFIG_SIBYTE_RHONE is not set
+# CONFIG_SIBYTE_SENTOSA is not set
+# CONFIG_SIBYTE_SWARM is not set
+CONFIG_SWAP_IO_SPACE=y
+CONFIG_SWCONFIG=y
+CONFIG_SYS_HAS_CPU_MIPS32_R1=y
+CONFIG_SYS_HAS_CPU_MIPS32_R2=y
+CONFIG_SYS_HAS_EARLY_PRINTK=y
+CONFIG_SYS_SUPPORTS_32BIT_KERNEL=y
+CONFIG_SYS_SUPPORTS_ARBIT_HZ=y
+CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
+CONFIG_SYS_SUPPORTS_MULTITHREADING=y
+CONFIG_TRAD_SIGNALS=y
+# CONFIG_TREE_PREEMPT_RCU is not set
+CONFIG_TREE_RCU=y
+CONFIG_ZONE_DMA_FLAG=0
diff --git a/target/linux/lantiq/danube/config-2.6.32 b/target/linux/lantiq/danube/config-2.6.32
new file mode 100644 (file)
index 0000000..11ed9c4
--- /dev/null
@@ -0,0 +1,30 @@
+CONFIG_ADM6996_PHY=y
+CONFIG_AR8216_PHY=y
+CONFIG_DEVPORT=y
+# CONFIG_DM9000 is not set
+CONFIG_HW_HAS_PCI=y
+# CONFIG_I2C_DESIGNWARE is not set
+CONFIG_INPUT=y
+CONFIG_INPUT_EVDEV=y
+# CONFIG_INPUT_GPIO_BUTTONS is not set
+CONFIG_INPUT_POLLDEV=y
+# CONFIG_INPUT_YEALINK is not set
+# CONFIG_ISDN is not set
+CONFIG_LANTIQ_ETOP=y
+CONFIG_LANTIQ_MACH_ARV45XX=y
+CONFIG_LANTIQ_MACH_EASY50712=y
+# CONFIG_LANTIQ_MACH_NETGEAR is not set
+CONFIG_PCI=y
+CONFIG_PCI_DOMAINS=y
+CONFIG_RTL8306_PHY=y
+# CONFIG_SOC_AMAZON_SE is not set
+# CONFIG_SOC_FALCON is not set
+CONFIG_SOC_TYPE_XWAY=y
+CONFIG_SOC_XWAY=y
+CONFIG_SPI=y
+CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_GPIO is not set
+CONFIG_SPI_MASTER=y
+# CONFIG_SPI_SPIDEV is not set
+# CONFIG_TC35815 is not set
+CONFIG_USB_SUPPORT=y
diff --git a/target/linux/lantiq/danube/profiles/000-generic.mk b/target/linux/lantiq/danube/profiles/000-generic.mk
new file mode 100644 (file)
index 0000000..787a74f
--- /dev/null
@@ -0,0 +1,6 @@
+define Profile/Generic
+  NAME:=Generic - all boards
+  PACKAGES:=kmod-leds-gpio button-hotplug
+endef
+
+$(eval $(call Profile,Generic))
diff --git a/target/linux/lantiq/danube/profiles/001-lantiq.mk b/target/linux/lantiq/danube/profiles/001-lantiq.mk
new file mode 100644 (file)
index 0000000..36b08a3
--- /dev/null
@@ -0,0 +1,10 @@
+define Profile/EASY50712
+  NAME:=EASY50712
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio
+endef
+
+define Profile/EASY50712/Description
+       Lantiq EASY50712 evalkit
+endef
+
+$(eval $(call Profile,EASY50712))
diff --git a/target/linux/lantiq/danube/profiles/002-arcadyan.mk b/target/linux/lantiq/danube/profiles/002-arcadyan.mk
new file mode 100644 (file)
index 0000000..79694f1
--- /dev/null
@@ -0,0 +1,101 @@
+define Profile/ARV3527P
+  NAME:=ARV3527P - Arcor Easybox 401
+  PACKAGES:=kmod-ledtrig-netdev kmod-leds-gpio kmod-button-hotplug kmod-ltq-dsl-firmware-b
+endef
+
+define Profile/ARV3527P/Description
+       Package set optimized for the ARV3527P
+endef
+
+$(eval $(call Profile,ARV3527P))
+
+define Profile/ARV4510PW
+  NAME:=ARV4510PW - Wippies Homebox
+  PACKAGES:= kmod-usb-core \
+       kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
+       kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-a
+endef
+
+define Profile/ARV4510PW/Description
+       Package set optimized for the ARV4518PW
+endef
+
+$(eval $(call Profile,ARV4510PW))
+
+define Profile/ARV4518PW
+  NAME:=ARV4518PW - SMC7908A
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
+       kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
+       kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-a
+endef
+
+define Profile/ARV4518PW/Description
+       Package set optimized for the ARV4518PW
+endef
+
+$(eval $(call Profile,ARV4518PW))
+
+define Profile/ARV4520PW
+  NAME:=ARV4520PW - Arcor Easybox 800
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
+       kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
+       kmod-rt61-pci wpad-mini kmod-ltq-dsl-firmware-b 
+endef
+
+define Profile/ARV4520PW/Description
+       Package set optimized for the ARV4520PW
+endef
+
+$(eval $(call Profile,ARV4520PW))
+
+define Profile/ARV4525PW
+  NAME:=ARV4525PW - Speedport W502V
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
+       kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
+       kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b
+endef
+
+define Profile/ARV4525PW/Description
+       Package set optimized for the ARV4525PW
+endef
+
+$(eval $(call Profile,ARV4525PW))
+
+define Profile/ARV452CPW
+  NAME:=ARV452CPW - Arcor Easybox 801
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
+       kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
+       kmod-madwifi wpad-mini kmod-ltq-dsl-firmware-b
+endef
+
+define Profile/ARV452CPW/Description
+       Package set optimized for the ARV452CPW
+endef
+
+$(eval $(call Profile,ARV452CPW))
+
+define Profile/ARV752DPW22
+  NAME:=ARV752DPW22 - Arcor Easybox 803
+  PACKAGES:= kmod-usb-core kmod-usb2 kmod-usb-uhci kmod-usb-dwc-otg \
+       kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
+       kmod-ltq-dsl-firmware-b
+endef
+
+define Profile/ARV752DPW22/Description
+       Package set optimized for the ARV752PW22
+endef
+
+$(eval $(call Profile,ARV752DPW22))
+
+define Profile/ARV7518PW
+  NAME:=ARV7518PW - ASTORIA
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg \
+       kmod-ledtrig-netdev kmod-ledtrig-usbdev kmod-leds-gpio kmod-button-hotplug \
+       kmod-ath9k wpad-mini ltq-dsl-firmware-a swconfig
+endef
+
+define Profile/ARV7518PW/Description
+       Package set optimized for the ARV7518PW
+endef
+
+$(eval $(call Profile,ARV7518PW))
diff --git a/target/linux/lantiq/danube/profiles/003-gigaset.mk b/target/linux/lantiq/danube/profiles/003-gigaset.mk
new file mode 100644 (file)
index 0000000..844b411
--- /dev/null
@@ -0,0 +1,11 @@
+define Profile/GIGASX76X
+  NAME:=GIGASX76X - Gigaset SX761,SX762,SX763
+  PACKAGES:= kmod-usb-core kmod-usb-dwc-otg kmod-leds-gpio \
+        kmod-ltq-dsl-firmware-b kmod-ledtrig-usbdev 
+endef
+
+define Profile/GIGASX76X/Description
+       Package set optimized for the Gigaset SX76X routers
+endef
+
+$(eval $(call Profile,GIGASX76X))
diff --git a/target/linux/lantiq/danube/target.mk b/target/linux/lantiq/danube/target.mk
new file mode 100644 (file)
index 0000000..2fa1261
--- /dev/null
@@ -0,0 +1,10 @@
+ARCH:=mips
+SUBTARGET:=danube
+BOARDNAME:=Danube
+FEATURES:=squashfs jffs2 atm
+
+DEFAULT_PACKAGES+=kmod-pppoa ppp-mod-pppoa linux-atm atm-tools br2684ctl kmod-ltq-dsl ltq-dsl-app swconfig
+
+define Target/Description
+       Lantiq Danube/Twinpass
+endef
diff --git a/target/linux/lantiq/falcon/config-default b/target/linux/lantiq/falcon/config-default
new file mode 100644 (file)
index 0000000..0a46b45
--- /dev/null
@@ -0,0 +1,29 @@
+CONFIG_CPU_MIPSR2_IRQ_EI=y
+CONFIG_CPU_MIPSR2_IRQ_VI=y
+CONFIG_DM9000=y
+CONFIG_DM9000_DEBUGLEVEL=4
+CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL=y
+# CONFIG_I2C_DESIGNWARE is not set
+CONFIG_IFX_VPE_CACHE_SPLIT=y
+CONFIG_IFX_VPE_EXT=y
+CONFIG_LANTIQ_MACH_95C3AM1=y
+CONFIG_LANTIQ_MACH_EASY98000=y
+CONFIG_LANTIQ_MACH_EASY98020=y
+CONFIG_M25PXX_USE_FAST_READ=y
+CONFIG_MIPS_MT=y
+# CONFIG_MIPS_VPE_APSP_API is not set
+CONFIG_MIPS_VPE_LOADER=y
+CONFIG_MIPS_VPE_LOADER_TOM=y
+CONFIG_MTD_M25P80=y
+CONFIG_MTSCHED=y
+# CONFIG_PERFCTRS is not set
+# CONFIG_SOC_AMAZON_SE is not set
+CONFIG_SOC_FALCON=y
+# CONFIG_SOC_TYPE_XWAY is not set
+# CONFIG_SOC_XWAY is not set
+CONFIG_SPI=y
+# CONFIG_SPI_BITBANG is not set
+CONFIG_SPI_FALCON=y
+# CONFIG_SPI_GPIO is not set
+CONFIG_SPI_MASTER=y
+# CONFIG_SPI_SPIDEV is not set
diff --git a/target/linux/lantiq/falcon/profiles/000-generic.mk b/target/linux/lantiq/falcon/profiles/000-generic.mk
new file mode 100644 (file)
index 0000000..a447bca
--- /dev/null
@@ -0,0 +1,13 @@
+define Profile/Generic
+  NAME:=Generic - all boards
+  PACKAGES:= \
+       kmod-leds-gpio \
+       kmod-dm9000 \
+       kmod-i2c-core kmod-i2c-algo-bit kmod-i2c-gpio kmod-eeprom-at24 \
+       kmod-spi-bitbang kmod-spi-gpio kmod-eeprom-at25 \
+       gpon-dti-agent
+endef
+
+$(eval $(call Profile,Generic))
+
+
diff --git a/target/linux/lantiq/falcon/profiles/001-lantiq.mk b/target/linux/lantiq/falcon/profiles/001-lantiq.mk
new file mode 100644 (file)
index 0000000..7ecc53e
--- /dev/null
@@ -0,0 +1,26 @@
+define Profile/EASY98000
+  NAME:=EASY98000
+  PACKAGES:= \
+       kmod-dm9000 \
+       kmod-i2c-core kmod-i2c-algo-bit kmod-i2c-gpio kmod-eeprom-at24 \
+       kmod-spi-bitbang kmod-spi-gpio kmod-eeprom-at25
+endef
+
+define Profile/EASY98000/Description
+       Lantiq EASY98000 evalkit
+endef
+
+$(eval $(call Profile,EASY98000))
+
+define Profile/EASY98020
+  NAME:=EASY98020
+  PACKAGES:= \
+       kmod-leds-gpio uboot-easy98020
+endef
+
+define Profile/EASY98020/Description
+       Lantiq EASY98020 evalkit
+endef
+
+$(eval $(call Profile,EASY98020))
+
diff --git a/target/linux/lantiq/falcon/target.mk b/target/linux/lantiq/falcon/target.mk
new file mode 100644 (file)
index 0000000..e8d9ecc
--- /dev/null
@@ -0,0 +1,13 @@
+ARCH:=mips
+SUBTARGET:=falcon
+BOARDNAME:=Falcon
+FEATURES:=squashfs jffs2
+DEVICE_TYPE:=other
+
+DEFAULT_PACKAGES+= kmod-ifxos gpon-base-files kmod-leds-gpio \
+       kmod-gpon-optic-drv gpon-optic-drv kmod-gpon-onu-drv gpon-onu-drv \
+       gpon-pe-firmware gpon-omci-api gpon-omci-onu gpon-luci
+
+define Target/Description
+       Lantiq Falcon
+endef
diff --git a/target/linux/lantiq/image/Makefile b/target/linux/lantiq/image/Makefile
new file mode 100644 (file)
index 0000000..f8d0ce7
--- /dev/null
@@ -0,0 +1,264 @@
+# 
+# Copyright (C) 2010 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/image.mk
+
+JFFS2_BLOCKSIZE = 64k 128k 256k
+
+ase_cmdline=-console=ttyLTQ1,115200 rootfstype=squashfs,jffs2
+xway_cmdline=-console=ttyLTQ1,115200 rootfstype=squashfs,jffs2
+falcon_cmdline=-console=ttyLTQ0,115200 rootfstype=squashfs,jffs2
+
+define CompressLzma
+  $(STAGING_DIR_HOST)/bin/lzma e $(1) $(2)
+endef
+
+define PatchKernelLzma
+       cp $(KDIR)/vmlinux $(KDIR)/vmlinux-$(1)
+       $(STAGING_DIR_HOST)/bin/patch-cmdline $(KDIR)/vmlinux-$(1) '$(strip $(2))'
+       $(call CompressLzma,$(KDIR)/vmlinux-$(1),$(KDIR)/vmlinux-$(1).lzma)
+endef
+
+define MkImageLzma
+       mkimage -A mips -O linux -T kernel -a 0x80002000 -C lzma \
+               -e 0x80002000 -n 'MIPS OpenWrt Linux-$(LINUX_VERSION)' \
+               -d $(KDIR)/vmlinux-$(1).lzma $(KDIR)/uImage-$(1)
+endef
+
+define Image/Build/squashfs
+       cat $(KDIR)/uImage-$(2) $(KDIR)/root.$(1) > $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(1).image
+       $(call prepare_generic_squashfs,$(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(1).image)
+endef
+
+define Image/Build/jffs2-64k
+       dd if=$(KDIR)/uImage-$(2) of=$(KDIR)/uImage-$(2)-$(1) bs=64k conv=sync
+       cat $(KDIR)/uImage-$(2)-$(1) $(KDIR)/root.$(1) > $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(1).image
+endef
+
+define Image/Build/jffs2-128k
+       dd if=$(KDIR)/uImage-$(2) of=$(KDIR)/uImage-$(2)-$(1) bs=128k conv=sync
+       cat $(KDIR)/uImage-$(2)-$(1) $(KDIR)/root.$(1) > $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(1).image
+endef
+
+define Image/Build/jffs2-256k
+       dd if=$(KDIR)/uImage-$(2) of=$(KDIR)/uImage-$(2)-$(1) bs=256k conv=sync
+       cat $(KDIR)/uImage-$(2)-$(1) $(KDIR)/root.$(1) > $(BIN_DIR)/$(IMG_PREFIX)-$(2)-$(1).image
+endef
+
+define Image/BuildKernel/Template
+       $(call PatchKernelLzma,$(1),$(if $(2),$(2) machtype=$(1),))
+       $(call MkImageLzma,$(1))
+       $(CP) $(KDIR)/uImage-$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(1)-uImage
+endef
+
+ifeq ($(CONFIG_TARGET_lantiq_danube),y)
+define Image/BuildKernel/Profile/EASY50712
+       $(call Image/BuildKernel/Template,EASY50712,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/EASY50712
+       $(call Image/Build/$(1),$(1),EASY50712)
+endef
+
+define Image/BuildKernel/Profile/EASY50812
+       $(call Image/BuildKernel/Template,EASY50812,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/EASY50812
+       $(call Image/Build/$(1),$(1),EASY50812)
+endef
+
+define Image/BuildKernel/Profile/ARV3527P
+       $(call Image/BuildKernel/Template,ARV3527P,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV3527P
+       $(call Image/Build/$(1),$(1),ARV3527P)
+endef
+
+define Image/BuildKernel/Profile/ARV4510PW
+       $(call Image/BuildKernel/Template,ARV4510PW,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV4510PW
+       $(call Image/Build/$(1),$(1),ARV4510PW)
+endef
+
+define Image/BuildKernel/Profile/ARV4518PW
+       $(call Image/BuildKernel/Template,ARV4518PW,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV4518PW
+       $(call Image/Build/$(1),$(1),ARV4518PW)
+endef
+
+define Image/BuildKernel/Profile/ARV4520PW
+       $(call Image/BuildKernel/Template,ARV4520PW,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV4520PW
+       $(call Image/Build/$(1),$(1),ARV4520PW)
+endef
+
+define Image/BuildKernel/Profile/ARV4525PW
+       $(call Image/BuildKernel/Template,ARV4525PW,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV4525PW
+       $(call Image/Build/$(1),$(1),ARV4525PW)
+endef
+
+define Image/BuildKernel/Profile/ARV452CPW
+       $(call Image/BuildKernel/Template,ARV452CPW,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV452CPW
+       $(call Image/Build/$(1),$(1),ARV452CPW)
+endef
+
+define Image/BuildKernel/Profile/ARV7518PW
+       $(call Image/BuildKernel/Template,ARV7518PW,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV7518PW
+       $(call Image/Build/$(1),$(1),ARV7518PW)
+endef
+
+define Image/BuildKernel/Profile/ARV752DPW22
+       $(call Image/BuildKernel/Template,ARV752DPW22,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/ARV752DPW22
+       $(call Image/Build/$(1),$(1),ARV752DPW22)
+endef
+
+define Image/BuildKernel/Profile/GIGASX76X
+       $(call Image/BuildKernel/Template,GIGASX76X,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/GIGASX76X
+       $(call Image/Build/$(1),$(1),GIGASX76X)
+endef
+
+define Image/BuildKernel/Profile/Generic
+       $(call Image/BuildKernel/Template,EASY4010,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,EASY50712,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,EASY50812,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV3527P,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV4510PW,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV4518PW,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV4520PW,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV452CPW,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV4525PW,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV7518PW,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV752DPW,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,ARV752DPW22,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,GIGASX76X,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,NONE)
+endef
+
+define Image/Build/Profile/Generic
+       $(call Image/Build/$(1),$(1),EASY4010)
+       $(call Image/Build/$(1),$(1),EASY50712)
+       $(call Image/Build/$(1),$(1),EASY50812)
+       $(call Image/Build/$(1),$(1),ARV3527P)
+       $(call Image/Build/$(1),$(1),ARV4510PW)
+       $(call Image/Build/$(1),$(1),ARV4518PW)
+       $(call Image/Build/$(1),$(1),ARV4520PW)
+       $(call Image/Build/$(1),$(1),ARV452CPW)
+       $(call Image/Build/$(1),$(1),ARV4525PW)
+       $(call Image/Build/$(1),$(1),ARV7518PW)
+       $(call Image/Build/$(1),$(1),ARV752DPW)
+       $(call Image/Build/$(1),$(1),ARV752DPW22)
+       $(call Image/Build/$(1),$(1),GIGASX76X)
+       $(call Image/Build/$(1),$(1),NONE)
+       $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(1).rootfs
+endef
+endif
+
+ifeq ($(CONFIG_TARGET_lantiq_ar9),y)
+define Image/BuildKernel/Profile/DGN3500B
+       $(call Image/BuildKernel/Template,DGN3500B,$(xway_cmdline))
+endef
+
+define Image/Build/Profile/DGN3500B
+       $(call Image/Build/$(1),$(1),DGN3500B)
+endef
+
+define Image/BuildKernel/Profile/Generic
+       $(call Image/BuildKernel/Template,DGN3500B,$(xway_cmdline))
+       $(call Image/BuildKernel/Template,NONE)
+endef
+
+define Image/Build/Profile/Generic
+       $(call Image/Build/$(1),$(1),DGN3500B)
+       $(call Image/Build/$(1),$(1),NONE)
+       $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(1).rootfs
+endef
+endif
+
+ifeq ($(CONFIG_TARGET_lantiq_falcon),y)
+define Image/BuildKernel/Profile/EASY98000
+       $(call Image/BuildKernel/Template,EASY98000,$(falcon_cmdline))
+endef
+
+define Image/Build/Profile/EASY98000
+       $(call Image/Build/$(1),$(1),EASY98000)
+endef
+
+define Image/BuildKernel/Profile/EASY98020
+       $(call Image/BuildKernel/Template,EASY98020,$(falcon_cmdline))
+endef
+
+define Image/Build/Profile/EASY98020
+       $(call Image/Build/$(1),$(1),EASY98020)
+endef
+
+define Image/BuildKernel/Profile/Generic
+       $(call Image/BuildKernel/Template,EASY98000,$(falcon_cmdline))
+       $(call Image/BuildKernel/Template,EASY98020,$(falcon_cmdline))
+       $(call Image/BuildKernel/Template,NONE)
+endef
+
+define Image/Build/Profile/Generic
+       $(call Image/Build/$(1),$(1),EASY98000)
+       $(call Image/Build/$(1),$(1),EASY98020)
+       $(call Image/Build/$(1),$(1),NONE)
+       $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(1).rootfs
+endef
+endif
+
+ifeq ($(CONFIG_TARGET_lantiq_ase),y)
+define Image/BuildKernel/Profile/EASY50601
+       $(call Image/BuildKernel/Template,EASY50601,$(ase_cmdline))
+endef
+
+define Image/Build/Profile/EASY50601
+       $(call Image/Build/$(1),$(1),EASY50601)
+endef
+
+define Image/BuildKernel/Profile/Generic
+       $(call Image/BuildKernel/Template,EASY50601,$(ase_cmdline))
+       $(call Image/BuildKernel/Template,NONE)
+endef
+
+define Image/Build/Profile/Generic
+       $(call Image/Build/$(1),$(1),EASY50601)
+       $(call Image/Build/$(1),$(1),NONE)
+       $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(1).rootfs
+endef
+endif
+
+define Image/BuildKernel
+       $(call Image/BuildKernel/Profile/$(PROFILE))
+endef
+
+define Image/Build
+       $(call Image/Build/Profile/$(PROFILE),$(1))
+endef
+
+$(eval $(call BuildImage))
diff --git a/target/linux/lantiq/modules.mk b/target/linux/lantiq/modules.mk
new file mode 100644 (file)
index 0000000..de9a249
--- /dev/null
@@ -0,0 +1,67 @@
+#
+# Copyright (C) 2010 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+CRYPTO_MENU:=Cryptographic API modules
+
+define KernelPackage/lantiq-deu
+  TITLE:=Lantiq data encryption unit
+  SUBMENU:=$(CRYPTO_MENU)
+  DEPENDS:=@TARGET_lantiq
+  KCONFIG:=CONFIG_CRYPTO_DEV_LANTIQ \
+          CONFIG_CRYPTO_HW=y \
+          CONFIG_CRYPTO_DEV_LANTIQ_AES=y \
+          CONFIG_CRYPTO_DEV_LANTIQ_DES=y \
+          CONFIG_CRYPTO_DEV_LANTIQ_MD5=y \
+          CONFIG_CRYPTO_DEV_LANTIQ_SHA1=y
+  DEPENDS+=@TARGET_lantiq +kmod-crypto-core
+endef
+
+define KernelPackage/lantiq-deu/description
+  Kernel support for the Lantiq crypto HW
+endef
+
+$(eval $(call KernelPackage,lantiq-deu))
+
+USB_MENU:=USB Support
+
+define KernelPackage/usb-dwc-otg
+  TITLE:=Synopsis DWC_OTG support
+  SUBMENU:=$(USB_MENU)
+  DEPENDS+=@TARGET_lantiq_danube +kmod-usb-core
+  KCONFIG:=CONFIG_DWC_OTG \
+       CONFIG_DWC_OTG_DEBUG=n \
+       CONFIG_DWC_OTG_LANTIQ=y \
+       CONFIG_DWC_OTG_HOST_ONLY=y \
+       CONFIG_DWC_OTG_DEVICE_ONLY=n
+  FILES:=$(LINUX_DIR)/drivers/usb/dwc_otg/dwc_otg.ko
+  AUTOLOAD:=$(call AutoLoad,50,dwc_otg)
+endef
+
+define KernelPackage/usb-dwc-otg/description
+  Kernel support for Synopsis USB on XWAY
+endef
+
+$(eval $(call KernelPackage,usb-dwc-otg))
+
+I2C_FALCON_MODULES:= \
+  CONFIG_I2C_FALCON:drivers/i2c/busses/i2c-falcon
+
+define KernelPackage/i2c-falcon-lantiq
+  TITLE:=Falcon I2C controller
+  SUBMENU:=I2C support
+  DEPENDS:=kmod-i2c-core @TARGET_lantiq_falcon
+  KCONFIG:=CONFIG_I2C_FALCON
+  FILES:=$(LINUX_DIR)/drivers/i2c/busses/i2c-falcon.ko
+  AUTOLOAD:=$(call AutoLoad,52,i2c-falcon)
+endef
+
+define KernelPackage/i2c-falcon-lantiq/description
+  Kernel support for the Falcon I2C controller
+endef
+
+$(eval $(call KernelPackage,i2c-falcon-lantiq))
+
diff --git a/target/linux/lantiq/patches-2.6.32/0001-MIPS-Lantiq-Add-initial-support-for-Lantiq-SoCs.patch b/target/linux/lantiq/patches-2.6.32/0001-MIPS-Lantiq-Add-initial-support-for-Lantiq-SoCs.patch
new file mode 100644 (file)
index 0000000..6131577
--- /dev/null
@@ -0,0 +1,898 @@
+From 9e0235e97ea2617beaacaa16ab5f0b9e75f4680e Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Wed, 30 Mar 2011 09:27:47 +0200
+Subject: [PATCH 01/13] MIPS: Lantiq: Add initial support for Lantiq SoCs
+
+Add initial support for Mips based SoCs made by Lantiq. This series will add
+support for the XWAY family.
+
+The series allows booting a minimal system using a initramfs or NOR. Missing
+drivers and support for Amazon and GPON family will be provided in a later
+series.
+
+[Ralf: Remove some cargo cult programming and fixed formatting.]
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Signed-off-by: David Daney <ddaney@caviumnetworks.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2252/
+Patchwork: https://patchwork.linux-mips.org/patch/2371/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/Kbuild.platforms                 |    1 +
+ arch/mips/Kconfig                          |   17 ++
+ arch/mips/include/asm/mach-lantiq/lantiq.h |   63 ++++++
+ arch/mips/include/asm/mach-lantiq/war.h    |   24 ++
+ arch/mips/lantiq/Makefile                  |    9 +
+ arch/mips/lantiq/Platform                  |    7 +
+ arch/mips/lantiq/clk.c                     |  140 ++++++++++++
+ arch/mips/lantiq/clk.h                     |   18 ++
+ arch/mips/lantiq/early_printk.c            |   33 +++
+ arch/mips/lantiq/irq.c                     |  326 ++++++++++++++++++++++++++++
+ arch/mips/lantiq/prom.c                    |   71 ++++++
+ arch/mips/lantiq/prom.h                    |   24 ++
+ arch/mips/lantiq/setup.c                   |   41 ++++
+ 13 files changed, 774 insertions(+), 0 deletions(-)
+ create mode 100644 arch/mips/include/asm/mach-lantiq/lantiq.h
+ create mode 100644 arch/mips/include/asm/mach-lantiq/war.h
+ create mode 100644 arch/mips/lantiq/Makefile
+ create mode 100644 arch/mips/lantiq/Platform
+ create mode 100644 arch/mips/lantiq/clk.c
+ create mode 100644 arch/mips/lantiq/clk.h
+ create mode 100644 arch/mips/lantiq/early_printk.c
+ create mode 100644 arch/mips/lantiq/irq.c
+ create mode 100644 arch/mips/lantiq/prom.c
+ create mode 100644 arch/mips/lantiq/prom.h
+ create mode 100644 arch/mips/lantiq/setup.c
+
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -174,6 +174,23 @@
+        Members include the Acer PICA, MIPS Magnum 4000, MIPS Millennium and
+        Olivetti M700-10 workstations.
++config LANTIQ
++      bool "Lantiq based platforms"
++      select DMA_NONCOHERENT
++      select IRQ_CPU
++      select CEVT_R4K
++      select CSRC_R4K
++      select SYS_HAS_CPU_MIPS32_R1
++      select SYS_HAS_CPU_MIPS32_R2
++      select SYS_SUPPORTS_BIG_ENDIAN
++      select SYS_SUPPORTS_32BIT_KERNEL
++      select SYS_SUPPORTS_MULTITHREADING
++      select SYS_HAS_EARLY_PRINTK
++      select ARCH_REQUIRE_GPIOLIB
++      select SWAP_IO_SPACE
++      select BOOT_RAW
++      select HAVE_CLK
++
+ config LASAT
+       bool "LASAT Networks platforms"
+       select CEVT_R4K
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/lantiq.h
+@@ -0,0 +1,63 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++#ifndef _LANTIQ_H__
++#define _LANTIQ_H__
++
++#include <linux/irq.h>
++
++/* generic reg access functions */
++#define ltq_r32(reg)          __raw_readl(reg)
++#define ltq_w32(val, reg)     __raw_writel(val, reg)
++#define ltq_w32_mask(clear, set, reg) \
++      ltq_w32((ltq_r32(reg) & ~(clear)) | (set), reg)
++#define ltq_r8(reg)           __raw_readb(reg)
++#define ltq_w8(val, reg)      __raw_writeb(val, reg)
++
++/* register access macros for EBU and CGU */
++#define ltq_ebu_w32(x, y)     ltq_w32((x), ltq_ebu_membase + (y))
++#define ltq_ebu_r32(x)                ltq_r32(ltq_ebu_membase + (x))
++#define ltq_cgu_w32(x, y)     ltq_w32((x), ltq_cgu_membase + (y))
++#define ltq_cgu_r32(x)                ltq_r32(ltq_cgu_membase + (x))
++
++extern __iomem void *ltq_ebu_membase;
++extern __iomem void *ltq_cgu_membase;
++
++extern unsigned int ltq_get_cpu_ver(void);
++extern unsigned int ltq_get_soc_type(void);
++
++/* clock speeds */
++#define CLOCK_60M     60000000
++#define CLOCK_83M     83333333
++#define CLOCK_111M    111111111
++#define CLOCK_133M    133333333
++#define CLOCK_167M    166666667
++#define CLOCK_200M    200000000
++#define CLOCK_266M    266666666
++#define CLOCK_333M    333333333
++#define CLOCK_400M    400000000
++
++/* spinlock all ebu i/o */
++extern spinlock_t ebu_lock;
++
++/* some irq helpers */
++extern void ltq_disable_irq(unsigned int irq);
++extern void ltq_mask_and_ack_irq(unsigned int irq);
++extern void ltq_enable_irq(unsigned int irq);
++
++/* find out what caused the last cpu reset */
++extern int ltq_reset_cause(void);
++#define LTQ_RST_CAUSE_WDTRST  0x20
++
++#define IOPORT_RESOURCE_START 0x10000000
++#define IOPORT_RESOURCE_END   0xffffffff
++#define IOMEM_RESOURCE_START  0x10000000
++#define IOMEM_RESOURCE_END    0xffffffff
++#define LTQ_FLASH_START               0x10000000
++#define LTQ_FLASH_MAX         0x04000000
++
++#endif
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/war.h
+@@ -0,0 +1,24 @@
++/*
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License.  See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ */
++#ifndef __ASM_MIPS_MACH_LANTIQ_WAR_H
++#define __ASM_MIPS_MACH_LANTIQ_WAR_H
++
++#define R4600_V1_INDEX_ICACHEOP_WAR     0
++#define R4600_V1_HIT_CACHEOP_WAR        0
++#define R4600_V2_HIT_CACHEOP_WAR        0
++#define R5432_CP0_INTERRUPT_WAR         0
++#define BCM1250_M3_WAR                  0
++#define SIBYTE_1956_WAR                 0
++#define MIPS4K_ICACHE_REFILL_WAR        0
++#define MIPS_CACHE_SYNC_WAR             0
++#define TX49XX_ICACHE_INDEX_INV_WAR     0
++#define RM9000_CDEX_SMP_WAR             0
++#define ICACHE_REFILLS_WORKAROUND_WAR   0
++#define R10000_LLSC_WAR                 0
++#define MIPS34K_MISSED_ITLB_WAR         0
++
++#endif
+--- /dev/null
++++ b/arch/mips/lantiq/Makefile
+@@ -0,0 +1,9 @@
++# Copyright (C) 2010 John Crispin <blogic@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.
++
++obj-y := irq.o setup.o clk.o prom.o
++
++obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+--- /dev/null
++++ b/arch/mips/lantiq/Platform
+@@ -0,0 +1,7 @@
++#
++# Lantiq
++#
++
++platform-$(CONFIG_LANTIQ)     += lantiq/
++cflags-$(CONFIG_LANTIQ)               += -I$(srctree)/arch/mips/include/asm/mach-lantiq
++load-$(CONFIG_LANTIQ)         = 0xffffffff80002000
+--- /dev/null
++++ b/arch/mips/lantiq/clk.c
+@@ -0,0 +1,144 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ * Copyright (C) 2010 Thomas Langer <thomas.langer@lantiq.com>
++ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++#include <linux/io.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/kernel.h>
++#include <linux/types.h>
++#include <linux/clk.h>
++#include <linux/err.h>
++#include <linux/list.h>
++
++#include <asm/time.h>
++#include <asm/irq.h>
++#include <asm/div64.h>
++
++#include <lantiq_soc.h>
++
++#include "clk.h"
++
++struct clk {
++      const char *name;
++      unsigned long rate;
++      unsigned long (*get_rate) (void);
++};
++
++static struct clk *cpu_clk;
++static int cpu_clk_cnt;
++
++/* lantiq socs have 3 static clocks */
++static struct clk cpu_clk_generic[] = {
++      {
++              .name = "cpu",
++              .get_rate = ltq_get_cpu_hz,
++      }, {
++              .name = "fpi",
++              .get_rate = ltq_get_fpi_hz,
++      }, {
++              .name = "io",
++              .get_rate = ltq_get_io_region_clock,
++      },
++};
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++static struct resource ltq_cgu_resource = {
++      .name   = "cgu",
++      .start  = LTQ_CGU_BASE_ADDR,
++      .end    = LTQ_CGU_BASE_ADDR + LTQ_CGU_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++/* remapped clock register range */
++void __iomem *ltq_cgu_membase;
++#endif
++
++void clk_init(void)
++{
++      cpu_clk = cpu_clk_generic;
++      cpu_clk_cnt = ARRAY_SIZE(cpu_clk_generic);
++}
++
++static inline int clk_good(struct clk *clk)
++{
++      return clk && !IS_ERR(clk);
++}
++
++unsigned long clk_get_rate(struct clk *clk)
++{
++      if (unlikely(!clk_good(clk)))
++              return 0;
++
++      if (clk->rate != 0)
++              return clk->rate;
++
++      if (clk->get_rate != NULL)
++              return clk->get_rate();
++
++      return 0;
++}
++EXPORT_SYMBOL(clk_get_rate);
++
++struct clk *clk_get(struct device *dev, const char *id)
++{
++      int i;
++
++      for (i = 0; i < cpu_clk_cnt; i++)
++              if (!strcmp(id, cpu_clk[i].name))
++                      return &cpu_clk[i];
++      BUG();
++      return ERR_PTR(-ENOENT);
++}
++EXPORT_SYMBOL(clk_get);
++
++void clk_put(struct clk *clk)
++{
++      /* not used */
++}
++EXPORT_SYMBOL(clk_put);
++
++static inline u32 ltq_get_counter_resolution(void)
++{
++      u32 res;
++
++      __asm__ __volatile__(
++              ".set   push\n"
++              ".set   mips32r2\n"
++              "rdhwr  %0, $3\n"
++              ".set pop\n"
++              : "=&r" (res)
++              : /* no input */
++              : "memory");
++
++      return res;
++}
++
++void __init plat_time_init(void)
++{
++      struct clk *clk;
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++      if (insert_resource(&iomem_resource, &ltq_cgu_resource) < 0)
++              panic("Failed to insert cgu memory\n");
++
++      if (request_mem_region(ltq_cgu_resource.start,
++                      resource_size(&ltq_cgu_resource), "cgu") < 0)
++              panic("Failed to request cgu memory\n");
++
++      ltq_cgu_membase = ioremap_nocache(ltq_cgu_resource.start,
++                              resource_size(&ltq_cgu_resource));
++      if (!ltq_cgu_membase) {
++              pr_err("Failed to remap cgu memory\n");
++              unreachable();
++      }
++#endif
++      clk = clk_get(0, "cpu");
++      mips_hpt_frequency = clk_get_rate(clk) / ltq_get_counter_resolution();
++      write_c0_compare(read_c0_count());
++      clk_put(clk);
++}
+--- /dev/null
++++ b/arch/mips/lantiq/clk.h
+@@ -0,0 +1,18 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LTQ_CLK_H__
++#define _LTQ_CLK_H__
++
++extern void clk_init(void);
++
++extern unsigned long ltq_get_cpu_hz(void);
++extern unsigned long ltq_get_fpi_hz(void);
++extern unsigned long ltq_get_io_region_clock(void);
++
++#endif
+--- /dev/null
++++ b/arch/mips/lantiq/early_printk.c
+@@ -0,0 +1,37 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/cpu.h>
++
++#include <lantiq.h>
++#include <lantiq_soc.h>
++
++/* no ioremap possible at this early stage, lets use KSEG1 instead  */
++#ifdef CONFIG_SOC_FALCON
++#define LTQ_ASC_BASE  KSEG1ADDR(LTQ_ASC0_BASE_ADDR)
++#else
++#define LTQ_ASC_BASE  KSEG1ADDR(LTQ_ASC1_BASE_ADDR)
++#endif
++#define ASC_BUF               1024
++#define LTQ_ASC_FSTAT ((u32 *)(LTQ_ASC_BASE + 0x0048))
++#define LTQ_ASC_TBUF  ((u32 *)(LTQ_ASC_BASE + 0x0020))
++#define TXMASK                0x3F00
++#define TXOFFSET      8
++
++void prom_putchar(char c)
++{
++      unsigned long flags;
++
++      local_irq_save(flags);
++      do { } while ((ltq_r32(LTQ_ASC_FSTAT) & TXMASK) >> TXOFFSET);
++      if (c == '\n')
++              ltq_w32('\r', LTQ_ASC_TBUF);
++      ltq_w32(c, LTQ_ASC_TBUF);
++      local_irq_restore(flags);
++}
+--- /dev/null
++++ b/arch/mips/lantiq/irq.c
+@@ -0,0 +1,353 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ * Copyright (C) 2010 Thomas Langer <thomas.langer@lantiq.com>
++ */
++
++#include <linux/interrupt.h>
++#include <linux/ioport.h>
++#include <linux/module.h>
++
++#include <asm/bootinfo.h>
++#include <asm/irq_cpu.h>
++
++#include <lantiq_soc.h>
++#include <irq.h>
++
++/* register definitions */
++#define LTQ_ICU_IM0_ISR               0x0000
++#define LTQ_ICU_IM0_IER               0x0008
++#define LTQ_ICU_IM0_IOSR      0x0010
++#define LTQ_ICU_IM0_IRSR      0x0018
++#define LTQ_ICU_IM0_IMR               0x0020
++#define LTQ_ICU_IM1_ISR               0x0028
++#define LTQ_ICU_OFFSET                (LTQ_ICU_IM1_ISR - LTQ_ICU_IM0_ISR)
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++
++#define LTQ_EIU_EXIN_C                0x0000
++#define LTQ_EIU_EXIN_INIC     0x0004
++#define LTQ_EIU_EXIN_INEN     0x000C
++
++/* irq numbers used by the external interrupt unit (EIU) */
++#define LTQ_EIU_IR0           (INT_NUM_IM4_IRL0 + 30)
++#define LTQ_EIU_IR1           (INT_NUM_IM3_IRL0 + 31)
++#define LTQ_EIU_IR2           (INT_NUM_IM1_IRL0 + 26)
++#define LTQ_EIU_IR3           INT_NUM_IM1_IRL0
++#define LTQ_EIU_IR4           (INT_NUM_IM1_IRL0 + 1)
++#define LTQ_EIU_IR5           (INT_NUM_IM1_IRL0 + 2)
++#define LTQ_EIU_IR6           (INT_NUM_IM2_IRL0 + 30)
++
++#define MAX_EIU                       6
++
++/* irqs generated by device attached to the EBU need to be acked in
++ * a special manner
++ */
++#define LTQ_ICU_EBU_IRQ               22
++
++#define ltq_eiu_w32(x, y)     ltq_w32((x), ltq_eiu_membase + (y))
++#define ltq_eiu_r32(x)                ltq_r32(ltq_eiu_membase + (x))
++
++static unsigned short ltq_eiu_irq[MAX_EIU] = {
++      LTQ_EIU_IR0,
++      LTQ_EIU_IR1,
++      LTQ_EIU_IR2,
++      LTQ_EIU_IR3,
++      LTQ_EIU_IR4,
++      LTQ_EIU_IR5,
++};
++
++static void __iomem *ltq_eiu_membase;
++
++static struct resource ltq_eiu_resource = {
++      .name   = "eiu",
++      .start  = LTQ_EIU_BASE_ADDR,
++      .end    = LTQ_EIU_BASE_ADDR + LTQ_ICU_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++#endif
++
++static struct resource ltq_icu_resource = {
++      .name   = "icu",
++      .start  = LTQ_ICU_BASE_ADDR,
++      .end    = LTQ_ICU_BASE_ADDR + LTQ_ICU_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++#define ltq_icu_w32(x, y)     ltq_w32((x), ltq_icu_membase + (y))
++#define ltq_icu_r32(x)                ltq_r32(ltq_icu_membase + (x))
++
++static void __iomem *ltq_icu_membase;
++
++void
++ltq_disable_irq(unsigned int irq_nr)
++{
++      u32 ier = LTQ_ICU_IM0_IER;
++
++      irq_nr -= INT_NUM_IRQ0;
++      ier += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET);
++      irq_nr %= INT_NUM_IM_OFFSET;
++      ltq_icu_w32(ltq_icu_r32(ier) & ~(1 << irq_nr), ier);
++}
++
++void
++ltq_mask_and_ack_irq(unsigned int irq_nr)
++{
++      u32 ier = LTQ_ICU_IM0_IER;
++      u32 isr = LTQ_ICU_IM0_ISR;
++
++      irq_nr -= INT_NUM_IRQ0;
++      ier += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET);
++      isr += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET);
++      irq_nr %= INT_NUM_IM_OFFSET;
++      ltq_icu_w32(ltq_icu_r32(ier) & ~(1 << irq_nr), ier);
++      ltq_icu_w32((1 << irq_nr), isr);
++}
++EXPORT_SYMBOL(ltq_mask_and_ack_irq);
++
++static void
++ltq_ack_irq(unsigned int irq_nr)
++{
++      u32 isr = LTQ_ICU_IM0_ISR;
++
++      irq_nr -= INT_NUM_IRQ0;
++      isr += LTQ_ICU_OFFSET * (irq_nr / INT_NUM_IM_OFFSET);
++      irq_nr %= INT_NUM_IM_OFFSET;
++      ltq_icu_w32((1 << irq_nr), isr);
++}
++
++void
++ltq_enable_irq(unsigned int irq_nr)
++{
++      u32 ier = LTQ_ICU_IM0_IER;
++
++      irq_nr -= INT_NUM_IRQ0;
++      ier += LTQ_ICU_OFFSET  * (irq_nr / INT_NUM_IM_OFFSET);
++      irq_nr %= INT_NUM_IM_OFFSET;
++      ltq_icu_w32(ltq_icu_r32(ier) | (1 << irq_nr), ier);
++}
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++static unsigned int
++ltq_startup_eiu_irq(unsigned int irq)
++{
++      int i;
++
++      ltq_enable_irq(irq);
++      for (i = 0; i < MAX_EIU; i++) {
++              if (irq == ltq_eiu_irq[i]) {
++                      /* low level - we should really handle set_type */
++                      ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_C) | (0x6 << (i * 4)),
++                              LTQ_EIU_EXIN_C);
++                      /* clear all pending */
++                      ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INIC) & ~(1 << i),
++                              LTQ_EIU_EXIN_INIC);
++                      /* enable */
++                      ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INEN) | (1 << i),
++                              LTQ_EIU_EXIN_INEN);
++                      break;
++              }
++      }
++      return 0;
++}
++
++static void
++ltq_shutdown_eiu_irq(unsigned int irq)
++{
++      int i;
++
++      ltq_disable_irq(irq);
++      for (i = 0; i < MAX_EIU; i++) {
++              if (irq == ltq_eiu_irq[i]) {
++                      /* disable */
++                      ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_INEN) & ~(1 << i),
++                      LTQ_EIU_EXIN_INEN);
++                      break;
++              }
++      }
++}
++#endif
++
++static void
++ltq_end_irq(unsigned int irq)
++{
++      if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
++              ltq_enable_irq(irq);
++}
++
++static struct irq_chip
++ltq_irq_type = {
++      "ltq_irq",
++      .enable = ltq_enable_irq,
++      .disable = ltq_disable_irq,
++      .unmask = ltq_enable_irq,
++      .ack = ltq_ack_irq,
++      .mask = ltq_disable_irq,
++      .mask_ack = ltq_mask_and_ack_irq,
++      .end = ltq_end_irq,
++};
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++static struct irq_chip
++ltq_eiu_type = {
++      "ltq_eiu_irq",
++      .startup = ltq_startup_eiu_irq,
++      .shutdown = ltq_shutdown_eiu_irq,
++      .enable = ltq_enable_irq,
++      .disable = ltq_disable_irq,
++      .unmask = ltq_enable_irq,
++      .ack = ltq_ack_irq,
++      .mask = ltq_disable_irq,
++      .mask_ack = ltq_mask_and_ack_irq,
++      .end = ltq_end_irq,
++};
++#endif
++
++static void ltq_hw_irqdispatch(int module)
++{
++      u32 irq;
++
++      irq = ltq_icu_r32(LTQ_ICU_IM0_IOSR + (module * LTQ_ICU_OFFSET));
++      if (irq == 0)
++              return;
++
++      /* silicon bug causes only the msb set to 1 to be valid. all
++       * other bits might be bogus
++       */
++      irq = __fls(irq);
++      do_IRQ((int)irq + INT_NUM_IM0_IRL0 + (INT_NUM_IM_OFFSET * module));
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++      /* if this is a EBU irq, we need to ack it or get a deadlock */
++      if ((irq == LTQ_ICU_EBU_IRQ) && (module == 0))
++              ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_ISTAT) | 0x10,
++                      LTQ_EBU_PCC_ISTAT);
++#endif
++}
++
++#define DEFINE_HWx_IRQDISPATCH(x)                                     \
++      static void ltq_hw ## x ## _irqdispatch(void)                   \
++      {                                                               \
++              ltq_hw_irqdispatch(x);                                  \
++      }
++DEFINE_HWx_IRQDISPATCH(0)
++DEFINE_HWx_IRQDISPATCH(1)
++DEFINE_HWx_IRQDISPATCH(2)
++DEFINE_HWx_IRQDISPATCH(3)
++DEFINE_HWx_IRQDISPATCH(4)
++
++static void ltq_hw5_irqdispatch(void)
++{
++      do_IRQ(MIPS_CPU_TIMER_IRQ);
++}
++
++asmlinkage void plat_irq_dispatch(void)
++{
++      unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
++      unsigned int i;
++
++      if (pending & CAUSEF_IP7) {
++              do_IRQ(MIPS_CPU_TIMER_IRQ);
++              goto out;
++      } else {
++              for (i = 0; i < 5; i++) {
++                      if (pending & (CAUSEF_IP2 << i)) {
++                              ltq_hw_irqdispatch(i);
++                              goto out;
++                      }
++              }
++      }
++      pr_alert("Spurious IRQ: CAUSE=0x%08x\n", read_c0_status());
++
++out:
++      return;
++}
++
++static struct irqaction cascade = {
++      .handler = no_action,
++      .flags = IRQF_DISABLED,
++      .name = "cascade",
++};
++
++void __init arch_init_irq(void)
++{
++      int i;
++
++      if (insert_resource(&iomem_resource, &ltq_icu_resource) < 0)
++              panic("Failed to insert icu memory\n");
++
++      if (request_mem_region(ltq_icu_resource.start,
++                      resource_size(&ltq_icu_resource), "icu") < 0)
++              panic("Failed to request icu memory\n");
++
++      ltq_icu_membase = ioremap_nocache(ltq_icu_resource.start,
++                              resource_size(&ltq_icu_resource));
++      if (!ltq_icu_membase)
++              panic("Failed to remap icu memory\n");
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++      if (insert_resource(&iomem_resource, &ltq_eiu_resource) < 0)
++              panic("Failed to insert eiu memory\n");
++
++      if (request_mem_region(ltq_eiu_resource.start,
++                      resource_size(&ltq_eiu_resource), "eiu") < 0)
++              panic("Failed to request eiu memory\n");
++
++      ltq_eiu_membase = ioremap_nocache(ltq_eiu_resource.start,
++                              resource_size(&ltq_eiu_resource));
++      if (!ltq_eiu_membase)
++              panic("Failed to remap eiu memory\n");
++#endif
++      /* make sure all irqs are turned off by default */
++      for (i = 0; i < 5; i++)
++              ltq_icu_w32(0, LTQ_ICU_IM0_IER + (i * LTQ_ICU_OFFSET));
++
++      /* clear all possibly pending interrupts */
++      ltq_icu_w32(~0, LTQ_ICU_IM0_ISR + (i * LTQ_ICU_OFFSET));
++
++      mips_cpu_irq_init();
++
++      for (i = 2; i <= 6; i++)
++              setup_irq(i, &cascade);
++
++      if (cpu_has_vint) {
++              pr_info("Setting up vectored interrupts\n");
++              set_vi_handler(2, ltq_hw0_irqdispatch);
++              set_vi_handler(3, ltq_hw1_irqdispatch);
++              set_vi_handler(4, ltq_hw2_irqdispatch);
++              set_vi_handler(5, ltq_hw3_irqdispatch);
++              set_vi_handler(6, ltq_hw4_irqdispatch);
++              set_vi_handler(7, ltq_hw5_irqdispatch);
++      }
++
++      for (i = INT_NUM_IRQ0;
++              i <= (INT_NUM_IRQ0 + (5 * INT_NUM_IM_OFFSET)); i++)
++#ifdef CONFIG_SOC_TYPE_XWAY
++                      if ((i == LTQ_EIU_IR0) || (i == LTQ_EIU_IR1) || (i == LTQ_EIU_IR2))
++                              set_irq_chip_and_handler(i, &ltq_eiu_type, handle_level_irq);
++                      /* EIU3-5 only exist on ar9 and vr9 */
++                      else if (((i == LTQ_EIU_IR3) || (i == LTQ_EIU_IR4) ||
++                              (i == LTQ_EIU_IR5)) && (ltq_is_ar9() || ltq_is_vr9()))
++                              set_irq_chip_and_handler(i, &ltq_eiu_type, handle_level_irq);
++                      else
++#endif
++                              set_irq_chip_and_handler(i, &ltq_irq_type, handle_level_irq);
++
++#if !defined(CONFIG_MIPS_MT_SMP) && !defined(CONFIG_MIPS_MT_SMTC)
++      set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 |
++              IE_IRQ3 | IE_IRQ4 | IE_IRQ5);
++#else
++      set_c0_status(IE_SW0 | IE_SW1 | IE_IRQ0 | IE_IRQ1 |
++              IE_IRQ2 | IE_IRQ3 | IE_IRQ4 | IE_IRQ5);
++#endif
++      cp0_compare_irq = CP0_LEGACY_COMPARE_IRQ;
++}
++
++unsigned int __cpuinit get_c0_compare_int(void)
++{
++      return CP0_LEGACY_COMPARE_IRQ;
++}
+--- /dev/null
++++ b/arch/mips/lantiq/prom.c
+@@ -0,0 +1,71 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/module.h>
++#include <linux/clk.h>
++#include <asm/bootinfo.h>
++#include <asm/time.h>
++
++#include <lantiq.h>
++
++#include "prom.h"
++#include "clk.h"
++
++static struct ltq_soc_info soc_info;
++
++unsigned int ltq_get_cpu_ver(void)
++{
++      return soc_info.rev;
++}
++EXPORT_SYMBOL(ltq_get_cpu_ver);
++
++unsigned int ltq_get_soc_type(void)
++{
++      return soc_info.type;
++}
++EXPORT_SYMBOL(ltq_get_soc_type);
++
++const char *get_system_type(void)
++{
++      return soc_info.sys_type;
++}
++
++void prom_free_prom_memory(void)
++{
++}
++
++static void __init prom_init_cmdline(void)
++{
++      int argc = fw_arg0;
++      char **argv = (char **) KSEG1ADDR(fw_arg1);
++      int i;
++
++      for (i = 0; i < argc; i++) {
++              char *p = (char *)  KSEG1ADDR(argv[i]);
++
++              if (p && *p) {
++                      strlcat(arcs_cmdline, p, sizeof(arcs_cmdline));
++                      strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline));
++              }
++      }
++}
++
++void __init prom_init(void)
++{
++      struct clk *clk;
++
++      ltq_soc_detect(&soc_info);
++      clk_init();
++      clk = clk_get(0, "cpu");
++      snprintf(soc_info.sys_type, LTQ_SYS_TYPE_LEN - 1, "%s rev1.%d",
++              soc_info.name, soc_info.rev);
++      clk_put(clk);
++      soc_info.sys_type[LTQ_SYS_TYPE_LEN - 1] = '\0';
++      pr_info("SoC: %s\n", soc_info.sys_type);
++      prom_init_cmdline();
++}
+--- /dev/null
++++ b/arch/mips/lantiq/prom.h
+@@ -0,0 +1,24 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LTQ_PROM_H__
++#define _LTQ_PROM_H__
++
++#define LTQ_SYS_TYPE_LEN      0x100
++
++struct ltq_soc_info {
++      unsigned char *name;
++      unsigned int rev;
++      unsigned int partnum;
++      unsigned int type;
++      unsigned char sys_type[LTQ_SYS_TYPE_LEN];
++};
++
++extern void ltq_soc_detect(struct ltq_soc_info *i);
++
++#endif
+--- /dev/null
++++ b/arch/mips/lantiq/setup.c
+@@ -0,0 +1,41 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/io.h>
++#include <linux/ioport.h>
++#include <asm/bootinfo.h>
++
++#include <lantiq_soc.h>
++
++void __init plat_mem_setup(void)
++{
++      /* assume 16M as default incase uboot fails to pass proper ramsize */
++      unsigned long memsize = 16;
++      char **envp = (char **) KSEG1ADDR(fw_arg2);
++
++      ioport_resource.start = IOPORT_RESOURCE_START;
++      ioport_resource.end = IOPORT_RESOURCE_END;
++      iomem_resource.start = IOMEM_RESOURCE_START;
++      iomem_resource.end = IOMEM_RESOURCE_END;
++
++      set_io_port_base((unsigned long) KSEG1);
++
++      while (*envp) {
++              char *e = (char *)KSEG1ADDR(*envp);
++              if (!strncmp(e, "memsize=", 8)) {
++                      e += 8;
++                      if (strict_strtoul(e, 0, &memsize))
++                              pr_warn("bad memsize specified\n");
++              }
++              envp++;
++      }
++      memsize *= 1024 * 1024;
++      add_memory_region(0x00000000, memsize, BOOT_MEM_RAM);
++}
diff --git a/target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch b/target/linux/lantiq/patches-2.6.32/0002-MIPS-Lantiq-add-SoC-specific-code-for-XWAY-family.patch
new file mode 100644 (file)
index 0000000..cb0058c
--- /dev/null
@@ -0,0 +1,1151 @@
+From 36cc26a362c6ad64ba3d176809847ec60cc40859 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Wed, 30 Mar 2011 09:27:48 +0200
+Subject: [PATCH 02/13] MIPS: Lantiq: add SoC specific code for XWAY family
+
+Add support for the Lantiq XWAY family of Mips24KEc SoCs.
+
+* Danube (PSB50702)
+* Twinpass (PSB4000)
+* AR9 (PSB50802)
+* Amazon SE (PSB5061)
+
+The Amazon SE is a lightweight SoC and has no PCI as well as a different
+clock. We split the code out into seperate files to handle this.
+
+The GPIO pins on the SoCs are multi function and there are several bits
+we can use to configure the pins. To be as compatible as possible to
+GPIOLIB we add a function
+
+int ltq_gpio_request(unsigned int pin, unsigned int alt0,
+        unsigned int alt1, unsigned int dir, const char *name);
+
+which lets you configure the 2 "alternate function" bits. This way drivers like
+PCI can make use of GPIOLIB without a cubersome wrapper.
+
+The PLL code inside arch/mips/lantiq/xway/clk-xway.c is voodoo to me. It was
+taken from a 2.4.20 source tree and was never really changed by me since then.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2249/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/Kconfig                                  |    1 +
+ arch/mips/include/asm/mach-lantiq/xway/irq.h       |   18 ++
+ .../mips/include/asm/mach-lantiq/xway/lantiq_irq.h |   66 ++++++
+ .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h |  140 ++++++++++++
+ arch/mips/lantiq/Kconfig                           |   21 ++
+ arch/mips/lantiq/Makefile                          |    2 +
+ arch/mips/lantiq/Platform                          |    1 +
+ arch/mips/lantiq/xway/Makefile                     |    4 +
+ arch/mips/lantiq/xway/clk-ase.c                    |   48 +++++
+ arch/mips/lantiq/xway/clk-xway.c                   |  223 ++++++++++++++++++++
+ arch/mips/lantiq/xway/ebu.c                        |   53 +++++
+ arch/mips/lantiq/xway/gpio.c                       |  195 +++++++++++++++++
+ arch/mips/lantiq/xway/pmu.c                        |   70 ++++++
+ arch/mips/lantiq/xway/prom-ase.c                   |   39 ++++
+ arch/mips/lantiq/xway/prom-xway.c                  |   54 +++++
+ arch/mips/lantiq/xway/reset.c                      |   91 ++++++++
+ 16 files changed, 1026 insertions(+), 0 deletions(-)
+ create mode 100644 arch/mips/include/asm/mach-lantiq/xway/irq.h
+ create mode 100644 arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
+ create mode 100644 arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
+ create mode 100644 arch/mips/lantiq/Kconfig
+ create mode 100644 arch/mips/lantiq/xway/Makefile
+ create mode 100644 arch/mips/lantiq/xway/clk-ase.c
+ create mode 100644 arch/mips/lantiq/xway/clk-xway.c
+ create mode 100644 arch/mips/lantiq/xway/ebu.c
+ create mode 100644 arch/mips/lantiq/xway/gpio.c
+ create mode 100644 arch/mips/lantiq/xway/pmu.c
+ create mode 100644 arch/mips/lantiq/xway/prom-ase.c
+ create mode 100644 arch/mips/lantiq/xway/prom-xway.c
+ create mode 100644 arch/mips/lantiq/xway/reset.c
+
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -694,6 +694,7 @@
+ source "arch/mips/basler/excite/Kconfig"
+ source "arch/mips/bcm63xx/Kconfig"
+ source "arch/mips/jazz/Kconfig"
++source "arch/mips/lantiq/Kconfig"
+ source "arch/mips/lasat/Kconfig"
+ source "arch/mips/pmc-sierra/Kconfig"
+ source "arch/mips/sgi-ip27/Kconfig"
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/xway/irq.h
+@@ -0,0 +1,18 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef __LANTIQ_IRQ_H
++#define __LANTIQ_IRQ_H
++
++#include <lantiq_irq.h>
++
++#define NR_IRQS 256
++
++#include_next <irq.h>
++
++#endif
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
+@@ -0,0 +1,66 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LANTIQ_XWAY_IRQ_H__
++#define _LANTIQ_XWAY_IRQ_H__
++
++#define INT_NUM_IRQ0          8
++#define INT_NUM_IM0_IRL0      (INT_NUM_IRQ0 + 0)
++#define INT_NUM_IM1_IRL0      (INT_NUM_IRQ0 + 32)
++#define INT_NUM_IM2_IRL0      (INT_NUM_IRQ0 + 64)
++#define INT_NUM_IM3_IRL0      (INT_NUM_IRQ0 + 96)
++#define INT_NUM_IM4_IRL0      (INT_NUM_IRQ0 + 128)
++#define INT_NUM_IM_OFFSET     (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0)
++
++#define LTQ_ASC_TIR(x)                (INT_NUM_IM3_IRL0 + (x * 8))
++#define LTQ_ASC_RIR(x)                (INT_NUM_IM3_IRL0 + (x * 8) + 1)
++#define LTQ_ASC_EIR(x)                (INT_NUM_IM3_IRL0 + (x * 8) + 2)
++
++#define LTQ_ASC_ASE_TIR               INT_NUM_IM2_IRL0
++#define LTQ_ASC_ASE_RIR               (INT_NUM_IM2_IRL0 + 2)
++#define LTQ_ASC_ASE_EIR               (INT_NUM_IM2_IRL0 + 3)
++
++#define LTQ_SSC_TIR           (INT_NUM_IM0_IRL0 + 15)
++#define LTQ_SSC_RIR           (INT_NUM_IM0_IRL0 + 14)
++#define LTQ_SSC_EIR           (INT_NUM_IM0_IRL0 + 16)
++
++#define LTQ_MEI_DYING_GASP_INT        (INT_NUM_IM1_IRL0 + 21)
++#define LTQ_MEI_INT           (INT_NUM_IM1_IRL0 + 23)
++
++#define LTQ_TIMER6_INT                (INT_NUM_IM1_IRL0 + 23)
++#define LTQ_USB_INT           (INT_NUM_IM1_IRL0 + 22)
++#define LTQ_USB_OC_INT                (INT_NUM_IM4_IRL0 + 23)
++
++#define MIPS_CPU_TIMER_IRQ            7
++
++#define LTQ_DMA_CH0_INT               (INT_NUM_IM2_IRL0)
++#define LTQ_DMA_CH1_INT               (INT_NUM_IM2_IRL0 + 1)
++#define LTQ_DMA_CH2_INT               (INT_NUM_IM2_IRL0 + 2)
++#define LTQ_DMA_CH3_INT               (INT_NUM_IM2_IRL0 + 3)
++#define LTQ_DMA_CH4_INT               (INT_NUM_IM2_IRL0 + 4)
++#define LTQ_DMA_CH5_INT               (INT_NUM_IM2_IRL0 + 5)
++#define LTQ_DMA_CH6_INT               (INT_NUM_IM2_IRL0 + 6)
++#define LTQ_DMA_CH7_INT               (INT_NUM_IM2_IRL0 + 7)
++#define LTQ_DMA_CH8_INT               (INT_NUM_IM2_IRL0 + 8)
++#define LTQ_DMA_CH9_INT               (INT_NUM_IM2_IRL0 + 9)
++#define LTQ_DMA_CH10_INT      (INT_NUM_IM2_IRL0 + 10)
++#define LTQ_DMA_CH11_INT      (INT_NUM_IM2_IRL0 + 11)
++#define LTQ_DMA_CH12_INT      (INT_NUM_IM2_IRL0 + 25)
++#define LTQ_DMA_CH13_INT      (INT_NUM_IM2_IRL0 + 26)
++#define LTQ_DMA_CH14_INT      (INT_NUM_IM2_IRL0 + 27)
++#define LTQ_DMA_CH15_INT      (INT_NUM_IM2_IRL0 + 28)
++#define LTQ_DMA_CH16_INT      (INT_NUM_IM2_IRL0 + 29)
++#define LTQ_DMA_CH17_INT      (INT_NUM_IM2_IRL0 + 30)
++#define LTQ_DMA_CH18_INT      (INT_NUM_IM2_IRL0 + 16)
++#define LTQ_DMA_CH19_INT      (INT_NUM_IM2_IRL0 + 21)
++
++#define LTQ_PPE_MBOX_INT      (INT_NUM_IM2_IRL0 + 24)
++
++#define INT_NUM_IM4_IRL14     (INT_NUM_IM4_IRL0 + 14)
++
++#endif
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
+@@ -0,0 +1,140 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LTQ_XWAY_H__
++#define _LTQ_XWAY_H__
++
++#ifdef CONFIG_SOC_TYPE_XWAY
++
++#include <lantiq.h>
++
++/* Chip IDs */
++#define SOC_ID_DANUBE1                0x129
++#define SOC_ID_DANUBE2                0x12B
++#define SOC_ID_TWINPASS               0x12D
++#define SOC_ID_AMAZON_SE      0x152
++#define SOC_ID_ARX188         0x16C
++#define SOC_ID_ARX168         0x16D
++#define SOC_ID_ARX182         0x16F
++
++/* SoC Types */
++#define SOC_TYPE_DANUBE               0x01
++#define SOC_TYPE_TWINPASS     0x02
++#define SOC_TYPE_AR9          0x03
++#define SOC_TYPE_VR9          0x04
++#define SOC_TYPE_AMAZON_SE    0x05
++
++/* ASC0/1 - serial port */
++#define LTQ_ASC0_BASE_ADDR    0x1E100400
++#define LTQ_ASC1_BASE_ADDR    0x1E100C00
++#define LTQ_ASC_SIZE          0x400
++
++/* RCU - reset control unit */
++#define LTQ_RCU_BASE_ADDR     0x1F203000
++#define LTQ_RCU_SIZE          0x1000
++
++/* GPTU - general purpose timer unit */
++#define LTQ_GPTU_BASE_ADDR    0x18000300
++#define LTQ_GPTU_SIZE         0x100
++
++/* EBU - external bus unit */
++#define LTQ_EBU_GPIO_START    0x14000000
++#define LTQ_EBU_GPIO_SIZE     0x1000
++
++#define LTQ_EBU_BASE_ADDR     0x1E105300
++#define LTQ_EBU_SIZE          0x100
++
++#define LTQ_EBU_BUSCON0               0x0060
++#define LTQ_EBU_PCC_CON               0x0090
++#define LTQ_EBU_PCC_IEN               0x00A4
++#define LTQ_EBU_PCC_ISTAT     0x00A0
++#define LTQ_EBU_BUSCON1               0x0064
++#define LTQ_EBU_ADDRSEL1      0x0024
++#define EBU_WRDIS             0x80000000
++
++/* CGU - clock generation unit */
++#define LTQ_CGU_BASE_ADDR     0x1F103000
++#define LTQ_CGU_SIZE          0x1000
++
++/* ICU - interrupt control unit */
++#define LTQ_ICU_BASE_ADDR     0x1F880200
++#define LTQ_ICU_SIZE          0x100
++
++/* EIU - external interrupt unit */
++#define LTQ_EIU_BASE_ADDR     0x1F101000
++#define LTQ_EIU_SIZE          0x1000
++
++/* PMU - power management unit */
++#define LTQ_PMU_BASE_ADDR     0x1F102000
++#define LTQ_PMU_SIZE          0x1000
++
++#define PMU_DMA                       0x0020
++#define PMU_USB                       0x8041
++#define PMU_LED                       0x0800
++#define PMU_GPT                       0x1000
++#define PMU_PPE                       0x2000
++#define PMU_FPI                       0x4000
++#define PMU_SWITCH            0x10000000
++
++/* ETOP - ethernet */
++#define LTQ_PPE32_BASE_ADDR   0xBE180000
++#define LTQ_PPE32_SIZE                0x40000
++
++/* DMA */
++#define LTQ_DMA_BASE_ADDR     0xBE104100
++
++/* PCI */
++#define PCI_CR_BASE_ADDR      0x1E105400
++#define PCI_CR_SIZE           0x400
++
++/* WDT */
++#define LTQ_WDT_BASE_ADDR     0x1F8803F0
++#define LTQ_WDT_SIZE          0x10
++
++/* STP - serial to parallel conversion unit */
++#define LTQ_STP_BASE_ADDR     0x1E100BB0
++#define LTQ_STP_SIZE          0x40
++
++/* GPIO */
++#define LTQ_GPIO0_BASE_ADDR   0x1E100B10
++#define LTQ_GPIO1_BASE_ADDR   0x1E100B40
++#define LTQ_GPIO2_BASE_ADDR   0x1E100B70
++#define LTQ_GPIO_SIZE         0x30
++
++/* SSC */
++#define LTQ_SSC_BASE_ADDR     0x1e100800
++#define LTQ_SSC_SIZE          0x100
++
++/* MEI - dsl core */
++#define LTQ_MEI_BASE_ADDR     0x1E116000
++
++/* DEU - data encryption unit */
++#define LTQ_DEU_BASE_ADDR     0x1E103100
++
++/* MPS - multi processor unit (voice) */
++#define LTQ_MPS_BASE_ADDR     (KSEG1 + 0x1F107000)
++#define LTQ_MPS_CHIPID                ((u32 *)(LTQ_MPS_BASE_ADDR + 0x0344))
++
++/* request a non-gpio and set the PIO config */
++extern int  ltq_gpio_request(unsigned int pin, unsigned int alt0,
++      unsigned int alt1, unsigned int dir, const char *name);
++extern void ltq_pmu_enable(unsigned int module);
++extern void ltq_pmu_disable(unsigned int module);
++
++static inline int ltq_is_ar9(void)
++{
++      return (ltq_get_soc_type() == SOC_TYPE_AR9);
++}
++
++static inline int ltq_is_vr9(void)
++{
++      return (ltq_get_soc_type() == SOC_TYPE_VR9);
++}
++
++#endif /* CONFIG_SOC_TYPE_XWAY */
++#endif /* _LTQ_XWAY_H__ */
+--- /dev/null
++++ b/arch/mips/lantiq/Kconfig
+@@ -0,0 +1,21 @@
++if LANTIQ
++
++config SOC_TYPE_XWAY
++      bool
++      default n
++
++choice
++      prompt "SoC Type"
++      default SOC_XWAY
++
++config SOC_AMAZON_SE
++      bool "Amazon SE"
++      select SOC_TYPE_XWAY
++
++config SOC_XWAY
++      bool "XWAY"
++      select SOC_TYPE_XWAY
++      select HW_HAS_PCI
++endchoice
++
++endif
+--- a/arch/mips/lantiq/Makefile
++++ b/arch/mips/lantiq/Makefile
+@@ -7,3 +7,5 @@
+ obj-y := irq.o setup.o clk.o prom.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
++
++obj-$(CONFIG_SOC_TYPE_XWAY) += xway/
+--- a/arch/mips/lantiq/Platform
++++ b/arch/mips/lantiq/Platform
+@@ -5,3 +5,4 @@
+ platform-$(CONFIG_LANTIQ)     += lantiq/
+ cflags-$(CONFIG_LANTIQ)               += -I$(srctree)/arch/mips/include/asm/mach-lantiq
+ load-$(CONFIG_LANTIQ)         = 0xffffffff80002000
++cflags-$(CONFIG_SOC_TYPE_XWAY)        += -I$(srctree)/arch/mips/include/asm/mach-lantiq/xway
+--- /dev/null
++++ b/arch/mips/lantiq/xway/Makefile
+@@ -0,0 +1,4 @@
++obj-y := pmu.o ebu.o reset.o gpio.o
++
++obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
++obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
+--- /dev/null
++++ b/arch/mips/lantiq/xway/clk-ase.c
+@@ -0,0 +1,48 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2011 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/io.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/clk.h>
++
++#include <asm/time.h>
++#include <asm/irq.h>
++#include <asm/div64.h>
++
++#include <lantiq_soc.h>
++
++/* cgu registers */
++#define LTQ_CGU_SYS   0x0010
++
++unsigned int ltq_get_io_region_clock(void)
++{
++      return CLOCK_133M;
++}
++EXPORT_SYMBOL(ltq_get_io_region_clock);
++
++unsigned int ltq_get_fpi_bus_clock(int fpi)
++{
++      return CLOCK_133M;
++}
++EXPORT_SYMBOL(ltq_get_fpi_bus_clock);
++
++unsigned int ltq_get_cpu_hz(void)
++{
++      if (ltq_cgu_r32(LTQ_CGU_SYS) & (1 << 5))
++              return CLOCK_266M;
++      else
++              return CLOCK_133M;
++}
++EXPORT_SYMBOL(ltq_get_cpu_hz);
++
++unsigned int ltq_get_fpi_hz(void)
++{
++      return CLOCK_133M;
++}
++EXPORT_SYMBOL(ltq_get_fpi_hz);
+--- /dev/null
++++ b/arch/mips/lantiq/xway/clk-xway.c
+@@ -0,0 +1,223 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/io.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/clk.h>
++
++#include <asm/time.h>
++#include <asm/irq.h>
++#include <asm/div64.h>
++
++#include <lantiq_soc.h>
++
++static unsigned int ltq_ram_clocks[] = {
++      CLOCK_167M, CLOCK_133M, CLOCK_111M, CLOCK_83M };
++#define DDR_HZ ltq_ram_clocks[ltq_cgu_r32(LTQ_CGU_SYS) & 0x3]
++
++#define BASIC_FREQUENCY_1     35328000
++#define BASIC_FREQUENCY_2     36000000
++#define BASIS_REQUENCY_USB    12000000
++
++#define GET_BITS(x, msb, lsb) \
++      (((x) & ((1 << ((msb) + 1)) - 1)) >> (lsb))
++
++#define LTQ_CGU_PLL0_CFG      0x0004
++#define LTQ_CGU_PLL1_CFG      0x0008
++#define LTQ_CGU_PLL2_CFG      0x000C
++#define LTQ_CGU_SYS           0x0010
++#define LTQ_CGU_UPDATE                0x0014
++#define LTQ_CGU_IF_CLK                0x0018
++#define LTQ_CGU_OSC_CON               0x001C
++#define LTQ_CGU_SMD           0x0020
++#define LTQ_CGU_CT1SR         0x0028
++#define LTQ_CGU_CT2SR         0x002C
++#define LTQ_CGU_PCMCR         0x0030
++#define LTQ_CGU_PCI_CR                0x0034
++#define LTQ_CGU_PD_PC         0x0038
++#define LTQ_CGU_FMR           0x003C
++
++#define CGU_PLL0_PHASE_DIVIDER_ENABLE \
++      (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 31))
++#define CGU_PLL0_BYPASS                       \
++      (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 30))
++#define CGU_PLL0_CFG_DSMSEL           \
++      (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 28))
++#define CGU_PLL0_CFG_FRAC_EN          \
++      (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & (1 << 27))
++#define CGU_PLL1_SRC                  \
++      (ltq_cgu_r32(LTQ_CGU_PLL1_CFG) & (1 << 31))
++#define CGU_PLL2_PHASE_DIVIDER_ENABLE \
++      (ltq_cgu_r32(LTQ_CGU_PLL2_CFG) & (1 << 20))
++#define CGU_SYS_FPI_SEL                       (1 << 6)
++#define CGU_SYS_DDR_SEL                       0x3
++#define CGU_PLL0_SRC                  (1 << 29)
++
++#define CGU_PLL0_CFG_PLLK     GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 26, 17)
++#define CGU_PLL0_CFG_PLLN     GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 12, 6)
++#define CGU_PLL0_CFG_PLLM     GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL0_CFG), 5, 2)
++#define CGU_PLL2_SRC          GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL2_CFG), 18, 17)
++#define CGU_PLL2_CFG_INPUT_DIV        GET_BITS(ltq_cgu_r32(LTQ_CGU_PLL2_CFG), 16, 13)
++
++static unsigned int ltq_get_pll0_fdiv(void);
++
++static inline unsigned int get_input_clock(int pll)
++{
++      switch (pll) {
++      case 0:
++              if (ltq_cgu_r32(LTQ_CGU_PLL0_CFG) & CGU_PLL0_SRC)
++                      return BASIS_REQUENCY_USB;
++              else if (CGU_PLL0_PHASE_DIVIDER_ENABLE)
++                      return BASIC_FREQUENCY_1;
++              else
++                      return BASIC_FREQUENCY_2;
++      case 1:
++              if (CGU_PLL1_SRC)
++                      return BASIS_REQUENCY_USB;
++              else if (CGU_PLL0_PHASE_DIVIDER_ENABLE)
++                      return BASIC_FREQUENCY_1;
++              else
++                      return BASIC_FREQUENCY_2;
++      case 2:
++              switch (CGU_PLL2_SRC) {
++              case 0:
++                      return ltq_get_pll0_fdiv();
++              case 1:
++                      return CGU_PLL2_PHASE_DIVIDER_ENABLE ?
++                              BASIC_FREQUENCY_1 :
++                              BASIC_FREQUENCY_2;
++              case 2:
++                      return BASIS_REQUENCY_USB;
++              }
++      default:
++              return 0;
++      }
++}
++
++static inline unsigned int cal_dsm(int pll, unsigned int num, unsigned int den)
++{
++      u64 res, clock = get_input_clock(pll);
++
++      res = num * clock;
++      do_div(res, den);
++      return res;
++}
++
++static inline unsigned int mash_dsm(int pll, unsigned int M, unsigned int N,
++      unsigned int K)
++{
++      unsigned int num = ((N + 1) << 10) + K;
++      unsigned int den = (M + 1) << 10;
++
++      return cal_dsm(pll, num, den);
++}
++
++static inline unsigned int ssff_dsm_1(int pll, unsigned int M, unsigned int N,
++      unsigned int K)
++{
++      unsigned int num = ((N + 1) << 11) + K + 512;
++      unsigned int den = (M + 1) << 11;
++
++      return cal_dsm(pll, num, den);
++}
++
++static inline unsigned int ssff_dsm_2(int pll, unsigned int M, unsigned int N,
++      unsigned int K)
++{
++      unsigned int num = K >= 512 ?
++              ((N + 1) << 12) + K - 512 : ((N + 1) << 12) + K + 3584;
++      unsigned int den = (M + 1) << 12;
++
++      return cal_dsm(pll, num, den);
++}
++
++static inline unsigned int dsm(int pll, unsigned int M, unsigned int N,
++      unsigned int K, unsigned int dsmsel, unsigned int phase_div_en)
++{
++      if (!dsmsel)
++              return mash_dsm(pll, M, N, K);
++      else if (!phase_div_en)
++              return mash_dsm(pll, M, N, K);
++      else
++              return ssff_dsm_2(pll, M, N, K);
++}
++
++static inline unsigned int ltq_get_pll0_fosc(void)
++{
++      if (CGU_PLL0_BYPASS)
++              return get_input_clock(0);
++      else
++              return !CGU_PLL0_CFG_FRAC_EN
++                      ? dsm(0, CGU_PLL0_CFG_PLLM, CGU_PLL0_CFG_PLLN, 0,
++                              CGU_PLL0_CFG_DSMSEL,
++                              CGU_PLL0_PHASE_DIVIDER_ENABLE)
++                      : dsm(0, CGU_PLL0_CFG_PLLM, CGU_PLL0_CFG_PLLN,
++                              CGU_PLL0_CFG_PLLK, CGU_PLL0_CFG_DSMSEL,
++                              CGU_PLL0_PHASE_DIVIDER_ENABLE);
++}
++
++static unsigned int ltq_get_pll0_fdiv(void)
++{
++      unsigned int div = CGU_PLL2_CFG_INPUT_DIV + 1;
++
++      return (ltq_get_pll0_fosc() + (div >> 1)) / div;
++}
++
++unsigned int ltq_get_io_region_clock(void)
++{
++      unsigned int ret = ltq_get_pll0_fosc();
++
++      switch (ltq_cgu_r32(LTQ_CGU_PLL2_CFG) & CGU_SYS_DDR_SEL) {
++      default:
++      case 0:
++              return (ret + 1) / 2;
++      case 1:
++              return (ret * 2 + 2) / 5;
++      case 2:
++              return (ret + 1) / 3;
++      case 3:
++              return (ret + 2) / 4;
++      }
++}
++EXPORT_SYMBOL(ltq_get_io_region_clock);
++
++unsigned int ltq_get_fpi_bus_clock(int fpi)
++{
++      unsigned int ret = ltq_get_io_region_clock();
++
++      if ((fpi == 2) && (ltq_cgu_r32(LTQ_CGU_SYS) & CGU_SYS_FPI_SEL))
++              ret >>= 1;
++      return ret;
++}
++EXPORT_SYMBOL(ltq_get_fpi_bus_clock);
++
++unsigned int ltq_get_cpu_hz(void)
++{
++      switch (ltq_cgu_r32(LTQ_CGU_SYS) & 0xc) {
++      case 0:
++              return CLOCK_333M;
++      case 4:
++              return DDR_HZ;
++      case 8:
++              return DDR_HZ << 1;
++      default:
++              return DDR_HZ >> 1;
++      }
++}
++EXPORT_SYMBOL(ltq_get_cpu_hz);
++
++unsigned int ltq_get_fpi_hz(void)
++{
++      unsigned int ddr_clock = DDR_HZ;
++
++      if (ltq_cgu_r32(LTQ_CGU_SYS) & 0x40)
++              return ddr_clock >> 1;
++      return ddr_clock;
++}
++EXPORT_SYMBOL(ltq_get_fpi_hz);
+--- /dev/null
++++ b/arch/mips/lantiq/xway/ebu.c
+@@ -0,0 +1,53 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  EBU - the external bus unit attaches PCI, NOR and NAND
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/version.h>
++#include <linux/ioport.h>
++
++#include <lantiq_soc.h>
++
++/* all access to the ebu must be locked */
++DEFINE_SPINLOCK(ebu_lock);
++EXPORT_SYMBOL_GPL(ebu_lock);
++
++static struct resource ltq_ebu_resource = {
++      .name   = "ebu",
++      .start  = LTQ_EBU_BASE_ADDR,
++      .end    = LTQ_EBU_BASE_ADDR + LTQ_EBU_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++/* remapped base addr of the clock unit and external bus unit */
++void __iomem *ltq_ebu_membase;
++
++static int __init lantiq_ebu_init(void)
++{
++      /* insert and request the memory region */
++      if (insert_resource(&iomem_resource, &ltq_ebu_resource) < 0)
++              panic("Failed to insert ebu memory\n");
++
++      if (request_mem_region(ltq_ebu_resource.start,
++                      resource_size(&ltq_ebu_resource), "ebu") < 0)
++              panic("Failed to request ebu memory\n");
++
++      /* remap ebu register range */
++      ltq_ebu_membase = ioremap_nocache(ltq_ebu_resource.start,
++                              resource_size(&ltq_ebu_resource));
++      if (!ltq_ebu_membase)
++              panic("Failed to remap ebu memory\n");
++
++      /* make sure to unprotect the memory region where flash is located */
++      ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_BUSCON0) & ~EBU_WRDIS, LTQ_EBU_BUSCON0);
++      return 0;
++}
++
++postcore_initcall(lantiq_ebu_init);
+--- /dev/null
++++ b/arch/mips/lantiq/xway/gpio.c
+@@ -0,0 +1,195 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/slab.h>
++#include <linux/module.h>
++#include <linux/platform_device.h>
++#include <linux/gpio.h>
++#include <linux/ioport.h>
++#include <linux/io.h>
++
++#include <lantiq_soc.h>
++
++#define LTQ_GPIO_OUT          0x00
++#define LTQ_GPIO_IN           0x04
++#define LTQ_GPIO_DIR          0x08
++#define LTQ_GPIO_ALTSEL0      0x0C
++#define LTQ_GPIO_ALTSEL1      0x10
++#define LTQ_GPIO_OD           0x14
++
++#define PINS_PER_PORT         16
++#define MAX_PORTS             3
++
++#define ltq_gpio_getbit(m, r, p)      (!!(ltq_r32(m + r) & (1 << p)))
++#define ltq_gpio_setbit(m, r, p)      ltq_w32_mask(0, (1 << p), m + r)
++#define ltq_gpio_clearbit(m, r, p)    ltq_w32_mask((1 << p), 0, m + r)
++
++struct ltq_gpio {
++      void __iomem *membase;
++      struct gpio_chip chip;
++};
++
++static struct ltq_gpio ltq_gpio_port[MAX_PORTS];
++
++int gpio_to_irq(unsigned int gpio)
++{
++      return -EINVAL;
++}
++EXPORT_SYMBOL(gpio_to_irq);
++
++int irq_to_gpio(unsigned int gpio)
++{
++      return -EINVAL;
++}
++EXPORT_SYMBOL(irq_to_gpio);
++
++int ltq_gpio_request(unsigned int pin, unsigned int alt0,
++      unsigned int alt1, unsigned int dir, const char *name)
++{
++      int id = 0;
++
++      if (pin >= (MAX_PORTS * PINS_PER_PORT))
++              return -EINVAL;
++      if (gpio_request(pin, name)) {
++              pr_err("failed to setup lantiq gpio: %s\n", name);
++              return -EBUSY;
++      }
++      if (dir)
++              gpio_direction_output(pin, 1);
++      else
++              gpio_direction_input(pin);
++      while (pin >= PINS_PER_PORT) {
++              pin -= PINS_PER_PORT;
++              id++;
++      }
++      if (alt0)
++              ltq_gpio_setbit(ltq_gpio_port[id].membase,
++                      LTQ_GPIO_ALTSEL0, pin);
++      else
++              ltq_gpio_clearbit(ltq_gpio_port[id].membase,
++                      LTQ_GPIO_ALTSEL0, pin);
++      if (alt1)
++              ltq_gpio_setbit(ltq_gpio_port[id].membase,
++                      LTQ_GPIO_ALTSEL1, pin);
++      else
++              ltq_gpio_clearbit(ltq_gpio_port[id].membase,
++                      LTQ_GPIO_ALTSEL1, pin);
++      return 0;
++}
++EXPORT_SYMBOL(ltq_gpio_request);
++
++static void ltq_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
++{
++      struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
++
++      if (value)
++              ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OUT, offset);
++      else
++              ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OUT, offset);
++}
++
++static int ltq_gpio_get(struct gpio_chip *chip, unsigned int offset)
++{
++      struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
++
++      return ltq_gpio_getbit(ltq_gpio->membase, LTQ_GPIO_IN, offset);
++}
++
++static int ltq_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
++{
++      struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
++
++      ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
++      ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset);
++
++      return 0;
++}
++
++static int ltq_gpio_direction_output(struct gpio_chip *chip,
++      unsigned int offset, int value)
++{
++      struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
++
++      ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_OD, offset);
++      ltq_gpio_setbit(ltq_gpio->membase, LTQ_GPIO_DIR, offset);
++      ltq_gpio_set(chip, offset, value);
++
++      return 0;
++}
++
++static int ltq_gpio_req(struct gpio_chip *chip, unsigned offset)
++{
++      struct ltq_gpio *ltq_gpio = container_of(chip, struct ltq_gpio, chip);
++
++      ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL0, offset);
++      ltq_gpio_clearbit(ltq_gpio->membase, LTQ_GPIO_ALTSEL1, offset);
++      return 0;
++}
++
++static int ltq_gpio_probe(struct platform_device *pdev)
++{
++      struct resource *res;
++
++      if (pdev->id >= MAX_PORTS) {
++              dev_err(&pdev->dev, "invalid gpio port %d\n",
++                      pdev->id);
++              return -EINVAL;
++      }
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!res) {
++              dev_err(&pdev->dev, "failed to get memory for gpio port %d\n",
++                      pdev->id);
++              return -ENOENT;
++      }
++      res = devm_request_mem_region(&pdev->dev, res->start,
++              resource_size(res), dev_name(&pdev->dev));
++      if (!res) {
++              dev_err(&pdev->dev,
++                      "failed to request memory for gpio port %d\n",
++                      pdev->id);
++              return -EBUSY;
++      }
++      ltq_gpio_port[pdev->id].membase = devm_ioremap_nocache(&pdev->dev,
++              res->start, resource_size(res));
++      if (!ltq_gpio_port[pdev->id].membase) {
++              dev_err(&pdev->dev, "failed to remap memory for gpio port %d\n",
++                      pdev->id);
++              return -ENOMEM;
++      }
++      ltq_gpio_port[pdev->id].chip.label = "ltq_gpio";
++      ltq_gpio_port[pdev->id].chip.direction_input = ltq_gpio_direction_input;
++      ltq_gpio_port[pdev->id].chip.direction_output =
++              ltq_gpio_direction_output;
++      ltq_gpio_port[pdev->id].chip.get = ltq_gpio_get;
++      ltq_gpio_port[pdev->id].chip.set = ltq_gpio_set;
++      ltq_gpio_port[pdev->id].chip.request = ltq_gpio_req;
++      ltq_gpio_port[pdev->id].chip.base = PINS_PER_PORT * pdev->id;
++      ltq_gpio_port[pdev->id].chip.ngpio = PINS_PER_PORT;
++      platform_set_drvdata(pdev, &ltq_gpio_port[pdev->id]);
++      return gpiochip_add(&ltq_gpio_port[pdev->id].chip);
++}
++
++static struct platform_driver
++ltq_gpio_driver = {
++      .probe = ltq_gpio_probe,
++      .driver = {
++              .name = "ltq_gpio",
++              .owner = THIS_MODULE,
++      },
++};
++
++int __init ltq_gpio_init(void)
++{
++      int ret = platform_driver_register(&ltq_gpio_driver);
++
++      if (ret)
++              pr_info("ltq_gpio : Error registering platfom driver!");
++      return ret;
++}
++
++postcore_initcall(ltq_gpio_init);
+--- /dev/null
++++ b/arch/mips/lantiq/xway/pmu.c
+@@ -0,0 +1,70 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/version.h>
++#include <linux/ioport.h>
++
++#include <lantiq_soc.h>
++
++/* PMU - the power management unit allows us to turn part of the core
++ * on and off
++ */
++
++/* the enable / disable registers */
++#define LTQ_PMU_PWDCR 0x1C
++#define LTQ_PMU_PWDSR 0x20
++
++#define ltq_pmu_w32(x, y)     ltq_w32((x), ltq_pmu_membase + (y))
++#define ltq_pmu_r32(x)                ltq_r32(ltq_pmu_membase + (x))
++
++static struct resource ltq_pmu_resource = {
++      .name   = "pmu",
++      .start  = LTQ_PMU_BASE_ADDR,
++      .end    = LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++static void __iomem *ltq_pmu_membase;
++
++void ltq_pmu_enable(unsigned int module)
++{
++      int err = 1000000;
++
++      ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR);
++      do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
++
++      if (!err)
++              panic("activating PMU module failed!\n");
++}
++EXPORT_SYMBOL(ltq_pmu_enable);
++
++void ltq_pmu_disable(unsigned int module)
++{
++      ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR);
++}
++EXPORT_SYMBOL(ltq_pmu_disable);
++
++int __init ltq_pmu_init(void)
++{
++      if (insert_resource(&iomem_resource, &ltq_pmu_resource) < 0)
++              panic("Failed to insert pmu memory\n");
++
++      if (request_mem_region(ltq_pmu_resource.start,
++                      resource_size(&ltq_pmu_resource), "pmu") < 0)
++              panic("Failed to request pmu memory\n");
++
++      ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start,
++                              resource_size(&ltq_pmu_resource));
++      if (!ltq_pmu_membase)
++              panic("Failed to remap pmu memory\n");
++      return 0;
++}
++
++core_initcall(ltq_pmu_init);
+--- /dev/null
++++ b/arch/mips/lantiq/xway/prom-ase.c
+@@ -0,0 +1,39 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/module.h>
++#include <linux/clk.h>
++#include <asm/bootinfo.h>
++#include <asm/time.h>
++
++#include <lantiq_soc.h>
++
++#include "../prom.h"
++
++#define SOC_AMAZON_SE "Amazon_SE"
++
++#define PART_SHIFT    12
++#define PART_MASK     0x0FFFFFFF
++#define REV_SHIFT     28
++#define REV_MASK      0xF0000000
++
++void __init ltq_soc_detect(struct ltq_soc_info *i)
++{
++      i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT;
++      i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT;
++      switch (i->partnum) {
++      case SOC_ID_AMAZON_SE:
++              i->name = SOC_AMAZON_SE;
++              i->type = SOC_TYPE_AMAZON_SE;
++              break;
++
++      default:
++              unreachable();
++              break;
++      }
++}
+--- /dev/null
++++ b/arch/mips/lantiq/xway/prom-xway.c
+@@ -0,0 +1,54 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/module.h>
++#include <linux/clk.h>
++#include <asm/bootinfo.h>
++#include <asm/time.h>
++
++#include <lantiq_soc.h>
++
++#include "../prom.h"
++
++#define SOC_DANUBE    "Danube"
++#define SOC_TWINPASS  "Twinpass"
++#define SOC_AR9               "AR9"
++
++#define PART_SHIFT    12
++#define PART_MASK     0x0FFFFFFF
++#define REV_SHIFT     28
++#define REV_MASK      0xF0000000
++
++void __init ltq_soc_detect(struct ltq_soc_info *i)
++{
++      i->partnum = (ltq_r32(LTQ_MPS_CHIPID) & PART_MASK) >> PART_SHIFT;
++      i->rev = (ltq_r32(LTQ_MPS_CHIPID) & REV_MASK) >> REV_SHIFT;
++      switch (i->partnum) {
++      case SOC_ID_DANUBE1:
++      case SOC_ID_DANUBE2:
++              i->name = SOC_DANUBE;
++              i->type = SOC_TYPE_DANUBE;
++              break;
++
++      case SOC_ID_TWINPASS:
++              i->name = SOC_TWINPASS;
++              i->type = SOC_TYPE_DANUBE;
++              break;
++
++      case SOC_ID_ARX188:
++      case SOC_ID_ARX168:
++      case SOC_ID_ARX182:
++              i->name = SOC_AR9;
++              i->type = SOC_TYPE_AR9;
++              break;
++
++      default:
++              unreachable();
++              break;
++      }
++}
+--- /dev/null
++++ b/arch/mips/lantiq/xway/reset.c
+@@ -0,0 +1,91 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/io.h>
++#include <linux/ioport.h>
++#include <linux/pm.h>
++#include <linux/module.h>
++#include <asm/reboot.h>
++
++#include <lantiq_soc.h>
++
++#define ltq_rcu_w32(x, y)     ltq_w32((x), ltq_rcu_membase + (y))
++#define ltq_rcu_r32(x)                ltq_r32(ltq_rcu_membase + (x))
++
++/* register definitions */
++#define LTQ_RCU_RST           0x0010
++#define LTQ_RCU_RST_ALL               0x40000000
++
++#define LTQ_RCU_RST_STAT      0x0014
++#define LTQ_RCU_STAT_SHIFT    26
++
++static struct resource ltq_rcu_resource = {
++      .name   = "rcu",
++      .start  = LTQ_RCU_BASE_ADDR,
++      .end    = LTQ_RCU_BASE_ADDR + LTQ_RCU_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++/* remapped base addr of the reset control unit */
++static void __iomem *ltq_rcu_membase;
++
++/* This function is used by the watchdog driver */
++int ltq_reset_cause(void)
++{
++      u32 val = ltq_rcu_r32(LTQ_RCU_RST_STAT);
++      return val >> LTQ_RCU_STAT_SHIFT;
++}
++EXPORT_SYMBOL_GPL(ltq_reset_cause);
++
++static void ltq_machine_restart(char *command)
++{
++      pr_notice("System restart\n");
++      local_irq_disable();
++      ltq_rcu_w32(ltq_rcu_r32(LTQ_RCU_RST) | LTQ_RCU_RST_ALL, LTQ_RCU_RST);
++      unreachable();
++}
++
++static void ltq_machine_halt(void)
++{
++      pr_notice("System halted.\n");
++      local_irq_disable();
++      unreachable();
++}
++
++static void ltq_machine_power_off(void)
++{
++      pr_notice("Please turn off the power now.\n");
++      local_irq_disable();
++      unreachable();
++}
++
++static int __init mips_reboot_setup(void)
++{
++      /* insert and request the memory region */
++      if (insert_resource(&iomem_resource, &ltq_rcu_resource) < 0)
++              panic("Failed to insert rcu memory\n");
++
++      if (request_mem_region(ltq_rcu_resource.start,
++                      resource_size(&ltq_rcu_resource), "rcu") < 0)
++              panic("Failed to request rcu memory\n");
++
++      /* remap rcu register range */
++      ltq_rcu_membase = ioremap_nocache(ltq_rcu_resource.start,
++                              resource_size(&ltq_rcu_resource));
++      if (!ltq_rcu_membase)
++              panic("Failed to remap rcu memory\n");
++
++      _machine_restart = ltq_machine_restart;
++      _machine_halt = ltq_machine_halt;
++      pm_power_off = ltq_machine_power_off;
++
++      return 0;
++}
++
++arch_initcall(mips_reboot_setup);
diff --git a/target/linux/lantiq/patches-2.6.32/0003-MIPS-Lantiq-Add-PCI-controller-support.patch b/target/linux/lantiq/patches-2.6.32/0003-MIPS-Lantiq-Add-PCI-controller-support.patch
new file mode 100644 (file)
index 0000000..1757266
--- /dev/null
@@ -0,0 +1,546 @@
+From 08127ed36bad367903591bbf0f244179683ccb28 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Wed, 30 Mar 2011 09:27:49 +0200
+Subject: [PATCH 03/13] MIPS: Lantiq: Add PCI controller support.
+
+The Lantiq family of SoCs have a EBU (External Bus Unit). This patch adds
+the driver that allows us to use the EBU as a PCI controller. In order for
+PCI to work the EBU is set to endianess swap all the data. In addition we
+need to make use of SWAP_IO_SPACE for device->host DMA to work.
+
+The clock of the PCI works in several modes (internal/external). If this
+is not configured correctly the SoC will hang.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2250/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ .../mips/include/asm/mach-lantiq/lantiq_platform.h |   46 +++
+ arch/mips/pci/Makefile                             |    1 +
+ arch/mips/pci/ops-lantiq.c                         |  116 ++++++++
+ arch/mips/pci/pci-lantiq.c                         |  297 ++++++++++++++++++++
+ arch/mips/pci/pci-lantiq.h                         |   18 ++
+ 5 files changed, 478 insertions(+), 0 deletions(-)
+ create mode 100644 arch/mips/include/asm/mach-lantiq/lantiq_platform.h
+ create mode 100644 arch/mips/pci/ops-lantiq.c
+ create mode 100644 arch/mips/pci/pci-lantiq.c
+ create mode 100644 arch/mips/pci/pci-lantiq.h
+
+diff --git a/arch/mips/include/asm/mach-lantiq/lantiq_platform.h b/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
+new file mode 100644
+index 0000000..1f1dba6
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
+@@ -0,0 +1,46 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LANTIQ_PLATFORM_H__
++#define _LANTIQ_PLATFORM_H__
++
++#include <linux/mtd/partitions.h>
++
++/* struct used to pass info to the pci core */
++enum {
++      PCI_CLOCK_INT = 0,
++      PCI_CLOCK_EXT
++};
++
++#define PCI_EXIN0     0x0001
++#define PCI_EXIN1     0x0002
++#define PCI_EXIN2     0x0004
++#define PCI_EXIN3     0x0008
++#define PCI_EXIN4     0x0010
++#define PCI_EXIN5     0x0020
++#define PCI_EXIN_MAX  6
++
++#define PCI_GNT1      0x0040
++#define PCI_GNT2      0x0080
++#define PCI_GNT3      0x0100
++#define PCI_GNT4      0x0200
++
++#define PCI_REQ1      0x0400
++#define PCI_REQ2      0x0800
++#define PCI_REQ3      0x1000
++#define PCI_REQ4      0x2000
++#define PCI_REQ_SHIFT 10
++#define PCI_REQ_MASK  0xf
++
++struct ltq_pci_data {
++      int clock;
++      int gpio;
++      int irq[16];
++};
++
++#endif
+diff --git a/arch/mips/pci/Makefile b/arch/mips/pci/Makefile
+index f0d5329..4df8799 100644
+--- a/arch/mips/pci/Makefile
++++ b/arch/mips/pci/Makefile
+@@ -41,6 +41,7 @@ obj-$(CONFIG_SIBYTE_SB1250)  += fixup-sb1250.o pci-sb1250.o
+ obj-$(CONFIG_SIBYTE_BCM112X)  += fixup-sb1250.o pci-sb1250.o
+ obj-$(CONFIG_SIBYTE_BCM1x80)  += pci-bcm1480.o pci-bcm1480ht.o
+ obj-$(CONFIG_SNI_RM)          += fixup-sni.o ops-sni.o
++obj-$(CONFIG_SOC_XWAY)                += pci-lantiq.o ops-lantiq.o
+ obj-$(CONFIG_TANBAC_TB0219)   += fixup-tb0219.o
+ obj-$(CONFIG_TANBAC_TB0226)   += fixup-tb0226.o
+ obj-$(CONFIG_TANBAC_TB0287)   += fixup-tb0287.o
+diff --git a/arch/mips/pci/ops-lantiq.c b/arch/mips/pci/ops-lantiq.c
+new file mode 100644
+index 0000000..1f2afb5
+--- /dev/null
++++ b/arch/mips/pci/ops-lantiq.c
+@@ -0,0 +1,116 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/types.h>
++#include <linux/pci.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/mm.h>
++#include <asm/addrspace.h>
++#include <linux/vmalloc.h>
++
++#include <lantiq_soc.h>
++
++#include "pci-lantiq.h"
++
++#define LTQ_PCI_CFG_BUSNUM_SHF 16
++#define LTQ_PCI_CFG_DEVNUM_SHF 11
++#define LTQ_PCI_CFG_FUNNUM_SHF 8
++
++#define PCI_ACCESS_READ  0
++#define PCI_ACCESS_WRITE 1
++
++static int ltq_pci_config_access(unsigned char access_type, struct pci_bus *bus,
++      unsigned int devfn, unsigned int where, u32 *data)
++{
++      unsigned long cfg_base;
++      unsigned long flags;
++      u32 temp;
++
++      /* we support slot from 0 to 15 dev_fn & 0x68 (AD29) is the
++         SoC itself */
++      if ((bus->number != 0) || ((devfn & 0xf8) > 0x78)
++              || ((devfn & 0xf8) == 0) || ((devfn & 0xf8) == 0x68))
++              return 1;
++
++      spin_lock_irqsave(&ebu_lock, flags);
++
++      cfg_base = (unsigned long) ltq_pci_mapped_cfg;
++      cfg_base |= (bus->number << LTQ_PCI_CFG_BUSNUM_SHF) | (devfn <<
++                      LTQ_PCI_CFG_FUNNUM_SHF) | (where & ~0x3);
++
++      /* Perform access */
++      if (access_type == PCI_ACCESS_WRITE) {
++              ltq_w32(swab32(*data), ((u32 *)cfg_base));
++      } else {
++              *data = ltq_r32(((u32 *)(cfg_base)));
++              *data = swab32(*data);
++      }
++      wmb();
++
++      /* clean possible Master abort */
++      cfg_base = (unsigned long) ltq_pci_mapped_cfg;
++      cfg_base |= (0x0 << LTQ_PCI_CFG_FUNNUM_SHF) + 4;
++      temp = ltq_r32(((u32 *)(cfg_base)));
++      temp = swab32(temp);
++      cfg_base = (unsigned long) ltq_pci_mapped_cfg;
++      cfg_base |= (0x68 << LTQ_PCI_CFG_FUNNUM_SHF) + 4;
++      ltq_w32(temp, ((u32 *)cfg_base));
++
++      spin_unlock_irqrestore(&ebu_lock, flags);
++
++      if (((*data) == 0xffffffff) && (access_type == PCI_ACCESS_READ))
++              return 1;
++
++      return 0;
++}
++
++int ltq_pci_read_config_dword(struct pci_bus *bus, unsigned int devfn,
++      int where, int size, u32 *val)
++{
++      u32 data = 0;
++
++      if (ltq_pci_config_access(PCI_ACCESS_READ, bus, devfn, where, &data))
++              return PCIBIOS_DEVICE_NOT_FOUND;
++
++      if (size == 1)
++              *val = (data >> ((where & 3) << 3)) & 0xff;
++      else if (size == 2)
++              *val = (data >> ((where & 3) << 3)) & 0xffff;
++      else
++              *val = data;
++
++      return PCIBIOS_SUCCESSFUL;
++}
++
++int ltq_pci_write_config_dword(struct pci_bus *bus, unsigned int devfn,
++      int where, int size, u32 val)
++{
++      u32 data = 0;
++
++      if (size == 4) {
++              data = val;
++      } else {
++              if (ltq_pci_config_access(PCI_ACCESS_READ, bus,
++                              devfn, where, &data))
++                      return PCIBIOS_DEVICE_NOT_FOUND;
++
++              if (size == 1)
++                      data = (data & ~(0xff << ((where & 3) << 3))) |
++                              (val << ((where & 3) << 3));
++              else if (size == 2)
++                      data = (data & ~(0xffff << ((where & 3) << 3))) |
++                              (val << ((where & 3) << 3));
++      }
++
++      if (ltq_pci_config_access(PCI_ACCESS_WRITE, bus, devfn, where, &data))
++              return PCIBIOS_DEVICE_NOT_FOUND;
++
++      return PCIBIOS_SUCCESSFUL;
++}
+diff --git a/arch/mips/pci/pci-lantiq.c b/arch/mips/pci/pci-lantiq.c
+new file mode 100644
+index 0000000..603d749
+--- /dev/null
++++ b/arch/mips/pci/pci-lantiq.c
+@@ -0,0 +1,297 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/types.h>
++#include <linux/pci.h>
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/mm.h>
++#include <linux/vmalloc.h>
++#include <linux/platform_device.h>
++
++#include <asm/pci.h>
++#include <asm/gpio.h>
++#include <asm/addrspace.h>
++
++#include <lantiq_soc.h>
++#include <lantiq_irq.h>
++#include <lantiq_platform.h>
++
++#include "pci-lantiq.h"
++
++#define LTQ_PCI_CFG_BASE              0x17000000
++#define LTQ_PCI_CFG_SIZE              0x00008000
++#define LTQ_PCI_MEM_BASE              0x18000000
++#define LTQ_PCI_MEM_SIZE              0x02000000
++#define LTQ_PCI_IO_BASE                       0x1AE00000
++#define LTQ_PCI_IO_SIZE                       0x00200000
++
++#define PCI_CR_FCI_ADDR_MAP0          0x00C0
++#define PCI_CR_FCI_ADDR_MAP1          0x00C4
++#define PCI_CR_FCI_ADDR_MAP2          0x00C8
++#define PCI_CR_FCI_ADDR_MAP3          0x00CC
++#define PCI_CR_FCI_ADDR_MAP4          0x00D0
++#define PCI_CR_FCI_ADDR_MAP5          0x00D4
++#define PCI_CR_FCI_ADDR_MAP6          0x00D8
++#define PCI_CR_FCI_ADDR_MAP7          0x00DC
++#define PCI_CR_CLK_CTRL                       0x0000
++#define PCI_CR_PCI_MOD                        0x0030
++#define PCI_CR_PC_ARB                 0x0080
++#define PCI_CR_FCI_ADDR_MAP11hg               0x00E4
++#define PCI_CR_BAR11MASK              0x0044
++#define PCI_CR_BAR12MASK              0x0048
++#define PCI_CR_BAR13MASK              0x004C
++#define PCI_CS_BASE_ADDR1             0x0010
++#define PCI_CR_PCI_ADDR_MAP11         0x0064
++#define PCI_CR_FCI_BURST_LENGTH               0x00E8
++#define PCI_CR_PCI_EOI                        0x002C
++#define PCI_CS_STS_CMD                        0x0004
++
++#define PCI_MASTER0_REQ_MASK_2BITS    8
++#define PCI_MASTER1_REQ_MASK_2BITS    10
++#define PCI_MASTER2_REQ_MASK_2BITS    12
++#define INTERNAL_ARB_ENABLE_BIT               0
++
++#define LTQ_CGU_IFCCR         0x0018
++#define LTQ_CGU_PCICR         0x0034
++
++#define ltq_pci_w32(x, y)     ltq_w32((x), ltq_pci_membase + (y))
++#define ltq_pci_r32(x)                ltq_r32(ltq_pci_membase + (x))
++
++#define ltq_pci_cfg_w32(x, y) ltq_w32((x), ltq_pci_mapped_cfg + (y))
++#define ltq_pci_cfg_r32(x)    ltq_r32(ltq_pci_mapped_cfg + (x))
++
++struct ltq_pci_gpio_map {
++      int pin;
++      int alt0;
++      int alt1;
++      int dir;
++      char *name;
++};
++
++/* the pci core can make use of the following gpios */
++static struct ltq_pci_gpio_map ltq_pci_gpio_map[] = {
++      { 0, 1, 0, 0, "pci-exin0" },
++      { 1, 1, 0, 0, "pci-exin1" },
++      { 2, 1, 0, 0, "pci-exin2" },
++      { 39, 1, 0, 0, "pci-exin3" },
++      { 10, 1, 0, 0, "pci-exin4" },
++      { 9, 1, 0, 0, "pci-exin5" },
++      { 30, 1, 0, 1, "pci-gnt1" },
++      { 23, 1, 0, 1, "pci-gnt2" },
++      { 19, 1, 0, 1, "pci-gnt3" },
++      { 38, 1, 0, 1, "pci-gnt4" },
++      { 29, 1, 0, 0, "pci-req1" },
++      { 31, 1, 0, 0, "pci-req2" },
++      { 3, 1, 0, 0, "pci-req3" },
++      { 37, 1, 0, 0, "pci-req4" },
++};
++
++__iomem void *ltq_pci_mapped_cfg;
++static __iomem void *ltq_pci_membase;
++
++int (*ltqpci_plat_dev_init)(struct pci_dev *dev) = NULL;
++
++/* Since the PCI REQ pins can be reused for other functionality, make it
++   possible to exclude those from interpretation by the PCI controller */
++static int ltq_pci_req_mask = 0xf;
++
++static int *ltq_pci_irq_map;
++
++struct pci_ops ltq_pci_ops = {
++      .read   = ltq_pci_read_config_dword,
++      .write  = ltq_pci_write_config_dword
++};
++
++static struct resource pci_io_resource = {
++      .name   = "pci io space",
++      .start  = LTQ_PCI_IO_BASE,
++      .end    = LTQ_PCI_IO_BASE + LTQ_PCI_IO_SIZE - 1,
++      .flags  = IORESOURCE_IO
++};
++
++static struct resource pci_mem_resource = {
++      .name   = "pci memory space",
++      .start  = LTQ_PCI_MEM_BASE,
++      .end    = LTQ_PCI_MEM_BASE + LTQ_PCI_MEM_SIZE - 1,
++      .flags  = IORESOURCE_MEM
++};
++
++static struct pci_controller ltq_pci_controller = {
++      .pci_ops        = &ltq_pci_ops,
++      .mem_resource   = &pci_mem_resource,
++      .mem_offset     = 0x00000000UL,
++      .io_resource    = &pci_io_resource,
++      .io_offset      = 0x00000000UL,
++};
++
++int pcibios_plat_dev_init(struct pci_dev *dev)
++{
++      if (ltqpci_plat_dev_init)
++              return ltqpci_plat_dev_init(dev);
++
++      return 0;
++}
++
++static u32 ltq_calc_bar11mask(void)
++{
++      u32 mem, bar11mask;
++
++      /* BAR11MASK value depends on available memory on system. */
++      mem = num_physpages * PAGE_SIZE;
++      bar11mask = (0x0ffffff0 & ~((1 << (fls(mem) - 1)) - 1)) | 8;
++
++      return bar11mask;
++}
++
++static void ltq_pci_setup_gpio(int gpio)
++{
++      int i;
++      for (i = 0; i < ARRAY_SIZE(ltq_pci_gpio_map); i++) {
++              if (gpio & (1 << i)) {
++                      ltq_gpio_request(ltq_pci_gpio_map[i].pin,
++                              ltq_pci_gpio_map[i].alt0,
++                              ltq_pci_gpio_map[i].alt1,
++                              ltq_pci_gpio_map[i].dir,
++                              ltq_pci_gpio_map[i].name);
++              }
++      }
++      ltq_gpio_request(21, 0, 0, 1, "pci-reset");
++      ltq_pci_req_mask = (gpio >> PCI_REQ_SHIFT) & PCI_REQ_MASK;
++}
++
++static int __devinit ltq_pci_startup(struct ltq_pci_data *conf)
++{
++      u32 temp_buffer;
++
++      /* set clock to 33Mhz */
++      ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) & ~0xf00000, LTQ_CGU_IFCCR);
++      ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) | 0x800000, LTQ_CGU_IFCCR);
++
++      /* external or internal clock ? */
++      if (conf->clock) {
++              ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) & ~(1 << 16),
++                      LTQ_CGU_IFCCR);
++              ltq_cgu_w32((1 << 30), LTQ_CGU_PCICR);
++      } else {
++              ltq_cgu_w32(ltq_cgu_r32(LTQ_CGU_IFCCR) | (1 << 16),
++                      LTQ_CGU_IFCCR);
++              ltq_cgu_w32((1 << 31) | (1 << 30), LTQ_CGU_PCICR);
++      }
++
++      /* setup pci clock and gpis used by pci */
++      ltq_pci_setup_gpio(conf->gpio);
++
++      /* enable auto-switching between PCI and EBU */
++      ltq_pci_w32(0xa, PCI_CR_CLK_CTRL);
++
++      /* busy, i.e. configuration is not done, PCI access has to be retried */
++      ltq_pci_w32(ltq_pci_r32(PCI_CR_PCI_MOD) & ~(1 << 24), PCI_CR_PCI_MOD);
++      wmb();
++      /* BUS Master/IO/MEM access */
++      ltq_pci_cfg_w32(ltq_pci_cfg_r32(PCI_CS_STS_CMD) | 7, PCI_CS_STS_CMD);
++
++      /* enable external 2 PCI masters */
++      temp_buffer = ltq_pci_r32(PCI_CR_PC_ARB);
++      temp_buffer &= (~(ltq_pci_req_mask << 16));
++      /* enable internal arbiter */
++      temp_buffer |= (1 << INTERNAL_ARB_ENABLE_BIT);
++      /* enable internal PCI master reqest */
++      temp_buffer &= (~(3 << PCI_MASTER0_REQ_MASK_2BITS));
++
++      /* enable EBU request */
++      temp_buffer &= (~(3 << PCI_MASTER1_REQ_MASK_2BITS));
++
++      /* enable all external masters request */
++      temp_buffer &= (~(3 << PCI_MASTER2_REQ_MASK_2BITS));
++      ltq_pci_w32(temp_buffer, PCI_CR_PC_ARB);
++      wmb();
++
++      /* setup BAR memory regions */
++      ltq_pci_w32(0x18000000, PCI_CR_FCI_ADDR_MAP0);
++      ltq_pci_w32(0x18400000, PCI_CR_FCI_ADDR_MAP1);
++      ltq_pci_w32(0x18800000, PCI_CR_FCI_ADDR_MAP2);
++      ltq_pci_w32(0x18c00000, PCI_CR_FCI_ADDR_MAP3);
++      ltq_pci_w32(0x19000000, PCI_CR_FCI_ADDR_MAP4);
++      ltq_pci_w32(0x19400000, PCI_CR_FCI_ADDR_MAP5);
++      ltq_pci_w32(0x19800000, PCI_CR_FCI_ADDR_MAP6);
++      ltq_pci_w32(0x19c00000, PCI_CR_FCI_ADDR_MAP7);
++      ltq_pci_w32(0x1ae00000, PCI_CR_FCI_ADDR_MAP11hg);
++      ltq_pci_w32(ltq_calc_bar11mask(), PCI_CR_BAR11MASK);
++      ltq_pci_w32(0, PCI_CR_PCI_ADDR_MAP11);
++      ltq_pci_w32(0, PCI_CS_BASE_ADDR1);
++      /* both TX and RX endian swap are enabled */
++      ltq_pci_w32(ltq_pci_r32(PCI_CR_PCI_EOI) | 3, PCI_CR_PCI_EOI);
++      wmb();
++      ltq_pci_w32(ltq_pci_r32(PCI_CR_BAR12MASK) | 0x80000000,
++              PCI_CR_BAR12MASK);
++      ltq_pci_w32(ltq_pci_r32(PCI_CR_BAR13MASK) | 0x80000000,
++              PCI_CR_BAR13MASK);
++      /*use 8 dw burst length */
++      ltq_pci_w32(0x303, PCI_CR_FCI_BURST_LENGTH);
++      ltq_pci_w32(ltq_pci_r32(PCI_CR_PCI_MOD) | (1 << 24), PCI_CR_PCI_MOD);
++      wmb();
++
++      /* setup irq line */
++      ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_CON) | 0xc, LTQ_EBU_PCC_CON);
++      ltq_ebu_w32(ltq_ebu_r32(LTQ_EBU_PCC_IEN) | 0x10, LTQ_EBU_PCC_IEN);
++
++      /* toggle reset pin */
++      __gpio_set_value(21, 0);
++      wmb();
++      mdelay(1);
++      __gpio_set_value(21, 1);
++      return 0;
++}
++
++int __init pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
++{
++      if (ltq_pci_irq_map[slot])
++              return ltq_pci_irq_map[slot];
++      printk(KERN_ERR "ltq_pci: trying to map irq for unknown slot %d\n",
++              slot);
++
++      return 0;
++}
++
++static int __devinit ltq_pci_probe(struct platform_device *pdev)
++{
++      struct ltq_pci_data *ltq_pci_data =
++              (struct ltq_pci_data *) pdev->dev.platform_data;
++      pci_probe_only = 0;
++      ltq_pci_irq_map = ltq_pci_data->irq;
++      ltq_pci_membase = ioremap_nocache(PCI_CR_BASE_ADDR, PCI_CR_SIZE);
++      ltq_pci_mapped_cfg =
++              ioremap_nocache(LTQ_PCI_CFG_BASE, LTQ_PCI_CFG_BASE);
++      ltq_pci_controller.io_map_base =
++              (unsigned long)ioremap(LTQ_PCI_IO_BASE, LTQ_PCI_IO_SIZE - 1);
++      ltq_pci_startup(ltq_pci_data);
++      register_pci_controller(&ltq_pci_controller);
++
++      return 0;
++}
++
++static struct platform_driver
++ltq_pci_driver = {
++      .probe = ltq_pci_probe,
++      .driver = {
++              .name = "ltq_pci",
++              .owner = THIS_MODULE,
++      },
++};
++
++int __init pcibios_init(void)
++{
++      int ret = platform_driver_register(&ltq_pci_driver);
++      if (ret)
++              printk(KERN_INFO "ltq_pci: Error registering platfom driver!");
++      return ret;
++}
++
++arch_initcall(pcibios_init);
+diff --git a/arch/mips/pci/pci-lantiq.h b/arch/mips/pci/pci-lantiq.h
+new file mode 100644
+index 0000000..66bf6cd
+--- /dev/null
++++ b/arch/mips/pci/pci-lantiq.h
+@@ -0,0 +1,18 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LTQ_PCI_H__
++#define _LTQ_PCI_H__
++
++extern __iomem void *ltq_pci_mapped_cfg;
++extern int ltq_pci_read_config_dword(struct pci_bus *bus,
++      unsigned int devfn, int where, int size, u32 *val);
++extern int ltq_pci_write_config_dword(struct pci_bus *bus,
++      unsigned int devfn, int where, int size, u32 val);
++
++#endif
+-- 
+1.7.2.3
+
diff --git a/target/linux/lantiq/patches-2.6.32/0004-MIPS-Lantiq-Add-NOR-flash-support.patch b/target/linux/lantiq/patches-2.6.32/0004-MIPS-Lantiq-Add-NOR-flash-support.patch
new file mode 100644 (file)
index 0000000..03e86bb
--- /dev/null
@@ -0,0 +1,301 @@
+From cd0d53b24ca744295d2cdf69bb2b659571091b75 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Tue, 12 Apr 2011 18:10:01 +0200
+Subject: [PATCH 04/13] MIPS: Lantiq: Add NOR flash support
+
+This patch adds the driver/map for NOR devices attached to the SoC via the
+External Bus Unit (EBU).
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: David Woodhouse <dwmw2@infradead.org>
+Cc: Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
+Cc: linux-mips@linux-mips.org
+Cc: linux-mtd@lists.infradead.org
+Acked-by: Artem Bityutskiy <dedekind1@gmail.com>
+Patchwork: https://patchwork.linux-mips.org/patch/2285/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ drivers/mtd/maps/Kconfig        |    7 +
+ drivers/mtd/maps/Makefile       |    1 +
+ drivers/mtd/maps/lantiq-flash.c |  251 +++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 259 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/mtd/maps/lantiq-flash.c
+
+--- a/drivers/mtd/maps/Kconfig
++++ b/drivers/mtd/maps/Kconfig
+@@ -259,6 +259,13 @@
+       help
+         Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards
++config MTD_LANTIQ
++      tristate "Lantiq SoC NOR support"
++      depends on LANTIQ
++      select MTD_PARTITIONS
++      help
++        Support for NOR flash attached to the Lantiq SoC's External Bus Unit.
++
+ config MTD_DILNETPC
+       tristate "CFI Flash device mapped on DIL/Net PC"
+       depends on X86 && MTD_CONCAT && MTD_PARTITIONS && MTD_CFI_INTELEXT && BROKEN
+--- a/drivers/mtd/maps/Makefile
++++ b/drivers/mtd/maps/Makefile
+@@ -61,3 +61,4 @@
+ obj-$(CONFIG_MTD_RBTX4939)    += rbtx4939-flash.o
+ obj-$(CONFIG_MTD_VMU)         += vmu-flash.o
+ obj-$(CONFIG_MTD_GPIO_ADDR)   += gpio-addr-flash.o
++obj-$(CONFIG_MTD_LANTIQ)      += lantiq-flash.o
+--- /dev/null
++++ b/drivers/mtd/maps/lantiq-flash.c
+@@ -0,0 +1,251 @@
++/*
++ *  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) 2004 Liu Peng Infineon IFAP DC COM CPE
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/kernel.h>
++#include <linux/io.h>
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/map.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/cfi.h>
++#include <linux/platform_device.h>
++#include <linux/mtd/physmap.h>
++
++#include <lantiq_soc.h>
++#include <lantiq_platform.h>
++
++/*
++ * The NOR flash is connected to the same external bus unit (EBU) as PCI.
++ * To make PCI work we need to enable the endianness swapping for the address
++ * written to the EBU. This endianness swapping works for PCI correctly but
++ * fails for attached NOR devices. To workaround this we need to use a complex
++ * map. The workaround involves swapping all addresses whilst probing the chip.
++ * Once probing is complete we stop swapping the addresses but swizzle the
++ * unlock addresses to ensure that access to the NOR device works correctly.
++ */
++
++enum {
++      LTQ_NOR_PROBING,
++      LTQ_NOR_NORMAL
++};
++
++struct ltq_mtd {
++      struct resource *res;
++      struct mtd_info *mtd;
++      struct map_info *map;
++};
++
++static char ltq_map_name[] = "ltq_nor";
++
++static map_word
++ltq_read16(struct map_info *map, unsigned long adr)
++{
++      unsigned long flags;
++      map_word temp;
++
++      if (map->map_priv_1 == LTQ_NOR_PROBING)
++              adr ^= 2;
++      spin_lock_irqsave(&ebu_lock, flags);
++      temp.x[0] = *(u16 *)(map->virt + adr);
++      spin_unlock_irqrestore(&ebu_lock, flags);
++      return temp;
++}
++
++static void
++ltq_write16(struct map_info *map, map_word d, unsigned long adr)
++{
++      unsigned long flags;
++
++      if (map->map_priv_1 == LTQ_NOR_PROBING)
++              adr ^= 2;
++      spin_lock_irqsave(&ebu_lock, flags);
++      *(u16 *)(map->virt + adr) = d.x[0];
++      spin_unlock_irqrestore(&ebu_lock, flags);
++}
++
++/*
++ * The following 2 functions copy data between iomem and a cached memory
++ * section. As memcpy() makes use of pre-fetching we cannot use it here.
++ * The normal alternative of using memcpy_{to,from}io also makes use of
++ * memcpy() on MIPS so it is not applicable either. We are therefore stuck
++ * with having to use our own loop.
++ */
++static void
++ltq_copy_from(struct map_info *map, void *to,
++      unsigned long from, ssize_t len)
++{
++      unsigned char *f = (unsigned char *)map->virt + from;
++      unsigned char *t = (unsigned char *)to;
++      unsigned long flags;
++
++      spin_lock_irqsave(&ebu_lock, flags);
++      while (len--)
++              *t++ = *f++;
++      spin_unlock_irqrestore(&ebu_lock, flags);
++}
++
++static void
++ltq_copy_to(struct map_info *map, unsigned long to,
++      const void *from, ssize_t len)
++{
++      unsigned char *f = (unsigned char *)from;
++      unsigned char *t = (unsigned char *)map->virt + to;
++      unsigned long flags;
++
++      spin_lock_irqsave(&ebu_lock, flags);
++      while (len--)
++              *t++ = *f++;
++      spin_unlock_irqrestore(&ebu_lock, flags);
++}
++
++static const char const *part_probe_types[] = { "cmdlinepart", NULL };
++
++static int __init
++ltq_mtd_probe(struct platform_device *pdev)
++{
++      struct physmap_flash_data *ltq_mtd_data = dev_get_platdata(&pdev->dev);
++      struct ltq_mtd *ltq_mtd;
++      struct mtd_partition *parts;
++      struct resource *res;
++      int nr_parts = 0;
++      struct cfi_private *cfi;
++      int err;
++
++      ltq_mtd = kzalloc(sizeof(struct ltq_mtd), GFP_KERNEL);
++      platform_set_drvdata(pdev, ltq_mtd);
++
++      ltq_mtd->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!ltq_mtd->res) {
++              dev_err(&pdev->dev, "failed to get memory resource");
++              err = -ENOENT;
++              goto err_out;
++      }
++
++      res = devm_request_mem_region(&pdev->dev, ltq_mtd->res->start,
++              resource_size(ltq_mtd->res), dev_name(&pdev->dev));
++      if (!ltq_mtd->res) {
++              dev_err(&pdev->dev, "failed to request mem resource");
++              err = -EBUSY;
++              goto err_out;
++      }
++
++      ltq_mtd->map = kzalloc(sizeof(struct map_info), GFP_KERNEL);
++      ltq_mtd->map->phys = res->start;
++      ltq_mtd->map->size = resource_size(res);
++      ltq_mtd->map->virt = devm_ioremap_nocache(&pdev->dev,
++                              ltq_mtd->map->phys, ltq_mtd->map->size);
++      if (!ltq_mtd->map->virt) {
++              dev_err(&pdev->dev, "failed to ioremap!\n");
++              err = -ENOMEM;
++              goto err_free;
++      }
++
++      ltq_mtd->map->name = ltq_map_name;
++      ltq_mtd->map->bankwidth = 2;
++      ltq_mtd->map->read = ltq_read16;
++      ltq_mtd->map->write = ltq_write16;
++      ltq_mtd->map->copy_from = ltq_copy_from;
++      ltq_mtd->map->copy_to = ltq_copy_to;
++
++      ltq_mtd->map->map_priv_1 = LTQ_NOR_PROBING;
++      ltq_mtd->mtd = do_map_probe("cfi_probe", ltq_mtd->map);
++      ltq_mtd->map->map_priv_1 = LTQ_NOR_NORMAL;
++
++      if (!ltq_mtd->mtd) {
++              dev_err(&pdev->dev, "probing failed\n");
++              err = -ENXIO;
++              goto err_unmap;
++      }
++
++      ltq_mtd->mtd->owner = THIS_MODULE;
++
++      cfi = ltq_mtd->map->fldrv_priv;
++      cfi->addr_unlock1 ^= 1;
++      cfi->addr_unlock2 ^= 1;
++
++      nr_parts = parse_mtd_partitions(ltq_mtd->mtd,
++                              part_probe_types, &parts, 0);
++      if (nr_parts > 0) {
++              dev_info(&pdev->dev,
++                      "using %d partitions from cmdline", nr_parts);
++      } else {
++              nr_parts = ltq_mtd_data->nr_parts;
++              parts = ltq_mtd_data->parts;
++      }
++
++      err = add_mtd_partitions(ltq_mtd->mtd, parts, nr_parts);
++      if (err) {
++              dev_err(&pdev->dev, "failed to add partitions\n");
++              goto err_destroy;
++      }
++
++      return 0;
++
++err_destroy:
++      map_destroy(ltq_mtd->mtd);
++err_unmap:
++      iounmap(ltq_mtd->map->virt);
++err_free:
++      kfree(ltq_mtd->map);
++err_out:
++      kfree(ltq_mtd);
++      return err;
++}
++
++static int __devexit
++ltq_mtd_remove(struct platform_device *pdev)
++{
++      struct ltq_mtd *ltq_mtd = platform_get_drvdata(pdev);
++
++      if (ltq_mtd) {
++              if (ltq_mtd->mtd) {
++                      del_mtd_partitions(ltq_mtd->mtd);
++                      map_destroy(ltq_mtd->mtd);
++              }
++              if (ltq_mtd->map->virt)
++                      iounmap(ltq_mtd->map->virt);
++              kfree(ltq_mtd->map);
++              kfree(ltq_mtd);
++      }
++      return 0;
++}
++
++static struct platform_driver ltq_mtd_driver = {
++      .remove = __devexit_p(ltq_mtd_remove),
++      .driver = {
++              .name = "ltq_nor",
++              .owner = THIS_MODULE,
++      },
++};
++
++static int __init
++init_ltq_mtd(void)
++{
++      int ret = platform_driver_probe(&ltq_mtd_driver, ltq_mtd_probe);
++
++      if (ret)
++              pr_err("ltq_nor: error registering platform driver");
++      return ret;
++}
++
++static void __exit
++exit_ltq_mtd(void)
++{
++      platform_driver_unregister(&ltq_mtd_driver);
++}
++
++module_init(init_ltq_mtd);
++module_exit(exit_ltq_mtd);
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("John Crispin <blogic@openwrt.org>");
++MODULE_DESCRIPTION("Lantiq SoC NOR");
diff --git a/target/linux/lantiq/patches-2.6.32/0005-MIPS-Lantiq-Add-platform-device-support.patch b/target/linux/lantiq/patches-2.6.32/0005-MIPS-Lantiq-Add-platform-device-support.patch
new file mode 100644 (file)
index 0000000..917993f
--- /dev/null
@@ -0,0 +1,338 @@
+From 09e57348261c1ae0ff89c68679126fc76a28b2a2 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Wed, 30 Mar 2011 09:27:53 +0200
+Subject: [PATCH 05/13] MIPS: Lantiq: Add platform device support
+
+This patch adds the wrappers for registering our platform devices.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2254/
+Patchwork: https://patchwork.linux-mips.org/patch/2360/
+Patchwork: https://patchwork.linux-mips.org/patch/2359/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/lantiq/Makefile       |    2 +-
+ arch/mips/lantiq/devices.c      |  122 +++++++++++++++++++++++++++++++++++++++
+ arch/mips/lantiq/devices.h      |   23 +++++++
+ arch/mips/lantiq/xway/Makefile  |    2 +-
+ arch/mips/lantiq/xway/devices.c |   98 +++++++++++++++++++++++++++++++
+ arch/mips/lantiq/xway/devices.h |   18 ++++++
+ 6 files changed, 263 insertions(+), 2 deletions(-)
+ create mode 100644 arch/mips/lantiq/devices.c
+ create mode 100644 arch/mips/lantiq/devices.h
+ create mode 100644 arch/mips/lantiq/xway/devices.c
+ create mode 100644 arch/mips/lantiq/xway/devices.h
+
+diff --git a/arch/mips/lantiq/Makefile b/arch/mips/lantiq/Makefile
+index a268391..e5dae0e 100644
+--- a/arch/mips/lantiq/Makefile
++++ b/arch/mips/lantiq/Makefile
+@@ -4,7 +4,7 @@
+ # under the terms of the GNU General Public License version 2 as published
+ # by the Free Software Foundation.
+-obj-y := irq.o setup.o clk.o prom.o
++obj-y := irq.o setup.o clk.o prom.o devices.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
+diff --git a/arch/mips/lantiq/devices.c b/arch/mips/lantiq/devices.c
+new file mode 100644
+index 0000000..7b82c34
+--- /dev/null
++++ b/arch/mips/lantiq/devices.c
+@@ -0,0 +1,122 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/string.h>
++#include <linux/kernel.h>
++#include <linux/reboot.h>
++#include <linux/platform_device.h>
++#include <linux/leds.h>
++#include <linux/etherdevice.h>
++#include <linux/reboot.h>
++#include <linux/time.h>
++#include <linux/io.h>
++#include <linux/gpio.h>
++#include <linux/leds.h>
++
++#include <asm/bootinfo.h>
++#include <asm/irq.h>
++
++#include <lantiq_soc.h>
++
++#include "devices.h"
++
++/* nor flash */
++static struct resource ltq_nor_resource = {
++      .name   = "nor",
++      .start  = LTQ_FLASH_START,
++      .end    = LTQ_FLASH_START + LTQ_FLASH_MAX - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++static struct platform_device ltq_nor = {
++      .name           = "ltq_nor",
++      .resource       = &ltq_nor_resource,
++      .num_resources  = 1,
++};
++
++void __init ltq_register_nor(struct physmap_flash_data *data)
++{
++      ltq_nor.dev.platform_data = data;
++      platform_device_register(&ltq_nor);
++}
++
++/* watchdog */
++static struct resource ltq_wdt_resource = {
++      .name   = "watchdog",
++      .start  = LTQ_WDT_BASE_ADDR,
++      .end    = LTQ_WDT_BASE_ADDR + LTQ_WDT_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++void __init ltq_register_wdt(void)
++{
++      platform_device_register_simple("ltq_wdt", 0, &ltq_wdt_resource, 1);
++}
++
++/* asc ports */
++static struct resource ltq_asc0_resources[] = {
++      {
++              .name   = "asc0",
++              .start  = LTQ_ASC0_BASE_ADDR,
++              .end    = LTQ_ASC0_BASE_ADDR + LTQ_ASC_SIZE - 1,
++              .flags  = IORESOURCE_MEM,
++      },
++      IRQ_RES(tx, LTQ_ASC_TIR(0)),
++      IRQ_RES(rx, LTQ_ASC_RIR(0)),
++      IRQ_RES(err, LTQ_ASC_EIR(0)),
++};
++
++static struct resource ltq_asc1_resources[] = {
++      {
++              .name   = "asc1",
++              .start  = LTQ_ASC1_BASE_ADDR,
++              .end    = LTQ_ASC1_BASE_ADDR + LTQ_ASC_SIZE - 1,
++              .flags  = IORESOURCE_MEM,
++      },
++      IRQ_RES(tx, LTQ_ASC_TIR(1)),
++      IRQ_RES(rx, LTQ_ASC_RIR(1)),
++      IRQ_RES(err, LTQ_ASC_EIR(1)),
++};
++
++void __init ltq_register_asc(int port)
++{
++      switch (port) {
++      case 0:
++              platform_device_register_simple("ltq_asc", 0,
++                      ltq_asc0_resources, ARRAY_SIZE(ltq_asc0_resources));
++              break;
++      case 1:
++              platform_device_register_simple("ltq_asc", 1,
++                      ltq_asc1_resources, ARRAY_SIZE(ltq_asc1_resources));
++              break;
++      default:
++              break;
++      }
++}
++
++#ifdef CONFIG_PCI
++/* pci */
++static struct platform_device ltq_pci = {
++      .name           = "ltq_pci",
++      .num_resources  = 0,
++};
++
++void __init ltq_register_pci(struct ltq_pci_data *data)
++{
++      ltq_pci.dev.platform_data = data;
++      platform_device_register(&ltq_pci);
++}
++#else
++void __init ltq_register_pci(struct ltq_pci_data *data)
++{
++      pr_err("kernel is compiled without PCI support\n");
++}
++#endif
+diff --git a/arch/mips/lantiq/devices.h b/arch/mips/lantiq/devices.h
+new file mode 100644
+index 0000000..2947bb1
+--- /dev/null
++++ b/arch/mips/lantiq/devices.h
+@@ -0,0 +1,23 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LTQ_DEVICES_H__
++#define _LTQ_DEVICES_H__
++
++#include <lantiq_platform.h>
++#include <linux/mtd/physmap.h>
++
++#define IRQ_RES(resname, irq) \
++      {.name = #resname, .start = (irq), .flags = IORESOURCE_IRQ}
++
++extern void ltq_register_nor(struct physmap_flash_data *data);
++extern void ltq_register_wdt(void);
++extern void ltq_register_asc(int port);
++extern void ltq_register_pci(struct ltq_pci_data *data);
++
++#endif
+diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
+index 9c85ff9..74ce438 100644
+--- a/arch/mips/lantiq/xway/Makefile
++++ b/arch/mips/lantiq/xway/Makefile
+@@ -1,4 +1,4 @@
+-obj-y := pmu.o ebu.o reset.o gpio.o
++obj-y := pmu.o ebu.o reset.o gpio.o devices.o
+ obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
+ obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
+diff --git a/arch/mips/lantiq/xway/devices.c b/arch/mips/lantiq/xway/devices.c
+new file mode 100644
+index 0000000..a71b3b5
+--- /dev/null
++++ b/arch/mips/lantiq/xway/devices.c
+@@ -0,0 +1,98 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/string.h>
++#include <linux/mtd/physmap.h>
++#include <linux/kernel.h>
++#include <linux/reboot.h>
++#include <linux/platform_device.h>
++#include <linux/leds.h>
++#include <linux/etherdevice.h>
++#include <linux/reboot.h>
++#include <linux/time.h>
++#include <linux/io.h>
++#include <linux/gpio.h>
++#include <linux/leds.h>
++
++#include <asm/bootinfo.h>
++#include <asm/irq.h>
++
++#include <lantiq_soc.h>
++#include <lantiq_irq.h>
++#include <lantiq_platform.h>
++
++#include "devices.h"
++
++/* gpio */
++static struct resource ltq_gpio_resource[] = {
++      {
++              .name   = "gpio0",
++              .start  = LTQ_GPIO0_BASE_ADDR,
++              .end    = LTQ_GPIO0_BASE_ADDR + LTQ_GPIO_SIZE - 1,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .name   = "gpio1",
++              .start  = LTQ_GPIO1_BASE_ADDR,
++              .end    = LTQ_GPIO1_BASE_ADDR + LTQ_GPIO_SIZE - 1,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .name   = "gpio2",
++              .start  = LTQ_GPIO2_BASE_ADDR,
++              .end    = LTQ_GPIO2_BASE_ADDR + LTQ_GPIO_SIZE - 1,
++              .flags  = IORESOURCE_MEM,
++      }
++};
++
++void __init ltq_register_gpio(void)
++{
++      platform_device_register_simple("ltq_gpio", 0,
++              &ltq_gpio_resource[0], 1);
++      platform_device_register_simple("ltq_gpio", 1,
++              &ltq_gpio_resource[1], 1);
++
++      /* AR9 and VR9 have an extra gpio block */
++      if (ltq_is_ar9() || ltq_is_vr9()) {
++              platform_device_register_simple("ltq_gpio", 2,
++                      &ltq_gpio_resource[2], 1);
++      }
++}
++
++/* serial to parallel conversion */
++static struct resource ltq_stp_resource = {
++      .name   = "stp",
++      .start  = LTQ_STP_BASE_ADDR,
++      .end    = LTQ_STP_BASE_ADDR + LTQ_STP_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++void __init ltq_register_gpio_stp(void)
++{
++      platform_device_register_simple("ltq_stp", 0, &ltq_stp_resource, 1);
++}
++
++/* asc ports - amazon se has its own serial mapping */
++static struct resource ltq_ase_asc_resources[] = {
++      {
++              .name   = "asc0",
++              .start  = LTQ_ASC1_BASE_ADDR,
++              .end    = LTQ_ASC1_BASE_ADDR + LTQ_ASC_SIZE - 1,
++              .flags  = IORESOURCE_MEM,
++      },
++      IRQ_RES(tx, LTQ_ASC_ASE_TIR),
++      IRQ_RES(rx, LTQ_ASC_ASE_RIR),
++      IRQ_RES(err, LTQ_ASC_ASE_EIR),
++};
++
++void __init ltq_register_ase_asc(void)
++{
++      platform_device_register_simple("ltq_asc", 0,
++              ltq_ase_asc_resources, ARRAY_SIZE(ltq_ase_asc_resources));
++}
+diff --git a/arch/mips/lantiq/xway/devices.h b/arch/mips/lantiq/xway/devices.h
+new file mode 100644
+index 0000000..51f56b5
+--- /dev/null
++++ b/arch/mips/lantiq/xway/devices.h
+@@ -0,0 +1,18 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LTQ_DEVICES_XWAY_H__
++#define _LTQ_DEVICES_XWAY_H__
++
++#include "../devices.h"
++
++extern void ltq_register_gpio(void);
++extern void ltq_register_gpio_stp(void);
++extern void ltq_register_ase_asc(void);
++
++#endif
+-- 
+1.7.2.3
+
diff --git a/target/linux/lantiq/patches-2.6.32/0006-MIPS-Lantiq-Add-mips_machine-support.patch b/target/linux/lantiq/patches-2.6.32/0006-MIPS-Lantiq-Add-mips_machine-support.patch
new file mode 100644 (file)
index 0000000..9e02b6a
--- /dev/null
@@ -0,0 +1,170 @@
+From 52a5369d1067d4feddbfa7ff4486a77ac9a2971e Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Wed, 30 Mar 2011 09:27:54 +0200
+Subject: [PATCH 06/13] MIPS: Lantiq: Add mips_machine support
+
+This patch adds support for Gabor's mips_machine patch.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: Gabor Juhos <juhosg@openwrt.org>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2251/
+Patchwork: https://patchwork.linux-mips.org/patch/2358/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/Kconfig                  |    1 +
+ arch/mips/lantiq/machtypes.h       |   18 ++++++++++++++++++
+ arch/mips/lantiq/prom.h            |    1 +
+ arch/mips/lantiq/setup.c           |   25 +++++++++++++++++++++++++
+ arch/mips/lantiq/xway/Makefile     |    4 ++--
+ arch/mips/lantiq/xway/setup-ase.c  |   19 +++++++++++++++++++
+ arch/mips/lantiq/xway/setup-xway.c |   20 ++++++++++++++++++++
+ 7 files changed, 86 insertions(+), 2 deletions(-)
+ create mode 100644 arch/mips/lantiq/machtypes.h
+ create mode 100644 arch/mips/lantiq/xway/setup-ase.c
+ create mode 100644 arch/mips/lantiq/xway/setup-xway.c
+
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -190,6 +190,7 @@
+       select SWAP_IO_SPACE
+       select BOOT_RAW
+       select HAVE_CLK
++      select MIPS_MACHINE
+ config LASAT
+       bool "LASAT Networks platforms"
+--- /dev/null
++++ b/arch/mips/lantiq/machtypes.h
+@@ -0,0 +1,18 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef _LANTIQ_MACH_H__
++#define _LANTIQ_MACH_H__
++
++#include <asm/mips_machine.h>
++
++enum lantiq_mach_type {
++      LTQ_MACH_GENERIC = 0,
++};
++
++#endif
+--- a/arch/mips/lantiq/prom.h
++++ b/arch/mips/lantiq/prom.h
+@@ -20,5 +20,6 @@
+ };
+ extern void ltq_soc_detect(struct ltq_soc_info *i);
++extern void ltq_soc_setup(void);
+ #endif
+--- a/arch/mips/lantiq/setup.c
++++ b/arch/mips/lantiq/setup.c
+@@ -14,6 +14,12 @@
+ #include <lantiq_soc.h>
++#include "machtypes.h"
++#include "devices.h"
++#include "prom.h"
++
++unsigned long physical_memsize = 0L;
++
+ void __init plat_mem_setup(void)
+ {
+       /* assume 16M as default incase uboot fails to pass proper ramsize */
+@@ -32,10 +38,32 @@
+               if (!strncmp(e, "memsize=", 8)) {
+                       e += 8;
+                       if (strict_strtoul(e, 0, &memsize))
+-                              pr_warn("bad memsize specified\n");
++                              pr_warning("bad memsize specified\n");
+               }
+               envp++;
+       }
+       memsize *= 1024 * 1024;
+       add_memory_region(0x00000000, memsize, BOOT_MEM_RAM);
++      physical_memsize = memsize;
++}
++
++static int __init
++lantiq_setup(void)
++{
++      ltq_soc_setup();
++      mips_machine_setup();
++      return 0;
+ }
++
++arch_initcall(lantiq_setup);
++
++static void __init
++lantiq_generic_init(void)
++{
++      /* Nothing to do */
++}
++
++MIPS_MACHINE(LTQ_MACH_GENERIC,
++           "Generic",
++           "Generic Lantiq based board",
++           lantiq_generic_init);
+--- a/arch/mips/lantiq/xway/Makefile
++++ b/arch/mips/lantiq/xway/Makefile
+@@ -1,4 +1,4 @@
+ obj-y := pmu.o ebu.o reset.o gpio.o devices.o
+-obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o
+-obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o
++obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o
++obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o
+--- /dev/null
++++ b/arch/mips/lantiq/xway/setup-ase.c
+@@ -0,0 +1,19 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2011 John Crispin <blogic@openwrt.org>
++ */
++
++#include <lantiq_soc.h>
++
++#include "../prom.h"
++#include "devices.h"
++
++void __init ltq_soc_setup(void)
++{
++      ltq_register_ase_asc();
++      ltq_register_gpio();
++      ltq_register_wdt();
++}
+--- /dev/null
++++ b/arch/mips/lantiq/xway/setup-xway.c
+@@ -0,0 +1,20 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2011 John Crispin <blogic@openwrt.org>
++ */
++
++#include <lantiq_soc.h>
++
++#include "../prom.h"
++#include "devices.h"
++
++void __init ltq_soc_setup(void)
++{
++      ltq_register_asc(0);
++      ltq_register_asc(1);
++      ltq_register_gpio();
++      ltq_register_wdt();
++}
diff --git a/target/linux/lantiq/patches-2.6.32/0007-MIPS-Lantiq-Add-machtypes-for-lantiq-eval-kits.patch b/target/linux/lantiq/patches-2.6.32/0007-MIPS-Lantiq-Add-machtypes-for-lantiq-eval-kits.patch
new file mode 100644 (file)
index 0000000..e69558c
--- /dev/null
@@ -0,0 +1,230 @@
+From ab2182fc419548455d03979683eb0e92c372ed79 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Wed, 30 Mar 2011 09:27:55 +0200
+Subject: [PATCH 07/13] MIPS: Lantiq: Add machtypes for lantiq eval kits
+
+This patch adds mach specific code for the Lantiq EASY50712/50601 evaluation
+boards
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2255/
+Patchwork: https://patchwork.linux-mips.org/patch/2361/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/lantiq/Kconfig               |    2 +
+ arch/mips/lantiq/machtypes.h           |    2 +
+ arch/mips/lantiq/xway/Kconfig          |   23 +++++++++++
+ arch/mips/lantiq/xway/Makefile         |    3 +
+ arch/mips/lantiq/xway/mach-easy50601.c |   57 ++++++++++++++++++++++++++
+ arch/mips/lantiq/xway/mach-easy50712.c |   68 ++++++++++++++++++++++++++++++++
+ 6 files changed, 155 insertions(+), 0 deletions(-)
+ create mode 100644 arch/mips/lantiq/xway/Kconfig
+ create mode 100644 arch/mips/lantiq/xway/mach-easy50601.c
+ create mode 100644 arch/mips/lantiq/xway/mach-easy50712.c
+
+diff --git a/arch/mips/lantiq/Kconfig b/arch/mips/lantiq/Kconfig
+index 2780461..3fccf21 100644
+--- a/arch/mips/lantiq/Kconfig
++++ b/arch/mips/lantiq/Kconfig
+@@ -18,4 +18,6 @@ config SOC_XWAY
+       select HW_HAS_PCI
+ endchoice
++source "arch/mips/lantiq/xway/Kconfig"
++
+ endif
+diff --git a/arch/mips/lantiq/machtypes.h b/arch/mips/lantiq/machtypes.h
+index ffcacfc..7e01b8c 100644
+--- a/arch/mips/lantiq/machtypes.h
++++ b/arch/mips/lantiq/machtypes.h
+@@ -13,6 +13,8 @@
+ enum lantiq_mach_type {
+       LTQ_MACH_GENERIC = 0,
++      LTQ_MACH_EASY50712,     /* Danube evaluation board */
++      LTQ_MACH_EASY50601,     /* Amazon SE evaluation board */
+ };
+ #endif
+diff --git a/arch/mips/lantiq/xway/Kconfig b/arch/mips/lantiq/xway/Kconfig
+new file mode 100644
+index 0000000..2b857de
+--- /dev/null
++++ b/arch/mips/lantiq/xway/Kconfig
+@@ -0,0 +1,23 @@
++if SOC_XWAY
++
++menu "MIPS Machine"
++
++config LANTIQ_MACH_EASY50712
++      bool "Easy50712 - Danube"
++      default y
++
++endmenu
++
++endif
++
++if SOC_AMAZON_SE
++
++menu "MIPS Machine"
++
++config LANTIQ_MACH_EASY50601
++      bool "Easy50601 - Amazon SE"
++      default y
++
++endmenu
++
++endif
+diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
+index 8c06a97..b1d3640 100644
+--- a/arch/mips/lantiq/xway/Makefile
++++ b/arch/mips/lantiq/xway/Makefile
+@@ -2,3 +2,6 @@ obj-y := pmu.o ebu.o reset.o gpio.o devices.o
+ obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o
+ obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o
++
++obj-$(CONFIG_LANTIQ_MACH_EASY50712) += mach-easy50712.o
++obj-$(CONFIG_LANTIQ_MACH_EASY50601) += mach-easy50601.o
+diff --git a/arch/mips/lantiq/xway/mach-easy50601.c b/arch/mips/lantiq/xway/mach-easy50601.c
+new file mode 100644
+index 0000000..d5aaf63
+--- /dev/null
++++ b/arch/mips/lantiq/xway/mach-easy50601.c
+@@ -0,0 +1,57 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/physmap.h>
++#include <linux/input.h>
++
++#include <lantiq.h>
++
++#include "../machtypes.h"
++#include "devices.h"
++
++static struct mtd_partition easy50601_partitions[] = {
++      {
++              .name   = "uboot",
++              .offset = 0x0,
++              .size   = 0x10000,
++      },
++      {
++              .name   = "uboot_env",
++              .offset = 0x10000,
++              .size   = 0x10000,
++      },
++      {
++              .name   = "linux",
++              .offset = 0x20000,
++              .size   = 0xE0000,
++      },
++      {
++              .name   = "rootfs",
++              .offset = 0x100000,
++              .size   = 0x300000,
++      },
++};
++
++static struct physmap_flash_data easy50601_flash_data = {
++      .nr_parts       = ARRAY_SIZE(easy50601_partitions),
++      .parts          = easy50601_partitions,
++};
++
++static void __init easy50601_init(void)
++{
++      ltq_register_nor(&easy50601_flash_data);
++}
++
++MIPS_MACHINE(LTQ_MACH_EASY50601,
++                      "EASY50601",
++                      "EASY50601 Eval Board",
++                      easy50601_init);
+diff --git a/arch/mips/lantiq/xway/mach-easy50712.c b/arch/mips/lantiq/xway/mach-easy50712.c
+new file mode 100644
+index 0000000..e5e7e09
+--- /dev/null
++++ b/arch/mips/lantiq/xway/mach-easy50712.c
+@@ -0,0 +1,68 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
++#include <linux/mtd/physmap.h>
++#include <linux/input.h>
++
++#include <lantiq_soc.h>
++#include <irq.h>
++
++#include "../machtypes.h"
++#include "devices.h"
++
++static struct mtd_partition easy50712_partitions[] = {
++      {
++              .name   = "uboot",
++              .offset = 0x0,
++              .size   = 0x10000,
++      },
++      {
++              .name   = "uboot_env",
++              .offset = 0x10000,
++              .size   = 0x10000,
++      },
++      {
++              .name   = "linux",
++              .offset = 0x20000,
++              .size   = 0xe0000,
++      },
++      {
++              .name   = "rootfs",
++              .offset = 0x100000,
++              .size   = 0x300000,
++      },
++};
++
++static struct physmap_flash_data easy50712_flash_data = {
++      .nr_parts       = ARRAY_SIZE(easy50712_partitions),
++      .parts          = easy50712_partitions,
++};
++
++static struct ltq_pci_data ltq_pci_data = {
++      .clock  = PCI_CLOCK_INT,
++      .gpio   = PCI_GNT1 | PCI_REQ1,
++      .irq    = {
++              [14] = INT_NUM_IM0_IRL0 + 22,
++      },
++};
++
++static void __init easy50712_init(void)
++{
++      ltq_register_gpio_stp();
++      ltq_register_nor(&easy50712_flash_data);
++      ltq_register_pci(&ltq_pci_data);
++}
++
++MIPS_MACHINE(LTQ_MACH_EASY50712,
++           "EASY50712",
++           "EASY50712 Eval Board",
++            easy50712_init);
+-- 
+1.7.2.3
+
diff --git a/target/linux/lantiq/patches-2.6.32/0008-MIPS-Lantiq-Add-more-gpio-drivers.patch b/target/linux/lantiq/patches-2.6.32/0008-MIPS-Lantiq-Add-more-gpio-drivers.patch
new file mode 100644 (file)
index 0000000..2daa9e0
--- /dev/null
@@ -0,0 +1,330 @@
+From f9391211e47cdcc31f341d710efef4b3b46c333d Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Wed, 30 Mar 2011 09:27:56 +0200
+Subject: [PATCH 08/13] MIPS: Lantiq: Add more gpio drivers
+
+The XWAY family allows to extend the number of gpios by using shift registers or latches. This patch adds the 2 drivers needed for this. The extended gpios are output only.
+
+[ralf@linux-mips.org: Fixed ltq_stp_probe section() attributes.]
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2258/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/lantiq/xway/Makefile   |    2 +-
+ arch/mips/lantiq/xway/gpio_ebu.c |  126 ++++++++++++++++++++++++++++++
+ arch/mips/lantiq/xway/gpio_stp.c |  157 ++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 284 insertions(+), 1 deletions(-)
+ create mode 100644 arch/mips/lantiq/xway/gpio_ebu.c
+ create mode 100644 arch/mips/lantiq/xway/gpio_stp.c
+
+diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
+index b1d3640..6b5e07e 100644
+--- a/arch/mips/lantiq/xway/Makefile
++++ b/arch/mips/lantiq/xway/Makefile
+@@ -1,4 +1,4 @@
+-obj-y := pmu.o ebu.o reset.o gpio.o devices.o
++obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o
+ obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o
+ obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o
+diff --git a/arch/mips/lantiq/xway/gpio_ebu.c b/arch/mips/lantiq/xway/gpio_ebu.c
+new file mode 100644
+index 0000000..a479355
+--- /dev/null
++++ b/arch/mips/lantiq/xway/gpio_ebu.c
+@@ -0,0 +1,126 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/platform_device.h>
++#include <linux/mutex.h>
++#include <linux/gpio.h>
++#include <linux/io.h>
++
++#include <lantiq_soc.h>
++
++/*
++ * By attaching hardware latches to the EBU it is possible to create output
++ * only gpios. This driver configures a special memory address, which when
++ * written to outputs 16 bit to the latches.
++ */
++
++#define LTQ_EBU_BUSCON        0x1e7ff         /* 16 bit access, slowest timing */
++#define LTQ_EBU_WP    0x80000000      /* write protect bit */
++
++/* we keep a shadow value of the last value written to the ebu */
++static int ltq_ebu_gpio_shadow = 0x0;
++static void __iomem *ltq_ebu_gpio_membase;
++
++static void ltq_ebu_apply(void)
++{
++      unsigned long flags;
++
++      spin_lock_irqsave(&ebu_lock, flags);
++      ltq_ebu_w32(LTQ_EBU_BUSCON, LTQ_EBU_BUSCON1);
++      *((__u16 *)ltq_ebu_gpio_membase) = ltq_ebu_gpio_shadow;
++      ltq_ebu_w32(LTQ_EBU_BUSCON | LTQ_EBU_WP, LTQ_EBU_BUSCON1);
++      spin_unlock_irqrestore(&ebu_lock, flags);
++}
++
++static void ltq_ebu_set(struct gpio_chip *chip, unsigned offset, int value)
++{
++      if (value)
++              ltq_ebu_gpio_shadow |= (1 << offset);
++      else
++              ltq_ebu_gpio_shadow &= ~(1 << offset);
++      ltq_ebu_apply();
++}
++
++static int ltq_ebu_direction_output(struct gpio_chip *chip, unsigned offset,
++      int value)
++{
++      ltq_ebu_set(chip, offset, value);
++
++      return 0;
++}
++
++static struct gpio_chip ltq_ebu_chip = {
++      .label = "ltq_ebu",
++      .direction_output = ltq_ebu_direction_output,
++      .set = ltq_ebu_set,
++      .base = 72,
++      .ngpio = 16,
++      .can_sleep = 1,
++      .owner = THIS_MODULE,
++};
++
++static int ltq_ebu_probe(struct platform_device *pdev)
++{
++      int ret = 0;
++      struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++
++      if (!res) {
++              dev_err(&pdev->dev, "failed to get memory resource\n");
++              return -ENOENT;
++      }
++
++      res = devm_request_mem_region(&pdev->dev, res->start,
++              resource_size(res), dev_name(&pdev->dev));
++      if (!res) {
++              dev_err(&pdev->dev, "failed to request memory resource\n");
++              return -EBUSY;
++      }
++
++      ltq_ebu_gpio_membase = devm_ioremap_nocache(&pdev->dev, res->start,
++              resource_size(res));
++      if (!ltq_ebu_gpio_membase) {
++              dev_err(&pdev->dev, "Failed to ioremap mem region\n");
++              return -ENOMEM;
++      }
++
++      /* grab the default shadow value passed form the platform code */
++      ltq_ebu_gpio_shadow = (unsigned int) pdev->dev.platform_data;
++
++      /* tell the ebu controller which memory address we will be using */
++      ltq_ebu_w32(pdev->resource->start | 0x1, LTQ_EBU_ADDRSEL1);
++
++      /* write protect the region */
++      ltq_ebu_w32(LTQ_EBU_BUSCON | LTQ_EBU_WP, LTQ_EBU_BUSCON1);
++
++      ret = gpiochip_add(&ltq_ebu_chip);
++      if (!ret)
++              ltq_ebu_apply();
++      return ret;
++}
++
++static struct platform_driver ltq_ebu_driver = {
++      .probe = ltq_ebu_probe,
++      .driver = {
++              .name = "ltq_ebu",
++              .owner = THIS_MODULE,
++      },
++};
++
++static int __init ltq_ebu_init(void)
++{
++      int ret = platform_driver_register(&ltq_ebu_driver);
++
++      if (ret)
++              pr_info("ltq_ebu : Error registering platfom driver!");
++      return ret;
++}
++
++postcore_initcall(ltq_ebu_init);
+diff --git a/arch/mips/lantiq/xway/gpio_stp.c b/arch/mips/lantiq/xway/gpio_stp.c
+new file mode 100644
+index 0000000..67d59d6
+--- /dev/null
++++ b/arch/mips/lantiq/xway/gpio_stp.c
+@@ -0,0 +1,157 @@
++/*
++ *  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) 2007 John Crispin <blogic@openwrt.org>
++ *
++ */
++
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/module.h>
++#include <linux/types.h>
++#include <linux/platform_device.h>
++#include <linux/mutex.h>
++#include <linux/io.h>
++#include <linux/gpio.h>
++
++#include <lantiq_soc.h>
++
++#define LTQ_STP_CON0          0x00
++#define LTQ_STP_CON1          0x04
++#define LTQ_STP_CPU0          0x08
++#define LTQ_STP_CPU1          0x0C
++#define LTQ_STP_AR            0x10
++
++#define LTQ_STP_CON_SWU               (1 << 31)
++#define LTQ_STP_2HZ           0
++#define LTQ_STP_4HZ           (1 << 23)
++#define LTQ_STP_8HZ           (2 << 23)
++#define LTQ_STP_10HZ          (3 << 23)
++#define LTQ_STP_SPEED_MASK    (0xf << 23)
++#define LTQ_STP_UPD_FPI               (1 << 31)
++#define LTQ_STP_UPD_MASK      (3 << 30)
++#define LTQ_STP_ADSL_SRC      (3 << 24)
++
++#define LTQ_STP_GROUP0                (1 << 0)
++
++#define LTQ_STP_RISING                0
++#define LTQ_STP_FALLING               (1 << 26)
++#define LTQ_STP_EDGE_MASK     (1 << 26)
++
++#define ltq_stp_r32(reg)      __raw_readl(ltq_stp_membase + reg)
++#define ltq_stp_w32(val, reg) __raw_writel(val, ltq_stp_membase + reg)
++#define ltq_stp_w32_mask(clear, set, reg) \
++              ltq_w32((ltq_r32(ltq_stp_membase + reg) & ~(clear)) | (set), \
++              ltq_stp_membase + (reg))
++
++static int ltq_stp_shadow = 0xffff;
++static void __iomem *ltq_stp_membase;
++
++static void ltq_stp_set(struct gpio_chip *chip, unsigned offset, int value)
++{
++      if (value)
++              ltq_stp_shadow |= (1 << offset);
++      else
++              ltq_stp_shadow &= ~(1 << offset);
++      ltq_stp_w32(ltq_stp_shadow, LTQ_STP_CPU0);
++}
++
++static int ltq_stp_direction_output(struct gpio_chip *chip, unsigned offset,
++      int value)
++{
++      ltq_stp_set(chip, offset, value);
++
++      return 0;
++}
++
++static struct gpio_chip ltq_stp_chip = {
++      .label = "ltq_stp",
++      .direction_output = ltq_stp_direction_output,
++      .set = ltq_stp_set,
++      .base = 48,
++      .ngpio = 24,
++      .can_sleep = 1,
++      .owner = THIS_MODULE,
++};
++
++static int ltq_stp_hw_init(void)
++{
++      /* the 3 pins used to control the external stp */
++      ltq_gpio_request(4, 1, 0, 1, "stp-st");
++      ltq_gpio_request(5, 1, 0, 1, "stp-d");
++      ltq_gpio_request(6, 1, 0, 1, "stp-sh");
++
++      /* sane defaults */
++      ltq_stp_w32(0, LTQ_STP_AR);
++      ltq_stp_w32(0, LTQ_STP_CPU0);
++      ltq_stp_w32(0, LTQ_STP_CPU1);
++      ltq_stp_w32(LTQ_STP_CON_SWU, LTQ_STP_CON0);
++      ltq_stp_w32(0, LTQ_STP_CON1);
++
++      /* rising or falling edge */
++      ltq_stp_w32_mask(LTQ_STP_EDGE_MASK, LTQ_STP_FALLING, LTQ_STP_CON0);
++
++      /* per default stp 15-0 are set */
++      ltq_stp_w32_mask(0, LTQ_STP_GROUP0, LTQ_STP_CON1);
++
++      /* stp are update periodically by the FPI bus */
++      ltq_stp_w32_mask(LTQ_STP_UPD_MASK, LTQ_STP_UPD_FPI, LTQ_STP_CON1);
++
++      /* set stp update speed */
++      ltq_stp_w32_mask(LTQ_STP_SPEED_MASK, LTQ_STP_8HZ, LTQ_STP_CON1);
++
++      /* tell the hardware that pin (led) 0 and 1 are controlled
++       *  by the dsl arc
++       */
++      ltq_stp_w32_mask(0, LTQ_STP_ADSL_SRC, LTQ_STP_CON0);
++
++      ltq_pmu_enable(PMU_LED);
++      return 0;
++}
++
++static int __devinit ltq_stp_probe(struct platform_device *pdev)
++{
++      struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      int ret = 0;
++
++      if (!res)
++              return -ENOENT;
++      res = devm_request_mem_region(&pdev->dev, res->start,
++              resource_size(res), dev_name(&pdev->dev));
++      if (!res) {
++              dev_err(&pdev->dev, "failed to request STP memory\n");
++              return -EBUSY;
++      }
++      ltq_stp_membase = devm_ioremap_nocache(&pdev->dev, res->start,
++              resource_size(res));
++      if (!ltq_stp_membase) {
++              dev_err(&pdev->dev, "failed to remap STP memory\n");
++              return -ENOMEM;
++      }
++      ret = gpiochip_add(&ltq_stp_chip);
++      if (!ret)
++              ret = ltq_stp_hw_init();
++
++      return ret;
++}
++
++static struct platform_driver ltq_stp_driver = {
++      .probe = ltq_stp_probe,
++      .driver = {
++              .name = "ltq_stp",
++              .owner = THIS_MODULE,
++      },
++};
++
++int __init ltq_stp_init(void)
++{
++      int ret = platform_driver_register(&ltq_stp_driver);
++
++      if (ret)
++              pr_info("ltq_stp: error registering platfom driver");
++      return ret;
++}
++
++postcore_initcall(ltq_stp_init);
+-- 
+1.7.2.3
+
diff --git a/target/linux/lantiq/patches-2.6.32/0009-SERIAL-Lantiq-Add-driver-for-MIPS-Lantiq-SOCs.patch b/target/linux/lantiq/patches-2.6.32/0009-SERIAL-Lantiq-Add-driver-for-MIPS-Lantiq-SOCs.patch
new file mode 100644 (file)
index 0000000..1d04aaa
--- /dev/null
@@ -0,0 +1,804 @@
+From 1d2b44b1afa3ef081cd817dbf947d48eb8f5d21a Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Tue, 5 Apr 2011 14:10:57 +0200
+Subject: [PATCH 09/13] SERIAL: Lantiq: Add driver for MIPS Lantiq SOCs.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Signed-off-by: Felix Fietkau <nbd@openwrt.org>
+Cc: alan@lxorguk.ukuu.org.uk
+Cc: linux-mips@linux-mips.org
+Cc: linux-serial@vger.kernel.org
+Patchwork: https://patchwork.linux-mips.org/patch/2269/
+Acked-by: Alan Cox <alan@linux.intel.com>
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ drivers/tty/serial/Kconfig  |    8 +
+ drivers/tty/serial/Makefile |    1 +
+ drivers/tty/serial/lantiq.c |  756 +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 765 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/tty/serial/lantiq.c
+
+--- /dev/null
++++ b/drivers/serial/lantiq.c
+@@ -0,0 +1,756 @@
++/*
++ *  Based on drivers/char/serial.c, by Linus Torvalds, Theodore Ts'o.
++ *
++ * 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.
++ *
++ * 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
++ *
++ * Copyright (C) 2004 Infineon IFAP DC COM CPE
++ * Copyright (C) 2007 Felix Fietkau <nbd@openwrt.org>
++ * Copyright (C) 2007 John Crispin <blogic@openwrt.org>
++ * Copyright (C) 2010 Thomas Langer, <thomas.langer@lantiq.com>
++ */
++
++#include <linux/slab.h>
++#include <linux/module.h>
++#include <linux/ioport.h>
++#include <linux/init.h>
++#include <linux/console.h>
++#include <linux/sysrq.h>
++#include <linux/device.h>
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/serial_core.h>
++#include <linux/serial.h>
++#include <linux/platform_device.h>
++#include <linux/io.h>
++#include <linux/clk.h>
++
++#include <lantiq_soc.h>
++
++#define PORT_LTQ_ASC          111
++#define MAXPORTS              2
++#define UART_DUMMY_UER_RX     1
++#define DRVNAME                       "ltq_asc"
++#ifdef __BIG_ENDIAN
++#define LTQ_ASC_TBUF          (0x0020 + 3)
++#define LTQ_ASC_RBUF          (0x0024 + 3)
++#else
++#define LTQ_ASC_TBUF          0x0020
++#define LTQ_ASC_RBUF          0x0024
++#endif
++#define LTQ_ASC_FSTAT         0x0048
++#define LTQ_ASC_WHBSTATE      0x0018
++#define LTQ_ASC_STATE         0x0014
++#define LTQ_ASC_IRNCR         0x00F8
++#define LTQ_ASC_CLC           0x0000
++#define LTQ_ASC_ID            0x0008
++#define LTQ_ASC_PISEL         0x0004
++#define LTQ_ASC_TXFCON                0x0044
++#define LTQ_ASC_RXFCON                0x0040
++#define LTQ_ASC_CON           0x0010
++#define LTQ_ASC_BG            0x0050
++#define LTQ_ASC_IRNREN                0x00F4
++
++#define ASC_IRNREN_TX         0x1
++#define ASC_IRNREN_RX         0x2
++#define ASC_IRNREN_ERR                0x4
++#define ASC_IRNREN_TX_BUF     0x8
++#define ASC_IRNCR_TIR         0x1
++#define ASC_IRNCR_RIR         0x2
++#define ASC_IRNCR_EIR         0x4
++
++#define ASCOPT_CSIZE          0x3
++#define TXFIFO_FL             1
++#define RXFIFO_FL             1
++#define ASCCLC_DISS           0x2
++#define ASCCLC_RMCMASK                0x0000FF00
++#define ASCCLC_RMCOFFSET      8
++#define ASCCON_M_8ASYNC               0x0
++#define ASCCON_M_7ASYNC               0x2
++#define ASCCON_ODD            0x00000020
++#define ASCCON_STP            0x00000080
++#define ASCCON_BRS            0x00000100
++#define ASCCON_FDE            0x00000200
++#define ASCCON_R              0x00008000
++#define ASCCON_FEN            0x00020000
++#define ASCCON_ROEN           0x00080000
++#define ASCCON_TOEN           0x00100000
++#define ASCSTATE_PE           0x00010000
++#define ASCSTATE_FE           0x00020000
++#define ASCSTATE_ROE          0x00080000
++#define ASCSTATE_ANY          (ASCSTATE_ROE|ASCSTATE_PE|ASCSTATE_FE)
++#define ASCWHBSTATE_CLRREN    0x00000001
++#define ASCWHBSTATE_SETREN    0x00000002
++#define ASCWHBSTATE_CLRPE     0x00000004
++#define ASCWHBSTATE_CLRFE     0x00000008
++#define ASCWHBSTATE_CLRROE    0x00000020
++#define ASCTXFCON_TXFEN               0x0001
++#define ASCTXFCON_TXFFLU      0x0002
++#define ASCTXFCON_TXFITLMASK  0x3F00
++#define ASCTXFCON_TXFITLOFF   8
++#define ASCRXFCON_RXFEN               0x0001
++#define ASCRXFCON_RXFFLU      0x0002
++#define ASCRXFCON_RXFITLMASK  0x3F00
++#define ASCRXFCON_RXFITLOFF   8
++#define ASCFSTAT_RXFFLMASK    0x003F
++#define ASCFSTAT_TXFFLMASK    0x3F00
++#define ASCFSTAT_TXFREEMASK   0x3F000000
++#define ASCFSTAT_TXFREEOFF    24
++
++static void lqasc_tx_chars(struct uart_port *port);
++static struct ltq_uart_port *lqasc_port[MAXPORTS];
++static struct uart_driver lqasc_reg;
++static DEFINE_SPINLOCK(ltq_asc_lock);
++
++struct ltq_uart_port {
++      struct uart_port        port;
++      struct clk              *clk;
++      unsigned int            tx_irq;
++      unsigned int            rx_irq;
++      unsigned int            err_irq;
++};
++
++static inline struct
++ltq_uart_port *to_ltq_uart_port(struct uart_port *port)
++{
++      return container_of(port, struct ltq_uart_port, port);
++}
++
++static void
++lqasc_stop_tx(struct uart_port *port)
++{
++      return;
++}
++
++static void
++lqasc_start_tx(struct uart_port *port)
++{
++      unsigned long flags;
++      spin_lock_irqsave(&ltq_asc_lock, flags);
++      lqasc_tx_chars(port);
++      spin_unlock_irqrestore(&ltq_asc_lock, flags);
++      return;
++}
++
++static void
++lqasc_stop_rx(struct uart_port *port)
++{
++      ltq_w32(ASCWHBSTATE_CLRREN, port->membase + LTQ_ASC_WHBSTATE);
++}
++
++static void
++lqasc_enable_ms(struct uart_port *port)
++{
++}
++
++static int
++lqasc_rx_chars(struct uart_port *port)
++{
++      struct tty_struct *tty = tty_port_tty_get(&port->state->port);
++      unsigned int ch = 0, rsr = 0, fifocnt;
++
++      if (!tty) {
++              dev_dbg(port->dev, "%s:tty is busy now", __func__);
++              return -EBUSY;
++      }
++      fifocnt =
++              ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_RXFFLMASK;
++      while (fifocnt--) {
++              u8 flag = TTY_NORMAL;
++              ch = ltq_r8(port->membase + LTQ_ASC_RBUF);
++              rsr = (ltq_r32(port->membase + LTQ_ASC_STATE)
++                      & ASCSTATE_ANY) | UART_DUMMY_UER_RX;
++              tty_flip_buffer_push(tty);
++              port->icount.rx++;
++
++              /*
++               * Note that the error handling code is
++               * out of the main execution path
++               */
++              if (rsr & ASCSTATE_ANY) {
++                      if (rsr & ASCSTATE_PE) {
++                              port->icount.parity++;
++                              ltq_w32_mask(0, ASCWHBSTATE_CLRPE,
++                                      port->membase + LTQ_ASC_WHBSTATE);
++                      } else if (rsr & ASCSTATE_FE) {
++                              port->icount.frame++;
++                              ltq_w32_mask(0, ASCWHBSTATE_CLRFE,
++                                      port->membase + LTQ_ASC_WHBSTATE);
++                      }
++                      if (rsr & ASCSTATE_ROE) {
++                              port->icount.overrun++;
++                              ltq_w32_mask(0, ASCWHBSTATE_CLRROE,
++                                      port->membase + LTQ_ASC_WHBSTATE);
++                      }
++
++                      rsr &= port->read_status_mask;
++
++                      if (rsr & ASCSTATE_PE)
++                              flag = TTY_PARITY;
++                      else if (rsr & ASCSTATE_FE)
++                              flag = TTY_FRAME;
++              }
++
++              if ((rsr & port->ignore_status_mask) == 0)
++                      tty_insert_flip_char(tty, ch, flag);
++
++              if (rsr & ASCSTATE_ROE)
++                      /*
++                       * Overrun is special, since it's reported
++                       * immediately, and doesn't affect the current
++                       * character
++                       */
++                      tty_insert_flip_char(tty, 0, TTY_OVERRUN);
++      }
++      if (ch != 0)
++              tty_flip_buffer_push(tty);
++      tty_kref_put(tty);
++      return 0;
++}
++
++static void
++lqasc_tx_chars(struct uart_port *port)
++{
++      struct circ_buf *xmit = &port->state->xmit;
++      if (uart_tx_stopped(port)) {
++              lqasc_stop_tx(port);
++              return;
++      }
++
++      while (((ltq_r32(port->membase + LTQ_ASC_FSTAT) &
++              ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF) != 0) {
++              if (port->x_char) {
++                      ltq_w8(port->x_char, port->membase + LTQ_ASC_TBUF);
++                      port->icount.tx++;
++                      port->x_char = 0;
++                      continue;
++              }
++
++              if (uart_circ_empty(xmit))
++                      break;
++
++              ltq_w8(port->state->xmit.buf[port->state->xmit.tail],
++                      port->membase + LTQ_ASC_TBUF);
++              xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
++              port->icount.tx++;
++      }
++
++      if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
++              uart_write_wakeup(port);
++}
++
++static irqreturn_t
++lqasc_tx_int(int irq, void *_port)
++{
++      unsigned long flags;
++      struct uart_port *port = (struct uart_port *)_port;
++      spin_lock_irqsave(&ltq_asc_lock, flags);
++      ltq_w32(ASC_IRNCR_TIR, port->membase + LTQ_ASC_IRNCR);
++      spin_unlock_irqrestore(&ltq_asc_lock, flags);
++      lqasc_start_tx(port);
++      return IRQ_HANDLED;
++}
++
++static irqreturn_t
++lqasc_err_int(int irq, void *_port)
++{
++      unsigned long flags;
++      struct uart_port *port = (struct uart_port *)_port;
++      spin_lock_irqsave(&ltq_asc_lock, flags);
++      /* clear any pending interrupts */
++      ltq_w32_mask(0, ASCWHBSTATE_CLRPE | ASCWHBSTATE_CLRFE |
++              ASCWHBSTATE_CLRROE, port->membase + LTQ_ASC_WHBSTATE);
++      spin_unlock_irqrestore(&ltq_asc_lock, flags);
++      return IRQ_HANDLED;
++}
++
++static irqreturn_t
++lqasc_rx_int(int irq, void *_port)
++{
++      unsigned long flags;
++      struct uart_port *port = (struct uart_port *)_port;
++      spin_lock_irqsave(&ltq_asc_lock, flags);
++      ltq_w32(ASC_IRNCR_RIR, port->membase + LTQ_ASC_IRNCR);
++      lqasc_rx_chars(port);
++      spin_unlock_irqrestore(&ltq_asc_lock, flags);
++      return IRQ_HANDLED;
++}
++
++static unsigned int
++lqasc_tx_empty(struct uart_port *port)
++{
++      int status;
++      status = ltq_r32(port->membase + LTQ_ASC_FSTAT) & ASCFSTAT_TXFFLMASK;
++      return status ? 0 : TIOCSER_TEMT;
++}
++
++static unsigned int
++lqasc_get_mctrl(struct uart_port *port)
++{
++      return TIOCM_CTS | TIOCM_CAR | TIOCM_DSR;
++}
++
++static void
++lqasc_set_mctrl(struct uart_port *port, u_int mctrl)
++{
++}
++
++static void
++lqasc_break_ctl(struct uart_port *port, int break_state)
++{
++}
++
++static int
++lqasc_startup(struct uart_port *port)
++{
++      struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
++      int retval;
++
++      port->uartclk = clk_get_rate(ltq_port->clk);
++
++      ltq_w32_mask(ASCCLC_DISS | ASCCLC_RMCMASK, (1 << ASCCLC_RMCOFFSET),
++              port->membase + LTQ_ASC_CLC);
++
++      ltq_w32(0, port->membase + LTQ_ASC_PISEL);
++      ltq_w32(
++              ((TXFIFO_FL << ASCTXFCON_TXFITLOFF) & ASCTXFCON_TXFITLMASK) |
++              ASCTXFCON_TXFEN | ASCTXFCON_TXFFLU,
++              port->membase + LTQ_ASC_TXFCON);
++      ltq_w32(
++              ((RXFIFO_FL << ASCRXFCON_RXFITLOFF) & ASCRXFCON_RXFITLMASK)
++              | ASCRXFCON_RXFEN | ASCRXFCON_RXFFLU,
++              port->membase + LTQ_ASC_RXFCON);
++      /* make sure other settings are written to hardware before
++       * setting enable bits
++       */
++      wmb();
++      ltq_w32_mask(0, ASCCON_M_8ASYNC | ASCCON_FEN | ASCCON_TOEN |
++              ASCCON_ROEN, port->membase + LTQ_ASC_CON);
++
++      retval = request_irq(ltq_port->tx_irq, lqasc_tx_int,
++              IRQF_DISABLED, "asc_tx", port);
++      if (retval) {
++              pr_err("failed to request lqasc_tx_int\n");
++              return retval;
++      }
++
++      retval = request_irq(ltq_port->rx_irq, lqasc_rx_int,
++              IRQF_DISABLED, "asc_rx", port);
++      if (retval) {
++              pr_err("failed to request lqasc_rx_int\n");
++              goto err1;
++      }
++
++      retval = request_irq(ltq_port->err_irq, lqasc_err_int,
++              IRQF_DISABLED, "asc_err", port);
++      if (retval) {
++              pr_err("failed to request lqasc_err_int\n");
++              goto err2;
++      }
++
++      ltq_w32(ASC_IRNREN_RX | ASC_IRNREN_ERR | ASC_IRNREN_TX,
++              port->membase + LTQ_ASC_IRNREN);
++      return 0;
++
++err2:
++      free_irq(ltq_port->rx_irq, port);
++err1:
++      free_irq(ltq_port->tx_irq, port);
++      return retval;
++}
++
++static void
++lqasc_shutdown(struct uart_port *port)
++{
++      struct ltq_uart_port *ltq_port = to_ltq_uart_port(port);
++      free_irq(ltq_port->tx_irq, port);
++      free_irq(ltq_port->rx_irq, port);
++      free_irq(ltq_port->err_irq, port);
++
++      ltq_w32(0, port->membase + LTQ_ASC_CON);
++      ltq_w32_mask(ASCRXFCON_RXFEN, ASCRXFCON_RXFFLU,
++              port->membase + LTQ_ASC_RXFCON);
++      ltq_w32_mask(ASCTXFCON_TXFEN, ASCTXFCON_TXFFLU,
++              port->membase + LTQ_ASC_TXFCON);
++}
++
++static void
++lqasc_set_termios(struct uart_port *port,
++      struct ktermios *new, struct ktermios *old)
++{
++      unsigned int cflag;
++      unsigned int iflag;
++      unsigned int divisor;
++      unsigned int baud;
++      unsigned int con = 0;
++      unsigned long flags;
++
++      cflag = new->c_cflag;
++      iflag = new->c_iflag;
++
++      switch (cflag & CSIZE) {
++      case CS7:
++              con = ASCCON_M_7ASYNC;
++              break;
++
++      case CS5:
++      case CS6:
++      default:
++              new->c_cflag &= ~ CSIZE;
++              new->c_cflag |= CS8;
++              con = ASCCON_M_8ASYNC;
++              break;
++      }
++
++      cflag &= ~CMSPAR; /* Mark/Space parity is not supported */
++
++      if (cflag & CSTOPB)
++              con |= ASCCON_STP;
++
++      if (cflag & PARENB) {
++              if (!(cflag & PARODD))
++                      con &= ~ASCCON_ODD;
++              else
++                      con |= ASCCON_ODD;
++      }
++
++      port->read_status_mask = ASCSTATE_ROE;
++      if (iflag & INPCK)
++              port->read_status_mask |= ASCSTATE_FE | ASCSTATE_PE;
++
++      port->ignore_status_mask = 0;
++      if (iflag & IGNPAR)
++              port->ignore_status_mask |= ASCSTATE_FE | ASCSTATE_PE;
++
++      if (iflag & IGNBRK) {
++              /*
++               * If we're ignoring parity and break indicators,
++               * ignore overruns too (for real raw support).
++               */
++              if (iflag & IGNPAR)
++                      port->ignore_status_mask |= ASCSTATE_ROE;
++      }
++
++      if ((cflag & CREAD) == 0)
++              port->ignore_status_mask |= UART_DUMMY_UER_RX;
++
++      /* set error signals  - framing, parity  and overrun, enable receiver */
++      con |= ASCCON_FEN | ASCCON_TOEN | ASCCON_ROEN;
++
++      spin_lock_irqsave(&ltq_asc_lock, flags);
++
++      /* set up CON */
++      ltq_w32_mask(0, con, port->membase + LTQ_ASC_CON);
++
++      /* Set baud rate - take a divider of 2 into account */
++      baud = uart_get_baud_rate(port, new, old, 0, port->uartclk / 16);
++      divisor = uart_get_divisor(port, baud);
++      divisor = divisor / 2 - 1;
++
++      /* disable the baudrate generator */
++      ltq_w32_mask(ASCCON_R, 0, port->membase + LTQ_ASC_CON);
++
++      /* make sure the fractional divider is off */
++      ltq_w32_mask(ASCCON_FDE, 0, port->membase + LTQ_ASC_CON);
++
++      /* set up to use divisor of 2 */
++      ltq_w32_mask(ASCCON_BRS, 0, port->membase + LTQ_ASC_CON);
++
++      /* now we can write the new baudrate into the register */
++      ltq_w32(divisor, port->membase + LTQ_ASC_BG);
++
++      /* turn the baudrate generator back on */
++      ltq_w32_mask(0, ASCCON_R, port->membase + LTQ_ASC_CON);
++
++      /* enable rx */
++      ltq_w32(ASCWHBSTATE_SETREN, port->membase + LTQ_ASC_WHBSTATE);
++
++      spin_unlock_irqrestore(&ltq_asc_lock, flags);
++
++      /* Don't rewrite B0 */
++        if (tty_termios_baud_rate(new))
++              tty_termios_encode_baud_rate(new, baud, baud);
++}
++
++static const char*
++lqasc_type(struct uart_port *port)
++{
++      if (port->type == PORT_LTQ_ASC)
++              return DRVNAME;
++      else
++              return NULL;
++}
++
++static void
++lqasc_release_port(struct uart_port *port)
++{
++      if (port->flags & UPF_IOREMAP) {
++              iounmap(port->membase);
++              port->membase = NULL;
++      }
++}
++
++static int
++lqasc_request_port(struct uart_port *port)
++{
++      struct platform_device *pdev = to_platform_device(port->dev);
++      struct resource *res;
++      int size;
++
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!res) {
++              dev_err(&pdev->dev, "cannot obtain I/O memory region");
++              return -ENODEV;
++      }
++      size = resource_size(res);
++
++      res = devm_request_mem_region(&pdev->dev, res->start,
++              size, dev_name(&pdev->dev));
++      if (!res) {
++              dev_err(&pdev->dev, "cannot request I/O memory region");
++              return -EBUSY;
++      }
++
++      if (port->flags & UPF_IOREMAP) {
++              port->membase = devm_ioremap_nocache(&pdev->dev,
++                      port->mapbase, size);
++              if (port->membase == NULL)
++                      return -ENOMEM;
++      }
++      return 0;
++}
++
++static void
++lqasc_config_port(struct uart_port *port, int flags)
++{
++      if (flags & UART_CONFIG_TYPE) {
++              port->type = PORT_LTQ_ASC;
++              lqasc_request_port(port);
++      }
++}
++
++static int
++lqasc_verify_port(struct uart_port *port,
++      struct serial_struct *ser)
++{
++      int ret = 0;
++      if (ser->type != PORT_UNKNOWN && ser->type != PORT_LTQ_ASC)
++              ret = -EINVAL;
++      if (ser->irq < 0 || ser->irq >= NR_IRQS)
++              ret = -EINVAL;
++      if (ser->baud_base < 9600)
++              ret = -EINVAL;
++      return ret;
++}
++
++static struct uart_ops lqasc_pops = {
++      .tx_empty =     lqasc_tx_empty,
++      .set_mctrl =    lqasc_set_mctrl,
++      .get_mctrl =    lqasc_get_mctrl,
++      .stop_tx =      lqasc_stop_tx,
++      .start_tx =     lqasc_start_tx,
++      .stop_rx =      lqasc_stop_rx,
++      .enable_ms =    lqasc_enable_ms,
++      .break_ctl =    lqasc_break_ctl,
++      .startup =      lqasc_startup,
++      .shutdown =     lqasc_shutdown,
++      .set_termios =  lqasc_set_termios,
++      .type =         lqasc_type,
++      .release_port = lqasc_release_port,
++      .request_port = lqasc_request_port,
++      .config_port =  lqasc_config_port,
++      .verify_port =  lqasc_verify_port,
++};
++
++static void
++lqasc_console_putchar(struct uart_port *port, int ch)
++{
++      int fifofree;
++
++      if (!port->membase)
++              return;
++
++      do {
++              fifofree = (ltq_r32(port->membase + LTQ_ASC_FSTAT)
++                      & ASCFSTAT_TXFREEMASK) >> ASCFSTAT_TXFREEOFF;
++      } while (fifofree == 0);
++      ltq_w8(ch, port->membase + LTQ_ASC_TBUF);
++}
++
++
++static void
++lqasc_console_write(struct console *co, const char *s, u_int count)
++{
++      struct ltq_uart_port *ltq_port;
++      struct uart_port *port;
++      unsigned long flags;
++
++      if (co->index >= MAXPORTS)
++              return;
++
++      ltq_port = lqasc_port[co->index];
++      if (!ltq_port)
++              return;
++
++      port = &ltq_port->port;
++
++      spin_lock_irqsave(&ltq_asc_lock, flags);
++      uart_console_write(port, s, count, lqasc_console_putchar);
++      spin_unlock_irqrestore(&ltq_asc_lock, flags);
++}
++
++static int __init
++lqasc_console_setup(struct console *co, char *options)
++{
++      struct ltq_uart_port *ltq_port;
++      struct uart_port *port;
++      int baud = 115200;
++      int bits = 8;
++      int parity = 'n';
++      int flow = 'n';
++
++      if (co->index >= MAXPORTS)
++              return -ENODEV;
++
++      ltq_port = lqasc_port[co->index];
++      if (!ltq_port)
++              return -ENODEV;
++
++      port = &ltq_port->port;
++
++      port->uartclk = clk_get_rate(ltq_port->clk);
++
++      if (options)
++              uart_parse_options(options, &baud, &parity, &bits, &flow);
++      return uart_set_options(port, co, baud, parity, bits, flow);
++}
++
++static struct console lqasc_console = {
++      .name =         "ttyLTQ",
++      .write =        lqasc_console_write,
++      .device =       uart_console_device,
++      .setup =        lqasc_console_setup,
++      .flags =        CON_PRINTBUFFER,
++      .index =        -1,
++      .data =         &lqasc_reg,
++};
++
++static int __init
++lqasc_console_init(void)
++{
++      register_console(&lqasc_console);
++      return 0;
++}
++console_initcall(lqasc_console_init);
++
++static struct uart_driver lqasc_reg = {
++      .owner =        THIS_MODULE,
++      .driver_name =  DRVNAME,
++      .dev_name =     "ttyLTQ",
++      .major =        0,
++      .minor =        0,
++      .nr =           MAXPORTS,
++      .cons =         &lqasc_console,
++};
++
++static int __init
++lqasc_probe(struct platform_device *pdev)
++{
++      struct ltq_uart_port *ltq_port;
++      struct uart_port *port;
++      struct resource *mmres, *irqres;
++      int tx_irq, rx_irq, err_irq;
++      struct clk *clk;
++      int ret;
++
++      mmres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      irqres = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
++      if (!mmres || !irqres)
++              return -ENODEV;
++
++      if (pdev->id >= MAXPORTS)
++              return -EBUSY;
++
++      if (lqasc_port[pdev->id] != NULL)
++              return -EBUSY;
++
++      clk = clk_get(&pdev->dev, "fpi");
++      if (IS_ERR(clk)) {
++              pr_err("failed to get fpi clk\n");
++              return -ENOENT;
++      }
++
++      tx_irq = platform_get_irq_byname(pdev, "tx");
++      rx_irq = platform_get_irq_byname(pdev, "rx");
++      err_irq = platform_get_irq_byname(pdev, "err");
++      if ((tx_irq < 0) | (rx_irq < 0) | (err_irq < 0))
++              return -ENODEV;
++
++      ltq_port = kzalloc(sizeof(struct ltq_uart_port), GFP_KERNEL);
++      if (!ltq_port)
++              return -ENOMEM;
++
++      port = &ltq_port->port;
++
++      port->iotype    = SERIAL_IO_MEM;
++      port->flags     = ASYNC_BOOT_AUTOCONF | UPF_IOREMAP;
++      port->ops       = &lqasc_pops;
++      port->fifosize  = 16;
++      port->type      = PORT_LTQ_ASC,
++      port->line      = pdev->id;
++      port->dev       = &pdev->dev;
++
++      port->irq       = tx_irq; /* unused, just to be backward-compatibe */
++      port->mapbase   = mmres->start;
++
++      ltq_port->clk   = clk;
++
++      ltq_port->tx_irq = tx_irq;
++      ltq_port->rx_irq = rx_irq;
++      ltq_port->err_irq = err_irq;
++
++      lqasc_port[pdev->id] = ltq_port;
++      platform_set_drvdata(pdev, ltq_port);
++
++      ret = uart_add_one_port(&lqasc_reg, port);
++
++      return ret;
++}
++
++static struct platform_driver lqasc_driver = {
++      .driver         = {
++              .name   = DRVNAME,
++              .owner  = THIS_MODULE,
++      },
++};
++
++int __init
++init_lqasc(void)
++{
++      int ret;
++
++      ret = uart_register_driver(&lqasc_reg);
++      if (ret != 0)
++              return ret;
++
++      ret = platform_driver_probe(&lqasc_driver, lqasc_probe);
++      if (ret != 0)
++              uart_unregister_driver(&lqasc_reg);
++
++      return ret;
++}
++
++module_init(init_lqasc);
++
++MODULE_DESCRIPTION("Lantiq serial port driver");
++MODULE_LICENSE("GPL");
+--- a/drivers/serial/Kconfig
++++ b/drivers/serial/Kconfig
+@@ -1383,6 +1383,14 @@
+       help
+         Support for Console on the NWP serial ports.
++config SERIAL_LANTIQ
++      bool "Lantiq serial driver"
++      depends on LANTIQ
++      select SERIAL_CORE
++      select SERIAL_CORE_CONSOLE
++      help
++        Support for console and UART on Lantiq SoCs.
++
+ config SERIAL_QE
+       tristate "Freescale QUICC Engine serial port support"
+       depends on QUICC_ENGINE
+--- a/drivers/serial/Makefile
++++ b/drivers/serial/Makefile
+@@ -81,3 +81,4 @@
+ obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o
+ obj-$(CONFIG_SERIAL_QE) += ucc_uart.o
+ obj-$(CONFIG_SERIAL_TIMBERDALE)       += timbuart.o
++obj-$(CONFIG_SERIAL_LANTIQ)   += lantiq.o
diff --git a/target/linux/lantiq/patches-2.6.32/0010-MIPS-Lantiq-Add-DMA-support.patch b/target/linux/lantiq/patches-2.6.32/0010-MIPS-Lantiq-Add-DMA-support.patch
new file mode 100644 (file)
index 0000000..fd9981a
--- /dev/null
@@ -0,0 +1,387 @@
+From bd620ec1ca053bab8ce2562968700e6f80e4ff83 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 6 May 2011 00:10:00 +0200
+Subject: [PATCH 10/13] MIPS: Lantiq: Add DMA support
+
+This patch adds support for the DMA engine found inside the XWAY family of
+SoCs. The engine has 5 ports and 20 channels.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2355/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h |    3 +-
+ arch/mips/include/asm/mach-lantiq/xway/xway_dma.h  |   60 +++++
+ arch/mips/lantiq/xway/Makefile                     |    2 +-
+ arch/mips/lantiq/xway/devices.h                    |    1 +
+ arch/mips/lantiq/xway/dma.c                        |  253 ++++++++++++++++++++
+ 5 files changed, 317 insertions(+), 2 deletions(-)
+ create mode 100644 arch/mips/include/asm/mach-lantiq/xway/xway_dma.h
+ create mode 100644 arch/mips/lantiq/xway/dma.c
+
+diff --git a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
+index 343e82c..4827afb 100644
+--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
++++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
+@@ -86,7 +86,8 @@
+ #define LTQ_PPE32_SIZE                0x40000
+ /* DMA */
+-#define LTQ_DMA_BASE_ADDR     0xBE104100
++#define LTQ_DMA_BASE_ADDR     0x1E104100
++#define LTQ_DMA_SIZE          0x800
+ /* PCI */
+ #define PCI_CR_BASE_ADDR      0x1E105400
+diff --git a/arch/mips/include/asm/mach-lantiq/xway/xway_dma.h b/arch/mips/include/asm/mach-lantiq/xway/xway_dma.h
+new file mode 100644
+index 0000000..872943a
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/xway/xway_dma.h
+@@ -0,0 +1,60 @@
++/*
++ *   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.
++ *
++ *   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.
++ *
++ *   Copyright (C) 2011 John Crispin <blogic@openwrt.org>
++ */
++
++#ifndef LTQ_DMA_H__
++#define LTQ_DMA_H__
++
++#define LTQ_DESC_SIZE         0x08    /* each descriptor is 64bit */
++#define LTQ_DESC_NUM          0x40    /* 64 descriptors / channel */
++
++#define LTQ_DMA_OWN           BIT(31) /* owner bit */
++#define LTQ_DMA_C             BIT(30) /* complete bit */
++#define LTQ_DMA_SOP           BIT(29) /* start of packet */
++#define LTQ_DMA_EOP           BIT(28) /* end of packet */
++#define LTQ_DMA_TX_OFFSET(x)  ((x & 0x1f) << 23) /* data bytes offset */
++#define LTQ_DMA_RX_OFFSET(x)  ((x & 0x7) << 23) /* data bytes offset */
++#define LTQ_DMA_SIZE_MASK     (0xffff) /* the size field is 16 bit */
++
++struct ltq_dma_desc {
++      u32 ctl;
++      u32 addr;
++};
++
++struct ltq_dma_channel {
++      int nr;                         /* the channel number */
++      int irq;                        /* the mapped irq */
++      int desc;                       /* the current descriptor */
++      struct ltq_dma_desc *desc_base; /* the descriptor base */
++      int phys;                       /* physical addr */
++};
++
++enum {
++      DMA_PORT_ETOP = 0,
++      DMA_PORT_DEU,
++};
++
++extern void ltq_dma_enable_irq(struct ltq_dma_channel *ch);
++extern void ltq_dma_disable_irq(struct ltq_dma_channel *ch);
++extern void ltq_dma_ack_irq(struct ltq_dma_channel *ch);
++extern void ltq_dma_open(struct ltq_dma_channel *ch);
++extern void ltq_dma_close(struct ltq_dma_channel *ch);
++extern void ltq_dma_alloc_tx(struct ltq_dma_channel *ch);
++extern void ltq_dma_alloc_rx(struct ltq_dma_channel *ch);
++extern void ltq_dma_free(struct ltq_dma_channel *ch);
++extern void ltq_dma_init_port(int p);
++
++#endif
+diff --git a/arch/mips/lantiq/xway/Makefile b/arch/mips/lantiq/xway/Makefile
+index 6b5e07e..c517f2e 100644
+--- a/arch/mips/lantiq/xway/Makefile
++++ b/arch/mips/lantiq/xway/Makefile
+@@ -1,4 +1,4 @@
+-obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o
++obj-y := pmu.o ebu.o reset.o gpio.o gpio_stp.o gpio_ebu.o devices.o dma.o
+ obj-$(CONFIG_SOC_XWAY) += clk-xway.o prom-xway.o setup-xway.o
+ obj-$(CONFIG_SOC_AMAZON_SE) += clk-ase.o prom-ase.o setup-ase.o
+diff --git a/arch/mips/lantiq/xway/devices.h b/arch/mips/lantiq/xway/devices.h
+index 51f56b5..d573084 100644
+--- a/arch/mips/lantiq/xway/devices.h
++++ b/arch/mips/lantiq/xway/devices.h
+@@ -10,6 +10,7 @@
+ #define _LTQ_DEVICES_XWAY_H__
+ #include "../devices.h"
++#include <linux/phy.h>
+ extern void ltq_register_gpio(void);
+ extern void ltq_register_gpio_stp(void);
+diff --git a/arch/mips/lantiq/xway/dma.c b/arch/mips/lantiq/xway/dma.c
+new file mode 100644
+index 0000000..4278a45
+--- /dev/null
++++ b/arch/mips/lantiq/xway/dma.c
+@@ -0,0 +1,253 @@
++/*
++ *   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.
++ *
++ *   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.
++ *
++ *   Copyright (C) 2011 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/io.h>
++#include <linux/dma-mapping.h>
++
++#include <lantiq_soc.h>
++#include <xway_dma.h>
++
++#define LTQ_DMA_CTRL          0x10
++#define LTQ_DMA_CPOLL         0x14
++#define LTQ_DMA_CS            0x18
++#define LTQ_DMA_CCTRL         0x1C
++#define LTQ_DMA_CDBA          0x20
++#define LTQ_DMA_CDLEN         0x24
++#define LTQ_DMA_CIS           0x28
++#define LTQ_DMA_CIE           0x2C
++#define LTQ_DMA_PS            0x40
++#define LTQ_DMA_PCTRL         0x44
++#define LTQ_DMA_IRNEN         0xf4
++
++#define DMA_DESCPT            BIT(3)          /* descriptor complete irq */
++#define DMA_TX                        BIT(8)          /* TX channel direction */
++#define DMA_CHAN_ON           BIT(0)          /* channel on / off bit */
++#define DMA_PDEN              BIT(6)          /* enable packet drop */
++#define DMA_CHAN_RST          BIT(1)          /* channel on / off bit */
++#define DMA_RESET             BIT(0)          /* channel on / off bit */
++#define DMA_IRQ_ACK           0x7e            /* IRQ status register */
++#define DMA_POLL              BIT(31)         /* turn on channel polling */
++#define DMA_CLK_DIV4          BIT(6)          /* polling clock divider */
++#define DMA_2W_BURST          BIT(1)          /* 2 word burst length */
++#define DMA_MAX_CHANNEL               20              /* the soc has 20 channels */
++#define DMA_ETOP_ENDIANESS    (0xf << 8) /* endianess swap etop channels */
++#define DMA_WEIGHT    (BIT(17) | BIT(16))     /* default channel wheight */
++
++#define ltq_dma_r32(x)                        ltq_r32(ltq_dma_membase + (x))
++#define ltq_dma_w32(x, y)             ltq_w32(x, ltq_dma_membase + (y))
++#define ltq_dma_w32_mask(x, y, z)     ltq_w32_mask(x, y, \
++                                              ltq_dma_membase + (z))
++
++static struct resource ltq_dma_resource = {
++      .name   = "dma",
++      .start  = LTQ_DMA_BASE_ADDR,
++      .end    = LTQ_DMA_BASE_ADDR + LTQ_DMA_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++static void __iomem *ltq_dma_membase;
++
++void
++ltq_dma_enable_irq(struct ltq_dma_channel *ch)
++{
++      unsigned long flags;
++
++      local_irq_save(flags);
++      ltq_dma_w32(ch->nr, LTQ_DMA_CS);
++      ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
++      local_irq_restore(flags);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_enable_irq);
++
++void
++ltq_dma_disable_irq(struct ltq_dma_channel *ch)
++{
++      unsigned long flags;
++
++      local_irq_save(flags);
++      ltq_dma_w32(ch->nr, LTQ_DMA_CS);
++      ltq_dma_w32_mask(1 << ch->nr, 0, LTQ_DMA_IRNEN);
++      local_irq_restore(flags);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_disable_irq);
++
++void
++ltq_dma_ack_irq(struct ltq_dma_channel *ch)
++{
++      unsigned long flags;
++
++      local_irq_save(flags);
++      ltq_dma_w32(ch->nr, LTQ_DMA_CS);
++      ltq_dma_w32(DMA_IRQ_ACK, LTQ_DMA_CIS);
++      local_irq_restore(flags);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_ack_irq);
++
++void
++ltq_dma_open(struct ltq_dma_channel *ch)
++{
++      unsigned long flag;
++
++      local_irq_save(flag);
++      ltq_dma_w32(ch->nr, LTQ_DMA_CS);
++      ltq_dma_w32_mask(0, DMA_CHAN_ON, LTQ_DMA_CCTRL);
++      ltq_dma_enable_irq(ch);
++      local_irq_restore(flag);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_open);
++
++void
++ltq_dma_close(struct ltq_dma_channel *ch)
++{
++      unsigned long flag;
++
++      local_irq_save(flag);
++      ltq_dma_w32(ch->nr, LTQ_DMA_CS);
++      ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL);
++      ltq_dma_disable_irq(ch);
++      local_irq_restore(flag);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_close);
++
++static void
++ltq_dma_alloc(struct ltq_dma_channel *ch)
++{
++      unsigned long flags;
++
++      ch->desc = 0;
++      ch->desc_base = dma_alloc_coherent(NULL,
++                              LTQ_DESC_NUM * LTQ_DESC_SIZE,
++                              &ch->phys, GFP_ATOMIC);
++      memset(ch->desc_base, 0, LTQ_DESC_NUM * LTQ_DESC_SIZE);
++
++      local_irq_save(flags);
++      ltq_dma_w32(ch->nr, LTQ_DMA_CS);
++      ltq_dma_w32(ch->phys, LTQ_DMA_CDBA);
++      ltq_dma_w32(LTQ_DESC_NUM, LTQ_DMA_CDLEN);
++      ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL);
++      wmb();
++      ltq_dma_w32_mask(0, DMA_CHAN_RST, LTQ_DMA_CCTRL);
++      while (ltq_dma_r32(LTQ_DMA_CCTRL) & DMA_CHAN_RST)
++              ;
++      local_irq_restore(flags);
++}
++
++void
++ltq_dma_alloc_tx(struct ltq_dma_channel *ch)
++{
++      unsigned long flags;
++
++      ltq_dma_alloc(ch);
++
++      local_irq_save(flags);
++      ltq_dma_w32(DMA_DESCPT, LTQ_DMA_CIE);
++      ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
++      ltq_dma_w32(DMA_WEIGHT | DMA_TX, LTQ_DMA_CCTRL);
++      local_irq_restore(flags);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_alloc_tx);
++
++void
++ltq_dma_alloc_rx(struct ltq_dma_channel *ch)
++{
++      unsigned long flags;
++
++      ltq_dma_alloc(ch);
++
++      local_irq_save(flags);
++      ltq_dma_w32(DMA_DESCPT, LTQ_DMA_CIE);
++      ltq_dma_w32_mask(0, 1 << ch->nr, LTQ_DMA_IRNEN);
++      ltq_dma_w32(DMA_WEIGHT, LTQ_DMA_CCTRL);
++      local_irq_restore(flags);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_alloc_rx);
++
++void
++ltq_dma_free(struct ltq_dma_channel *ch)
++{
++      if (!ch->desc_base)
++              return;
++      ltq_dma_close(ch);
++      dma_free_coherent(NULL, LTQ_DESC_NUM * LTQ_DESC_SIZE,
++              ch->desc_base, ch->phys);
++}
++EXPORT_SYMBOL_GPL(ltq_dma_free);
++
++void
++ltq_dma_init_port(int p)
++{
++      ltq_dma_w32(p, LTQ_DMA_PS);
++      switch (p) {
++      case DMA_PORT_ETOP:
++              /*
++               * Tell the DMA engine to swap the endianess of data frames and
++               * drop packets if the channel arbitration fails.
++               */
++              ltq_dma_w32_mask(0, DMA_ETOP_ENDIANESS | DMA_PDEN,
++                      LTQ_DMA_PCTRL);
++              break;
++
++      case DMA_PORT_DEU:
++              ltq_dma_w32((DMA_2W_BURST << 4) | (DMA_2W_BURST << 2),
++                      LTQ_DMA_PCTRL);
++              break;
++
++      default:
++              break;
++      }
++}
++EXPORT_SYMBOL_GPL(ltq_dma_init_port);
++
++int __init
++ltq_dma_init(void)
++{
++      int i;
++
++      /* insert and request the memory region */
++      if (insert_resource(&iomem_resource, &ltq_dma_resource) < 0)
++              panic("Failed to insert dma memory\n");
++
++      if (request_mem_region(ltq_dma_resource.start,
++                      resource_size(&ltq_dma_resource), "dma") < 0)
++              panic("Failed to request dma memory\n");
++
++      /* remap dma register range */
++      ltq_dma_membase = ioremap_nocache(ltq_dma_resource.start,
++                              resource_size(&ltq_dma_resource));
++      if (!ltq_dma_membase)
++              panic("Failed to remap dma memory\n");
++
++      /* power up and reset the dma engine */
++      ltq_pmu_enable(PMU_DMA);
++      ltq_dma_w32_mask(0, DMA_RESET, LTQ_DMA_CTRL);
++
++      /* disable all interrupts */
++      ltq_dma_w32(0, LTQ_DMA_IRNEN);
++
++      /* reset/configure each channel */
++      for (i = 0; i < DMA_MAX_CHANNEL; i++) {
++              ltq_dma_w32(i, LTQ_DMA_CS);
++              ltq_dma_w32(DMA_CHAN_RST, LTQ_DMA_CCTRL);
++              ltq_dma_w32(DMA_POLL | DMA_CLK_DIV4, LTQ_DMA_CPOLL);
++              ltq_dma_w32_mask(DMA_CHAN_ON, 0, LTQ_DMA_CCTRL);
++      }
++      return 0;
++}
++
++postcore_initcall(ltq_dma_init);
+-- 
+1.7.2.3
+
diff --git a/target/linux/lantiq/patches-2.6.32/0011-MIPS-Lantiq-Add-ethernet-driver.patch b/target/linux/lantiq/patches-2.6.32/0011-MIPS-Lantiq-Add-ethernet-driver.patch
new file mode 100644 (file)
index 0000000..0d869de
--- /dev/null
@@ -0,0 +1,943 @@
+From 435de86088af82496bcba69165cd7422bb4622ec Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 6 May 2011 00:10:01 +0200
+Subject: [PATCH 11/13] MIPS: Lantiq: Add ethernet driver
+
+This patch adds the driver for the ETOP Packet Processing Engine (PPE32)
+found inside the XWAY family of Lantiq MIPS SoCs. This driver makes 100MBit
+ethernet work. Support for all 8 dma channels, gbit and the embedded switch
+found on the ar9/vr9 still needs to be implemented.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: linux-mips@linux-mips.org
+Cc: netdev@vger.kernel.org
+Patchwork: https://patchwork.linux-mips.org/patch/2357/
+Acked-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ .../mips/include/asm/mach-lantiq/lantiq_platform.h |    7 +
+ .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h |    4 +-
+ arch/mips/lantiq/xway/devices.c                    |   23 +
+ arch/mips/lantiq/xway/devices.h                    |    1 +
+ drivers/net/Kconfig                                |    7 +
+ drivers/net/Makefile                               |    1 +
+ drivers/net/lantiq_etop.c                          |  805 ++++++++++++++++++++
+ 7 files changed, 846 insertions(+), 2 deletions(-)
+ create mode 100644 drivers/net/lantiq_etop.c
+
+--- a/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
++++ b/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
+@@ -10,6 +10,7 @@
+ #define _LANTIQ_PLATFORM_H__
+ #include <linux/mtd/partitions.h>
++#include <linux/socket.h>
+ /* struct used to pass info to the pci core */
+ enum {
+@@ -43,4 +44,10 @@
+       int irq[16];
+ };
++/* struct used to pass info to network drivers */
++struct ltq_eth_data {
++      struct sockaddr mac;
++      int mii_mode;
++};
++
+ #endif
+--- a/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
++++ b/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
+@@ -82,8 +82,8 @@
+ #define PMU_SWITCH            0x10000000
+ /* ETOP - ethernet */
+-#define LTQ_PPE32_BASE_ADDR   0xBE180000
+-#define LTQ_PPE32_SIZE                0x40000
++#define LTQ_ETOP_BASE_ADDR    0x1E180000
++#define LTQ_ETOP_SIZE         0x40000
+ /* DMA */
+ #define LTQ_DMA_BASE_ADDR     0x1E104100
+--- a/arch/mips/lantiq/xway/devices.c
++++ b/arch/mips/lantiq/xway/devices.c
+@@ -96,3 +96,26 @@
+       platform_device_register_simple("ltq_asc", 0,
+               ltq_ase_asc_resources, ARRAY_SIZE(ltq_ase_asc_resources));
+ }
++
++/* ethernet */
++static struct resource ltq_etop_resources = {
++      .name   = "etop",
++      .start  = LTQ_ETOP_BASE_ADDR,
++      .end    = LTQ_ETOP_BASE_ADDR + LTQ_ETOP_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++};
++
++static struct platform_device ltq_etop = {
++      .name           = "ltq_etop",
++      .resource       = &ltq_etop_resources,
++      .num_resources  = 1,
++};
++
++void __init
++ltq_register_etop(struct ltq_eth_data *eth)
++{
++      if (eth) {
++              ltq_etop.dev.platform_data = eth;
++              platform_device_register(&ltq_etop);
++      }
++}
+--- a/arch/mips/lantiq/xway/devices.h
++++ b/arch/mips/lantiq/xway/devices.h
+@@ -15,5 +15,6 @@
+ extern void ltq_register_gpio(void);
+ extern void ltq_register_gpio_stp(void);
+ extern void ltq_register_ase_asc(void);
++extern void ltq_register_etop(struct ltq_eth_data *eth);
+ #endif
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -1951,6 +1951,13 @@
+         This driver supports the ethernet MACs in the Broadcom 63xx
+         MIPS chipset family (BCM63XX).
++config LANTIQ_ETOP
++      tristate "Lantiq SoC ETOP driver"
++      depends on SOC_TYPE_XWAY
++      help
++        Support for the MII0 inside the Lantiq SoC
++
++
+ source "drivers/net/fs_enet/Kconfig"
+ endif # NET_ETHERNET
+--- a/drivers/net/Makefile
++++ b/drivers/net/Makefile
+@@ -246,6 +246,7 @@
+ obj-$(CONFIG_MLX4_CORE) += mlx4/
+ obj-$(CONFIG_ENC28J60) += enc28j60.o
+ obj-$(CONFIG_ETHOC) += ethoc.o
++obj-$(CONFIG_LANTIQ_ETOP) += lantiq_etop.o
+ obj-$(CONFIG_XTENSA_XT2000_SONIC) += xtsonic.o
+--- /dev/null
++++ b/drivers/net/lantiq_etop.c
+@@ -0,0 +1,814 @@
++/*
++ *   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.
++ *
++ *   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.
++ *
++ *   Copyright (C) 2011 John Crispin <blogic@openwrt.org>
++ */
++
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/errno.h>
++#include <linux/types.h>
++#include <linux/interrupt.h>
++#include <linux/uaccess.h>
++#include <linux/in.h>
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <linux/phy.h>
++#include <linux/ip.h>
++#include <linux/tcp.h>
++#include <linux/skbuff.h>
++#include <linux/mm.h>
++#include <linux/platform_device.h>
++#include <linux/ethtool.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/io.h>
++
++#include <asm/checksum.h>
++
++#include <lantiq_soc.h>
++#include <xway_dma.h>
++#include <lantiq_platform.h>
++
++#define LTQ_ETOP_MDIO         0x11804
++#define MDIO_REQUEST          0x80000000
++#define MDIO_READ             0x40000000
++#define MDIO_ADDR_MASK                0x1f
++#define MDIO_ADDR_OFFSET      0x15
++#define MDIO_REG_MASK         0x1f
++#define MDIO_REG_OFFSET               0x10
++#define MDIO_VAL_MASK         0xffff
++
++#define PPE32_CGEN            0x800
++#define LTQ_PPE32_ENET_MAC_CFG        0x1840
++
++#define LTQ_ETOP_ENETS0               0x11850
++#define LTQ_ETOP_MAC_DA0      0x1186C
++#define LTQ_ETOP_MAC_DA1      0x11870
++#define LTQ_ETOP_CFG          0x16020
++#define LTQ_ETOP_IGPLEN               0x16080
++
++#define MAX_DMA_CHAN          0x8
++#define MAX_DMA_CRC_LEN               0x4
++#define MAX_DMA_DATA_LEN      0x600
++
++#define ETOP_FTCU             BIT(28)
++#define ETOP_MII_MASK         0xf
++#define ETOP_MII_NORMAL               0xd
++#define ETOP_MII_REVERSE      0xe
++#define ETOP_PLEN_UNDER               0x40
++#define ETOP_CGEN             0x800
++
++/* use 2 static channels for TX/RX */
++#define LTQ_ETOP_TX_CHANNEL   1
++#define LTQ_ETOP_RX_CHANNEL   6
++#define IS_TX(x)              (x == LTQ_ETOP_TX_CHANNEL)
++#define IS_RX(x)              (x == LTQ_ETOP_RX_CHANNEL)
++
++#define ltq_etop_r32(x)               ltq_r32(ltq_etop_membase + (x))
++#define ltq_etop_w32(x, y)    ltq_w32(x, ltq_etop_membase + (y))
++#define ltq_etop_w32_mask(x, y, z)    \
++              ltq_w32_mask(x, y, ltq_etop_membase + (z))
++
++#define DRV_VERSION   "1.0"
++
++#ifndef netdev_err
++#define netdev_err(a, b, ...) printk(b, ##__VA_ARGS__)
++#endif
++
++#ifndef pr_warn
++#define pr_warn pr_warning
++#endif
++
++static void __iomem *ltq_etop_membase;
++
++struct ltq_etop_chan {
++      int idx;
++      int tx_free;
++      struct net_device *netdev;
++      struct napi_struct napi;
++      struct ltq_dma_channel dma;
++      struct sk_buff *skb[LTQ_DESC_NUM];
++};
++
++struct ltq_etop_priv {
++      struct net_device *netdev;
++      struct ltq_eth_data *pldata;
++      struct resource *res;
++
++      struct mii_bus *mii_bus;
++      struct phy_device *phydev;
++
++      struct ltq_etop_chan ch[MAX_DMA_CHAN];
++      int tx_free[MAX_DMA_CHAN >> 1];
++
++      spinlock_t lock;
++};
++
++static int
++ltq_etop_alloc_skb(struct ltq_etop_chan *ch)
++{
++      ch->skb[ch->dma.desc] = dev_alloc_skb(MAX_DMA_DATA_LEN);
++      if (!ch->skb[ch->dma.desc])
++              return -ENOMEM;
++      ch->dma.desc_base[ch->dma.desc].addr = dma_map_single(NULL,
++              ch->skb[ch->dma.desc]->data, MAX_DMA_DATA_LEN,
++              DMA_FROM_DEVICE);
++      ch->dma.desc_base[ch->dma.desc].addr =
++              CPHYSADDR(ch->skb[ch->dma.desc]->data);
++      ch->dma.desc_base[ch->dma.desc].ctl =
++              LTQ_DMA_OWN | LTQ_DMA_RX_OFFSET(NET_IP_ALIGN) |
++              MAX_DMA_DATA_LEN;
++      skb_reserve(ch->skb[ch->dma.desc], NET_IP_ALIGN);
++      return 0;
++}
++
++static void
++ltq_etop_hw_receive(struct ltq_etop_chan *ch)
++{
++      struct ltq_etop_priv *priv = netdev_priv(ch->netdev);
++      struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc];
++      struct sk_buff *skb = ch->skb[ch->dma.desc];
++      int len = (desc->ctl & LTQ_DMA_SIZE_MASK) - MAX_DMA_CRC_LEN;
++      unsigned long flags;
++
++      spin_lock_irqsave(&priv->lock, flags);
++      if (ltq_etop_alloc_skb(ch)) {
++              netdev_err(ch->netdev,
++                      "failed to allocate new rx buffer, stopping DMA\n");
++              ltq_dma_close(&ch->dma);
++      }
++      ch->dma.desc++;
++      ch->dma.desc %= LTQ_DESC_NUM;
++      spin_unlock_irqrestore(&priv->lock, flags);
++
++      skb_put(skb, len);
++      skb->dev = ch->netdev;
++      skb->protocol = eth_type_trans(skb, ch->netdev);
++      netif_receive_skb(skb);
++}
++
++static int
++ltq_etop_poll_rx(struct napi_struct *napi, int budget)
++{
++      struct ltq_etop_chan *ch = container_of(napi,
++                              struct ltq_etop_chan, napi);
++      int rx = 0;
++      int complete = 0;
++
++      while ((rx < budget) && !complete) {
++              struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc];
++
++              if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) == LTQ_DMA_C) {
++                      ltq_etop_hw_receive(ch);
++                      rx++;
++              } else {
++                      complete = 1;
++              }
++      }
++      if (complete || !rx) {
++              napi_complete(&ch->napi);
++              ltq_dma_ack_irq(&ch->dma);
++      }
++      return rx;
++}
++
++static int
++ltq_etop_poll_tx(struct napi_struct *napi, int budget)
++{
++      struct ltq_etop_chan *ch =
++              container_of(napi, struct ltq_etop_chan, napi);
++      struct ltq_etop_priv *priv = netdev_priv(ch->netdev);
++      struct netdev_queue *txq =
++              netdev_get_tx_queue(ch->netdev, ch->idx >> 1);
++      unsigned long flags;
++
++      spin_lock_irqsave(&priv->lock, flags);
++      while ((ch->dma.desc_base[ch->tx_free].ctl &
++                      (LTQ_DMA_OWN | LTQ_DMA_C)) == LTQ_DMA_C) {
++              dev_kfree_skb_any(ch->skb[ch->tx_free]);
++              ch->skb[ch->tx_free] = NULL;
++              memset(&ch->dma.desc_base[ch->tx_free], 0,
++                      sizeof(struct ltq_dma_desc));
++              ch->tx_free++;
++              ch->tx_free %= LTQ_DESC_NUM;
++      }
++      spin_unlock_irqrestore(&priv->lock, flags);
++
++      if (netif_tx_queue_stopped(txq))
++              netif_tx_start_queue(txq);
++      napi_complete(&ch->napi);
++      ltq_dma_ack_irq(&ch->dma);
++      return 1;
++}
++
++static irqreturn_t
++ltq_etop_dma_irq(int irq, void *_priv)
++{
++      struct ltq_etop_priv *priv = _priv;
++      int ch = irq - LTQ_DMA_CH0_INT;
++
++      napi_schedule(&priv->ch[ch].napi);
++      return IRQ_HANDLED;
++}
++
++static void
++ltq_etop_free_channel(struct net_device *dev, struct ltq_etop_chan *ch)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++
++      ltq_dma_free(&ch->dma);
++      if (ch->dma.irq)
++              free_irq(ch->dma.irq, priv);
++      if (IS_RX(ch->idx)) {
++              int desc;
++              for (desc = 0; desc < LTQ_DESC_NUM; desc++)
++                      dev_kfree_skb_any(ch->skb[ch->dma.desc]);
++      }
++}
++
++static void
++ltq_etop_hw_exit(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      int i;
++
++      ltq_pmu_disable(PMU_PPE);
++      for (i = 0; i < MAX_DMA_CHAN; i++)
++              if (IS_TX(i) || IS_RX(i))
++                      ltq_etop_free_channel(dev, &priv->ch[i]);
++}
++
++static int
++ltq_etop_hw_init(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      int i;
++
++      ltq_pmu_enable(PMU_PPE);
++
++      switch (priv->pldata->mii_mode) {
++      case PHY_INTERFACE_MODE_RMII:
++              ltq_etop_w32_mask(ETOP_MII_MASK,
++                      ETOP_MII_REVERSE, LTQ_ETOP_CFG);
++              break;
++
++      case PHY_INTERFACE_MODE_MII:
++              ltq_etop_w32_mask(ETOP_MII_MASK,
++                      ETOP_MII_NORMAL, LTQ_ETOP_CFG);
++              break;
++
++      default:
++              netdev_err(dev, "unknown mii mode %d\n",
++                      priv->pldata->mii_mode);
++              return -ENOTSUPP;
++      }
++
++      /* enable crc generation */
++      ltq_etop_w32(PPE32_CGEN, LTQ_PPE32_ENET_MAC_CFG);
++
++      ltq_dma_init_port(DMA_PORT_ETOP);
++
++      for (i = 0; i < MAX_DMA_CHAN; i++) {
++              int irq = LTQ_DMA_CH0_INT + i;
++              struct ltq_etop_chan *ch = &priv->ch[i];
++
++              ch->idx = ch->dma.nr = i;
++
++              if (IS_TX(i)) {
++                      ltq_dma_alloc_tx(&ch->dma);
++                      request_irq(irq, ltq_etop_dma_irq, IRQF_DISABLED,
++                              "etop_tx", priv);
++              } else if (IS_RX(i)) {
++                      ltq_dma_alloc_rx(&ch->dma);
++                      for (ch->dma.desc = 0; ch->dma.desc < LTQ_DESC_NUM;
++                                      ch->dma.desc++)
++                              if (ltq_etop_alloc_skb(ch))
++                                      return -ENOMEM;
++                      ch->dma.desc = 0;
++                      request_irq(irq, ltq_etop_dma_irq, IRQF_DISABLED,
++                              "etop_rx", priv);
++              }
++              ch->dma.irq = irq;
++      }
++      return 0;
++}
++
++static void
++ltq_etop_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *info)
++{
++      strcpy(info->driver, "Lantiq ETOP");
++      strcpy(info->bus_info, "internal");
++      strcpy(info->version, DRV_VERSION);
++}
++
++static int
++ltq_etop_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++
++      return phy_ethtool_gset(priv->phydev, cmd);
++}
++
++static int
++ltq_etop_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++
++      return phy_ethtool_sset(priv->phydev, cmd);
++}
++
++static int
++ltq_etop_nway_reset(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++
++      return phy_start_aneg(priv->phydev);
++}
++
++static const struct ethtool_ops ltq_etop_ethtool_ops = {
++      .get_drvinfo = ltq_etop_get_drvinfo,
++      .get_settings = ltq_etop_get_settings,
++      .set_settings = ltq_etop_set_settings,
++      .nway_reset = ltq_etop_nway_reset,
++};
++
++static int
++ltq_etop_mdio_wr(struct mii_bus *bus, int phy_addr, int phy_reg, u16 phy_data)
++{
++      u32 val = MDIO_REQUEST |
++              ((phy_addr & MDIO_ADDR_MASK) << MDIO_ADDR_OFFSET) |
++              ((phy_reg & MDIO_REG_MASK) << MDIO_REG_OFFSET) |
++              phy_data;
++
++      while (ltq_etop_r32(LTQ_ETOP_MDIO) & MDIO_REQUEST)
++              ;
++      ltq_etop_w32(val, LTQ_ETOP_MDIO);
++      return 0;
++}
++
++static int
++ltq_etop_mdio_rd(struct mii_bus *bus, int phy_addr, int phy_reg)
++{
++      u32 val = MDIO_REQUEST | MDIO_READ |
++              ((phy_addr & MDIO_ADDR_MASK) << MDIO_ADDR_OFFSET) |
++              ((phy_reg & MDIO_REG_MASK) << MDIO_REG_OFFSET);
++
++      while (ltq_etop_r32(LTQ_ETOP_MDIO) & MDIO_REQUEST)
++              ;
++      ltq_etop_w32(val, LTQ_ETOP_MDIO);
++      while (ltq_etop_r32(LTQ_ETOP_MDIO) & MDIO_REQUEST)
++              ;
++      val = ltq_etop_r32(LTQ_ETOP_MDIO) & MDIO_VAL_MASK;
++      return val;
++}
++
++static void
++ltq_etop_mdio_link(struct net_device *dev)
++{
++      /* nothing to do  */
++}
++
++static int
++ltq_etop_mdio_probe(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      struct phy_device *phydev = NULL;
++      int phy_addr;
++
++      for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
++              if (priv->mii_bus->phy_map[phy_addr]) {
++                      phydev = priv->mii_bus->phy_map[phy_addr];
++                      break;
++              }
++      }
++
++      if (!phydev) {
++              netdev_err(dev, "no PHY found\n");
++              return -ENODEV;
++      }
++
++      phydev = phy_connect(dev, dev_name(&phydev->dev), &ltq_etop_mdio_link,
++                      0, priv->pldata->mii_mode);
++
++      if (IS_ERR(phydev)) {
++              netdev_err(dev, "Could not attach to PHY\n");
++              return PTR_ERR(phydev);
++      }
++
++      phydev->supported &= (SUPPORTED_10baseT_Half
++                            | SUPPORTED_10baseT_Full
++                            | SUPPORTED_100baseT_Half
++                            | SUPPORTED_100baseT_Full
++                            | SUPPORTED_Autoneg
++                            | SUPPORTED_MII
++                            | SUPPORTED_TP);
++
++      phydev->advertising = phydev->supported;
++      priv->phydev = phydev;
++      pr_info("%s: attached PHY [%s] (phy_addr=%s, irq=%d)\n",
++             dev->name, phydev->drv->name,
++             dev_name(&phydev->dev), phydev->irq);
++
++      return 0;
++}
++
++static int
++ltq_etop_mdio_init(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      int i;
++      int err;
++
++      priv->mii_bus = mdiobus_alloc();
++      if (!priv->mii_bus) {
++              netdev_err(dev, "failed to allocate mii bus\n");
++              err = -ENOMEM;
++              goto err_out;
++      }
++
++      priv->mii_bus->priv = dev;
++      priv->mii_bus->read = ltq_etop_mdio_rd;
++      priv->mii_bus->write = ltq_etop_mdio_wr;
++      priv->mii_bus->name = "ltq_mii";
++      snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%x", 0);
++      priv->mii_bus->irq = kmalloc(sizeof(int) * PHY_MAX_ADDR, GFP_KERNEL);
++      if (!priv->mii_bus->irq) {
++              err = -ENOMEM;
++              goto err_out_free_mdiobus;
++      }
++
++      for (i = 0; i < PHY_MAX_ADDR; ++i)
++              priv->mii_bus->irq[i] = PHY_POLL;
++
++      if (mdiobus_register(priv->mii_bus)) {
++              err = -ENXIO;
++              goto err_out_free_mdio_irq;
++      }
++
++      if (ltq_etop_mdio_probe(dev)) {
++              err = -ENXIO;
++              goto err_out_unregister_bus;
++      }
++      return 0;
++
++err_out_unregister_bus:
++      mdiobus_unregister(priv->mii_bus);
++err_out_free_mdio_irq:
++      kfree(priv->mii_bus->irq);
++err_out_free_mdiobus:
++      mdiobus_free(priv->mii_bus);
++err_out:
++      return err;
++}
++
++static void
++ltq_etop_mdio_cleanup(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++
++      phy_disconnect(priv->phydev);
++      mdiobus_unregister(priv->mii_bus);
++      kfree(priv->mii_bus->irq);
++      mdiobus_free(priv->mii_bus);
++}
++
++static int
++ltq_etop_open(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      int i;
++
++      for (i = 0; i < MAX_DMA_CHAN; i++) {
++              struct ltq_etop_chan *ch = &priv->ch[i];
++
++              if (!IS_TX(i) && (!IS_RX(i)))
++                      continue;
++              ltq_dma_open(&ch->dma);
++              napi_enable(&ch->napi);
++      }
++      phy_start(priv->phydev);
++      netif_tx_start_all_queues(dev);
++      return 0;
++}
++
++static int
++ltq_etop_stop(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      int i;
++
++      netif_tx_stop_all_queues(dev);
++      phy_stop(priv->phydev);
++      for (i = 0; i < MAX_DMA_CHAN; i++) {
++              struct ltq_etop_chan *ch = &priv->ch[i];
++
++              if (!IS_RX(i) && !IS_TX(i))
++                      continue;
++              napi_disable(&ch->napi);
++              ltq_dma_close(&ch->dma);
++      }
++      return 0;
++}
++
++static int
++ltq_etop_tx(struct sk_buff *skb, struct net_device *dev)
++{
++      int queue = skb_get_queue_mapping(skb);
++      struct netdev_queue *txq = netdev_get_tx_queue(dev, queue);
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      struct ltq_etop_chan *ch = &priv->ch[(queue << 1) | 1];
++      struct ltq_dma_desc *desc = &ch->dma.desc_base[ch->dma.desc];
++      int len;
++      unsigned long flags;
++      u32 byte_offset;
++
++      len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
++
++      if ((desc->ctl & (LTQ_DMA_OWN | LTQ_DMA_C)) || ch->skb[ch->dma.desc]) {
++              dev_kfree_skb_any(skb);
++              netdev_err(dev, "tx ring full\n");
++              netif_tx_stop_queue(txq);
++              return NETDEV_TX_BUSY;
++      }
++
++      /* dma needs to start on a 16 byte aligned address */
++      byte_offset = CPHYSADDR(skb->data) % 16;
++      ch->skb[ch->dma.desc] = skb;
++
++      dev->trans_start = jiffies;
++
++      spin_lock_irqsave(&priv->lock, flags);
++      desc->addr = ((unsigned int) dma_map_single(NULL, skb->data, len,
++                                              DMA_TO_DEVICE)) - byte_offset;
++      wmb();
++      desc->ctl = LTQ_DMA_OWN | LTQ_DMA_SOP | LTQ_DMA_EOP |
++              LTQ_DMA_TX_OFFSET(byte_offset) | (len & LTQ_DMA_SIZE_MASK);
++      ch->dma.desc++;
++      ch->dma.desc %= LTQ_DESC_NUM;
++      spin_unlock_irqrestore(&priv->lock, flags);
++
++      if (ch->dma.desc_base[ch->dma.desc].ctl & LTQ_DMA_OWN)
++              netif_tx_stop_queue(txq);
++
++      return NETDEV_TX_OK;
++}
++
++static int
++ltq_etop_change_mtu(struct net_device *dev, int new_mtu)
++{
++      int ret = eth_change_mtu(dev, new_mtu);
++
++      if (!ret) {
++              struct ltq_etop_priv *priv = netdev_priv(dev);
++              unsigned long flags;
++
++              spin_lock_irqsave(&priv->lock, flags);
++              ltq_etop_w32((ETOP_PLEN_UNDER << 16) | new_mtu,
++                      LTQ_ETOP_IGPLEN);
++              spin_unlock_irqrestore(&priv->lock, flags);
++      }
++      return ret;
++}
++
++static int
++ltq_etop_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      struct mii_ioctl_data *data = if_mii(rq);
++
++      /* TODO: mii-toll reports "No MII transceiver present!." ?!*/
++      return phy_mii_ioctl(priv->phydev, data, cmd);
++}
++
++static int
++ltq_etop_set_mac_address(struct net_device *dev, void *p)
++{
++      int ret = eth_mac_addr(dev, p);
++
++      if (!ret) {
++              struct ltq_etop_priv *priv = netdev_priv(dev);
++              unsigned long flags;
++
++              /* store the mac for the unicast filter */
++              spin_lock_irqsave(&priv->lock, flags);
++              ltq_etop_w32(*((u32 *)dev->dev_addr), LTQ_ETOP_MAC_DA0);
++              ltq_etop_w32(*((u16 *)&dev->dev_addr[4]) << 16,
++                      LTQ_ETOP_MAC_DA1);
++              spin_unlock_irqrestore(&priv->lock, flags);
++      }
++      return ret;
++}
++
++static void
++ltq_etop_set_multicast_list(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      unsigned long flags;
++
++      /* ensure that the unicast filter is not enabled in promiscious mode */
++      spin_lock_irqsave(&priv->lock, flags);
++      if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI))
++              ltq_etop_w32_mask(ETOP_FTCU, 0, LTQ_ETOP_ENETS0);
++      else
++              ltq_etop_w32_mask(0, ETOP_FTCU, LTQ_ETOP_ENETS0);
++      spin_unlock_irqrestore(&priv->lock, flags);
++}
++
++static u16
++ltq_etop_select_queue(struct net_device *dev, struct sk_buff *skb)
++{
++      /* we are currently only using the first queue */
++      return 0;
++}
++
++static int
++ltq_etop_init(struct net_device *dev)
++{
++      struct ltq_etop_priv *priv = netdev_priv(dev);
++      struct sockaddr mac;
++      int err;
++
++      ether_setup(dev);
++      dev->watchdog_timeo = 10 * HZ;
++      err = ltq_etop_hw_init(dev);
++      if (err)
++              goto err_hw;
++      ltq_etop_change_mtu(dev, 1500);
++
++      memcpy(&mac, &priv->pldata->mac, sizeof(struct sockaddr));
++      if (!is_valid_ether_addr(mac.sa_data)) {
++              pr_warn("etop: invalid MAC, using random\n");
++              random_ether_addr(mac.sa_data);
++      }
++
++      err = ltq_etop_set_mac_address(dev, &mac);
++      if (err)
++              goto err_netdev;
++      ltq_etop_set_multicast_list(dev);
++      err = ltq_etop_mdio_init(dev);
++      if (err)
++              goto err_netdev;
++      return 0;
++
++err_netdev:
++      unregister_netdev(dev);
++      free_netdev(dev);
++err_hw:
++      ltq_etop_hw_exit(dev);
++      return err;
++}
++
++static void
++ltq_etop_tx_timeout(struct net_device *dev)
++{
++      int err;
++
++      ltq_etop_hw_exit(dev);
++      err = ltq_etop_hw_init(dev);
++      if (err)
++              goto err_hw;
++      dev->trans_start = jiffies;
++      netif_wake_queue(dev);
++      return;
++
++err_hw:
++      ltq_etop_hw_exit(dev);
++      netdev_err(dev, "failed to restart etop after TX timeout\n");
++}
++
++static const struct net_device_ops ltq_eth_netdev_ops = {
++      .ndo_open = ltq_etop_open,
++      .ndo_stop = ltq_etop_stop,
++      .ndo_start_xmit = ltq_etop_tx,
++      .ndo_change_mtu = ltq_etop_change_mtu,
++      .ndo_do_ioctl = ltq_etop_ioctl,
++      .ndo_set_mac_address = ltq_etop_set_mac_address,
++      .ndo_validate_addr = eth_validate_addr,
++      .ndo_set_multicast_list = ltq_etop_set_multicast_list,
++      .ndo_select_queue = ltq_etop_select_queue,
++      .ndo_init = ltq_etop_init,
++      .ndo_tx_timeout = ltq_etop_tx_timeout,
++};
++
++static int __init
++ltq_etop_probe(struct platform_device *pdev)
++{
++      struct net_device *dev;
++      struct ltq_etop_priv *priv;
++      struct resource *res;
++      int err;
++      int i;
++
++      res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!res) {
++              dev_err(&pdev->dev, "failed to get etop resource\n");
++              err = -ENOENT;
++              goto err_out;
++      }
++
++      res = devm_request_mem_region(&pdev->dev, res->start,
++              resource_size(res), dev_name(&pdev->dev));
++      if (!res) {
++              dev_err(&pdev->dev, "failed to request etop resource\n");
++              err = -EBUSY;
++              goto err_out;
++      }
++
++      ltq_etop_membase = devm_ioremap_nocache(&pdev->dev,
++              res->start, resource_size(res));
++      if (!ltq_etop_membase) {
++              dev_err(&pdev->dev, "failed to remap etop engine %d\n",
++                      pdev->id);
++              err = -ENOMEM;
++              goto err_out;
++      }
++
++      dev = alloc_etherdev_mq(sizeof(struct ltq_etop_priv), 4);
++      strcpy(dev->name, "eth%d");
++      dev->netdev_ops = &ltq_eth_netdev_ops;
++      dev->ethtool_ops = &ltq_etop_ethtool_ops;
++      priv = netdev_priv(dev);
++      priv->res = res;
++      priv->pldata = dev_get_platdata(&pdev->dev);
++      priv->netdev = dev;
++      spin_lock_init(&priv->lock);
++
++      for (i = 0; i < MAX_DMA_CHAN; i++) {
++              if (IS_TX(i))
++                      netif_napi_add(dev, &priv->ch[i].napi,
++                              ltq_etop_poll_tx, 8);
++              else if (IS_RX(i))
++                      netif_napi_add(dev, &priv->ch[i].napi,
++                              ltq_etop_poll_rx, 32);
++              priv->ch[i].netdev = dev;
++      }
++
++      err = register_netdev(dev);
++      if (err)
++              goto err_free;
++
++      platform_set_drvdata(pdev, dev);
++      return 0;
++
++err_free:
++      kfree(dev);
++err_out:
++      return err;
++}
++
++static int __devexit
++ltq_etop_remove(struct platform_device *pdev)
++{
++      struct net_device *dev = platform_get_drvdata(pdev);
++
++      if (dev) {
++              netif_tx_stop_all_queues(dev);
++              ltq_etop_hw_exit(dev);
++              ltq_etop_mdio_cleanup(dev);
++              unregister_netdev(dev);
++      }
++      return 0;
++}
++
++static struct platform_driver ltq_mii_driver = {
++      .remove = __devexit_p(ltq_etop_remove),
++      .driver = {
++              .name = "ltq_etop",
++              .owner = THIS_MODULE,
++      },
++};
++
++int __init
++init_ltq_etop(void)
++{
++      int ret = platform_driver_probe(&ltq_mii_driver, ltq_etop_probe);
++
++      if (ret)
++              pr_err("ltq_etop: Error registering platfom driver!");
++      return ret;
++}
++
++static void __exit
++exit_ltq_etop(void)
++{
++      platform_driver_unregister(&ltq_mii_driver);
++}
++
++module_init(init_ltq_etop);
++module_exit(exit_ltq_etop);
++
++MODULE_AUTHOR("John Crispin <blogic@openwrt.org>");
++MODULE_DESCRIPTION("Lantiq SoC ETOP");
++MODULE_LICENSE("GPL");
diff --git a/target/linux/lantiq/patches-2.6.32/0012-MIPS-Lantiq-Add-etop-board-support.patch b/target/linux/lantiq/patches-2.6.32/0012-MIPS-Lantiq-Add-etop-board-support.patch
new file mode 100644 (file)
index 0000000..2bc4abd
--- /dev/null
@@ -0,0 +1,50 @@
+From 72a9b536ef81f06bb8042abee0410458f5df93d2 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Fri, 6 May 2011 00:10:02 +0200
+Subject: [PATCH 12/13] MIPS: Lantiq: Add etop board support
+
+Register the etop platform device inside the machtype specific init code.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Signed-off-by: David Daney <ddaney@caviumnetworks.com>
+Cc: linux-mips@linux-mips.org
+Patchwork: https://patchwork.linux-mips.org/patch/2356/
+Patchwork: https://patchwork.linux-mips.org/patch/2370/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ arch/mips/lantiq/xway/mach-easy50712.c |    6 ++++++
+ 1 files changed, 6 insertions(+), 0 deletions(-)
+
+diff --git a/arch/mips/lantiq/xway/mach-easy50712.c b/arch/mips/lantiq/xway/mach-easy50712.c
+index e5e7e09..ea5027b 100644
+--- a/arch/mips/lantiq/xway/mach-easy50712.c
++++ b/arch/mips/lantiq/xway/mach-easy50712.c
+@@ -12,6 +12,7 @@
+ #include <linux/mtd/partitions.h>
+ #include <linux/mtd/physmap.h>
+ #include <linux/input.h>
++#include <linux/phy.h>
+ #include <lantiq_soc.h>
+ #include <irq.h>
+@@ -55,11 +56,16 @@ static struct ltq_pci_data ltq_pci_data = {
+       },
+ };
++static struct ltq_eth_data ltq_eth_data = {
++      .mii_mode = PHY_INTERFACE_MODE_MII,
++};
++
+ static void __init easy50712_init(void)
+ {
+       ltq_register_gpio_stp();
+       ltq_register_nor(&easy50712_flash_data);
+       ltq_register_pci(&ltq_pci_data);
++      ltq_register_etop(&ltq_eth_data);
+ }
+ MIPS_MACHINE(LTQ_MACH_EASY50712,
+-- 
+1.7.2.3
+
diff --git a/target/linux/lantiq/patches-2.6.32/0013-MIPS-Lantiq-Add-watchdog-support.patch b/target/linux/lantiq/patches-2.6.32/0013-MIPS-Lantiq-Add-watchdog-support.patch
new file mode 100644 (file)
index 0000000..903f674
--- /dev/null
@@ -0,0 +1,310 @@
+From 3466449c8f455da0cb646231602e6af16190f592 Mon Sep 17 00:00:00 2001
+From: John Crispin <blogic@openwrt.org>
+Date: Thu, 5 May 2011 23:00:23 +0200
+Subject: [PATCH 13/13] MIPS: Lantiq: Add watchdog support
+
+This patch adds the driver for the watchdog found inside the Lantiq SoC family.
+
+Signed-off-by: John Crispin <blogic@openwrt.org>
+Signed-off-by: Ralph Hempel <ralph.hempel@lantiq.com>
+Cc: Wim Van Sebroeck <wim@iguana.be>
+Cc: linux-mips@linux-mips.org
+Cc: linux-watchdog@vger.kernel.org
+Patchwork: https://patchwork.linux-mips.org/patch/2327/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+---
+ drivers/watchdog/Kconfig      |    6 +
+ drivers/watchdog/Makefile     |    1 +
+ drivers/watchdog/lantiq_wdt.c |  261 +++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 268 insertions(+), 0 deletions(-)
+ create mode 100644 drivers/watchdog/lantiq_wdt.c
+
+--- a/drivers/watchdog/Kconfig
++++ b/drivers/watchdog/Kconfig
+@@ -850,6 +850,12 @@
+       help
+         Hardware driver for the built-in watchdog timer on TXx9 MIPS SoCs.
++config LANTIQ_WDT
++      tristate "Lantiq SoC watchdog"
++      depends on LANTIQ
++      help
++        Hardware driver for the Lantiq SoC Watchdog Timer.
++
+ # PARISC Architecture
+ # POWERPC Architecture
+--- a/drivers/watchdog/Makefile
++++ b/drivers/watchdog/Makefile
+@@ -113,6 +113,7 @@
+ obj-$(CONFIG_SIBYTE_WDOG) += sb_wdog.o
+ obj-$(CONFIG_AR7_WDT) += ar7_wdt.o
+ obj-$(CONFIG_TXX9_WDT) += txx9wdt.o
++obj-$(CONFIG_LANTIQ_WDT) += lantiq_wdt.o
+ # PARISC Architecture
+--- /dev/null
++++ b/drivers/watchdog/lantiq_wdt.c
+@@ -0,0 +1,261 @@
++/*
++ *  This program is free software; you can redistribute it and/or modify it
++ *  under the terms of the GNU General Public License version 2 as published
++ *  by the Free Software Foundation.
++ *
++ *  Copyright (C) 2010 John Crispin <blogic@openwrt.org>
++ *  Based on EP93xx wdt driver
++ */
++
++#include <linux/module.h>
++#include <linux/fs.h>
++#include <linux/miscdevice.h>
++#include <linux/watchdog.h>
++#include <linux/platform_device.h>
++#include <linux/uaccess.h>
++#include <linux/clk.h>
++#include <linux/io.h>
++
++#include <lantiq.h>
++
++/* Section 3.4 of the datasheet
++ * The password sequence protects the WDT control register from unintended
++ * write actions, which might cause malfunction of the WDT.
++ *
++ * essentially the following two magic passwords need to be written to allow
++ * IO access to the WDT core
++ */
++#define LTQ_WDT_PW1           0x00BE0000
++#define LTQ_WDT_PW2           0x00DC0000
++
++#define LTQ_WDT_CR            0x0     /* watchdog control register */
++#define LTQ_WDT_SR            0x8     /* watchdog status register */
++
++#define LTQ_WDT_SR_EN         (0x1 << 31)     /* enable bit */
++#define LTQ_WDT_SR_PWD                (0x3 << 26)     /* turn on power */
++#define LTQ_WDT_SR_CLKDIV     (0x3 << 24)     /* turn on clock and set */
++                                              /* divider to 0x40000 */
++#define LTQ_WDT_DIVIDER               0x40000
++#define LTQ_MAX_TIMEOUT               ((1 << 16) - 1) /* the reload field is 16 bit */
++
++static int nowayout = WATCHDOG_NOWAYOUT;
++
++static void __iomem *ltq_wdt_membase;
++static unsigned long ltq_io_region_clk_rate;
++
++static unsigned long ltq_wdt_bootstatus;
++static unsigned long ltq_wdt_in_use;
++static int ltq_wdt_timeout = 30;
++static int ltq_wdt_ok_to_close;
++
++static void
++ltq_wdt_enable(void)
++{
++      ltq_wdt_timeout = ltq_wdt_timeout *
++                      (ltq_io_region_clk_rate / LTQ_WDT_DIVIDER) + 0x1000;
++      if (ltq_wdt_timeout > LTQ_MAX_TIMEOUT)
++              ltq_wdt_timeout = LTQ_MAX_TIMEOUT;
++
++      /* write the first password magic */
++      ltq_w32(LTQ_WDT_PW1, ltq_wdt_membase + LTQ_WDT_CR);
++      /* write the second magic plus the configuration and new timeout */
++      ltq_w32(LTQ_WDT_SR_EN | LTQ_WDT_SR_PWD | LTQ_WDT_SR_CLKDIV |
++              LTQ_WDT_PW2 | ltq_wdt_timeout, ltq_wdt_membase + LTQ_WDT_CR);
++}
++
++static void
++ltq_wdt_disable(void)
++{
++      /* write the first password magic */
++      ltq_w32(LTQ_WDT_PW1, ltq_wdt_membase + LTQ_WDT_CR);
++      /* write the second password magic with no config
++       * this turns the watchdog off
++       */
++      ltq_w32(LTQ_WDT_PW2, ltq_wdt_membase + LTQ_WDT_CR);
++}
++
++static ssize_t
++ltq_wdt_write(struct file *file, const char __user *data,
++              size_t len, loff_t *ppos)
++{
++      if (len) {
++              if (!nowayout) {
++                      size_t i;
++
++                      ltq_wdt_ok_to_close = 0;
++                      for (i = 0; i != len; i++) {
++                              char c;
++
++                              if (get_user(c, data + i))
++                                      return -EFAULT;
++                              if (c == 'V')
++                                      ltq_wdt_ok_to_close = 1;
++                              else
++                                      ltq_wdt_ok_to_close = 0;
++                      }
++              }
++              ltq_wdt_enable();
++      }
++
++      return len;
++}
++
++static struct watchdog_info ident = {
++      .options = WDIOF_MAGICCLOSE | WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING |
++                      WDIOF_CARDRESET,
++      .identity = "ltq_wdt",
++};
++
++static long
++ltq_wdt_ioctl(struct file *file,
++              unsigned int cmd, unsigned long arg)
++{
++      int ret = -ENOTTY;
++
++      switch (cmd) {
++      case WDIOC_GETSUPPORT:
++              ret = copy_to_user((struct watchdog_info __user *)arg, &ident,
++                              sizeof(ident)) ? -EFAULT : 0;
++              break;
++
++      case WDIOC_GETBOOTSTATUS:
++              ret = put_user(ltq_wdt_bootstatus, (int __user *)arg);
++              break;
++
++      case WDIOC_GETSTATUS:
++              ret = put_user(0, (int __user *)arg);
++              break;
++
++      case WDIOC_SETTIMEOUT:
++              ret = get_user(ltq_wdt_timeout, (int __user *)arg);
++              if (!ret)
++                      ltq_wdt_enable();
++              /* intentional drop through */
++      case WDIOC_GETTIMEOUT:
++              ret = put_user(ltq_wdt_timeout, (int __user *)arg);
++              break;
++
++      case WDIOC_KEEPALIVE:
++              ltq_wdt_enable();
++              ret = 0;
++              break;
++      }
++      return ret;
++}
++
++static int
++ltq_wdt_open(struct inode *inode, struct file *file)
++{
++      if (test_and_set_bit(0, &ltq_wdt_in_use))
++              return -EBUSY;
++      ltq_wdt_in_use = 1;
++      ltq_wdt_enable();
++
++      return nonseekable_open(inode, file);
++}
++
++static int
++ltq_wdt_release(struct inode *inode, struct file *file)
++{
++      if (ltq_wdt_ok_to_close)
++              ltq_wdt_disable();
++      else
++              pr_err("ltq_wdt: watchdog closed without warning\n");
++      ltq_wdt_ok_to_close = 0;
++      clear_bit(0, &ltq_wdt_in_use);
++
++      return 0;
++}
++
++static const struct file_operations ltq_wdt_fops = {
++      .owner          = THIS_MODULE,
++      .write          = ltq_wdt_write,
++      .unlocked_ioctl = ltq_wdt_ioctl,
++      .open           = ltq_wdt_open,
++      .release        = ltq_wdt_release,
++      .llseek         = no_llseek,
++};
++
++static struct miscdevice ltq_wdt_miscdev = {
++      .minor  = WATCHDOG_MINOR,
++      .name   = "watchdog",
++      .fops   = &ltq_wdt_fops,
++};
++
++static int __init
++ltq_wdt_probe(struct platform_device *pdev)
++{
++      struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      struct clk *clk;
++
++      if (!res) {
++              dev_err(&pdev->dev, "cannot obtain I/O memory region");
++              return -ENOENT;
++      }
++      res = devm_request_mem_region(&pdev->dev, res->start,
++              resource_size(res), dev_name(&pdev->dev));
++      if (!res) {
++              dev_err(&pdev->dev, "cannot request I/O memory region");
++              return -EBUSY;
++      }
++      ltq_wdt_membase = devm_ioremap_nocache(&pdev->dev, res->start,
++              resource_size(res));
++      if (!ltq_wdt_membase) {
++              dev_err(&pdev->dev, "cannot remap I/O memory region\n");
++              return -ENOMEM;
++      }
++
++      /* we do not need to enable the clock as it is always running */
++      clk = clk_get(&pdev->dev, "io");
++      WARN_ON(!clk);
++      ltq_io_region_clk_rate = clk_get_rate(clk);
++      clk_put(clk);
++
++      if (ltq_reset_cause() == LTQ_RST_CAUSE_WDTRST)
++              ltq_wdt_bootstatus = WDIOF_CARDRESET;
++
++      return misc_register(&ltq_wdt_miscdev);
++}
++
++static int __devexit
++ltq_wdt_remove(struct platform_device *pdev)
++{
++      misc_deregister(&ltq_wdt_miscdev);
++
++      if (ltq_wdt_membase)
++              iounmap(ltq_wdt_membase);
++
++      return 0;
++}
++
++
++static struct platform_driver ltq_wdt_driver = {
++      .remove = __devexit_p(ltq_wdt_remove),
++      .driver = {
++              .name = "ltq_wdt",
++              .owner = THIS_MODULE,
++      },
++};
++
++static int __init
++init_ltq_wdt(void)
++{
++      return platform_driver_probe(&ltq_wdt_driver, ltq_wdt_probe);
++}
++
++static void __exit
++exit_ltq_wdt(void)
++{
++      return platform_driver_unregister(&ltq_wdt_driver);
++}
++
++module_init(init_ltq_wdt);
++module_exit(exit_ltq_wdt);
++
++module_param(nowayout, int, 0);
++MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started");
++
++MODULE_AUTHOR("John Crispin <blogic@openwrt.org>");
++MODULE_DESCRIPTION("Lantiq SoC Watchdog");
++MODULE_LICENSE("GPL");
++MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
diff --git a/target/linux/lantiq/patches-2.6.32/0014-fix_mtd.patch b/target/linux/lantiq/patches-2.6.32/0014-fix_mtd.patch
new file mode 100644 (file)
index 0000000..051ba86
--- /dev/null
@@ -0,0 +1,32 @@
+--- a/arch/mips/lantiq/xway/mach-easy50601.c
++++ b/arch/mips/lantiq/xway/mach-easy50601.c
+@@ -32,12 +32,7 @@
+       {
+               .name   = "linux",
+               .offset = 0x20000,
+-              .size   = 0xE0000,
+-      },
+-      {
+-              .name   = "rootfs",
+-              .offset = 0x100000,
+-              .size   = 0x300000,
++              .size   = 0x3d0000,
+       },
+ };
+--- a/arch/mips/lantiq/xway/mach-easy50712.c
++++ b/arch/mips/lantiq/xway/mach-easy50712.c
+@@ -34,12 +34,7 @@
+       {
+               .name   = "linux",
+               .offset = 0x20000,
+-              .size   = 0xe0000,
+-      },
+-      {
+-              .name   = "rootfs",
+-              .offset = 0x100000,
+-              .size   = 0x300000,
++              .size   = 0x3d0000,
+       },
+ };
diff --git a/target/linux/lantiq/patches-2.6.32/100-falcon_header.patch b/target/linux/lantiq/patches-2.6.32/100-falcon_header.patch
new file mode 100644 (file)
index 0000000..f4da9ef
--- /dev/null
@@ -0,0 +1,13992 @@
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/falcon/falcon_irq.h
+@@ -0,0 +1,277 @@
++/*
++ *   This program is free software; you can redistribute it and/or modify
++ *   it under the terms of the GNU General Public License as published by
++ *   the Free Software Foundation; either version 2 of the License, or
++ *   (at your option) any later version.
++ *
++ *   This program is distributed in the hope that it will be useful,
++ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
++ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++ *   GNU General Public License for more details.
++ *
++ *   You should have received a copy of the GNU General Public License
++ *   along with this program; if not, write to the Free Software
++ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
++ *
++ *   Copyright (C) 2010 Lantiq
++ */
++#ifndef _FALCON_IRQ__
++#define _FALCON_IRQ__
++
++#define INT_NUM_IRQ0                  8
++#define INT_NUM_IM0_IRL0              (INT_NUM_IRQ0 + 0)
++#define INT_NUM_IM1_IRL0              (INT_NUM_IM0_IRL0 + 32)
++#define INT_NUM_IM2_IRL0              (INT_NUM_IM1_IRL0 + 32)
++#define INT_NUM_IM3_IRL0              (INT_NUM_IM2_IRL0 + 32)
++#define INT_NUM_IM4_IRL0              (INT_NUM_IM3_IRL0 + 32)
++#define INT_NUM_EXTRA_START           (INT_NUM_IM4_IRL0 + 32)
++#define INT_NUM_IM_OFFSET             (INT_NUM_IM1_IRL0 - INT_NUM_IM0_IRL0)
++
++#define MIPS_CPU_TIMER_IRQ                    7
++
++/* HOST IF Event Interrupt */
++#define FALCON_IRQ_HOST                               (INT_NUM_IM0_IRL0 + 0)
++/* HOST IF Mailbox0 Receive Interrupt */
++#define FALCON_IRQ_HOST_MB0_RX                        (INT_NUM_IM0_IRL0 + 1)
++/* HOST IF Mailbox0 Transmit Interrupt */
++#define FALCON_IRQ_HOST_MB0_TX                        (INT_NUM_IM0_IRL0 + 2)
++/* HOST IF Mailbox1 Receive Interrupt */
++#define FALCON_IRQ_HOST_MB1_RX                        (INT_NUM_IM0_IRL0 + 3)
++/* HOST IF Mailbox1 Transmit Interrupt */
++#define FALCON_IRQ_HOST_MB1_TX                        (INT_NUM_IM0_IRL0 + 4)
++/* I2C Last Single Data Transfer Request */
++#define FALCON_IRQ_I2C_LSREQ                  (INT_NUM_IM0_IRL0 + 8)
++/* I2C Single Data Transfer Request */
++#define FALCON_IRQ_I2C_SREQ                   (INT_NUM_IM0_IRL0 + 9)
++/* I2C Last Burst Data Transfer Request */
++#define FALCON_IRQ_I2C_LBREQ                  (INT_NUM_IM0_IRL0 + 10)
++/* I2C Burst Data Transfer Request */
++#define FALCON_IRQ_I2C_BREQ                   (INT_NUM_IM0_IRL0 + 11)
++/* I2C Error Interrupt */
++#define FALCON_IRQ_I2C_I2C_ERR                        (INT_NUM_IM0_IRL0 + 12)
++/* I2C Protocol Interrupt */
++#define FALCON_IRQ_I2C_I2C_P                  (INT_NUM_IM0_IRL0 + 13)
++/* SSC Transmit Interrupt */
++#define FALCON_IRQ_SSC_T                      (INT_NUM_IM0_IRL0 + 14)
++/* SSC Receive Interrupt */
++#define FALCON_IRQ_SSC_R                      (INT_NUM_IM0_IRL0 + 15)
++/* SSC Error Interrupt */
++#define FALCON_IRQ_SSC_E                      (INT_NUM_IM0_IRL0 + 16)
++/* SSC Frame Interrupt */
++#define FALCON_IRQ_SSC_F                      (INT_NUM_IM0_IRL0 + 17)
++/* Advanced Encryption Standard Interrupt */
++#define FALCON_IRQ_AES_AES                    (INT_NUM_IM0_IRL0 + 27)
++/* Secure Hash Algorithm Interrupt */
++#define FALCON_IRQ_SHA_HASH                   (INT_NUM_IM0_IRL0 + 28)
++/* PCM Receive Interrupt */
++#define FALCON_IRQ_PCM_RX                     (INT_NUM_IM0_IRL0 + 29)
++/* PCM Transmit Interrupt */
++#define FALCON_IRQ_PCM_TX                     (INT_NUM_IM0_IRL0 + 30)
++/* PCM Transmit Crash Interrupt */
++#define FALCON_IRQ_PCM_HW2_CRASH              (INT_NUM_IM0_IRL0 + 31)
++
++/* EBU Serial Flash Command Error */
++#define FALCON_IRQ_EBU_SF_CMDERR              (INT_NUM_IM1_IRL0 + 0)
++/* EBU Serial Flash Command Overwrite Error */
++#define FALCON_IRQ_EBU_SF_COVERR              (INT_NUM_IM1_IRL0 + 1)
++/* EBU Serial Flash Busy */
++#define FALCON_IRQ_EBU_SF_BUSY                        (INT_NUM_IM1_IRL0 + 2)
++/* External Interrupt from GPIO P0 */
++#define FALCON_IRQ_GPIO_P0                    (INT_NUM_IM1_IRL0 + 4)
++/* External Interrupt from GPIO P1 */
++#define FALCON_IRQ_GPIO_P1                    (INT_NUM_IM1_IRL0 + 5)
++/* External Interrupt from GPIO P2 */
++#define FALCON_IRQ_GPIO_P2                    (INT_NUM_IM1_IRL0 + 6)
++/* External Interrupt from GPIO P3 */
++#define FALCON_IRQ_GPIO_P3                    (INT_NUM_IM1_IRL0 + 7)
++/* External Interrupt from GPIO P4 */
++#define FALCON_IRQ_GPIO_P4                    (INT_NUM_IM1_IRL0 + 8)
++/* 8kHz backup interrupt derived from core-PLL */
++#define FALCON_IRQ_FSC_BKP                    (INT_NUM_IM1_IRL0 + 10)
++/* FSC Timer Interrupt 0 */
++#define FALCON_IRQ_FSCT_CMP0                  (INT_NUM_IM1_IRL0 + 11)
++/* FSC Timer Interrupt 1 */
++#define FALCON_IRQ_FSCT_CMP1                  (INT_NUM_IM1_IRL0 + 12)
++/* 8kHz root interrupt derived from GPON interface */
++#define FALCON_IRQ_FSC_ROOT                   (INT_NUM_IM1_IRL0 + 13)
++/* Time of Day */
++#define FALCON_IRQ_TOD                                (INT_NUM_IM1_IRL0 + 14)
++/* PMA Interrupt from IntNode of the 200MHz Domain */
++#define FALCON_IRQ_PMA_200M                   (INT_NUM_IM1_IRL0 + 15)
++/* PMA Interrupt from IntNode of the TX Clk Domain */
++#define FALCON_IRQ_PMA_TX                     (INT_NUM_IM1_IRL0 + 16)
++/* PMA Interrupt from IntNode of the RX Clk Domain */
++#define FALCON_IRQ_PMA_RX                     (INT_NUM_IM1_IRL0 + 17)
++/* SYS1 Interrupt */
++#define FALCON_IRQ_SYS1                               (INT_NUM_IM1_IRL0 + 20)
++/* SYS GPE Interrupt */
++#define FALCON_IRQ_SYS_GPE                    (INT_NUM_IM1_IRL0 + 21)
++/* Watchdog Access Error Interrupt */
++#define FALCON_IRQ_WDT_AEIR                   (INT_NUM_IM1_IRL0 + 24)
++/* Watchdog Prewarning Interrupt */
++#define FALCON_IRQ_WDT_PIR                    (INT_NUM_IM1_IRL0 + 25)
++/* SBIU interrupt */
++#define FALCON_IRQ_SBIU0                      (INT_NUM_IM1_IRL0 + 27)
++/* FPI Bus Control Unit Interrupt */
++#define FALCON_IRQ_BCU0                               (INT_NUM_IM1_IRL0 + 29)
++/* DDR Controller Interrupt */
++#define FALCON_IRQ_DDR                                (INT_NUM_IM1_IRL0 + 30)
++/* Crossbar Error Interrupt */
++#define FALCON_IRQ_XBAR_ERROR                 (INT_NUM_IM1_IRL0 + 31)
++
++/* ICTRLL 0 Interrupt */
++#define FALCON_IRQ_ICTRLL0                    (INT_NUM_IM2_IRL0 + 0)
++/* ICTRLL 1 Interrupt */
++#define FALCON_IRQ_ICTRLL1                    (INT_NUM_IM2_IRL0 + 1)
++/* ICTRLL 2 Interrupt */
++#define FALCON_IRQ_ICTRLL2                    (INT_NUM_IM2_IRL0 + 2)
++/* ICTRLL 3 Interrupt */
++#define FALCON_IRQ_ICTRLL3                    (INT_NUM_IM2_IRL0 + 3)
++/* OCTRLL 0 Interrupt */
++#define FALCON_IRQ_OCTRLL0                    (INT_NUM_IM2_IRL0 + 4)
++/* OCTRLL 1 Interrupt */
++#define FALCON_IRQ_OCTRLL1                    (INT_NUM_IM2_IRL0 + 5)
++/* OCTRLL 2 Interrupt */
++#define FALCON_IRQ_OCTRLL2                    (INT_NUM_IM2_IRL0 + 6)
++/* OCTRLL 3 Interrupt */
++#define FALCON_IRQ_OCTRLL3                    (INT_NUM_IM2_IRL0 + 7)
++/* OCTRLG Interrupt */
++#define FALCON_IRQ_OCTRLG                     (INT_NUM_IM2_IRL0 + 9)
++/* IQM Interrupt */
++#define FALCON_IRQ_IQM                                (INT_NUM_IM2_IRL0 + 10)
++/* FSQM Interrupt */
++#define FALCON_IRQ_FSQM                               (INT_NUM_IM2_IRL0 + 11)
++/* TMU Interrupt */
++#define FALCON_IRQ_TMU                                (INT_NUM_IM2_IRL0 + 12)
++/* LINK1 Interrupt */
++#define FALCON_IRQ_LINK1                      (INT_NUM_IM2_IRL0 + 14)
++/* ICTRLC 0 Interrupt */
++#define FALCON_IRQ_ICTRLC0                    (INT_NUM_IM2_IRL0 + 16)
++/* ICTRLC 1 Interrupt */
++#define FALCON_IRQ_ICTRLC1                    (INT_NUM_IM2_IRL0 + 17)
++/* OCTRLC Interrupt */
++#define FALCON_IRQ_OCTRLC                     (INT_NUM_IM2_IRL0 + 18)
++/* CONFIG Break Interrupt */
++#define FALCON_IRQ_CONFIG_BREAK                       (INT_NUM_IM2_IRL0 + 19)
++/* CONFIG Interrupt */
++#define FALCON_IRQ_CONFIG                     (INT_NUM_IM2_IRL0 + 20)
++/* Dispatcher Interrupt */
++#define FALCON_IRQ_DISP                               (INT_NUM_IM2_IRL0 + 21)
++/* TBM Interrupt */
++#define FALCON_IRQ_TBM                                (INT_NUM_IM2_IRL0 + 22)
++/* GTC Downstream Interrupt */
++#define FALCON_IRQ_GTC_DS                     (INT_NUM_IM2_IRL0 + 29)
++/* GTC Upstream Interrupt */
++#define FALCON_IRQ_GTC_US                     (INT_NUM_IM2_IRL0 + 30)
++/* EIM Interrupt */
++#define FALCON_IRQ_EIM                                (INT_NUM_IM2_IRL0 + 31)
++
++/* ASC0 Transmit Interrupt */
++#define FALCON_IRQ_ASC0_T                     (INT_NUM_IM3_IRL0 + 0)
++/* ASC0 Receive Interrupt */
++#define FALCON_IRQ_ASC0_R                     (INT_NUM_IM3_IRL0 + 1)
++/* ASC0 Error Interrupt */
++#define FALCON_IRQ_ASC0_E                     (INT_NUM_IM3_IRL0 + 2)
++/* ASC0 Transmit Buffer Interrupt */
++#define FALCON_IRQ_ASC0_TB                    (INT_NUM_IM3_IRL0 + 3)
++/* ASC0 Autobaud Start Interrupt */
++#define FALCON_IRQ_ASC0_ABST                  (INT_NUM_IM3_IRL0 + 4)
++/* ASC0 Autobaud Detection Interrupt */
++#define FALCON_IRQ_ASC0_ABDET                 (INT_NUM_IM3_IRL0 + 5)
++/* ASC1 Modem Status Interrupt */
++#define FALCON_IRQ_ASC0_MS                    (INT_NUM_IM3_IRL0 + 6)
++/* ASC0 Soft Flow Control Interrupt */
++#define FALCON_IRQ_ASC0_SFC                   (INT_NUM_IM3_IRL0 + 7)
++/* ASC1 Transmit Interrupt */
++#define FALCON_IRQ_ASC1_T                     (INT_NUM_IM3_IRL0 + 8)
++/* ASC1 Receive Interrupt */
++#define FALCON_IRQ_ASC1_R                     (INT_NUM_IM3_IRL0 + 9)
++/* ASC1 Error Interrupt */
++#define FALCON_IRQ_ASC1_E                     (INT_NUM_IM3_IRL0 + 10)
++/* ASC1 Transmit Buffer Interrupt */
++#define FALCON_IRQ_ASC1_TB                    (INT_NUM_IM3_IRL0 + 11)
++/* ASC1 Autobaud Start Interrupt */
++#define FALCON_IRQ_ASC1_ABST                  (INT_NUM_IM3_IRL0 + 12)
++/* ASC1 Autobaud Detection Interrupt */
++#define FALCON_IRQ_ASC1_ABDET                 (INT_NUM_IM3_IRL0 + 13)
++/* ASC1 Modem Status Interrupt */
++#define FALCON_IRQ_ASC1_MS                    (INT_NUM_IM3_IRL0 + 14)
++/* ASC1 Soft Flow Control Interrupt */
++#define FALCON_IRQ_ASC1_SFC                   (INT_NUM_IM3_IRL0 + 15)
++/* GPTC Timer/Counter 1A Interrupt */
++#define FALCON_IRQ_GPTC_TC1A                  (INT_NUM_IM3_IRL0 + 16)
++/* GPTC Timer/Counter 1B Interrupt */
++#define FALCON_IRQ_GPTC_TC1B                  (INT_NUM_IM3_IRL0 + 17)
++/* GPTC Timer/Counter 2A Interrupt */
++#define FALCON_IRQ_GPTC_TC2A                  (INT_NUM_IM3_IRL0 + 18)
++/* GPTC Timer/Counter 2B Interrupt */
++#define FALCON_IRQ_GPTC_TC2B                  (INT_NUM_IM3_IRL0 + 19)
++/* GPTC Timer/Counter 3A Interrupt */
++#define FALCON_IRQ_GPTC_TC3A                  (INT_NUM_IM3_IRL0 + 20)
++/* GPTC Timer/Counter 3B Interrupt */
++#define FALCON_IRQ_GPTC_TC3B                  (INT_NUM_IM3_IRL0 + 21)
++/* DFEV0, Channel 1 Transmit Interrupt */
++#define FALCON_IRQ_DFEV0_2TX                  (INT_NUM_IM3_IRL0 + 26)
++/* DFEV0, Channel 1 Receive Interrupt */
++#define FALCON_IRQ_DFEV0_2RX                  (INT_NUM_IM3_IRL0 + 27)
++/* DFEV0, Channel 1 General Purpose Interrupt */
++#define FALCON_IRQ_DFEV0_2GP                  (INT_NUM_IM3_IRL0 + 28)
++/* DFEV0, Channel 0 Transmit Interrupt */
++#define FALCON_IRQ_DFEV0_1TX                  (INT_NUM_IM3_IRL0 + 29)
++/* DFEV0, Channel 0 Receive Interrupt */
++#define FALCON_IRQ_DFEV0_1RX                  (INT_NUM_IM3_IRL0 + 30)
++/* DFEV0, Channel 0 General Purpose Interrupt */
++#define FALCON_IRQ_DFEV0_1GP                  (INT_NUM_IM3_IRL0 + 31)
++
++/* ICTRLL 0 Error */
++#define FALCON_IRQ_ICTRLL0_ERR                        (INT_NUM_IM4_IRL0 + 0)
++/* ICTRLL 1 Error */
++#define FALCON_IRQ_ICTRLL1_ERR                        (INT_NUM_IM4_IRL0 + 1)
++/* ICTRLL 2 Error */
++#define FALCON_IRQ_ICTRLL2_ERR                        (INT_NUM_IM4_IRL0 + 2)
++/* ICTRLL 3 Error */
++#define FALCON_IRQ_ICTRLL3_ERR                        (INT_NUM_IM4_IRL0 + 3)
++/* OCTRLL 0 Error */
++#define FALCON_IRQ_OCTRLL0_ERR                        (INT_NUM_IM4_IRL0 + 4)
++/* OCTRLL 1 Error */
++#define FALCON_IRQ_OCTRLL1_ERR                        (INT_NUM_IM4_IRL0 + 5)
++/* OCTRLL 2 Error */
++#define FALCON_IRQ_OCTRLL2_ERR                        (INT_NUM_IM4_IRL0 + 6)
++/* OCTRLL 3 Error */
++#define FALCON_IRQ_OCTRLL3_ERR                        (INT_NUM_IM4_IRL0 + 7)
++/* ICTRLG Error */
++#define FALCON_IRQ_ICTRLG_ERR                 (INT_NUM_IM4_IRL0 + 8)
++/* OCTRLG Error */
++#define FALCON_IRQ_OCTRLG_ERR                 (INT_NUM_IM4_IRL0 + 9)
++/* IQM Error */
++#define FALCON_IRQ_IQM_ERR                    (INT_NUM_IM4_IRL0 + 10)
++/* FSQM Error */
++#define FALCON_IRQ_FSQM_ERR                   (INT_NUM_IM4_IRL0 + 11)
++/* TMU Error */
++#define FALCON_IRQ_TMU_ERR                    (INT_NUM_IM4_IRL0 + 12)
++/* MPS Status Interrupt #0 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR0                    (INT_NUM_IM4_IRL0 + 14)
++/* MPS Status Interrupt #1 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR1                    (INT_NUM_IM4_IRL0 + 15)
++/* MPS Status Interrupt #2 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR2                    (INT_NUM_IM4_IRL0 + 16)
++/* MPS Status Interrupt #3 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR3                    (INT_NUM_IM4_IRL0 + 17)
++/* MPS Status Interrupt #4 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR4                    (INT_NUM_IM4_IRL0 + 18)
++/* MPS Status Interrupt #5 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR5                    (INT_NUM_IM4_IRL0 + 19)
++/* MPS Status Interrupt #6 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR6                    (INT_NUM_IM4_IRL0 + 20)
++/* MPS Status Interrupt #7 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR7                    (INT_NUM_IM4_IRL0 + 21)
++/* MPS Status Interrupt #8 (VPE1 to VPE0) */
++#define FALCON_IRQ_MPS_IR8                    (INT_NUM_IM4_IRL0 + 22)
++/* VPE0 Exception Level Flag Interrupt */
++#define FALCON_IRQ_VPE0_EXL                   (INT_NUM_IM4_IRL0 + 29)
++/* VPE0 Error Level Flag Interrupt */
++#define FALCON_IRQ_VPE0_ERL                   (INT_NUM_IM4_IRL0 + 30)
++/* VPE0 Performance Monitoring Counter Interrupt */
++#define FALCON_IRQ_VPE0_PMCIR                 (INT_NUM_IM4_IRL0 + 31)
++
++#endif /* _FALCON_IRQ__ */
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/falcon/gpon_reg_base.h
+@@ -0,0 +1,376 @@
++/******************************************************************************
++
++                               Copyright (c) 2010
++                            Lantiq Deutschland GmbH
++
++  For licensing information, see the file 'LICENSE' in the root folder of
++  this software module.
++
++******************************************************************************/
++
++#ifndef _gpon_reg_base_h
++#define _gpon_reg_base_h
++
++/** \addtogroup GPON_BASE
++   @{
++*/
++
++#ifndef KSEG1
++#define KSEG1 0xA0000000
++#endif
++
++/** address range for ebu
++    0x18000000--0x180000FF */
++#define GPON_EBU_BASE         (KSEG1 | 0x18000000)
++#define GPON_EBU_END          (KSEG1 | 0x180000FF)
++#define GPON_EBU_SIZE         0x00000100
++/** address range for gpearb
++    0x1D400100--0x1D4001FF */
++#define GPON_GPEARB_BASE              (KSEG1 | 0x1D400100)
++#define GPON_GPEARB_END               (KSEG1 | 0x1D4001FF)
++#define GPON_GPEARB_SIZE              0x00000100
++/** address range for tmu
++    0x1D404000--0x1D404FFF */
++#define GPON_TMU_BASE         (KSEG1 | 0x1D404000)
++#define GPON_TMU_END          (KSEG1 | 0x1D404FFF)
++#define GPON_TMU_SIZE         0x00001000
++/** address range for iqm
++    0x1D410000--0x1D41FFFF */
++#define GPON_IQM_BASE         (KSEG1 | 0x1D410000)
++#define GPON_IQM_END          (KSEG1 | 0x1D41FFFF)
++#define GPON_IQM_SIZE         0x00010000
++/** address range for octrlg
++    0x1D420000--0x1D42FFFF */
++#define GPON_OCTRLG_BASE              (KSEG1 | 0x1D420000)
++#define GPON_OCTRLG_END               (KSEG1 | 0x1D42FFFF)
++#define GPON_OCTRLG_SIZE              0x00010000
++/** address range for octrll0
++    0x1D440000--0x1D4400FF */
++#define GPON_OCTRLL0_BASE             (KSEG1 | 0x1D440000)
++#define GPON_OCTRLL0_END              (KSEG1 | 0x1D4400FF)
++#define GPON_OCTRLL0_SIZE             0x00000100
++/** address range for octrll1
++    0x1D440100--0x1D4401FF */
++#define GPON_OCTRLL1_BASE             (KSEG1 | 0x1D440100)
++#define GPON_OCTRLL1_END              (KSEG1 | 0x1D4401FF)
++#define GPON_OCTRLL1_SIZE             0x00000100
++/** address range for octrll2
++    0x1D440200--0x1D4402FF */
++#define GPON_OCTRLL2_BASE             (KSEG1 | 0x1D440200)
++#define GPON_OCTRLL2_END              (KSEG1 | 0x1D4402FF)
++#define GPON_OCTRLL2_SIZE             0x00000100
++/** address range for octrll3
++    0x1D440300--0x1D4403FF */
++#define GPON_OCTRLL3_BASE             (KSEG1 | 0x1D440300)
++#define GPON_OCTRLL3_END              (KSEG1 | 0x1D4403FF)
++#define GPON_OCTRLL3_SIZE             0x00000100
++/** address range for octrlc
++    0x1D441000--0x1D4410FF */
++#define GPON_OCTRLC_BASE              (KSEG1 | 0x1D441000)
++#define GPON_OCTRLC_END               (KSEG1 | 0x1D4410FF)
++#define GPON_OCTRLC_SIZE              0x00000100
++/** address range for ictrlg
++    0x1D450000--0x1D45FFFF */
++#define GPON_ICTRLG_BASE              (KSEG1 | 0x1D450000)
++#define GPON_ICTRLG_END               (KSEG1 | 0x1D45FFFF)
++#define GPON_ICTRLG_SIZE              0x00010000
++/** address range for ictrll0
++    0x1D460000--0x1D4601FF */
++#define GPON_ICTRLL0_BASE             (KSEG1 | 0x1D460000)
++#define GPON_ICTRLL0_END              (KSEG1 | 0x1D4601FF)
++#define GPON_ICTRLL0_SIZE             0x00000200
++/** address range for ictrll1
++    0x1D460200--0x1D4603FF */
++#define GPON_ICTRLL1_BASE             (KSEG1 | 0x1D460200)
++#define GPON_ICTRLL1_END              (KSEG1 | 0x1D4603FF)
++#define GPON_ICTRLL1_SIZE             0x00000200
++/** address range for ictrll2
++    0x1D460400--0x1D4605FF */
++#define GPON_ICTRLL2_BASE             (KSEG1 | 0x1D460400)
++#define GPON_ICTRLL2_END              (KSEG1 | 0x1D4605FF)
++#define GPON_ICTRLL2_SIZE             0x00000200
++/** address range for ictrll3
++    0x1D460600--0x1D4607FF */
++#define GPON_ICTRLL3_BASE             (KSEG1 | 0x1D460600)
++#define GPON_ICTRLL3_END              (KSEG1 | 0x1D4607FF)
++#define GPON_ICTRLL3_SIZE             0x00000200
++/** address range for ictrlc0
++    0x1D461000--0x1D4610FF */
++#define GPON_ICTRLC0_BASE             (KSEG1 | 0x1D461000)
++#define GPON_ICTRLC0_END              (KSEG1 | 0x1D4610FF)
++#define GPON_ICTRLC0_SIZE             0x00000100
++/** address range for ictrlc1
++    0x1D461100--0x1D4611FF */
++#define GPON_ICTRLC1_BASE             (KSEG1 | 0x1D461100)
++#define GPON_ICTRLC1_END              (KSEG1 | 0x1D4611FF)
++#define GPON_ICTRLC1_SIZE             0x00000100
++/** address range for fsqm
++    0x1D500000--0x1D5FFFFF */
++#define GPON_FSQM_BASE                (KSEG1 | 0x1D500000)
++#define GPON_FSQM_END         (KSEG1 | 0x1D5FFFFF)
++#define GPON_FSQM_SIZE                0x00100000
++/** address range for pctrl
++    0x1D600000--0x1D6001FF */
++#define GPON_PCTRL_BASE               (KSEG1 | 0x1D600000)
++#define GPON_PCTRL_END                (KSEG1 | 0x1D6001FF)
++#define GPON_PCTRL_SIZE               0x00000200
++/** address range for link0
++    0x1D600200--0x1D6002FF */
++#define GPON_LINK0_BASE               (KSEG1 | 0x1D600200)
++#define GPON_LINK0_END                (KSEG1 | 0x1D6002FF)
++#define GPON_LINK0_SIZE               0x00000100
++/** address range for link1
++    0x1D600300--0x1D6003FF */
++#define GPON_LINK1_BASE               (KSEG1 | 0x1D600300)
++#define GPON_LINK1_END                (KSEG1 | 0x1D6003FF)
++#define GPON_LINK1_SIZE               0x00000100
++/** address range for link2
++    0x1D600400--0x1D6004FF */
++#define GPON_LINK2_BASE               (KSEG1 | 0x1D600400)
++#define GPON_LINK2_END                (KSEG1 | 0x1D6004FF)
++#define GPON_LINK2_SIZE               0x00000100
++/** address range for disp
++    0x1D600500--0x1D6005FF */
++#define GPON_DISP_BASE                (KSEG1 | 0x1D600500)
++#define GPON_DISP_END         (KSEG1 | 0x1D6005FF)
++#define GPON_DISP_SIZE                0x00000100
++/** address range for merge
++    0x1D600600--0x1D6006FF */
++#define GPON_MERGE_BASE               (KSEG1 | 0x1D600600)
++#define GPON_MERGE_END                (KSEG1 | 0x1D6006FF)
++#define GPON_MERGE_SIZE               0x00000100
++/** address range for tbm
++    0x1D600700--0x1D6007FF */
++#define GPON_TBM_BASE         (KSEG1 | 0x1D600700)
++#define GPON_TBM_END          (KSEG1 | 0x1D6007FF)
++#define GPON_TBM_SIZE         0x00000100
++/** address range for pe0
++    0x1D610000--0x1D61FFFF */
++#define GPON_PE0_BASE         (KSEG1 | 0x1D610000)
++#define GPON_PE0_END          (KSEG1 | 0x1D61FFFF)
++#define GPON_PE0_SIZE         0x00010000
++/** address range for pe1
++    0x1D620000--0x1D62FFFF */
++#define GPON_PE1_BASE         (KSEG1 | 0x1D620000)
++#define GPON_PE1_END          (KSEG1 | 0x1D62FFFF)
++#define GPON_PE1_SIZE         0x00010000
++/** address range for pe2
++    0x1D630000--0x1D63FFFF */
++#define GPON_PE2_BASE         (KSEG1 | 0x1D630000)
++#define GPON_PE2_END          (KSEG1 | 0x1D63FFFF)
++#define GPON_PE2_SIZE         0x00010000
++/** address range for pe3
++    0x1D640000--0x1D64FFFF */
++#define GPON_PE3_BASE         (KSEG1 | 0x1D640000)
++#define GPON_PE3_END          (KSEG1 | 0x1D64FFFF)
++#define GPON_PE3_SIZE         0x00010000
++/** address range for pe4
++    0x1D650000--0x1D65FFFF */
++#define GPON_PE4_BASE         (KSEG1 | 0x1D650000)
++#define GPON_PE4_END          (KSEG1 | 0x1D65FFFF)
++#define GPON_PE4_SIZE         0x00010000
++/** address range for pe5
++    0x1D660000--0x1D66FFFF */
++#define GPON_PE5_BASE         (KSEG1 | 0x1D660000)
++#define GPON_PE5_END          (KSEG1 | 0x1D66FFFF)
++#define GPON_PE5_SIZE         0x00010000
++/** address range for sys_gpe
++    0x1D700000--0x1D7000FF */
++#define GPON_SYS_GPE_BASE             (KSEG1 | 0x1D700000)
++#define GPON_SYS_GPE_END              (KSEG1 | 0x1D7000FF)
++#define GPON_SYS_GPE_SIZE             0x00000100
++/** address range for eim
++    0x1D800000--0x1D800FFF */
++#define GPON_EIM_BASE         (KSEG1 | 0x1D800000)
++#define GPON_EIM_END          (KSEG1 | 0x1D800FFF)
++#define GPON_EIM_SIZE         0x00001000
++/** address range for sxgmii
++    0x1D808800--0x1D8088FF */
++#define GPON_SXGMII_BASE              (KSEG1 | 0x1D808800)
++#define GPON_SXGMII_END               (KSEG1 | 0x1D8088FF)
++#define GPON_SXGMII_SIZE              0x00000100
++/** address range for sgmii
++    0x1D808C00--0x1D808CFF */
++#define GPON_SGMII_BASE               (KSEG1 | 0x1D808C00)
++#define GPON_SGMII_END                (KSEG1 | 0x1D808CFF)
++#define GPON_SGMII_SIZE               0x00000100
++/** address range for gpio0
++    0x1D810000--0x1D81007F */
++#define GPON_GPIO0_BASE               (KSEG1 | 0x1D810000)
++#define GPON_GPIO0_END                (KSEG1 | 0x1D81007F)
++#define GPON_GPIO0_SIZE               0x00000080
++/** address range for gpio2
++    0x1D810100--0x1D81017F */
++#define GPON_GPIO2_BASE               (KSEG1 | 0x1D810100)
++#define GPON_GPIO2_END                (KSEG1 | 0x1D81017F)
++#define GPON_GPIO2_SIZE               0x00000080
++/** address range for sys_eth
++    0x1DB00000--0x1DB000FF */
++#define GPON_SYS_ETH_BASE             (KSEG1 | 0x1DB00000)
++#define GPON_SYS_ETH_END              (KSEG1 | 0x1DB000FF)
++#define GPON_SYS_ETH_SIZE             0x00000100
++/** address range for padctrl0
++    0x1DB01000--0x1DB010FF */
++#define GPON_PADCTRL0_BASE            (KSEG1 | 0x1DB01000)
++#define GPON_PADCTRL0_END             (KSEG1 | 0x1DB010FF)
++#define GPON_PADCTRL0_SIZE            0x00000100
++/** address range for padctrl2
++    0x1DB02000--0x1DB020FF */
++#define GPON_PADCTRL2_BASE            (KSEG1 | 0x1DB02000)
++#define GPON_PADCTRL2_END             (KSEG1 | 0x1DB020FF)
++#define GPON_PADCTRL2_SIZE            0x00000100
++/** address range for gtc
++    0x1DC05000--0x1DC052D4 */
++#define GPON_GTC_BASE         (KSEG1 | 0x1DC05000)
++#define GPON_GTC_END          (KSEG1 | 0x1DC052D4)
++#define GPON_GTC_SIZE         0x000002D5
++/** address range for pma
++    0x1DD00000--0x1DD003FF */
++#define GPON_PMA_BASE         (KSEG1 | 0x1DD00000)
++#define GPON_PMA_END          (KSEG1 | 0x1DD003FF)
++#define GPON_PMA_SIZE         0x00000400
++/** address range for fcsic
++    0x1DD00600--0x1DD0061F */
++#define GPON_FCSIC_BASE               (KSEG1 | 0x1DD00600)
++#define GPON_FCSIC_END                (KSEG1 | 0x1DD0061F)
++#define GPON_FCSIC_SIZE               0x00000020
++/** address range for pma_int200
++    0x1DD00700--0x1DD0070F */
++#define GPON_PMA_INT200_BASE          (KSEG1 | 0x1DD00700)
++#define GPON_PMA_INT200_END           (KSEG1 | 0x1DD0070F)
++#define GPON_PMA_INT200_SIZE          0x00000010
++/** address range for pma_inttx
++    0x1DD00720--0x1DD0072F */
++#define GPON_PMA_INTTX_BASE           (KSEG1 | 0x1DD00720)
++#define GPON_PMA_INTTX_END            (KSEG1 | 0x1DD0072F)
++#define GPON_PMA_INTTX_SIZE           0x00000010
++/** address range for pma_intrx
++    0x1DD00740--0x1DD0074F */
++#define GPON_PMA_INTRX_BASE           (KSEG1 | 0x1DD00740)
++#define GPON_PMA_INTRX_END            (KSEG1 | 0x1DD0074F)
++#define GPON_PMA_INTRX_SIZE           0x00000010
++/** address range for gtc_pma
++    0x1DEFFF00--0x1DEFFFFF */
++#define GPON_GTC_PMA_BASE             (KSEG1 | 0x1DEFFF00)
++#define GPON_GTC_PMA_END              (KSEG1 | 0x1DEFFFFF)
++#define GPON_GTC_PMA_SIZE             0x00000100
++/** address range for sys
++    0x1DF00000--0x1DF000FF */
++#define GPON_SYS_BASE         (KSEG1 | 0x1DF00000)
++#define GPON_SYS_END          (KSEG1 | 0x1DF000FF)
++#define GPON_SYS_SIZE         0x00000100
++/** address range for asc1
++    0x1E100B00--0x1E100BFF */
++#define GPON_ASC1_BASE                (KSEG1 | 0x1E100B00)
++#define GPON_ASC1_END         (KSEG1 | 0x1E100BFF)
++#define GPON_ASC1_SIZE                0x00000100
++/** address range for asc0
++    0x1E100C00--0x1E100CFF */
++#define GPON_ASC0_BASE                (KSEG1 | 0x1E100C00)
++#define GPON_ASC0_END         (KSEG1 | 0x1E100CFF)
++#define GPON_ASC0_SIZE                0x00000100
++/** address range for i2c
++    0x1E200000--0x1E20FFFF */
++#define GPON_I2C_BASE         (KSEG1 | 0x1E200000)
++#define GPON_I2C_END          (KSEG1 | 0x1E20FFFF)
++#define GPON_I2C_SIZE         0x00010000
++/** address range for gpio1
++    0x1E800100--0x1E80017F */
++#define GPON_GPIO1_BASE               (KSEG1 | 0x1E800100)
++#define GPON_GPIO1_END                (KSEG1 | 0x1E80017F)
++#define GPON_GPIO1_SIZE               0x00000080
++/** address range for gpio3
++    0x1E800200--0x1E80027F */
++#define GPON_GPIO3_BASE               (KSEG1 | 0x1E800200)
++#define GPON_GPIO3_END                (KSEG1 | 0x1E80027F)
++#define GPON_GPIO3_SIZE               0x00000080
++/** address range for gpio4
++    0x1E800300--0x1E80037F */
++#define GPON_GPIO4_BASE               (KSEG1 | 0x1E800300)
++#define GPON_GPIO4_END                (KSEG1 | 0x1E80037F)
++#define GPON_GPIO4_SIZE               0x00000080
++/** address range for padctrl1
++    0x1E800400--0x1E8004FF */
++#define GPON_PADCTRL1_BASE            (KSEG1 | 0x1E800400)
++#define GPON_PADCTRL1_END             (KSEG1 | 0x1E8004FF)
++#define GPON_PADCTRL1_SIZE            0x00000100
++/** address range for padctrl3
++    0x1E800500--0x1E8005FF */
++#define GPON_PADCTRL3_BASE            (KSEG1 | 0x1E800500)
++#define GPON_PADCTRL3_END             (KSEG1 | 0x1E8005FF)
++#define GPON_PADCTRL3_SIZE            0x00000100
++/** address range for padctrl4
++    0x1E800600--0x1E8006FF */
++#define GPON_PADCTRL4_BASE            (KSEG1 | 0x1E800600)
++#define GPON_PADCTRL4_END             (KSEG1 | 0x1E8006FF)
++#define GPON_PADCTRL4_SIZE            0x00000100
++/** address range for status
++    0x1E802000--0x1E80207F */
++#define GPON_STATUS_BASE              (KSEG1 | 0x1E802000)
++#define GPON_STATUS_END               (KSEG1 | 0x1E80207F)
++#define GPON_STATUS_SIZE              0x00000080
++/** address range for dcdc_1v0
++    0x1E803000--0x1E8033FF */
++#define GPON_DCDC_1V0_BASE            (KSEG1 | 0x1E803000)
++#define GPON_DCDC_1V0_END             (KSEG1 | 0x1E8033FF)
++#define GPON_DCDC_1V0_SIZE            0x00000400
++/** address range for dcdc_ddr
++    0x1E804000--0x1E8043FF */
++#define GPON_DCDC_DDR_BASE            (KSEG1 | 0x1E804000)
++#define GPON_DCDC_DDR_END             (KSEG1 | 0x1E8043FF)
++#define GPON_DCDC_DDR_SIZE            0x00000400
++/** address range for dcdc_apd
++    0x1E805000--0x1E8053FF */
++#define GPON_DCDC_APD_BASE            (KSEG1 | 0x1E805000)
++#define GPON_DCDC_APD_END             (KSEG1 | 0x1E8053FF)
++#define GPON_DCDC_APD_SIZE            0x00000400
++/** address range for sys1
++    0x1EF00000--0x1EF000FF */
++#define GPON_SYS1_BASE                (KSEG1 | 0x1EF00000)
++#define GPON_SYS1_END         (KSEG1 | 0x1EF000FF)
++#define GPON_SYS1_SIZE                0x00000100
++/** address range for sbs0ctrl
++    0x1F080000--0x1F0801FF */
++#define GPON_SBS0CTRL_BASE            (KSEG1 | 0x1F080000)
++#define GPON_SBS0CTRL_END             (KSEG1 | 0x1F0801FF)
++#define GPON_SBS0CTRL_SIZE            0x00000200
++/** address range for sbs0red
++    0x1F080200--0x1F08027F */
++#define GPON_SBS0RED_BASE             (KSEG1 | 0x1F080200)
++#define GPON_SBS0RED_END              (KSEG1 | 0x1F08027F)
++#define GPON_SBS0RED_SIZE             0x00000080
++/** address range for sbs0ram
++    0x1F200000--0x1F32FFFF */
++#define GPON_SBS0RAM_BASE             (KSEG1 | 0x1F200000)
++#define GPON_SBS0RAM_END              (KSEG1 | 0x1F32FFFF)
++#define GPON_SBS0RAM_SIZE             0x00130000
++/** address range for ddrdb
++    0x1F701000--0x1F701FFF */
++#define GPON_DDRDB_BASE               (KSEG1 | 0x1F701000)
++#define GPON_DDRDB_END                (KSEG1 | 0x1F701FFF)
++#define GPON_DDRDB_SIZE               0x00001000
++/** address range for sbiu
++    0x1F880000--0x1F8800FF */
++#define GPON_SBIU_BASE                (KSEG1 | 0x1F880000)
++#define GPON_SBIU_END         (KSEG1 | 0x1F8800FF)
++#define GPON_SBIU_SIZE                0x00000100
++/** address range for icu0
++    0x1F880200--0x1F8802DF */
++#define GPON_ICU0_BASE                (KSEG1 | 0x1F880200)
++#define GPON_ICU0_END         (KSEG1 | 0x1F8802DF)
++#define GPON_ICU0_SIZE                0x000000E0
++/** address range for icu1
++    0x1F880300--0x1F8803DF */
++#define GPON_ICU1_BASE                (KSEG1 | 0x1F880300)
++#define GPON_ICU1_END         (KSEG1 | 0x1F8803DF)
++#define GPON_ICU1_SIZE                0x000000E0
++/** address range for wdt
++    0x1F8803F0--0x1F8803FF */
++#define GPON_WDT_BASE         (KSEG1 | 0x1F8803F0)
++#define GPON_WDT_END          (KSEG1 | 0x1F8803FF)
++#define GPON_WDT_SIZE         0x00000010
++
++/*! @} */ /* GPON_BASE */
++
++#endif /* _gpon_reg_base_h */
++
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/falcon/i2c_reg.h
+@@ -0,0 +1,830 @@
++/******************************************************************************
++
++                               Copyright (c) 2010
++                            Lantiq Deutschland GmbH
++
++  For licensing information, see the file 'LICENSE' in the root folder of
++  this software module.
++
++******************************************************************************/
++
++#ifndef _i2c_reg_h
++#define _i2c_reg_h
++
++/** \addtogroup I2C_REGISTER
++   @{
++*/
++/* access macros */
++#define i2c_r32(reg) reg_r32(&i2c->reg)
++#define i2c_w32(val, reg) reg_w32(val, &i2c->reg)
++#define i2c_w32_mask(clear, set, reg) reg_w32_mask(clear, set, &i2c->reg)
++#define i2c_r32_table(reg, idx) reg_r32_table(i2c->reg, idx)
++#define i2c_w32_table(val, reg, idx) reg_w32_table(val, i2c->reg, idx)
++#define i2c_w32_table_mask(clear, set, reg, idx) reg_w32_table_mask(clear, set, i2c->reg, idx)
++#define i2c_adr_table(reg, idx) adr_table(i2c->reg, idx)
++
++
++/** I2C register structure */
++struct gpon_reg_i2c
++{
++   /** I2C Kernel Clock Control Register */
++   unsigned int clc; /* 0x00000000 */
++   /** Reserved */
++   unsigned int res_0; /* 0x00000004 */
++   /** I2C Identification Register */
++   unsigned int id; /* 0x00000008 */
++   /** Reserved */
++   unsigned int res_1; /* 0x0000000C */
++   /** I2C RUN Control Register
++       This register enables and disables the I2C peripheral. Before enabling, the I2C has to be configured properly. After enabling no configuration is possible */
++   unsigned int run_ctrl; /* 0x00000010 */
++   /** I2C End Data Control Register
++       This register is used to either turn around the data transmission direction or to address another slave without sending a stop condition. Also the software can stop the slave-transmitter by sending a not-accolade when working as master-receiver or even stop data transmission immediately when operating as master-transmitter. The writing to the bits of this control register is only effective when in MASTER RECEIVES BYTES, MASTER TRANSMITS BYTES, MASTER RESTART or SLAVE RECEIVE BYTES state */
++   unsigned int endd_ctrl; /* 0x00000014 */
++   /** I2C Fractional Divider Configuration Register
++       These register is used to program the fractional divider of the I2C bus. Before the peripheral is switched on by setting the RUN-bit the two (fixed) values for the two operating frequencies are programmed into these (configuration) registers. The Register FDIV_HIGH_CFG has the same layout as I2C_FDIV_CFG. */
++   unsigned int fdiv_cfg; /* 0x00000018 */
++   /** I2C Fractional Divider (highspeed mode) Configuration Register
++       These register is used to program the fractional divider of the I2C bus. Before the peripheral is switched on by setting the RUN-bit the two (fixed) values for the two operating frequencies are programmed into these (configuration) registers. The Register FDIV_CFG has the same layout as I2C_FDIV_CFG. */
++   unsigned int fdiv_high_cfg; /* 0x0000001C */
++   /** I2C Address Configuration Register */
++   unsigned int addr_cfg; /* 0x00000020 */
++   /** I2C Bus Status Register
++       This register gives a status information of the I2C. This additional information can be used by the software to start proper actions. */
++   unsigned int bus_stat; /* 0x00000024 */
++   /** I2C FIFO Configuration Register */
++   unsigned int fifo_cfg; /* 0x00000028 */
++   /** I2C Maximum Received Packet Size Register */
++   unsigned int mrps_ctrl; /* 0x0000002C */
++   /** I2C Received Packet Size Status Register */
++   unsigned int rps_stat; /* 0x00000030 */
++   /** I2C Transmit Packet Size Register */
++   unsigned int tps_ctrl; /* 0x00000034 */
++   /** I2C Filled FIFO Stages Status Register */
++   unsigned int ffs_stat; /* 0x00000038 */
++   /** Reserved */
++   unsigned int res_2; /* 0x0000003C */
++   /** I2C Timing Configuration Register */
++   unsigned int tim_cfg; /* 0x00000040 */
++   /** Reserved */
++   unsigned int res_3[7]; /* 0x00000044 */
++   /** I2C Error Interrupt Request Source Mask Register */
++   unsigned int err_irqsm; /* 0x00000060 */
++   /** I2C Error Interrupt Request Source Status Register */
++   unsigned int err_irqss; /* 0x00000064 */
++   /** I2C Error Interrupt Request Source Clear Register */
++   unsigned int err_irqsc; /* 0x00000068 */
++   /** Reserved */
++   unsigned int res_4; /* 0x0000006C */
++   /** I2C Protocol Interrupt Request Source Mask Register */
++   unsigned int p_irqsm; /* 0x00000070 */
++   /** I2C Protocol Interrupt Request Source Status Register */
++   unsigned int p_irqss; /* 0x00000074 */
++   /** I2C Protocol Interrupt Request Source Clear Register */
++   unsigned int p_irqsc; /* 0x00000078 */
++   /** Reserved */
++   unsigned int res_5; /* 0x0000007C */
++   /** I2C Raw Interrupt Status Register */
++   unsigned int ris; /* 0x00000080 */
++   /** I2C Interrupt Mask Control Register */
++   unsigned int imsc; /* 0x00000084 */
++   /** I2C Masked Interrupt Status Register */
++   unsigned int mis; /* 0x00000088 */
++   /** I2C Interrupt Clear Register */
++   unsigned int icr; /* 0x0000008C */
++   /** I2C Interrupt Set Register */
++   unsigned int isr; /* 0x00000090 */
++   /** I2C DMA Enable Register */
++   unsigned int dmae; /* 0x00000094 */
++   /** Reserved */
++   unsigned int res_6[8154]; /* 0x00000098 */
++   /** I2C Transmit Data Register */
++   unsigned int txd; /* 0x00008000 */
++   /** Reserved */
++   unsigned int res_7[4095]; /* 0x00008004 */
++   /** I2C Receive Data Register */
++   unsigned int rxd; /* 0x0000C000 */
++   /** Reserved */
++   unsigned int res_8[4095]; /* 0x0000C004 */
++};
++
++
++/* Fields of "I2C Kernel Clock Control Register" */
++/** Clock Divider for Optional Run Mode (AHB peripherals)
++    Max 8-bit divider value. Note: As long as the new divider value ORMC is not valid, the register returns 0x0000 00xx on reading. */
++#define I2C_CLC_ORMC_MASK 0x00FF0000
++/** field offset */
++#define I2C_CLC_ORMC_OFFSET 16
++/** Clock Divider for Normal Run Mode
++    Max 8-bit divider value. IF RMC is 0 the module is disabled. Note: As long as the new divider value RMC is not valid, the register returns 0x0000 00xx on reading. */
++#define I2C_CLC_RMC_MASK 0x0000FF00
++/** field offset */
++#define I2C_CLC_RMC_OFFSET 8
++/** Fast Shut-Off Enable Bit */
++#define I2C_CLC_FSOE 0x00000020
++/* Disable
++#define I2C_CLC_FSOE_DIS 0x00000000 */
++/** Enable */
++#define I2C_CLC_FSOE_EN 0x00000020
++/** Suspend Bit Write Enable for OCDS */
++#define I2C_CLC_SBWE 0x00000010
++/* Disable
++#define I2C_CLC_SBWE_DIS 0x00000000 */
++/** Enable */
++#define I2C_CLC_SBWE_EN 0x00000010
++/** Disable External Request Disable */
++#define I2C_CLC_EDIS 0x00000008
++/* Enable
++#define I2C_CLC_EDIS_EN 0x00000000 */
++/** Disable */
++#define I2C_CLC_EDIS_DIS 0x00000008
++/** Suspend Enable Bit for OCDS */
++#define I2C_CLC_SPEN 0x00000004
++/* Disable
++#define I2C_CLC_SPEN_DIS 0x00000000 */
++/** Enable */
++#define I2C_CLC_SPEN_EN 0x00000004
++/** Disable Status Bit
++    Bit DISS can be modified only by writing to bit DISR */
++#define I2C_CLC_DISS 0x00000002
++/* Enable
++#define I2C_CLC_DISS_EN 0x00000000 */
++/** Disable */
++#define I2C_CLC_DISS_DIS 0x00000002
++/** Disable Request Bit */
++#define I2C_CLC_DISR 0x00000001
++/* Module disable not requested
++#define I2C_CLC_DISR_OFF 0x00000000 */
++/** Module disable requested */
++#define I2C_CLC_DISR_ON 0x00000001
++
++/* Fields of "I2C Identification Register" */
++/** Module ID */
++#define I2C_ID_ID_MASK 0x0000FF00
++/** field offset */
++#define I2C_ID_ID_OFFSET 8
++/** Revision */
++#define I2C_ID_REV_MASK 0x000000FF
++/** field offset */
++#define I2C_ID_REV_OFFSET 0
++
++/* Fields of "I2C RUN Control Register" */
++/** Enabling I2C Interface
++    Only when this bit is set to zero, the configuration registers of the I2C peripheral are writable by SW. */
++#define I2C_RUN_CTRL_RUN 0x00000001
++/* Disable
++#define I2C_RUN_CTRL_RUN_DIS 0x00000000 */
++/** Enable */
++#define I2C_RUN_CTRL_RUN_EN 0x00000001
++
++/* Fields of "I2C End Data Control Register" */
++/** Set End of Transmission
++    Note:Do not write '1' to this bit when bus is free. This will cause an abort after the first byte when a new transfer is started. */
++#define I2C_ENDD_CTRL_SETEND 0x00000002
++/* No-Operation
++#define I2C_ENDD_CTRL_SETEND_NOP 0x00000000 */
++/** Master Receives Bytes */
++#define I2C_ENDD_CTRL_SETEND_MRB 0x00000002
++/** Set Restart Condition */
++#define I2C_ENDD_CTRL_SETRSC 0x00000001
++/* No-Operation
++#define I2C_ENDD_CTRL_SETRSC_NOP 0x00000000 */
++/** Master Restart */
++#define I2C_ENDD_CTRL_SETRSC_RESTART 0x00000001
++
++/* Fields of "I2C Fractional Divider Configuration Register" */
++/** Decrement Value of fractional divider */
++#define I2C_FDIV_CFG_INC_MASK 0x00FF0000
++/** field offset */
++#define I2C_FDIV_CFG_INC_OFFSET 16
++/** Increment Value of fractional divider */
++#define I2C_FDIV_CFG_DEC_MASK 0x000007FF
++/** field offset */
++#define I2C_FDIV_CFG_DEC_OFFSET 0
++
++/* Fields of "I2C Fractional Divider (highspeed mode) Configuration Register" */
++/** Decrement Value of fractional divider */
++#define I2C_FDIV_HIGH_CFG_INC_MASK 0x00FF0000
++/** field offset */
++#define I2C_FDIV_HIGH_CFG_INC_OFFSET 16
++/** Increment Value of fractional divider */
++#define I2C_FDIV_HIGH_CFG_DEC_MASK 0x000007FF
++/** field offset */
++#define I2C_FDIV_HIGH_CFG_DEC_OFFSET 0
++
++/* Fields of "I2C Address Configuration Register" */
++/** Stop on Packet End
++    If device works as receiver a not acknowledge is generated in both cases. After successful transmission of a master code (during high speed mode) SOPE is not considered till a stop condition is manually generated by SETEND. */
++#define I2C_ADDR_CFG_SOPE 0x00200000
++/* Disable
++#define I2C_ADDR_CFG_SOPE_DIS 0x00000000 */
++/** Enable */
++#define I2C_ADDR_CFG_SOPE_EN 0x00200000
++/** Stop on Not Acknowledge
++    After successful transmission of a master code (during high speed mode) SONA is not considered till a stop condition is manually generated by SETEND. */
++#define I2C_ADDR_CFG_SONA 0x00100000
++/* Disable
++#define I2C_ADDR_CFG_SONA_DIS 0x00000000 */
++/** Enable */
++#define I2C_ADDR_CFG_SONA_EN 0x00100000
++/** Master Enable */
++#define I2C_ADDR_CFG_MnS 0x00080000
++/* Disable
++#define I2C_ADDR_CFG_MnS_DIS 0x00000000 */
++/** Enable */
++#define I2C_ADDR_CFG_MnS_EN 0x00080000
++/** Master Code Enable */
++#define I2C_ADDR_CFG_MCE 0x00040000
++/* Disable
++#define I2C_ADDR_CFG_MCE_DIS 0x00000000 */
++/** Enable */
++#define I2C_ADDR_CFG_MCE_EN 0x00040000
++/** General Call Enable */
++#define I2C_ADDR_CFG_GCE 0x00020000
++/* Disable
++#define I2C_ADDR_CFG_GCE_DIS 0x00000000 */
++/** Enable */
++#define I2C_ADDR_CFG_GCE_EN 0x00020000
++/** Ten Bit Address Mode */
++#define I2C_ADDR_CFG_TBAM 0x00010000
++/* 7-bit address mode enabled.
++#define I2C_ADDR_CFG_TBAM_7bit 0x00000000 */
++/** 10-bit address mode enabled. */
++#define I2C_ADDR_CFG_TBAM_10bit 0x00010000
++/** I2C Bus device address
++    This is the address of this device. (Watch out for reserved addresses by referring to Phillips Spec V2.1) This could either be a 7bit- address (bits [7:1]) or a 10bit- address (bits [9:0]). Note:The validity of the bits are in accordance with the TBAM bit. Bit-1 (Bit-0) is the LSB of the device address. */
++#define I2C_ADDR_CFG_ADR_MASK 0x000003FF
++/** field offset */
++#define I2C_ADDR_CFG_ADR_OFFSET 0
++
++/* Fields of "I2C Bus Status Register" */
++/** Read / not Write */
++#define I2C_BUS_STAT_RNW 0x00000004
++/* Write to I2C Bus.
++#define I2C_BUS_STAT_RNW_WRITE 0x00000000 */
++/** Read from I2C Bus. */
++#define I2C_BUS_STAT_RNW_READ 0x00000004
++/** Bus Status */
++#define I2C_BUS_STAT_BS_MASK 0x00000003
++/** field offset */
++#define I2C_BUS_STAT_BS_OFFSET 0
++/** I2C Bus is free. */
++#define I2C_BUS_STAT_BS_FREE 0x00000000
++/** A start condition has been detected on the bus (bus busy). */
++#define I2C_BUS_STAT_BS_SC 0x00000001
++/** The device is working as master and has claimed the control on the I2C-bus (busy master). */
++#define I2C_BUS_STAT_BS_BM 0x00000002
++/** A remote master has accessed this device as slave. */
++#define I2C_BUS_STAT_BS_RM 0x00000003
++
++/* Fields of "I2C FIFO Configuration Register" */
++/** TX FIFO Flow Control */
++#define I2C_FIFO_CFG_TXFC 0x00020000
++/* TX FIFO not as Flow Controller
++#define I2C_FIFO_CFG_TXFC_TXNFC 0x00000000 */
++/** RX FIFO Flow Control */
++#define I2C_FIFO_CFG_RXFC 0x00010000
++/* RX FIFO not as Flow Controller
++#define I2C_FIFO_CFG_RXFC_RXNFC 0x00000000 */
++/** The reset value depends on the used character sizes of the peripheral. The maximum selectable alignment depends on the maximum number of characters per stage. */
++#define I2C_FIFO_CFG_TXFA_MASK 0x00003000
++/** field offset */
++#define I2C_FIFO_CFG_TXFA_OFFSET 12
++/** Byte aligned (character alignment) */
++#define I2C_FIFO_CFG_TXFA_TXFA0 0x00000000
++/** Half word aligned (character alignment of two characters) */
++#define I2C_FIFO_CFG_TXFA_TXFA1 0x00001000
++/** Word aligned (character alignment of four characters) */
++#define I2C_FIFO_CFG_TXFA_TXFA2 0x00002000
++/** Double word aligned (character alignment of eight */
++#define I2C_FIFO_CFG_TXFA_TXFA3 0x00003000
++/** The reset value depends on the used character sizes of the peripheral. The maximum selectable alignment depends on the maximum number of characters per stage. */
++#define I2C_FIFO_CFG_RXFA_MASK 0x00000300
++/** field offset */
++#define I2C_FIFO_CFG_RXFA_OFFSET 8
++/** Byte aligned (character alignment) */
++#define I2C_FIFO_CFG_RXFA_RXFA0 0x00000000
++/** Half word aligned (character alignment of two characters) */
++#define I2C_FIFO_CFG_RXFA_RXFA1 0x00000100
++/** Word aligned (character alignment of four characters) */
++#define I2C_FIFO_CFG_RXFA_RXFA2 0x00000200
++/** Double word aligned (character alignment of eight */
++#define I2C_FIFO_CFG_RXFA_RXFA3 0x00000300
++/** DMA controller does not support a burst size of 2 words. The reset value is the half of the FIFO size. The maximum selectable burst size is smaller than the FIFO size. */
++#define I2C_FIFO_CFG_TXBS_MASK 0x00000030
++/** field offset */
++#define I2C_FIFO_CFG_TXBS_OFFSET 4
++/** 1 word */
++#define I2C_FIFO_CFG_TXBS_TXBS0 0x00000000
++/** 2 words */
++#define I2C_FIFO_CFG_TXBS_TXBS1 0x00000010
++/** 4 words */
++#define I2C_FIFO_CFG_TXBS_TXBS2 0x00000020
++/** 8 words */
++#define I2C_FIFO_CFG_TXBS_TXBS3 0x00000030
++/** DMA controller does not support a burst size of 2 words. The reset value is the half of the FIFO size. The maximum selectable burst size is smaller than the FIFO size. */
++#define I2C_FIFO_CFG_RXBS_MASK 0x00000003
++/** field offset */
++#define I2C_FIFO_CFG_RXBS_OFFSET 0
++/** 1 word */
++#define I2C_FIFO_CFG_RXBS_RXBS0 0x00000000
++/** 2 words */
++#define I2C_FIFO_CFG_RXBS_RXBS1 0x00000001
++/** 4 words */
++#define I2C_FIFO_CFG_RXBS_RXBS2 0x00000002
++/** 8 words */
++#define I2C_FIFO_CFG_RXBS_RXBS3 0x00000003
++
++/* Fields of "I2C Maximum Received Packet Size Register" */
++/** MRPS */
++#define I2C_MRPS_CTRL_MRPS_MASK 0x00003FFF
++/** field offset */
++#define I2C_MRPS_CTRL_MRPS_OFFSET 0
++
++/* Fields of "I2C Received Packet Size Status Register" */
++/** RPS */
++#define I2C_RPS_STAT_RPS_MASK 0x00003FFF
++/** field offset */
++#define I2C_RPS_STAT_RPS_OFFSET 0
++
++/* Fields of "I2C Transmit Packet Size Register" */
++/** TPS */
++#define I2C_TPS_CTRL_TPS_MASK 0x00003FFF
++/** field offset */
++#define I2C_TPS_CTRL_TPS_OFFSET 0
++
++/* Fields of "I2C Filled FIFO Stages Status Register" */
++/** FFS */
++#define I2C_FFS_STAT_FFS_MASK 0x0000000F
++/** field offset */
++#define I2C_FFS_STAT_FFS_OFFSET 0
++
++/* Fields of "I2C Timing Configuration Register" */
++/** SDA Delay Stages for Start/Stop bit in High Speed Mode
++    The actual delay is calculated as the value of this field + 3 */
++#define I2C_TIM_CFG_HS_SDA_DEL_MASK 0x00070000
++/** field offset */
++#define I2C_TIM_CFG_HS_SDA_DEL_OFFSET 16
++/** Enable Fast Mode SCL Low period timing */
++#define I2C_TIM_CFG_FS_SCL_LOW 0x00008000
++/* Disable
++#define I2C_TIM_CFG_FS_SCL_LOW_DIS 0x00000000 */
++/** Enable */
++#define I2C_TIM_CFG_FS_SCL_LOW_EN 0x00008000
++/** SCL Delay Stages for Hold Time Start (Restart) Bit.
++    The actual delay is calculated as the value of this field + 2 */
++#define I2C_TIM_CFG_SCL_DEL_HD_STA_MASK 0x00000E00
++/** field offset */
++#define I2C_TIM_CFG_SCL_DEL_HD_STA_OFFSET 9
++/** SDA Delay Stages for Start/Stop bit in High Speed Mode
++    The actual delay is calculated as the value of this field + 3 */
++#define I2C_TIM_CFG_HS_SDA_DEL_HD_DAT_MASK 0x000001C0
++/** field offset */
++#define I2C_TIM_CFG_HS_SDA_DEL_HD_DAT_OFFSET 6
++/** SDA Delay Stages for Start/Stop bit in High Speed Mode
++    The actual delay is calculated as the value of this field + 3 */
++#define I2C_TIM_CFG_SDA_DEL_HD_DAT_MASK 0x0000003F
++/** field offset */
++#define I2C_TIM_CFG_SDA_DEL_HD_DAT_OFFSET 0
++
++/* Fields of "I2C Error Interrupt Request Source Mask Register" */
++/** Enables the corresponding error interrupt. */
++#define I2C_ERR_IRQSM_TXF_OFL 0x00000008
++/* Disable
++#define I2C_ERR_IRQSM_TXF_OFL_DIS 0x00000000 */
++/** Enable */
++#define I2C_ERR_IRQSM_TXF_OFL_EN 0x00000008
++/** Enables the corresponding error interrupt. */
++#define I2C_ERR_IRQSM_TXF_UFL 0x00000004
++/* Disable
++#define I2C_ERR_IRQSM_TXF_UFL_DIS 0x00000000 */
++/** Enable */
++#define I2C_ERR_IRQSM_TXF_UFL_EN 0x00000004
++/** Enables the corresponding error interrupt. */
++#define I2C_ERR_IRQSM_RXF_OFL 0x00000002
++/* Disable
++#define I2C_ERR_IRQSM_RXF_OFL_DIS 0x00000000 */
++/** Enable */
++#define I2C_ERR_IRQSM_RXF_OFL_EN 0x00000002
++/** Enables the corresponding error interrupt. */
++#define I2C_ERR_IRQSM_RXF_UFL 0x00000001
++/* Disable
++#define I2C_ERR_IRQSM_RXF_UFL_DIS 0x00000000 */
++/** Enable */
++#define I2C_ERR_IRQSM_RXF_UFL_EN 0x00000001
++
++/* Fields of "I2C Error Interrupt Request Source Status Register" */
++/** TXF_OFL */
++#define I2C_ERR_IRQSS_TXF_OFL 0x00000008
++/* Nothing
++#define I2C_ERR_IRQSS_TXF_OFL_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_ERR_IRQSS_TXF_OFL_INTOCC 0x00000008
++/** TXF_UFL */
++#define I2C_ERR_IRQSS_TXF_UFL 0x00000004
++/* Nothing
++#define I2C_ERR_IRQSS_TXF_UFL_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_ERR_IRQSS_TXF_UFL_INTOCC 0x00000004
++/** RXF_OFL */
++#define I2C_ERR_IRQSS_RXF_OFL 0x00000002
++/* Nothing
++#define I2C_ERR_IRQSS_RXF_OFL_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_ERR_IRQSS_RXF_OFL_INTOCC 0x00000002
++/** RXF_UFL */
++#define I2C_ERR_IRQSS_RXF_UFL 0x00000001
++/* Nothing
++#define I2C_ERR_IRQSS_RXF_UFL_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_ERR_IRQSS_RXF_UFL_INTOCC 0x00000001
++
++/* Fields of "I2C Error Interrupt Request Source Clear Register" */
++/** TXF_OFL */
++#define I2C_ERR_IRQSC_TXF_OFL 0x00000008
++/* No-Operation
++#define I2C_ERR_IRQSC_TXF_OFL_NOP 0x00000000 */
++/** Clear */
++#define I2C_ERR_IRQSC_TXF_OFL_CLR 0x00000008
++/** TXF_UFL */
++#define I2C_ERR_IRQSC_TXF_UFL 0x00000004
++/* No-Operation
++#define I2C_ERR_IRQSC_TXF_UFL_NOP 0x00000000 */
++/** Clear */
++#define I2C_ERR_IRQSC_TXF_UFL_CLR 0x00000004
++/** RXF_OFL */
++#define I2C_ERR_IRQSC_RXF_OFL 0x00000002
++/* No-Operation
++#define I2C_ERR_IRQSC_RXF_OFL_NOP 0x00000000 */
++/** Clear */
++#define I2C_ERR_IRQSC_RXF_OFL_CLR 0x00000002
++/** RXF_UFL */
++#define I2C_ERR_IRQSC_RXF_UFL 0x00000001
++/* No-Operation
++#define I2C_ERR_IRQSC_RXF_UFL_NOP 0x00000000 */
++/** Clear */
++#define I2C_ERR_IRQSC_RXF_UFL_CLR 0x00000001
++
++/* Fields of "I2C Protocol Interrupt Request Source Mask Register" */
++/** Enables the corresponding interrupt. */
++#define I2C_P_IRQSM_RX 0x00000040
++/* Disable
++#define I2C_P_IRQSM_RX_DIS 0x00000000 */
++/** Enable */
++#define I2C_P_IRQSM_RX_EN 0x00000040
++/** Enables the corresponding interrupt. */
++#define I2C_P_IRQSM_TX_END 0x00000020
++/* Disable
++#define I2C_P_IRQSM_TX_END_DIS 0x00000000 */
++/** Enable */
++#define I2C_P_IRQSM_TX_END_EN 0x00000020
++/** Enables the corresponding interrupt. */
++#define I2C_P_IRQSM_NACK 0x00000010
++/* Disable
++#define I2C_P_IRQSM_NACK_DIS 0x00000000 */
++/** Enable */
++#define I2C_P_IRQSM_NACK_EN 0x00000010
++/** Enables the corresponding interrupt. */
++#define I2C_P_IRQSM_AL 0x00000008
++/* Disable
++#define I2C_P_IRQSM_AL_DIS 0x00000000 */
++/** Enable */
++#define I2C_P_IRQSM_AL_EN 0x00000008
++/** Enables the corresponding interrupt. */
++#define I2C_P_IRQSM_MC 0x00000004
++/* Disable
++#define I2C_P_IRQSM_MC_DIS 0x00000000 */
++/** Enable */
++#define I2C_P_IRQSM_MC_EN 0x00000004
++/** Enables the corresponding interrupt. */
++#define I2C_P_IRQSM_GC 0x00000002
++/* Disable
++#define I2C_P_IRQSM_GC_DIS 0x00000000 */
++/** Enable */
++#define I2C_P_IRQSM_GC_EN 0x00000002
++/** Enables the corresponding interrupt. */
++#define I2C_P_IRQSM_AM 0x00000001
++/* Disable
++#define I2C_P_IRQSM_AM_DIS 0x00000000 */
++/** Enable */
++#define I2C_P_IRQSM_AM_EN 0x00000001
++
++/* Fields of "I2C Protocol Interrupt Request Source Status Register" */
++/** RX */
++#define I2C_P_IRQSS_RX 0x00000040
++/* Nothing
++#define I2C_P_IRQSS_RX_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_P_IRQSS_RX_INTOCC 0x00000040
++/** TX_END */
++#define I2C_P_IRQSS_TX_END 0x00000020
++/* Nothing
++#define I2C_P_IRQSS_TX_END_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_P_IRQSS_TX_END_INTOCC 0x00000020
++/** NACK */
++#define I2C_P_IRQSS_NACK 0x00000010
++/* Nothing
++#define I2C_P_IRQSS_NACK_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_P_IRQSS_NACK_INTOCC 0x00000010
++/** AL */
++#define I2C_P_IRQSS_AL 0x00000008
++/* Nothing
++#define I2C_P_IRQSS_AL_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_P_IRQSS_AL_INTOCC 0x00000008
++/** MC */
++#define I2C_P_IRQSS_MC 0x00000004
++/* Nothing
++#define I2C_P_IRQSS_MC_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_P_IRQSS_MC_INTOCC 0x00000004
++/** GC */
++#define I2C_P_IRQSS_GC 0x00000002
++/* Nothing
++#define I2C_P_IRQSS_GC_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_P_IRQSS_GC_INTOCC 0x00000002
++/** AM */
++#define I2C_P_IRQSS_AM 0x00000001
++/* Nothing
++#define I2C_P_IRQSS_AM_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_P_IRQSS_AM_INTOCC 0x00000001
++
++/* Fields of "I2C Protocol Interrupt Request Source Clear Register" */
++/** RX */
++#define I2C_P_IRQSC_RX 0x00000040
++/* No-Operation
++#define I2C_P_IRQSC_RX_NOP 0x00000000 */
++/** Clear */
++#define I2C_P_IRQSC_RX_CLR 0x00000040
++/** TX_END */
++#define I2C_P_IRQSC_TX_END 0x00000020
++/* No-Operation
++#define I2C_P_IRQSC_TX_END_NOP 0x00000000 */
++/** Clear */
++#define I2C_P_IRQSC_TX_END_CLR 0x00000020
++/** NACK */
++#define I2C_P_IRQSC_NACK 0x00000010
++/* No-Operation
++#define I2C_P_IRQSC_NACK_NOP 0x00000000 */
++/** Clear */
++#define I2C_P_IRQSC_NACK_CLR 0x00000010
++/** AL */
++#define I2C_P_IRQSC_AL 0x00000008
++/* No-Operation
++#define I2C_P_IRQSC_AL_NOP 0x00000000 */
++/** Clear */
++#define I2C_P_IRQSC_AL_CLR 0x00000008
++/** MC */
++#define I2C_P_IRQSC_MC 0x00000004
++/* No-Operation
++#define I2C_P_IRQSC_MC_NOP 0x00000000 */
++/** Clear */
++#define I2C_P_IRQSC_MC_CLR 0x00000004
++/** GC */
++#define I2C_P_IRQSC_GC 0x00000002
++/* No-Operation
++#define I2C_P_IRQSC_GC_NOP 0x00000000 */
++/** Clear */
++#define I2C_P_IRQSC_GC_CLR 0x00000002
++/** AM */
++#define I2C_P_IRQSC_AM 0x00000001
++/* No-Operation
++#define I2C_P_IRQSC_AM_NOP 0x00000000 */
++/** Clear */
++#define I2C_P_IRQSC_AM_CLR 0x00000001
++
++/* Fields of "I2C Raw Interrupt Status Register" */
++/** This is the combined interrupt bit for indication of an protocol event in the I2C kernel. */
++#define I2C_RIS_I2C_P_INT 0x00000020
++/* Nothing
++#define I2C_RIS_I2C_P_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_RIS_I2C_P_INT_INTOCC 0x00000020
++/** This is the combined interrupt bit for indication of FIFO errors due to overflow and underrun. */
++#define I2C_RIS_I2C_ERR_INT 0x00000010
++/* Nothing
++#define I2C_RIS_I2C_ERR_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_RIS_I2C_ERR_INT_INTOCC 0x00000010
++/** BREQ_INT */
++#define I2C_RIS_BREQ_INT 0x00000008
++/* Nothing
++#define I2C_RIS_BREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_RIS_BREQ_INT_INTOCC 0x00000008
++/** LBREQ_INT */
++#define I2C_RIS_LBREQ_INT 0x00000004
++/* Nothing
++#define I2C_RIS_LBREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_RIS_LBREQ_INT_INTOCC 0x00000004
++/** SREQ_INT */
++#define I2C_RIS_SREQ_INT 0x00000002
++/* Nothing
++#define I2C_RIS_SREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_RIS_SREQ_INT_INTOCC 0x00000002
++/** LSREQ_INT */
++#define I2C_RIS_LSREQ_INT 0x00000001
++/* Nothing
++#define I2C_RIS_LSREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_RIS_LSREQ_INT_INTOCC 0x00000001
++
++/* Fields of "I2C Interrupt Mask Control Register" */
++/** This is the combined interrupt bit for indication of an protocol event in the I2C kernel. */
++#define I2C_IMSC_I2C_P_INT 0x00000020
++/* Disable
++#define I2C_IMSC_I2C_P_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_IMSC_I2C_P_INT_EN 0x00000020
++/** This is the combined interrupt bit for indication of FIFO errors due to overflow and underrun. */
++#define I2C_IMSC_I2C_ERR_INT 0x00000010
++/* Disable
++#define I2C_IMSC_I2C_ERR_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_IMSC_I2C_ERR_INT_EN 0x00000010
++/** BREQ_INT */
++#define I2C_IMSC_BREQ_INT 0x00000008
++/* Disable
++#define I2C_IMSC_BREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_IMSC_BREQ_INT_EN 0x00000008
++/** LBREQ_INT */
++#define I2C_IMSC_LBREQ_INT 0x00000004
++/* Disable
++#define I2C_IMSC_LBREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_IMSC_LBREQ_INT_EN 0x00000004
++/** SREQ_INT */
++#define I2C_IMSC_SREQ_INT 0x00000002
++/* Disable
++#define I2C_IMSC_SREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_IMSC_SREQ_INT_EN 0x00000002
++/** LSREQ_INT */
++#define I2C_IMSC_LSREQ_INT 0x00000001
++/* Disable
++#define I2C_IMSC_LSREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_IMSC_LSREQ_INT_EN 0x00000001
++
++/* Fields of "I2C Masked Interrupt Status Register" */
++/** This is the combined interrupt bit for indication of an protocol event in the I2C kernel. */
++#define I2C_MIS_I2C_P_INT 0x00000020
++/* Nothing
++#define I2C_MIS_I2C_P_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_MIS_I2C_P_INT_INTOCC 0x00000020
++/** This is the combined interrupt bit for indication of FIFO errors due to overflow and underrun. */
++#define I2C_MIS_I2C_ERR_INT 0x00000010
++/* Nothing
++#define I2C_MIS_I2C_ERR_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_MIS_I2C_ERR_INT_INTOCC 0x00000010
++/** BREQ_INT */
++#define I2C_MIS_BREQ_INT 0x00000008
++/* Nothing
++#define I2C_MIS_BREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_MIS_BREQ_INT_INTOCC 0x00000008
++/** LBREQ_INT */
++#define I2C_MIS_LBREQ_INT 0x00000004
++/* Nothing
++#define I2C_MIS_LBREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_MIS_LBREQ_INT_INTOCC 0x00000004
++/** SREQ_INT */
++#define I2C_MIS_SREQ_INT 0x00000002
++/* Nothing
++#define I2C_MIS_SREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_MIS_SREQ_INT_INTOCC 0x00000002
++/** LSREQ_INT */
++#define I2C_MIS_LSREQ_INT 0x00000001
++/* Nothing
++#define I2C_MIS_LSREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define I2C_MIS_LSREQ_INT_INTOCC 0x00000001
++
++/* Fields of "I2C Interrupt Clear Register" */
++/** This is the combined interrupt bit for indication of an protocol event in the I2C kernel. */
++#define I2C_ICR_I2C_P_INT 0x00000020
++/* No-Operation
++#define I2C_ICR_I2C_P_INT_NOP 0x00000000 */
++/** Clear */
++#define I2C_ICR_I2C_P_INT_CLR 0x00000020
++/** This is the combined interrupt bit for indication of FIFO errors due to overflow and underrun. */
++#define I2C_ICR_I2C_ERR_INT 0x00000010
++/* No-Operation
++#define I2C_ICR_I2C_ERR_INT_NOP 0x00000000 */
++/** Clear */
++#define I2C_ICR_I2C_ERR_INT_CLR 0x00000010
++/** BREQ_INT */
++#define I2C_ICR_BREQ_INT 0x00000008
++/* No-Operation
++#define I2C_ICR_BREQ_INT_NOP 0x00000000 */
++/** Clear */
++#define I2C_ICR_BREQ_INT_CLR 0x00000008
++/** LBREQ_INT */
++#define I2C_ICR_LBREQ_INT 0x00000004
++/* No-Operation
++#define I2C_ICR_LBREQ_INT_NOP 0x00000000 */
++/** Clear */
++#define I2C_ICR_LBREQ_INT_CLR 0x00000004
++/** SREQ_INT */
++#define I2C_ICR_SREQ_INT 0x00000002
++/* No-Operation
++#define I2C_ICR_SREQ_INT_NOP 0x00000000 */
++/** Clear */
++#define I2C_ICR_SREQ_INT_CLR 0x00000002
++/** LSREQ_INT */
++#define I2C_ICR_LSREQ_INT 0x00000001
++/* No-Operation
++#define I2C_ICR_LSREQ_INT_NOP 0x00000000 */
++/** Clear */
++#define I2C_ICR_LSREQ_INT_CLR 0x00000001
++
++/* Fields of "I2C Interrupt Set Register" */
++/** This is the combined interrupt bit for indication of an protocol event in the I2C kernel. */
++#define I2C_ISR_I2C_P_INT 0x00000020
++/* No-Operation
++#define I2C_ISR_I2C_P_INT_NOP 0x00000000 */
++/** Set */
++#define I2C_ISR_I2C_P_INT_SET 0x00000020
++/** This is the combined interrupt bit for indication of FIFO errors due to overflow and underrun. */
++#define I2C_ISR_I2C_ERR_INT 0x00000010
++/* No-Operation
++#define I2C_ISR_I2C_ERR_INT_NOP 0x00000000 */
++/** Set */
++#define I2C_ISR_I2C_ERR_INT_SET 0x00000010
++/** BREQ_INT */
++#define I2C_ISR_BREQ_INT 0x00000008
++/* No-Operation
++#define I2C_ISR_BREQ_INT_NOP 0x00000000 */
++/** Set */
++#define I2C_ISR_BREQ_INT_SET 0x00000008
++/** LBREQ_INT */
++#define I2C_ISR_LBREQ_INT 0x00000004
++/* No-Operation
++#define I2C_ISR_LBREQ_INT_NOP 0x00000000 */
++/** Set */
++#define I2C_ISR_LBREQ_INT_SET 0x00000004
++/** SREQ_INT */
++#define I2C_ISR_SREQ_INT 0x00000002
++/* No-Operation
++#define I2C_ISR_SREQ_INT_NOP 0x00000000 */
++/** Set */
++#define I2C_ISR_SREQ_INT_SET 0x00000002
++/** LSREQ_INT */
++#define I2C_ISR_LSREQ_INT 0x00000001
++/* No-Operation
++#define I2C_ISR_LSREQ_INT_NOP 0x00000000 */
++/** Set */
++#define I2C_ISR_LSREQ_INT_SET 0x00000001
++
++/* Fields of "I2C DMA Enable Register" */
++/** BREQ_INT */
++#define I2C_DMAE_BREQ_INT 0x00000008
++/* Disable
++#define I2C_DMAE_BREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_DMAE_BREQ_INT_EN 0x00000008
++/** LBREQ_INT */
++#define I2C_DMAE_LBREQ_INT 0x00000004
++/* Disable
++#define I2C_DMAE_LBREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_DMAE_LBREQ_INT_EN 0x00000004
++/** SREQ_INT */
++#define I2C_DMAE_SREQ_INT 0x00000002
++/* Disable
++#define I2C_DMAE_SREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_DMAE_SREQ_INT_EN 0x00000002
++/** LSREQ_INT */
++#define I2C_DMAE_LSREQ_INT 0x00000001
++/* Disable
++#define I2C_DMAE_LSREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define I2C_DMAE_LSREQ_INT_EN 0x00000001
++
++/* Fields of "I2C Transmit Data Register" */
++/** Characters to be transmitted */
++#define I2C_TXD_TXD_MASK 0xFFFFFFFF
++/** field offset */
++#define I2C_TXD_TXD_OFFSET 0
++
++/* Fields of "I2C Receive Data Register" */
++/** Received characters */
++#define I2C_RXD_RXD_MASK 0xFFFFFFFF
++/** field offset */
++#define I2C_RXD_RXD_OFFSET 0
++
++/*! @} */ /* I2C_REGISTER */
++
++#endif /* _i2c_reg_h */
+--- /dev/null
++++ b/arch/mips/include/asm/mach-lantiq/falcon/icu0_reg.h
+@@ -0,0 +1,4324 @@
++/******************************************************************************
++
++                               Copyright (c) 2010
++                            Lantiq Deutschland GmbH
++
++  For licensing information, see the file 'LICENSE' in the root folder of
++  this software module.
++
++******************************************************************************/
++
++#ifndef _icu0_reg_h
++#define _icu0_reg_h
++
++/** \addtogroup ICU0_REGISTER
++   @{
++*/
++/* access macros */
++#define icu0_r32(reg) reg_r32(&icu0->reg)
++#define icu0_w32(val, reg) reg_w32(val, &icu0->reg)
++#define icu0_w32_mask(clear, set, reg) reg_w32_mask(clear, set, &icu0->reg)
++#define icu0_r32_table(reg, idx) reg_r32_table(icu0->reg, idx)
++#define icu0_w32_table(val, reg, idx) reg_w32_table(val, icu0->reg, idx)
++#define icu0_w32_table_mask(clear, set, reg, idx) reg_w32_table_mask(clear, set, icu0->reg, idx)
++#define icu0_adr_table(reg, idx) adr_table(icu0->reg, idx)
++
++
++/** ICU0 register structure */
++struct gpon_reg_icu0
++{
++   /** IM0 Interrupt Status Register
++       A read action to this register delivers the unmasked captured status of the interrupt request lines. Each bit can be cleared by a write operation. */
++   unsigned int im0_isr; /* 0x00000000 */
++   /** Reserved */
++   unsigned int res_0; /* 0x00000004 */
++   /** IM0 Interrupt Enable Register
++       This register contains the enable (or mask) bits for the interrupts. Disabled interrupts are not visible in the IM0_IOSR register and are not signalled via the interrupt line towards the controller. */
++   unsigned int im0_ier; /* 0x00000008 */
++   /** Reserved */
++   unsigned int res_1; /* 0x0000000C */
++   /** IM0 Interrupt Output Status Register
++       This register shows the currently active interrupt requests masked with the corresponding enable bits of the IM0_IER register. */
++   unsigned int im0_iosr; /* 0x00000010 */
++   /** Reserved */
++   unsigned int res_2; /* 0x00000014 */
++   /** IM0 Interrupt Request Set Register
++       A write operation directly effects the interrupts. This can be used to trigger events under software control for testing purposes. A read operation returns the unmasked interrupt events. */
++   unsigned int im0_irsr; /* 0x00000018 */
++   /** Reserved */
++   unsigned int res_3; /* 0x0000001C */
++   /** IM0 Interrupt Mode Register
++       This register shows the type of interrupt for each bit. */
++   unsigned int im0_imr; /* 0x00000020 */
++   /** Reserved */
++   unsigned int res_4; /* 0x00000024 */
++   /** IM1 Interrupt Status Register
++       A read action to this register delivers the unmasked captured status of the interrupt request lines. Each bit can be cleared by a write operation. */
++   unsigned int im1_isr; /* 0x00000028 */
++   /** Reserved */
++   unsigned int res_5; /* 0x0000002C */
++   /** IM1 Interrupt Enable Register
++       This register contains the enable (or mask) bits for the interrupts. Disabled interrupts are not visible in the IM1_IOSR register and are not signalled via the interrupt line towards the controller. */
++   unsigned int im1_ier; /* 0x00000030 */
++   /** Reserved */
++   unsigned int res_6; /* 0x00000034 */
++   /** IM1 Interrupt Output Status Register
++       This register shows the currently active interrupt requests masked with the corresponding enable bits of the IM1_IER register. */
++   unsigned int im1_iosr; /* 0x00000038 */
++   /** Reserved */
++   unsigned int res_7; /* 0x0000003C */
++   /** IM1 Interrupt Request Set Register
++       A write operation directly effects the interrupts. This can be used to trigger events under software control for testing purposes. A read operation returns the unmasked interrupt events. */
++   unsigned int im1_irsr; /* 0x00000040 */
++   /** Reserved */
++   unsigned int res_8; /* 0x00000044 */
++   /** IM1 Interrupt Mode Register
++       This register shows the type of interrupt for each bit. */
++   unsigned int im1_imr; /* 0x00000048 */
++   /** Reserved */
++   unsigned int res_9; /* 0x0000004C */
++   /** IM2 Interrupt Status Register
++       A read action to this register delivers the unmasked captured status of the interrupt request lines. Each bit can be cleared by a write operation. */
++   unsigned int im2_isr; /* 0x00000050 */
++   /** Reserved */
++   unsigned int res_10; /* 0x00000054 */
++   /** IM2 Interrupt Enable Register
++       This register contains the enable (or mask) bits for the interrupts. Disabled interrupts are not visible in the IM2_IOSR register and are not signalled via the interrupt line towards the controller. */
++   unsigned int im2_ier; /* 0x00000058 */
++   /** Reserved */
++   unsigned int res_11; /* 0x0000005C */
++   /** IM2 Interrupt Output Status Register
++       This register shows the currently active interrupt requests masked with the corresponding enable bits of the IM2_IER register. */
++   unsigned int im2_iosr; /* 0x00000060 */
++   /** Reserved */
++   unsigned int res_12; /* 0x00000064 */
++   /** IM2 Interrupt Request Set Register
++       A write operation directly effects the interrupts. This can be used to trigger events under software control for testing purposes. A read operation returns the unmasked interrupt events. */
++   unsigned int im2_irsr; /* 0x00000068 */
++   /** Reserved */
++   unsigned int res_13; /* 0x0000006C */
++   /** IM2 Interrupt Mode Register
++       This register shows the type of interrupt for each bit. */
++   unsigned int im2_imr; /* 0x00000070 */
++   /** Reserved */
++   unsigned int res_14; /* 0x00000074 */
++   /** IM3 Interrupt Status Register
++       A read action to this register delivers the unmasked captured status of the interrupt request lines. Each bit can be cleared by a write operation. */
++   unsigned int im3_isr; /* 0x00000078 */
++   /** Reserved */
++   unsigned int res_15; /* 0x0000007C */
++   /** IM3 Interrupt Enable Register
++       This register contains the enable (or mask) bits for the interrupts. Disabled interrupts are not visible in the IM3_IOSR register and are not signalled via the interrupt line towards the controller. */
++   unsigned int im3_ier; /* 0x00000080 */
++   /** Reserved */
++   unsigned int res_16; /* 0x00000084 */
++   /** IM3 Interrupt Output Status Register
++       This register shows the currently active interrupt requests masked with the corresponding enable bits of the IM3_IER register. */
++   unsigned int im3_iosr; /* 0x00000088 */
++   /** Reserved */
++   unsigned int res_17; /* 0x0000008C */
++   /** IM3 Interrupt Request Set Register
++       A write operation directly effects the interrupts. This can be used to trigger events under software control for testing purposes. A read operation returns the unmasked interrupt events. */
++   unsigned int im3_irsr; /* 0x00000090 */
++   /** Reserved */
++   unsigned int res_18; /* 0x00000094 */
++   /** IM3 Interrupt Mode Register
++       This register shows the type of interrupt for each bit. */
++   unsigned int im3_imr; /* 0x00000098 */
++   /** Reserved */
++   unsigned int res_19; /* 0x0000009C */
++   /** IM4 Interrupt Status Register
++       A read action to this register delivers the unmasked captured status of the interrupt request lines. Each bit can be cleared by a write operation. */
++   unsigned int im4_isr; /* 0x000000A0 */
++   /** Reserved */
++   unsigned int res_20; /* 0x000000A4 */
++   /** IM4 Interrupt Enable Register
++       This register contains the enable (or mask) bits for the interrupts. Disabled interrupts are not visible in the IM4_IOSR register and are not signalled via the interrupt line towards the controller. */
++   unsigned int im4_ier; /* 0x000000A8 */
++   /** Reserved */
++   unsigned int res_21; /* 0x000000AC */
++   /** IM4 Interrupt Output Status Register
++       This register shows the currently active interrupt requests masked with the corresponding enable bits of the IM4_IER register. */
++   unsigned int im4_iosr; /* 0x000000B0 */
++   /** Reserved */
++   unsigned int res_22; /* 0x000000B4 */
++   /** IM4 Interrupt Request Set Register
++       A write operation directly effects the interrupts. This can be used to trigger events under software control for testing purposes. A read operation returns the unmasked interrupt events. */
++   unsigned int im4_irsr; /* 0x000000B8 */
++   /** Reserved */
++   unsigned int res_23; /* 0x000000BC */
++   /** IM4 Interrupt Mode Register
++       This register shows the type of interrupt for each bit. */
++   unsigned int im4_imr; /* 0x000000C0 */
++   /** Reserved */
++   unsigned int res_24; /* 0x000000C4 */
++   /** ICU Interrupt Vector Register (5 bit variant)
++       Shows the leftmost pending interrupt request. If e.g. bit 14 of the IOSR register is set, 15 is reported, because the 15th interrupt request is active. */
++   unsigned int icu_ivec; /* 0x000000C8 */
++   /** Reserved */
++   unsigned int res_25; /* 0x000000CC */
++   /** ICU Interrupt Vector Register (6 bit variant)
++       Shows the leftmost pending interrupt request. If e.g. bit 14 of the IOSR register is set, 15 is reported, because the 15th interrupt request is active. */
++   unsigned int icu_ivec_6; /* 0x000000D0 */
++   /** Reserved */
++   unsigned int res_26[3]; /* 0x000000D4 */
++};
++
++
++/* Fields of "IM0 Interrupt Status Register" */
++/** PCM Transmit Crash Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_PCM_HW2_CRASH 0x80000000
++/* Nothing
++#define ICU0_IM0_ISR_PCM_HW2_CRASH_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_PCM_HW2_CRASH_INTACK 0x80000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_PCM_HW2_CRASH_INTOCC 0x80000000
++/** PCM Transmit Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_PCM_TX 0x40000000
++/* Nothing
++#define ICU0_IM0_ISR_PCM_TX_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_PCM_TX_INTACK 0x40000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_PCM_TX_INTOCC 0x40000000
++/** PCM Receive Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_PCM_RX 0x20000000
++/* Nothing
++#define ICU0_IM0_ISR_PCM_RX_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_PCM_RX_INTACK 0x20000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_PCM_RX_INTOCC 0x20000000
++/** Secure Hash Algorithm Interrupt
++    This bit is a direct interrupt. */
++#define ICU0_IM0_ISR_SHA1_HASH 0x10000000
++/* Nothing
++#define ICU0_IM0_ISR_SHA1_HASH_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_SHA1_HASH_INTACK 0x10000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_SHA1_HASH_INTOCC 0x10000000
++/** Advanced Encryption Standard Interrupt
++    This bit is a direct interrupt. */
++#define ICU0_IM0_ISR_AES_AES 0x08000000
++/* Nothing
++#define ICU0_IM0_ISR_AES_AES_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_AES_AES_INTACK 0x08000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_AES_AES_INTOCC 0x08000000
++/** SSC Frame Interrupt
++    This bit is a direct interrupt. */
++#define ICU0_IM0_ISR_SSC0_F 0x00020000
++/* Nothing
++#define ICU0_IM0_ISR_SSC0_F_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_SSC0_F_INTACK 0x00020000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_SSC0_F_INTOCC 0x00020000
++/** SSC Error Interrupt
++    This bit is a direct interrupt. */
++#define ICU0_IM0_ISR_SSC0_E 0x00010000
++/* Nothing
++#define ICU0_IM0_ISR_SSC0_E_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_SSC0_E_INTACK 0x00010000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_SSC0_E_INTOCC 0x00010000
++/** SSC Receive Interrupt
++    This bit is a direct interrupt. */
++#define ICU0_IM0_ISR_SSC0_R 0x00008000
++/* Nothing
++#define ICU0_IM0_ISR_SSC0_R_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_SSC0_R_INTACK 0x00008000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_SSC0_R_INTOCC 0x00008000
++/** SSC Transmit Interrupt
++    This bit is a direct interrupt. */
++#define ICU0_IM0_ISR_SSC0_T 0x00004000
++/* Nothing
++#define ICU0_IM0_ISR_SSC0_T_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_SSC0_T_INTACK 0x00004000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_SSC0_T_INTOCC 0x00004000
++/** I2C Peripheral Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_I2C_I2C_P_INT 0x00002000
++/* Nothing
++#define ICU0_IM0_ISR_I2C_I2C_P_INT_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_I2C_I2C_P_INT_INTACK 0x00002000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_I2C_I2C_P_INT_INTOCC 0x00002000
++/** I2C Error Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_I2C_I2C_ERR_INT 0x00001000
++/* Nothing
++#define ICU0_IM0_ISR_I2C_I2C_ERR_INT_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_I2C_I2C_ERR_INT_INTACK 0x00001000
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_I2C_I2C_ERR_INT_INTOCC 0x00001000
++/** I2C Burst Data Transfer Request
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_I2C_BREQ_INT 0x00000800
++/* Nothing
++#define ICU0_IM0_ISR_I2C_BREQ_INT_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_I2C_BREQ_INT_INTACK 0x00000800
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_I2C_BREQ_INT_INTOCC 0x00000800
++/** I2C Last Burst Data Transfer Request
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_I2C_LBREQ_INT 0x00000400
++/* Nothing
++#define ICU0_IM0_ISR_I2C_LBREQ_INT_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_I2C_LBREQ_INT_INTACK 0x00000400
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_I2C_LBREQ_INT_INTOCC 0x00000400
++/** I2C Single Data Transfer Request
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_I2C_SREQ_INT 0x00000200
++/* Nothing
++#define ICU0_IM0_ISR_I2C_SREQ_INT_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_I2C_SREQ_INT_INTACK 0x00000200
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_I2C_SREQ_INT_INTOCC 0x00000200
++/** I2C Last Single Data Transfer Request
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_I2C_LSREQ_INT 0x00000100
++/* Nothing
++#define ICU0_IM0_ISR_I2C_LSREQ_INT_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_I2C_LSREQ_INT_INTACK 0x00000100
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_I2C_LSREQ_INT_INTOCC 0x00000100
++/** HOST IF Mailbox1 Transmit Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_HOST_MB1_TIR 0x00000010
++/* Nothing
++#define ICU0_IM0_ISR_HOST_MB1_TIR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_HOST_MB1_TIR_INTACK 0x00000010
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_HOST_MB1_TIR_INTOCC 0x00000010
++/** HOST IF Mailbox1 Receive Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_HOST_MB1_RIR 0x00000008
++/* Nothing
++#define ICU0_IM0_ISR_HOST_MB1_RIR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_HOST_MB1_RIR_INTACK 0x00000008
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_HOST_MB1_RIR_INTOCC 0x00000008
++/** HOST IF Mailbox0 Transmit Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_HOST_MB0_TIR 0x00000004
++/* Nothing
++#define ICU0_IM0_ISR_HOST_MB0_TIR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_HOST_MB0_TIR_INTACK 0x00000004
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_HOST_MB0_TIR_INTOCC 0x00000004
++/** HOST IF Mailbox0 Receive Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_HOST_MB0_RIR 0x00000002
++/* Nothing
++#define ICU0_IM0_ISR_HOST_MB0_RIR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_HOST_MB0_RIR_INTACK 0x00000002
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_HOST_MB0_RIR_INTOCC 0x00000002
++/** HOST IF Event Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM0_ISR_HOST_EIR 0x00000001
++/* Nothing
++#define ICU0_IM0_ISR_HOST_EIR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM0_ISR_HOST_EIR_INTACK 0x00000001
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_ISR_HOST_EIR_INTOCC 0x00000001
++
++/* Fields of "IM0 Interrupt Enable Register" */
++/** PCM Transmit Crash Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_PCM_HW2_CRASH 0x80000000
++/* Disable
++#define ICU0_IM0_IER_PCM_HW2_CRASH_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_PCM_HW2_CRASH_EN 0x80000000
++/** PCM Transmit Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_PCM_TX 0x40000000
++/* Disable
++#define ICU0_IM0_IER_PCM_TX_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_PCM_TX_EN 0x40000000
++/** PCM Receive Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_PCM_RX 0x20000000
++/* Disable
++#define ICU0_IM0_IER_PCM_RX_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_PCM_RX_EN 0x20000000
++/** Secure Hash Algorithm Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_SHA1_HASH 0x10000000
++/* Disable
++#define ICU0_IM0_IER_SHA1_HASH_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_SHA1_HASH_EN 0x10000000
++/** Advanced Encryption Standard Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_AES_AES 0x08000000
++/* Disable
++#define ICU0_IM0_IER_AES_AES_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_AES_AES_EN 0x08000000
++/** SSC Frame Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_SSC0_F 0x00020000
++/* Disable
++#define ICU0_IM0_IER_SSC0_F_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_SSC0_F_EN 0x00020000
++/** SSC Error Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_SSC0_E 0x00010000
++/* Disable
++#define ICU0_IM0_IER_SSC0_E_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_SSC0_E_EN 0x00010000
++/** SSC Receive Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_SSC0_R 0x00008000
++/* Disable
++#define ICU0_IM0_IER_SSC0_R_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_SSC0_R_EN 0x00008000
++/** SSC Transmit Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_SSC0_T 0x00004000
++/* Disable
++#define ICU0_IM0_IER_SSC0_T_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_SSC0_T_EN 0x00004000
++/** I2C Peripheral Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_I2C_I2C_P_INT 0x00002000
++/* Disable
++#define ICU0_IM0_IER_I2C_I2C_P_INT_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_I2C_I2C_P_INT_EN 0x00002000
++/** I2C Error Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_I2C_I2C_ERR_INT 0x00001000
++/* Disable
++#define ICU0_IM0_IER_I2C_I2C_ERR_INT_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_I2C_I2C_ERR_INT_EN 0x00001000
++/** I2C Burst Data Transfer Request
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_I2C_BREQ_INT 0x00000800
++/* Disable
++#define ICU0_IM0_IER_I2C_BREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_I2C_BREQ_INT_EN 0x00000800
++/** I2C Last Burst Data Transfer Request
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_I2C_LBREQ_INT 0x00000400
++/* Disable
++#define ICU0_IM0_IER_I2C_LBREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_I2C_LBREQ_INT_EN 0x00000400
++/** I2C Single Data Transfer Request
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_I2C_SREQ_INT 0x00000200
++/* Disable
++#define ICU0_IM0_IER_I2C_SREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_I2C_SREQ_INT_EN 0x00000200
++/** I2C Last Single Data Transfer Request
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_I2C_LSREQ_INT 0x00000100
++/* Disable
++#define ICU0_IM0_IER_I2C_LSREQ_INT_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_I2C_LSREQ_INT_EN 0x00000100
++/** HOST IF Mailbox1 Transmit Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_HOST_MB1_TIR 0x00000010
++/* Disable
++#define ICU0_IM0_IER_HOST_MB1_TIR_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_HOST_MB1_TIR_EN 0x00000010
++/** HOST IF Mailbox1 Receive Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_HOST_MB1_RIR 0x00000008
++/* Disable
++#define ICU0_IM0_IER_HOST_MB1_RIR_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_HOST_MB1_RIR_EN 0x00000008
++/** HOST IF Mailbox0 Transmit Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_HOST_MB0_TIR 0x00000004
++/* Disable
++#define ICU0_IM0_IER_HOST_MB0_TIR_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_HOST_MB0_TIR_EN 0x00000004
++/** HOST IF Mailbox0 Receive Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_HOST_MB0_RIR 0x00000002
++/* Disable
++#define ICU0_IM0_IER_HOST_MB0_RIR_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_HOST_MB0_RIR_EN 0x00000002
++/** HOST IF Event Interrupt
++    Interrupt enable bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IER_HOST_EIR 0x00000001
++/* Disable
++#define ICU0_IM0_IER_HOST_EIR_DIS 0x00000000 */
++/** Enable */
++#define ICU0_IM0_IER_HOST_EIR_EN 0x00000001
++
++/* Fields of "IM0 Interrupt Output Status Register" */
++/** PCM Transmit Crash Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_PCM_HW2_CRASH 0x80000000
++/* Nothing
++#define ICU0_IM0_IOSR_PCM_HW2_CRASH_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_PCM_HW2_CRASH_INTOCC 0x80000000
++/** PCM Transmit Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_PCM_TX 0x40000000
++/* Nothing
++#define ICU0_IM0_IOSR_PCM_TX_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_PCM_TX_INTOCC 0x40000000
++/** PCM Receive Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_PCM_RX 0x20000000
++/* Nothing
++#define ICU0_IM0_IOSR_PCM_RX_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_PCM_RX_INTOCC 0x20000000
++/** Secure Hash Algorithm Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_SHA1_HASH 0x10000000
++/* Nothing
++#define ICU0_IM0_IOSR_SHA1_HASH_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_SHA1_HASH_INTOCC 0x10000000
++/** Advanced Encryption Standard Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_AES_AES 0x08000000
++/* Nothing
++#define ICU0_IM0_IOSR_AES_AES_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_AES_AES_INTOCC 0x08000000
++/** SSC Frame Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_SSC0_F 0x00020000
++/* Nothing
++#define ICU0_IM0_IOSR_SSC0_F_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_SSC0_F_INTOCC 0x00020000
++/** SSC Error Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_SSC0_E 0x00010000
++/* Nothing
++#define ICU0_IM0_IOSR_SSC0_E_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_SSC0_E_INTOCC 0x00010000
++/** SSC Receive Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_SSC0_R 0x00008000
++/* Nothing
++#define ICU0_IM0_IOSR_SSC0_R_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_SSC0_R_INTOCC 0x00008000
++/** SSC Transmit Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_SSC0_T 0x00004000
++/* Nothing
++#define ICU0_IM0_IOSR_SSC0_T_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_SSC0_T_INTOCC 0x00004000
++/** I2C Peripheral Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_I2C_I2C_P_INT 0x00002000
++/* Nothing
++#define ICU0_IM0_IOSR_I2C_I2C_P_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_I2C_I2C_P_INT_INTOCC 0x00002000
++/** I2C Error Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_I2C_I2C_ERR_INT 0x00001000
++/* Nothing
++#define ICU0_IM0_IOSR_I2C_I2C_ERR_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_I2C_I2C_ERR_INT_INTOCC 0x00001000
++/** I2C Burst Data Transfer Request
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_I2C_BREQ_INT 0x00000800
++/* Nothing
++#define ICU0_IM0_IOSR_I2C_BREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_I2C_BREQ_INT_INTOCC 0x00000800
++/** I2C Last Burst Data Transfer Request
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_I2C_LBREQ_INT 0x00000400
++/* Nothing
++#define ICU0_IM0_IOSR_I2C_LBREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_I2C_LBREQ_INT_INTOCC 0x00000400
++/** I2C Single Data Transfer Request
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_I2C_SREQ_INT 0x00000200
++/* Nothing
++#define ICU0_IM0_IOSR_I2C_SREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_I2C_SREQ_INT_INTOCC 0x00000200
++/** I2C Last Single Data Transfer Request
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_I2C_LSREQ_INT 0x00000100
++/* Nothing
++#define ICU0_IM0_IOSR_I2C_LSREQ_INT_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_I2C_LSREQ_INT_INTOCC 0x00000100
++/** HOST IF Mailbox1 Transmit Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_HOST_MB1_TIR 0x00000010
++/* Nothing
++#define ICU0_IM0_IOSR_HOST_MB1_TIR_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_HOST_MB1_TIR_INTOCC 0x00000010
++/** HOST IF Mailbox1 Receive Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_HOST_MB1_RIR 0x00000008
++/* Nothing
++#define ICU0_IM0_IOSR_HOST_MB1_RIR_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_HOST_MB1_RIR_INTOCC 0x00000008
++/** HOST IF Mailbox0 Transmit Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_HOST_MB0_TIR 0x00000004
++/* Nothing
++#define ICU0_IM0_IOSR_HOST_MB0_TIR_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_HOST_MB0_TIR_INTOCC 0x00000004
++/** HOST IF Mailbox0 Receive Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_HOST_MB0_RIR 0x00000002
++/* Nothing
++#define ICU0_IM0_IOSR_HOST_MB0_RIR_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_HOST_MB0_RIR_INTOCC 0x00000002
++/** HOST IF Event Interrupt
++    Masked interrupt bit for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IOSR_HOST_EIR 0x00000001
++/* Nothing
++#define ICU0_IM0_IOSR_HOST_EIR_NULL 0x00000000 */
++/** Read: Interrupt occurred. */
++#define ICU0_IM0_IOSR_HOST_EIR_INTOCC 0x00000001
++
++/* Fields of "IM0 Interrupt Request Set Register" */
++/** PCM Transmit Crash Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_PCM_HW2_CRASH 0x80000000
++/** PCM Transmit Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_PCM_TX 0x40000000
++/** PCM Receive Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_PCM_RX 0x20000000
++/** Secure Hash Algorithm Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_SHA1_HASH 0x10000000
++/** Advanced Encryption Standard Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_AES_AES 0x08000000
++/** SSC Frame Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_SSC0_F 0x00020000
++/** SSC Error Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_SSC0_E 0x00010000
++/** SSC Receive Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_SSC0_R 0x00008000
++/** SSC Transmit Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_SSC0_T 0x00004000
++/** I2C Peripheral Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_I2C_I2C_P_INT 0x00002000
++/** I2C Error Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_I2C_I2C_ERR_INT 0x00001000
++/** I2C Burst Data Transfer Request
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_I2C_BREQ_INT 0x00000800
++/** I2C Last Burst Data Transfer Request
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_I2C_LBREQ_INT 0x00000400
++/** I2C Single Data Transfer Request
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_I2C_SREQ_INT 0x00000200
++/** I2C Last Single Data Transfer Request
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_I2C_LSREQ_INT 0x00000100
++/** HOST IF Mailbox1 Transmit Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_HOST_MB1_TIR 0x00000010
++/** HOST IF Mailbox1 Receive Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_HOST_MB1_RIR 0x00000008
++/** HOST IF Mailbox0 Transmit Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_HOST_MB0_TIR 0x00000004
++/** HOST IF Mailbox0 Receive Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_HOST_MB0_RIR 0x00000002
++/** HOST IF Event Interrupt
++    Software control for the corresponding bit in the IM0_ISR register. */
++#define ICU0_IM0_IRSR_HOST_EIR 0x00000001
++
++/* Fields of "IM0 Interrupt Mode Register" */
++/** PCM Transmit Crash Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_PCM_HW2_CRASH 0x80000000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_PCM_HW2_CRASH_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_PCM_HW2_CRASH_DIR 0x80000000
++/** PCM Transmit Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_PCM_TX 0x40000000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_PCM_TX_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_PCM_TX_DIR 0x40000000
++/** PCM Receive Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_PCM_RX 0x20000000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_PCM_RX_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_PCM_RX_DIR 0x20000000
++/** Secure Hash Algorithm Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_SHA1_HASH 0x10000000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_SHA1_HASH_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_SHA1_HASH_DIR 0x10000000
++/** Advanced Encryption Standard Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_AES_AES 0x08000000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_AES_AES_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_AES_AES_DIR 0x08000000
++/** SSC Frame Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_SSC0_F 0x00020000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_SSC0_F_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_SSC0_F_DIR 0x00020000
++/** SSC Error Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_SSC0_E 0x00010000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_SSC0_E_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_SSC0_E_DIR 0x00010000
++/** SSC Receive Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_SSC0_R 0x00008000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_SSC0_R_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_SSC0_R_DIR 0x00008000
++/** SSC Transmit Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_SSC0_T 0x00004000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_SSC0_T_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_SSC0_T_DIR 0x00004000
++/** I2C Peripheral Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_I2C_I2C_P_INT 0x00002000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_I2C_I2C_P_INT_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_I2C_I2C_P_INT_DIR 0x00002000
++/** I2C Error Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_I2C_I2C_ERR_INT 0x00001000
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_I2C_I2C_ERR_INT_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_I2C_I2C_ERR_INT_DIR 0x00001000
++/** I2C Burst Data Transfer Request
++    Type of interrupt. */
++#define ICU0_IM0_IMR_I2C_BREQ_INT 0x00000800
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_I2C_BREQ_INT_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_I2C_BREQ_INT_DIR 0x00000800
++/** I2C Last Burst Data Transfer Request
++    Type of interrupt. */
++#define ICU0_IM0_IMR_I2C_LBREQ_INT 0x00000400
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_I2C_LBREQ_INT_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_I2C_LBREQ_INT_DIR 0x00000400
++/** I2C Single Data Transfer Request
++    Type of interrupt. */
++#define ICU0_IM0_IMR_I2C_SREQ_INT 0x00000200
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_I2C_SREQ_INT_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_I2C_SREQ_INT_DIR 0x00000200
++/** I2C Last Single Data Transfer Request
++    Type of interrupt. */
++#define ICU0_IM0_IMR_I2C_LSREQ_INT 0x00000100
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_I2C_LSREQ_INT_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_I2C_LSREQ_INT_DIR 0x00000100
++/** HOST IF Mailbox1 Transmit Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_HOST_MB1_TIR 0x00000010
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_HOST_MB1_TIR_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_HOST_MB1_TIR_DIR 0x00000010
++/** HOST IF Mailbox1 Receive Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_HOST_MB1_RIR 0x00000008
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_HOST_MB1_RIR_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_HOST_MB1_RIR_DIR 0x00000008
++/** HOST IF Mailbox0 Transmit Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_HOST_MB0_TIR 0x00000004
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_HOST_MB0_TIR_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_HOST_MB0_TIR_DIR 0x00000004
++/** HOST IF Mailbox0 Receive Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_HOST_MB0_RIR 0x00000002
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_HOST_MB0_RIR_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_HOST_MB0_RIR_DIR 0x00000002
++/** HOST IF Event Interrupt
++    Type of interrupt. */
++#define ICU0_IM0_IMR_HOST_EIR 0x00000001
++/* Indirect Interrupt.
++#define ICU0_IM0_IMR_HOST_EIR_IND 0x00000000 */
++/** Direct Interrupt. */
++#define ICU0_IM0_IMR_HOST_EIR_DIR 0x00000001
++
++/* Fields of "IM1 Interrupt Status Register" */
++/** Crossbar Error Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_XBAR_ERROR 0x80000000
++/* Nothing
++#define ICU0_IM1_ISR_XBAR_ERROR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_XBAR_ERROR_INTACK 0x80000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_XBAR_ERROR_INTOCC 0x80000000
++/** DDR Controller Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_DDR 0x40000000
++/* Nothing
++#define ICU0_IM1_ISR_DDR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_DDR_INTACK 0x40000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_DDR_INTOCC 0x40000000
++/** FPI Bus Control Unit Interrupt
++    This bit is a direct interrupt. */
++#define ICU0_IM1_ISR_BCU0 0x20000000
++/* Nothing
++#define ICU0_IM1_ISR_BCU0_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_BCU0_INTACK 0x20000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_BCU0_INTOCC 0x20000000
++/** SBIU interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_SBIU0 0x08000000
++/* Nothing
++#define ICU0_IM1_ISR_SBIU0_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_SBIU0_INTACK 0x08000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_SBIU0_INTOCC 0x08000000
++/** Watchdog Prewarning Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_WDT_PIR 0x02000000
++/* Nothing
++#define ICU0_IM1_ISR_WDT_PIR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_WDT_PIR_INTACK 0x02000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_WDT_PIR_INTOCC 0x02000000
++/** Watchdog Access Error Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_WDT_AEIR 0x01000000
++/* Nothing
++#define ICU0_IM1_ISR_WDT_AEIR_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_WDT_AEIR_INTACK 0x01000000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_WDT_AEIR_INTOCC 0x01000000
++/** SYS GPE Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_SYS_GPE 0x00200000
++/* Nothing
++#define ICU0_IM1_ISR_SYS_GPE_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_SYS_GPE_INTACK 0x00200000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_SYS_GPE_INTOCC 0x00200000
++/** SYS1 Interrupt
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_SYS1 0x00100000
++/* Nothing
++#define ICU0_IM1_ISR_SYS1_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_SYS1_INTACK 0x00100000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_SYS1_INTOCC 0x00100000
++/** PMA Interrupt from IntNode of the RX Clk Domain
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_PMA_RX 0x00020000
++/* Nothing
++#define ICU0_IM1_ISR_PMA_RX_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_PMA_RX_INTACK 0x00020000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_PMA_RX_INTOCC 0x00020000
++/** PMA Interrupt from IntNode of the TX Clk Domain
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_PMA_TX 0x00010000
++/* Nothing
++#define ICU0_IM1_ISR_PMA_TX_NULL 0x00000000 */
++/** Write: Acknowledge the interrupt. */
++#define ICU0_IM1_ISR_PMA_TX_INTACK 0x00010000
++/** Read: Interrupt occurred. */
++#define ICU0_IM1_ISR_PMA_TX_INTOCC 0x00010000
++/** PMA Interrupt from IntNode of the 200MHz Domain
++    This bit is an indirect interrupt. */
++#define ICU0_IM1_ISR_PMA_