add preliminary Marvell Orion support
authorImre Kaloz <kaloz@openwrt.org>
Wed, 4 Jun 2008 13:51:17 +0000 (13:51 +0000)
committerImre Kaloz <kaloz@openwrt.org>
Wed, 4 Jun 2008 13:51:17 +0000 (13:51 +0000)
SVN-Revision: 11352

24 files changed:
package/madwifi/Makefile
target/linux/orion/Makefile [new file with mode: 0644]
target/linux/orion/config-default [new file with mode: 0644]
target/linux/orion/image/Makefile [new file with mode: 0644]
target/linux/orion/patches/001-latencytop_support.patch [new file with mode: 0644]
target/linux/orion/patches/002-feroceon__speed_up_flushing_of_the_entire_cache.patch [new file with mode: 0644]
target/linux/orion/patches/003-fix_various_whitespace_and_coding_style.patch [new file with mode: 0644]
target/linux/orion/patches/004-make_window_setup_a_little_more_safe.patch [new file with mode: 0644]
target/linux/orion/patches/005-dram_mapping_granularity_is_64kib.patch [new file with mode: 0644]
target/linux/orion/patches/006-add_a_separate_BRIDGE_INT_TIMER1_CLR_define.patch [new file with mode: 0644]
target/linux/orion/patches/007-annotate_88fr531-vd_cpu_entries.patch [new file with mode: 0644]
target/linux/orion/patches/008-top-level_irqs_are_level-triggered.patch [new file with mode: 0644]
target/linux/orion/patches/009-delete_unused_IO_SPACE_REMAP_define.patch [new file with mode: 0644]
target/linux/orion/patches/010-move_EHCI_I2C_UART_peripheral_init.patch [new file with mode: 0644]
target/linux/orion/patches/011-move_setting_up_pcie_wa_window_into_pcie.patch [new file with mode: 0644]
target/linux/orion/patches/012-rework_mpp_handling.patch [new file with mode: 0644]
target/linux/orion/patches/013-add_88f5181l_support.patch [new file with mode: 0644]
target/linux/orion/patches/014-avoid_setting_force_phy_addr.patch [new file with mode: 0644]
target/linux/orion/patches/015-implement_power-off_method_for_kurobox_pro.patch [new file with mode: 0644]
target/linux/orion/patches/016-add_qnap_ts-409_support.patch [new file with mode: 0644]
target/linux/orion/patches/017-add_linksys_wrt350n_v2_support.patch [new file with mode: 0644]
target/linux/orion/patches/018-add_hp_media_vault_mv2120_support.patch [new file with mode: 0644]
target/linux/orion/patches/019-add_technologic_systems_ts-78xx_support.patch [new file with mode: 0644]
toolchain/Config.in

index 496e5e6..874438b 100644 (file)
@@ -56,6 +56,9 @@ endif
 ifeq ($(BOARD),iop32x)
   HAL_TARGET:=xscale-le-elf
 endif
+ifeq ($(BOARD),orion)
+  HAL_TARGET:=xscale-le-elf
+endif
 ifeq ($(ARCH),powerpc)
   HAL_TARGET:=powerpc-be-elf
 endif
diff --git a/target/linux/orion/Makefile b/target/linux/orion/Makefile
new file mode 100644 (file)
index 0000000..4cc509a
--- /dev/null
@@ -0,0 +1,28 @@
+# 
+# Copyright (C) 2008 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+
+ARCH:=arm
+BOARD:=orion
+BOARDNAME:=Marvell Orion
+FEATURES:=squashfs
+
+LINUX_VERSION:=2.6.26-rc4
+
+include $(INCLUDE_DIR)/target.mk
+
+KERNELNAME:="uImage"
+
+DEFAULT_PACKAGES += kmod-madwifi
+
+define Kernel/Configure
+       $(call Kernel/Configure/Default)
+       $(SED) 's,.*CONFIG_AEABI.*,$(if $(CONFIG_EABI_SUPPORT),CONFIG_AEABI=y,# CONFIG_AEABI is not set),' $(LINUX_DIR)/.config
+       $(if $(CONFIG_EABI_SUPPORT),echo '# CONFIG_OABI_COMPAT is not set' >> $(LINUX_DIR)/.config)
+endef
+
+$(eval $(call BuildTarget))
diff --git a/target/linux/orion/config-default b/target/linux/orion/config-default
new file mode 100644 (file)
index 0000000..4dc9ec5
--- /dev/null
@@ -0,0 +1,384 @@
+# CONFIG_8139TOO is not set
+# CONFIG_AEABI is not set
+CONFIG_ALIGNMENT_TRAP=y
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_DAVINCI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_HAS_ILOG2_U32 is not set
+# CONFIG_ARCH_HAS_ILOG2_U64 is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_IOP13XX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_KS8695 is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_MSM7X00A is not set
+# CONFIG_ARCH_MXC is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_OMAP is not set
+CONFIG_ARCH_ORION5X=y
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_S3C2410 is not set
+# CONFIG_ARCH_SA1100 is not set
+# CONFIG_ARCH_SHARK is not set
+CONFIG_ARCH_SUPPORTS_AOUT=y
+# CONFIG_ARCH_SUPPORTS_MSI is not set
+CONFIG_ARCH_SUSPEND_POSSIBLE=y
+# CONFIG_ARCH_VERSATILE is not set
+CONFIG_ARM=y
+# CONFIG_ARM_THUMB is not set
+# CONFIG_ARTHUR is not set
+# CONFIG_ARPD is not set
+CONFIG_ATA=m
+# CONFIG_ATA_NONSTANDARD is not set
+# CONFIG_ATA_PIIX is not set
+CONFIG_ATA_SFF=y
+# CONFIG_ATM is not set
+# CONFIG_ATMEL is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_BINFMT_AOUT is not set
+CONFIG_BITREVERSE=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+# CONFIG_BLK_DEV_NBD is not set
+# CONFIG_BONDING is not set
+CONFIG_BOUNCE=y
+# CONFIG_BSD_DISKLABEL is not set
+# CONFIG_BT is not set
+# CONFIG_CIFS_STATS is not set
+CONFIG_CLASSIC_RCU=y
+CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=squashfs,jffs2 noinitrd console=ttyS0,115200 init=/etc/preinit"
+# CONFIG_CONFIGFS_FS is not set
+CONFIG_CPU_32=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV5T=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_FEROCEON=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+# CONFIG_CPU_DCACHE_DISABLE is not set
+CONFIG_CPU_FEROCEON=y
+CONFIG_CPU_FEROCEON_OLD_ID=y
+# CONFIG_CPU_ICACHE_DISABLE is not set
+CONFIG_CPU_PABRT_NOIFAR=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CRC16=y
+# CONFIG_CRC_CCITT is not set
+CONFIG_CRYPTO_AEAD=m
+CONFIG_CRYPTO_AUTHENC=m
+# CONFIG_CRYPTO_CTS is not set
+CONFIG_CRYPTO_GF128MUL=m
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_DEBUG_USER is not set
+CONFIG_DEFAULT_TCP_CONG="westwood"
+# CONFIG_DEFAULT_VEGAS is not set
+CONFIG_DEFAULT_WESTWOOD=y
+# CONFIG_DEVKMEM is not set
+CONFIG_DEVPORT=y
+CONFIG_DLCI=m
+CONFIG_DLCI_MAX=8
+# CONFIG_DM9000 is not set
+CONFIG_DNOTIFY=y
+# CONFIG_DSCC4 is not set
+# CONFIG_E100 is not set
+# CONFIG_E1000 is not set
+# CONFIG_E1000E_ENABLED is not set
+# CONFIG_FARSYNC is not set
+# CONFIG_FPE_NWFPE is not set
+# CONFIG_FPE_FASTFPE is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FRAME_WARN=1024
+CONFIG_FS_POSIX_ACL=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+# CONFIG_GENERIC_FIND_FIRST_BIT is not set
+# CONFIG_GENERIC_FIND_NEXT_BIT is not set
+CONFIG_GENERIC_GPIO=y
+# CONFIG_HAMRADIO is not set
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_HAS_DMA=y
+CONFIG_HAS_IOMEM=y
+CONFIG_HAS_IOPORT=y
+# CONFIG_HAVE_DMA_ATTRS is not set
+CONFIG_HAVE_IDE=y
+CONFIG_HAVE_KPROBES=y
+CONFIG_HAVE_KRETPROBES=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
+CONFIG_HAVE_OPROFILE=y
+CONFIG_HDLC=m
+CONFIG_HDLC_CISCO=m
+CONFIG_HDLC_FR=m
+CONFIG_HDLC_PPP=m
+CONFIG_HDLC_RAW=m
+# CONFIG_HDLC_RAW_ETH is not set
+# CONFIG_HERMES is not set
+# CONFIG_HTC_PASIC3 is not set
+CONFIG_HWMON=y
+# CONFIG_HWMON_DEBUG_CHIP is not set
+CONFIG_HW_RANDOM=y
+CONFIG_I2C=y
+CONFIG_I2C_BOARDINFO=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MV64XXX=y
+# CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
+# CONFIG_IBM_NEW_EMAC_RGMII is not set
+# CONFIG_IBM_NEW_EMAC_TAH is not set
+# CONFIG_IBM_NEW_EMAC_ZMII is not set
+# CONFIG_IDE is not set
+CONFIG_INITRAMFS_SOURCE=""
+# CONFIG_IP6_NF_MANGLE is not set
+# CONFIG_IP6_NF_MATCH_EUI64 is not set
+# CONFIG_IP6_NF_MATCH_FRAG is not set
+# CONFIG_IP6_NF_MATCH_HL is not set
+# CONFIG_IP6_NF_MATCH_IPV6HEADER is not set
+# CONFIG_IP6_NF_MATCH_OPTS is not set
+# CONFIG_IP6_NF_MATCH_RT is not set
+# CONFIG_IP6_NF_TARGET_LOG is not set
+# CONFIG_IPV6_MROUTE is not set
+CONFIG_IPV6_NDISC_NODETYPE=y
+# CONFIG_IPV6_ROUTER_PREF is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_MROUTE=y
+# CONFIG_IP_NF_ARPTABLES is not set
+# CONFIG_IP_NF_MATCH_ADDRTYPE is not set
+# CONFIG_IP_NF_MATCH_ECN is not set
+# CONFIG_IP_NF_MATCH_RECENT is not set
+# CONFIG_IP_NF_MATCH_TIME is not set
+# CONFIG_IP_NF_SET is not set
+# CONFIG_IP_NF_TARGET_ECN is not set
+# CONFIG_IP_NF_TARGET_LOG is not set
+# CONFIG_IP_NF_TARGET_NETMAP is not set
+# CONFIG_IP_NF_TARGET_TTL is not set
+# CONFIG_IP_NF_TARGET_ULOG is not set
+CONFIG_IP_PIMSM_V1=y
+CONFIG_IP_PIMSM_V2=y
+# CONFIG_IWLWIFI_LEDS is not set
+# CONFIG_LANMEDIA is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_LLC2 is not set
+CONFIG_LZO_COMPRESS=m
+CONFIG_LZO_DECOMPRESS=m
+# CONFIG_MACH_DB88F5281 is not set
+# CONFIG_MACH_DNS323 is not set
+# CONFIG_MACH_KUROBOX_PRO is not set
+# CONFIG_MACH_LINKSTATION_PRO is not set
+# CONFIG_MACH_MV2120 is not set
+# CONFIG_MACH_RD88F5182 is not set
+# CONFIG_MACH_TS209 is not set
+# CONFIG_MACH_TS409 is not set
+# CONFIG_MACH_TS78XX is not set
+CONFIG_MACH_WRT350N_V2=y
+# CONFIG_MAC_PARTITION is not set
+# CONFIG_MEDIA_ATTACH is not set
+CONFIG_MEDIA_TUNER=m
+# CONFIG_MEDIA_TUNER_CUSTOMIZE is not set
+CONFIG_MEDIA_TUNER_MT20XX=m
+CONFIG_MEDIA_TUNER_SIMPLE=m
+CONFIG_MEDIA_TUNER_TDA8290=m
+CONFIG_MEDIA_TUNER_TDA9887=m
+CONFIG_MEDIA_TUNER_TEA5761=m
+CONFIG_MEDIA_TUNER_TEA5767=m
+CONFIG_MEDIA_TUNER_XC2028=m
+CONFIG_MEDIA_TUNER_XC5000=m
+# CONFIG_MINIX_FS is not set
+# CONFIG_MODULE_FORCE_LOAD is not set
+CONFIG_MTD=y
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_AFS_PARTS is not set
+# CONFIG_MTD_AR7_PARTS is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+CONFIG_MTD_BLKDEVS=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_MTD_BLOCK2MTD is not set
+CONFIG_MTD_CFI=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+# CONFIG_MTD_CFI_AMDSTD is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+CONFIG_MTD_CHAR=y
+# CONFIG_MTD_CMDLINE_PARTS is not set
+CONFIG_MTD_COMPLEX_MAPPINGS=y
+# CONFIG_MTD_CONCAT is not set
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_JEDECPROBE is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_ONENAND is not set
+CONFIG_MTD_PARTITIONS=y
+# CONFIG_MTD_PCI is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_PLATRAM is not set
+# CONFIG_MTD_PMC551 is not set
+# CONFIG_MTD_RAM is not set
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_PARTS_READONLY=y
+# CONFIG_MTD_ROM is not set
+# CONFIG_MTD_SLRAM is not set
+CONFIG_MV643XX_ETH=y
+# CONFIG_NATSEMI is not set
+# CONFIG_NE2K_PCI is not set
+# CONFIG_NET_CLS_ACT is not set
+# CONFIG_NET_CLS_IND is not set
+# CONFIG_NET_EMATCH is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_SCH_NETEM is not set
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NEW_LEDS is not set
+# CONFIG_NF_CT_PROTO_DCCP is not set
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NO_IOPORT is not set
+# CONFIG_NVRAM is not set
+# CONFIG_OABI_COMPAT is not set
+# CONFIG_OUTER_CACHE is not set
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_PATA_ARTOP=m
+# CONFIG_PATA_SCH is not set
+# CONFIG_PC300 is not set
+CONFIG_PCI=y
+# CONFIG_PCI200SYN is not set
+# CONFIG_PCIPCWATCHDOG is not set
+CONFIG_PCI_SYSCALL=y
+CONFIG_PLAT_ORION=y
+# CONFIG_PPP is not set
+# CONFIG_PRISM54 is not set
+# CONFIG_R6040 is not set
+CONFIG_RTC_CLASS=y
+# CONFIG_RTC_DEBUG is not set
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1374 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_M41T80 is not set
+# CONFIG_RTC_DRV_M48T59 is not set
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+# CONFIG_RTC_DRV_STK17TA8 is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_V3020 is not set
+# CONFIG_RTC_DRV_X1205 is not set
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_LIB=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_SATA_PMP=y
+# CONFIG_SCSI_MULTI_LUN is not set
+CONFIG_SCSI_WAIT_SCAN=m
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SERIAL_8250_EXTENDED is not set
+# CONFIG_SHMEM is not set
+CONFIG_SLABINFO=y
+# CONFIG_SMC91X is not set
+# CONFIG_SOFT_WATCHDOG is not set
+# CONFIG_SOUND is not set
+# CONFIG_SPARSEMEM_STATIC is not set
+# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+CONFIG_SSB_POSSIBLE=y
+# CONFIG_SWAP is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_SYS_SUPPORTS_APM_EMULATION=y
+# CONFIG_TCP_CONG_HSTCP is not set
+# CONFIG_TCP_CONG_HYBLA is not set
+# CONFIG_TCP_CONG_LP is not set
+# CONFIG_TCP_CONG_SCALABLE is not set
+CONFIG_TCP_CONG_VEGAS=m
+# CONFIG_TCP_CONG_VENO is not set
+CONFIG_TCP_CONG_WESTWOOD=y
+CONFIG_TICK_ONESHOT=y
+CONFIG_TINY_SHMEM=y
+# CONFIG_TUN is not set
+CONFIG_UID16=y
+CONFIG_USB=m
+# CONFIG_USBPCWATCHDOG is not set
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_C67X00_HCD is not set
+# CONFIG_USB_CATC is not set
+CONFIG_USB_EHCI_HCD=m
+# CONFIG_USB_ISP1760_HCD is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
+# CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
+CONFIG_USB_OHCI_HCD=m
+# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+# CONFIG_USB_OTG_WHITELIST is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_PRINTER is not set
+# CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_SERIAL is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+CONFIG_USB_UHCI_HCD=m
+# CONFIG_USB_USBNET is not set
+# CONFIG_USB_WDM is not set
+CONFIG_VECTORS_BASE=0xffff0000
+# CONFIG_VFP is not set
+# CONFIG_VGASTATE is not set
+# CONFIG_VIA_RHINE is not set
+CONFIG_VIDEO_ALLOW_V4L1=y
+CONFIG_VIDEO_MEDIA=m
+CONFIG_VIDEO_V4L1=m
+CONFIG_VIDEO_V4L2=m
+CONFIG_VIDEO_V4L2_COMMON=m
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_WAN=y
+# CONFIG_WANXL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_XIP_KERNEL is not set
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_ZBOOT_ROM_TEXT=0x0
diff --git a/target/linux/orion/image/Makefile b/target/linux/orion/image/Makefile
new file mode 100644 (file)
index 0000000..073c24f
--- /dev/null
@@ -0,0 +1,34 @@
+#
+# Copyright (C) 2008 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
+
+define Image/Prepare
+       cp $(LINUX_DIR)/arch/arm/boot/uImage $(KDIR)/uImage
+endef
+
+define Image/BuildKernel
+       cp $(KDIR)/uImage $(BIN_DIR)/openwrt-$(BOARD)-uImage
+#
+# XXX - FIXME
+#
+#      BIN_DIR=$(BIN_DIR) $(TOPDIR)/scripts/arm-magic.sh
+endef
+
+define Image/Build
+       $(call Image/Build/$(1),$(1))
+endef
+
+define Image/Build/squashfs
+       $(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
+       ( \
+               dd if=$(LINUX_DIR)/arch/arm/boot/uImage bs=1024k conv=sync; \
+               dd if=$(KDIR)/root.$(1) bs=128k conv=sync; \
+       ) > $(BIN_DIR)/openwrt-$(BOARD)-$(1).img
+endef
+
+$(eval $(call BuildImage))
diff --git a/target/linux/orion/patches/001-latencytop_support.patch b/target/linux/orion/patches/001-latencytop_support.patch
new file mode 100644 (file)
index 0000000..a1fbc17
--- /dev/null
@@ -0,0 +1,82 @@
+From: Nicolas Pitre <nico@cam.org>
+
+Signed-off-by: Nicolas Pitre <nico@marvell.com>
+Tested-by: Lennert Buytenhek <buytenh@marvell.com>
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/Kconfig             |    4 ++++
+ arch/arm/kernel/stacktrace.c |   26 ++++++++++++++++++++++----
+ 2 files changed, 26 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -84,6 +84,10 @@
+       bool
+       default y
++config HAVE_LATENCYTOP_SUPPORT
++      bool
++      default y
++
+ config LOCKDEP_SUPPORT
+       bool
+       default y
+--- a/arch/arm/kernel/stacktrace.c
++++ b/arch/arm/kernel/stacktrace.c
+@@ -36,6 +36,7 @@
+ #ifdef CONFIG_STACKTRACE
+ struct stack_trace_data {
+       struct stack_trace *trace;
++      unsigned int no_sched_functions;
+       unsigned int skip;
+ };
+@@ -43,27 +44,44 @@
+ {
+       struct stack_trace_data *data = d;
+       struct stack_trace *trace = data->trace;
++      unsigned long addr = frame->lr;
++      if (data->no_sched_functions && in_sched_functions(addr))
++              return 0;
+       if (data->skip) {
+               data->skip--;
+               return 0;
+       }
+-      trace->entries[trace->nr_entries++] = frame->lr;
++      trace->entries[trace->nr_entries++] = addr;
+       return trace->nr_entries >= trace->max_entries;
+ }
+-void save_stack_trace(struct stack_trace *trace)
++void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
+ {
+       struct stack_trace_data data;
+       unsigned long fp, base;
+       data.trace = trace;
+       data.skip = trace->skip;
+-      base = (unsigned long)task_stack_page(current);
+-      asm("mov %0, fp" : "=r" (fp));
++      base = (unsigned long)task_stack_page(tsk);
++
++      if (tsk != current) {
++              data.no_sched_functions = 1;
++              fp = thread_saved_fp(tsk);
++      } else {
++              data.no_sched_functions = 0;
++              asm("mov %0, fp" : "=r" (fp));
++      }
+       walk_stackframe(fp, base, base + THREAD_SIZE, save_trace, &data);
++      if (trace->nr_entries < trace->max_entries)
++              trace->entries[trace->nr_entries++] = ULONG_MAX;
++}
++
++void save_stack_trace(struct stack_trace *trace)
++{
++      save_stack_trace_tsk(current, trace);
+ }
+ #endif
diff --git a/target/linux/orion/patches/002-feroceon__speed_up_flushing_of_the_entire_cache.patch b/target/linux/orion/patches/002-feroceon__speed_up_flushing_of_the_entire_cache.patch
new file mode 100644 (file)
index 0000000..c2efe5b
--- /dev/null
@@ -0,0 +1,117 @@
+Flushing the L1 D cache with a test/clean/invalidate loop is very
+easy in software, but it is not the quickest way of doing it, as
+there is a lot of overhead involved in re-scanning the cache from
+the beginning every time we hit a dirty line.
+
+This patch makes proc-feroceon.S use "clean+invalidate by set/way"
+loops according to possible cache configuration of Feroceon CPUs
+(either direct-mapped or 4-way set associative).
+
+[nico: optimized the assembly a bit]
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+Signed-off-by: Nicolas Pitre <nico@marvell.com>
+---
+ arch/arm/mm/proc-feroceon.S |   53 ++++++++++++++++++++++++++++++++++---------
+ 1 files changed, 42 insertions(+), 11 deletions(-)
+
+--- a/arch/arm/mm/proc-feroceon.S
++++ b/arch/arm/mm/proc-feroceon.S
+@@ -44,11 +44,31 @@
+  */
+ #define CACHE_DLINESIZE       32
++      .bss
++      .align 3
++__cache_params_loc:
++      .space  8
++
+       .text
++__cache_params:
++      .word   __cache_params_loc
++
+ /*
+  * cpu_feroceon_proc_init()
+  */
+ ENTRY(cpu_feroceon_proc_init)
++      mrc     p15, 0, r0, c0, c0, 1           @ read cache type register
++      ldr     r1, __cache_params
++      mov     r2, #(16 << 5)
++      tst     r0, #(1 << 16)                  @ get way
++      mov     r0, r0, lsr #18                 @ get cache size order
++      movne   r3, #((4 - 1) << 30)            @ 4-way
++      and     r0, r0, #0xf
++      moveq   r3, #0                          @ 1-way
++      mov     r2, r2, lsl r0                  @ actual cache size
++      movne   r2, r2, lsr #2                  @ turned into # of sets
++      sub     r2, r2, #(1 << 5)
++      stmia   r1, {r2, r3}
+       mov     pc, lr
+ /*
+@@ -117,11 +137,19 @@
+  */
+ ENTRY(feroceon_flush_kern_cache_all)
+       mov     r2, #VM_EXEC
+-      mov     ip, #0
++
+ __flush_whole_cache:
+-1:    mrc     p15, 0, r15, c7, c14, 3         @ test,clean,invalidate
+-      bne     1b
++      ldr     r1, __cache_params
++      ldmia   r1, {r1, r3}
++1:    orr     ip, r1, r3
++2:    mcr     p15, 0, ip, c7, c14, 2          @ clean + invalidate D set/way
++      subs    ip, ip, #(1 << 30)              @ next way
++      bcs     2b
++      subs    r1, r1, #(1 << 5)               @ next set
++      bcs     1b
++
+       tst     r2, #VM_EXEC
++      mov     ip, #0
+       mcrne   p15, 0, ip, c7, c5, 0           @ invalidate I cache
+       mcrne   p15, 0, ip, c7, c10, 4          @ drain WB
+       mov     pc, lr
+@@ -138,7 +166,6 @@
+  */
+       .align  5
+ ENTRY(feroceon_flush_user_cache_range)
+-      mov     ip, #0
+       sub     r3, r1, r0                      @ calculate total size
+       cmp     r3, #CACHE_DLIMIT
+       bgt     __flush_whole_cache
+@@ -152,6 +179,7 @@
+       cmp     r0, r1
+       blo     1b
+       tst     r2, #VM_EXEC
++      mov     ip, #0
+       mcrne   p15, 0, ip, c7, c10, 4          @ drain WB
+       mov     pc, lr
+@@ -306,16 +334,19 @@
+       .align  5
+ ENTRY(cpu_feroceon_switch_mm)
+ #ifdef CONFIG_MMU
+-      mov     ip, #0
+-@ && 'Clean & Invalidate whole DCache'
+-1:    mrc     p15, 0, r15, c7, c14, 3         @ test,clean,invalidate
+-      bne     1b
+-      mcr     p15, 0, ip, c7, c5, 0           @ invalidate I cache
+-      mcr     p15, 0, ip, c7, c10, 4          @ drain WB
++      mov     r2, lr                          @ abuse r2 to preserve lr
++      bl      __flush_whole_cache
++      @ if r2 contains the VM_EXEC bit then the next 2 ops are done already
++      tst     r2, #VM_EXEC
++      mcreq   p15, 0, ip, c7, c5, 0           @ invalidate I cache
++      mcreq   p15, 0, ip, c7, c10, 4          @ drain WB
++
+       mcr     p15, 0, r0, c2, c0, 0           @ load page table pointer
+       mcr     p15, 0, ip, c8, c7, 0           @ invalidate I & D TLBs
+-#endif
++      mov     pc, r2
++#else
+       mov     pc, lr
++#endif
+ /*
+  * cpu_feroceon_set_pte_ext(ptep, pte, ext)
diff --git a/target/linux/orion/patches/003-fix_various_whitespace_and_coding_style.patch b/target/linux/orion/patches/003-fix_various_whitespace_and_coding_style.patch
new file mode 100644 (file)
index 0000000..02126ca
--- /dev/null
@@ -0,0 +1,647 @@
+More cosmetic cleanup:
+- Replace 8-space indents by proper tab indents.
+- In structure initialisers, use a trailing comma for every member.
+- Collapse "},\n{" in structure initialiers to "}, {".
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/common.c            |   91 +++++++++++--------------
+ arch/arm/mach-orion5x/db88f5281-setup.c   |   13 ++--
+ arch/arm/mach-orion5x/dns323-setup.c      |   33 +++++----
+ arch/arm/mach-orion5x/kurobox_pro-setup.c |    8 +--
+ arch/arm/mach-orion5x/pci.c               |   14 ++--
+ arch/arm/mach-orion5x/rd88f5182-setup.c   |    3 +-
+ arch/arm/mach-orion5x/ts209-setup.c       |  103 +++++++++++++++--------------
+ arch/arm/mm/proc-feroceon.S               |    8 +-
+ 8 files changed, 132 insertions(+), 141 deletions(-)
+
+--- a/arch/arm/mach-orion5x/common.c
++++ b/arch/arm/mach-orion5x/common.c
+@@ -39,25 +39,22 @@
+               .virtual        = ORION5X_REGS_VIRT_BASE,
+               .pfn            = __phys_to_pfn(ORION5X_REGS_PHYS_BASE),
+               .length         = ORION5X_REGS_SIZE,
+-              .type           = MT_DEVICE
+-      },
+-      {
++              .type           = MT_DEVICE,
++      }, {
+               .virtual        = ORION5X_PCIE_IO_VIRT_BASE,
+               .pfn            = __phys_to_pfn(ORION5X_PCIE_IO_PHYS_BASE),
+               .length         = ORION5X_PCIE_IO_SIZE,
+-              .type           = MT_DEVICE
+-      },
+-      {
++              .type           = MT_DEVICE,
++      }, {
+               .virtual        = ORION5X_PCI_IO_VIRT_BASE,
+               .pfn            = __phys_to_pfn(ORION5X_PCI_IO_PHYS_BASE),
+               .length         = ORION5X_PCI_IO_SIZE,
+-              .type           = MT_DEVICE
+-      },
+-      {
++              .type           = MT_DEVICE,
++      }, {
+               .virtual        = ORION5X_PCIE_WA_VIRT_BASE,
+               .pfn            = __phys_to_pfn(ORION5X_PCIE_WA_PHYS_BASE),
+               .length         = ORION5X_PCIE_WA_SIZE,
+-              .type           = MT_DEVICE
++              .type           = MT_DEVICE,
+       },
+ };
+@@ -75,18 +72,15 @@
+               .start          = UART0_PHYS_BASE,
+               .end            = UART0_PHYS_BASE + 0xff,
+               .flags          = IORESOURCE_MEM,
+-      },
+-      {
++      }, {
+               .start          = IRQ_ORION5X_UART0,
+               .end            = IRQ_ORION5X_UART0,
+               .flags          = IORESOURCE_IRQ,
+-      },
+-      {
++      }, {
+               .start          = UART1_PHYS_BASE,
+               .end            = UART1_PHYS_BASE + 0xff,
+               .flags          = IORESOURCE_MEM,
+-      },
+-      {
++      }, {
+               .start          = IRQ_ORION5X_UART1,
+               .end            = IRQ_ORION5X_UART1,
+               .flags          = IORESOURCE_IRQ,
+@@ -102,8 +96,7 @@
+               .iotype         = UPIO_MEM,
+               .regshift       = 2,
+               .uartclk        = ORION5X_TCLK,
+-      },
+-      {
++      }, {
+               .mapbase        = UART1_PHYS_BASE,
+               .membase        = (char *)UART1_VIRT_BASE,
+               .irq            = IRQ_ORION5X_UART1,
+@@ -111,8 +104,8 @@
+               .iotype         = UPIO_MEM,
+               .regshift       = 2,
+               .uartclk        = ORION5X_TCLK,
++      }, {
+       },
+-      { },
+ };
+ static struct platform_device orion5x_uart = {
+@@ -134,8 +127,7 @@
+               .start  = ORION5X_USB0_PHYS_BASE,
+               .end    = ORION5X_USB0_PHYS_BASE + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+-      },
+-      {
++      }, {
+               .start  = IRQ_ORION5X_USB0_CTRL,
+               .end    = IRQ_ORION5X_USB0_CTRL,
+               .flags  = IORESOURCE_IRQ,
+@@ -147,8 +139,7 @@
+               .start  = ORION5X_USB1_PHYS_BASE,
+               .end    = ORION5X_USB1_PHYS_BASE + SZ_4K - 1,
+               .flags  = IORESOURCE_MEM,
+-      },
+-      {
++      }, {
+               .start  = IRQ_ORION5X_USB1_CTRL,
+               .end    = IRQ_ORION5X_USB1_CTRL,
+               .flags  = IORESOURCE_IRQ,
+@@ -219,7 +210,7 @@
+               .start  = IRQ_ORION5X_ETH_SUM,
+               .end    = IRQ_ORION5X_ETH_SUM,
+               .flags  = IORESOURCE_IRQ,
+-      }
++      },
+ };
+ static struct platform_device orion5x_eth = {
+@@ -251,16 +242,15 @@
+ static struct resource orion5x_i2c_resources[] = {
+       {
+-              .name   = "i2c base",
+-              .start  = I2C_PHYS_BASE,
+-              .end    = I2C_PHYS_BASE + 0x20 -1,
+-              .flags  = IORESOURCE_MEM,
+-      },
+-      {
+-              .name   = "i2c irq",
+-              .start  = IRQ_ORION5X_I2C,
+-              .end    = IRQ_ORION5X_I2C,
+-              .flags  = IORESOURCE_IRQ,
++              .name   = "i2c base",
++              .start  = I2C_PHYS_BASE,
++              .end    = I2C_PHYS_BASE + 0x20 -1,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .name   = "i2c irq",
++              .start  = IRQ_ORION5X_I2C,
++              .end    = IRQ_ORION5X_I2C,
++              .flags  = IORESOURCE_IRQ,
+       },
+ };
+@@ -270,7 +260,7 @@
+       .num_resources  = ARRAY_SIZE(orion5x_i2c_resources),
+       .resource       = orion5x_i2c_resources,
+       .dev            = {
+-              .platform_data = &orion5x_i2c_pdata,
++              .platform_data  = &orion5x_i2c_pdata,
+       },
+ };
+@@ -278,28 +268,27 @@
+  * Sata port
+  ****************************************************************************/
+ static struct resource orion5x_sata_resources[] = {
+-        {
+-                .name   = "sata base",
+-                .start  = ORION5X_SATA_PHYS_BASE,
+-                .end    = ORION5X_SATA_PHYS_BASE + 0x5000 - 1,
+-                .flags  = IORESOURCE_MEM,
+-        },
+       {
+-                .name   = "sata irq",
+-                .start  = IRQ_ORION5X_SATA,
+-                .end    = IRQ_ORION5X_SATA,
+-                .flags  = IORESOURCE_IRQ,
+-        },
++              .name   = "sata base",
++              .start  = ORION5X_SATA_PHYS_BASE,
++              .end    = ORION5X_SATA_PHYS_BASE + 0x5000 - 1,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .name   = "sata irq",
++              .start  = IRQ_ORION5X_SATA,
++              .end    = IRQ_ORION5X_SATA,
++              .flags  = IORESOURCE_IRQ,
++      },
+ };
+ static struct platform_device orion5x_sata = {
+-      .name           = "sata_mv",
+-      .id             = 0,
++      .name           = "sata_mv",
++      .id             = 0,
+       .dev            = {
+               .coherent_dma_mask      = 0xffffffff,
+       },
+-      .num_resources  = ARRAY_SIZE(orion5x_sata_resources),
+-      .resource       = orion5x_sata_resources,
++      .num_resources  = ARRAY_SIZE(orion5x_sata_resources),
++      .resource       = orion5x_sata_resources,
+ };
+ void __init orion5x_sata_init(struct mv_sata_platform_data *sata_data)
+@@ -319,7 +308,7 @@
+ }
+ struct sys_timer orion5x_timer = {
+-        .init = orion5x_timer_init,
++      .init = orion5x_timer_init,
+ };
+ /*****************************************************************************
+--- a/arch/arm/mach-orion5x/db88f5281-setup.c
++++ b/arch/arm/mach-orion5x/db88f5281-setup.c
+@@ -86,7 +86,7 @@
+       .name           = "physmap-flash",
+       .id             = 0,
+       .dev            = {
+-              .platform_data = &db88f5281_boot_flash_data,
++              .platform_data  = &db88f5281_boot_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &db88f5281_boot_flash_resource,
+@@ -110,7 +110,7 @@
+       .name           = "physmap-flash",
+       .id             = 1,
+       .dev            = {
+-              .platform_data = &db88f5281_nor_flash_data,
++              .platform_data  = &db88f5281_nor_flash_data,
+       },
+       .num_resources  = 1,
+       .resource       = &db88f5281_nor_flash_resource,
+@@ -125,18 +125,15 @@
+               .name = "kernel",
+               .offset = 0,
+               .size = SZ_2M,
+-      },
+-      {
++      }, {
+               .name = "root",
+               .offset = SZ_2M,
+               .size = (SZ_16M - SZ_2M),
+-      },
+-      {
++      }, {
+               .name = "user",
+               .offset = SZ_16M,
+               .size = SZ_8M,
+-      },
+-      {
++      }, {
+               .name = "recovery",
+               .offset = (SZ_16M + SZ_8M),
+               .size = SZ_8M,
+--- a/arch/arm/mach-orion5x/dns323-setup.c
++++ b/arch/arm/mach-orion5x/dns323-setup.c
+@@ -119,7 +119,7 @@
+               .name   = "u-boot",
+               .size   = 0x00030000,
+               .offset = 0x007d0000,
+-      }
++      },
+ };
+ static struct physmap_flash_data dns323_nor_flash_data = {
+@@ -137,7 +137,9 @@
+ static struct platform_device dns323_nor_flash = {
+       .name           = "physmap-flash",
+       .id             = 0,
+-      .dev            = { .platform_data = &dns323_nor_flash_data, },
++      .dev            = {
++              .platform_data  = &dns323_nor_flash_data,
++      },
+       .resource       = &dns323_nor_flash_resource,
+       .num_resources  = 1,
+ };
+@@ -170,7 +172,9 @@
+ static struct platform_device dns323_gpio_leds = {
+       .name           = "leds-gpio",
+       .id             = -1,
+-      .dev            = { .platform_data = &dns323_led_data, },
++      .dev            = {
++              .platform_data  = &dns323_led_data,
++      },
+ };
+ /****************************************************************************
+@@ -183,25 +187,26 @@
+               .gpio           = DNS323_GPIO_KEY_RESET,
+               .desc           = "Reset Button",
+               .active_low     = 1,
+-      },
+-      {
++      }, {
+               .code           = KEY_POWER,
+               .gpio           = DNS323_GPIO_KEY_POWER,
+               .desc           = "Power Button",
+               .active_low     = 1,
+-      }
++      },
+ };
+ static struct gpio_keys_platform_data dns323_button_data = {
+       .buttons        = dns323_buttons,
+-      .nbuttons       = ARRAY_SIZE(dns323_buttons),
++      .nbuttons       = ARRAY_SIZE(dns323_buttons),
+ };
+ static struct platform_device dns323_button_device = {
+       .name           = "gpio-keys",
+       .id             = -1,
+       .num_resources  = 0,
+-      .dev            = { .platform_data  = &dns323_button_data, },
++      .dev            = {
++              .platform_data  = &dns323_button_data,
++      },
+ };
+ /****************************************************************************
+@@ -225,17 +230,15 @@
+ static struct i2c_board_info __initdata dns323_i2c_devices[] = {
+       {
+               I2C_BOARD_INFO("g760a", 0x3e),
+-      },
+ #if 0
+       /* this entry requires the new-style driver model lm75 driver,
+        * for the meantime "insmod lm75.ko force_lm75=0,0x48" is needed */
+-      {
++      }, {
+               I2C_BOARD_INFO("g751", 0x48),
+-      },
+ #endif
+-      {
++      }, {
+               I2C_BOARD_INFO("m41t80", 0x68),
+-      }
++      },
+ };
+ /* DNS-323 specific power off method */
+@@ -292,8 +295,8 @@
+       orion5x_gpio_set_valid_pins(0x07f6);
+       /* register dns323 specific power-off method */
+-      if ((gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0)
+-          || (gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0))
++      if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
++          gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
+               pr_err("DNS323: failed to setup power-off GPIO\n");
+       pm_power_off = dns323_power_off;
+--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
++++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
+@@ -53,13 +53,11 @@
+               .name   = "uImage",
+               .offset = 0,
+               .size   = SZ_4M,
+-      },
+-      {
++      }, {
+               .name   = "rootfs",
+               .offset = SZ_4M,
+               .size   = SZ_64M,
+-      },
+-      {
++      }, {
+               .name   = "extra",
+               .offset = SZ_4M + SZ_64M,
+               .size   = SZ_256M - (SZ_4M + SZ_64M),
+@@ -175,7 +173,7 @@
+  * SATA
+  ****************************************************************************/
+ static struct mv_sata_platform_data kurobox_pro_sata_data = {
+-      .n_ports        = 2,
++      .n_ports        = 2,
+ };
+ /*****************************************************************************
+--- a/arch/arm/mach-orion5x/pci.c
++++ b/arch/arm/mach-orion5x/pci.c
+@@ -240,13 +240,13 @@
+  * PCI Address Decode Windows registers
+  */
+ #define PCI_BAR_SIZE_DDR_CS(n)        (((n) == 0) ? ORION5X_PCI_REG(0xc08) : \
+-                              ((n) == 1) ? ORION5X_PCI_REG(0xd08) :  \
+-                              ((n) == 2) ? ORION5X_PCI_REG(0xc0c) :  \
+-                              ((n) == 3) ? ORION5X_PCI_REG(0xd0c) : 0)
+-#define PCI_BAR_REMAP_DDR_CS(n)       (((n) ==0) ? ORION5X_PCI_REG(0xc48) :  \
+-                              ((n) == 1) ? ORION5X_PCI_REG(0xd48) :  \
+-                              ((n) == 2) ? ORION5X_PCI_REG(0xc4c) :  \
+-                              ((n) == 3) ? ORION5X_PCI_REG(0xd4c) : 0)
++                               ((n) == 1) ? ORION5X_PCI_REG(0xd08) : \
++                               ((n) == 2) ? ORION5X_PCI_REG(0xc0c) : \
++                               ((n) == 3) ? ORION5X_PCI_REG(0xd0c) : 0)
++#define PCI_BAR_REMAP_DDR_CS(n)       (((n) == 0) ? ORION5X_PCI_REG(0xc48) : \
++                               ((n) == 1) ? ORION5X_PCI_REG(0xd48) : \
++                               ((n) == 2) ? ORION5X_PCI_REG(0xc4c) : \
++                               ((n) == 3) ? ORION5X_PCI_REG(0xd4c) : 0)
+ #define PCI_BAR_ENABLE                ORION5X_PCI_REG(0xc3c)
+ #define PCI_ADDR_DECODE_CTRL  ORION5X_PCI_REG(0xd3c)
+--- a/arch/arm/mach-orion5x/rd88f5182-setup.c
++++ b/arch/arm/mach-orion5x/rd88f5182-setup.c
+@@ -125,6 +125,7 @@
+               leds_event = rd88f5182_dbgled_event;
+       }
++
+       return 0;
+ }
+@@ -234,7 +235,7 @@
+  * Sata
+  ****************************************************************************/
+ static struct mv_sata_platform_data rd88f5182_sata_data = {
+-      .n_ports        = 2,
++      .n_ports        = 2,
+ };
+ /*****************************************************************************
+--- a/arch/arm/mach-orion5x/ts209-setup.c
++++ b/arch/arm/mach-orion5x/ts209-setup.c
+@@ -47,52 +47,54 @@
+  ***************************************************************************/
+ static struct mtd_partition qnap_ts209_partitions[] = {
+       {
+-              .name       = "U-Boot",
+-              .size       = 0x00080000,
+-              .offset     = 0x00780000,
+-              .mask_flags = MTD_WRITEABLE,
++              .name           = "U-Boot",
++              .size           = 0x00080000,
++              .offset         = 0x00780000,
++              .mask_flags     = MTD_WRITEABLE,
+       }, {
+-              .name   = "Kernel",
+-              .size   = 0x00200000,
+-              .offset = 0,
++              .name           = "Kernel",
++              .size           = 0x00200000,
++              .offset         = 0,
+       }, {
+-              .name   = "RootFS1",
+-              .size   = 0x00400000,
+-              .offset = 0x00200000,
++              .name           = "RootFS1",
++              .size           = 0x00400000,
++              .offset         = 0x00200000,
+       }, {
+-              .name   = "RootFS2",
+-              .size   = 0x00100000,
+-              .offset = 0x00600000,
++              .name           = "RootFS2",
++              .size           = 0x00100000,
++              .offset         = 0x00600000,
+       }, {
+-              .name   = "U-Boot Config",
+-              .size   = 0x00020000,
+-              .offset = 0x00760000,
++              .name           = "U-Boot Config",
++              .size           = 0x00020000,
++              .offset         = 0x00760000,
+       }, {
+-              .name       = "NAS Config",
+-              .size       = 0x00060000,
+-              .offset     = 0x00700000,
+-              .mask_flags = MTD_WRITEABLE,
+-      }
++              .name           = "NAS Config",
++              .size           = 0x00060000,
++              .offset         = 0x00700000,
++              .mask_flags     = MTD_WRITEABLE,
++      },
+ };
+ static struct physmap_flash_data qnap_ts209_nor_flash_data = {
+-      .width    = 1,
+-      .parts    = qnap_ts209_partitions,
+-      .nr_parts = ARRAY_SIZE(qnap_ts209_partitions)
++      .width          = 1,
++      .parts          = qnap_ts209_partitions,
++      .nr_parts       = ARRAY_SIZE(qnap_ts209_partitions)
+ };
+ static struct resource qnap_ts209_nor_flash_resource = {
+-      .flags = IORESOURCE_MEM,
+-      .start = QNAP_TS209_NOR_BOOT_BASE,
+-      .end   = QNAP_TS209_NOR_BOOT_BASE + QNAP_TS209_NOR_BOOT_SIZE - 1,
++      .flags  = IORESOURCE_MEM,
++      .start  = QNAP_TS209_NOR_BOOT_BASE,
++      .end    = QNAP_TS209_NOR_BOOT_BASE + QNAP_TS209_NOR_BOOT_SIZE - 1,
+ };
+ static struct platform_device qnap_ts209_nor_flash = {
+-      .name          = "physmap-flash",
+-      .id            = 0,
+-      .dev           = { .platform_data = &qnap_ts209_nor_flash_data, },
+-      .resource      = &qnap_ts209_nor_flash_resource,
+-      .num_resources = 1,
++      .name           = "physmap-flash",
++      .id             = 0,
++      .dev            = {
++              .platform_data  = &qnap_ts209_nor_flash_data,
++      },
++      .resource       = &qnap_ts209_nor_flash_resource,
++      .num_resources  = 1,
+ };
+ /*****************************************************************************
+@@ -164,12 +166,12 @@
+ }
+ static struct hw_pci qnap_ts209_pci __initdata = {
+-      .nr_controllers = 2,
+-      .preinit        = qnap_ts209_pci_preinit,
+-      .swizzle        = pci_std_swizzle,
+-      .setup          = orion5x_pci_sys_setup,
+-      .scan           = orion5x_pci_sys_scan_bus,
+-      .map_irq        = qnap_ts209_pci_map_irq,
++      .nr_controllers = 2,
++      .preinit        = qnap_ts209_pci_preinit,
++      .swizzle        = pci_std_swizzle,
++      .setup          = orion5x_pci_sys_setup,
++      .scan           = orion5x_pci_sys_scan_bus,
++      .map_irq        = qnap_ts209_pci_map_irq,
+ };
+ static int __init qnap_ts209_pci_init(void)
+@@ -187,8 +189,8 @@
+  ****************************************************************************/
+ static struct mv643xx_eth_platform_data qnap_ts209_eth_data = {
+-      .phy_addr       = 8,
+-      .force_phy_addr = 1,
++      .phy_addr       = 8,
++      .force_phy_addr = 1,
+ };
+ static int __init parse_hex_nibble(char n)
+@@ -280,7 +282,7 @@
+ static struct i2c_board_info __initdata qnap_ts209_i2c_rtc = {
+       I2C_BOARD_INFO("s35390a", 0x30),
+-       .irq         = 0,
++      .irq    = 0,
+ };
+ /****************************************************************************
+@@ -297,32 +299,33 @@
+               .gpio           = QNAP_TS209_GPIO_KEY_MEDIA,
+               .desc           = "USB Copy Button",
+               .active_low     = 1,
+-      },
+-      {
++      }, {
+               .code           = KEY_POWER,
+               .gpio           = QNAP_TS209_GPIO_KEY_RESET,
+               .desc           = "Reset Button",
+               .active_low     = 1,
+-      }
++      },
+ };
+ static struct gpio_keys_platform_data qnap_ts209_button_data = {
+       .buttons        = qnap_ts209_buttons,
+-      .nbuttons       = ARRAY_SIZE(qnap_ts209_buttons),
++      .nbuttons       = ARRAY_SIZE(qnap_ts209_buttons),
+ };
+ static struct platform_device qnap_ts209_button_device = {
+       .name           = "gpio-keys",
+       .id             = -1,
+       .num_resources  = 0,
+-      .dev            = { .platform_data  = &qnap_ts209_button_data, },
++      .dev            = {
++              .platform_data  = &qnap_ts209_button_data,
++      },
+ };
+ /*****************************************************************************
+  * SATA
+  ****************************************************************************/
+ static struct mv_sata_platform_data qnap_ts209_sata_data = {
+-      .n_ports        = 2,
++      .n_ports        = 2,
+ };
+ /*****************************************************************************
+@@ -339,7 +342,7 @@
+  * QNAP TS-[12]09 specific power off method via UART1-attached PIC
+  */
+-#define UART1_REG(x)  (UART1_VIRT_BASE + ((UART_##x) << 2))
++#define UART1_REG(x)  (UART1_VIRT_BASE + ((UART_##x) << 2))
+ static void qnap_ts209_power_off(void)
+ {
+@@ -372,7 +375,7 @@
+        * Setup flash mapping
+        */
+       orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE,
+-                          QNAP_TS209_NOR_BOOT_SIZE);
++                                 QNAP_TS209_NOR_BOOT_SIZE);
+       /*
+        * Open a special address decode windows for the PCIe WA.
+@@ -432,7 +435,7 @@
+ }
+ MACHINE_START(TS209, "QNAP TS-109/TS-209")
+-      /* Maintainer:  Byron Bradley <byron.bbradley@gmail.com> */
++      /* Maintainer: Byron Bradley <byron.bbradley@gmail.com> */
+       .phys_io        = ORION5X_REGS_PHYS_BASE,
+       .io_pg_offst    = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
+       .boot_params    = 0x00000100,
+--- a/arch/arm/mm/proc-feroceon.S
++++ b/arch/arm/mm/proc-feroceon.S
+@@ -454,13 +454,13 @@
+ __feroceon_old_id_proc_info:
+       .long   0x41069260
+       .long   0xfffffff0
+-      .long   PMD_TYPE_SECT | \
++      .long   PMD_TYPE_SECT | \
+               PMD_SECT_BUFFERABLE | \
+               PMD_SECT_CACHEABLE | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
+-      .long   PMD_TYPE_SECT | \
++      .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
+@@ -480,13 +480,13 @@
+ __feroceon_proc_info:
+       .long   0x56055310
+       .long   0xfffffff0
+-      .long   PMD_TYPE_SECT | \
++      .long   PMD_TYPE_SECT | \
+               PMD_SECT_BUFFERABLE | \
+               PMD_SECT_CACHEABLE | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
+-      .long   PMD_TYPE_SECT | \
++      .long   PMD_TYPE_SECT | \
+               PMD_BIT4 | \
+               PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ
diff --git a/target/linux/orion/patches/004-make_window_setup_a_little_more_safe.patch b/target/linux/orion/patches/004-make_window_setup_a_little_more_safe.patch
new file mode 100644 (file)
index 0000000..f5f1de4
--- /dev/null
@@ -0,0 +1,79 @@
+Currently, Orion window setup uses hardcoded window indexes for each
+of the boot/cs0/cs1/cs2/PCIe WA windows.  The static window allocation
+used can clash if board support code will ever attempt to configure
+both a dev2 and a PCIe WA window, as both of those use CPU mbus window
+#7 at present.
+
+This patch keeps track of the last used window, and opens subsequently
+requested windows sequentially, starting from 4.  (Windows 0-3 are used
+as MEM/IO windows for the PCI/PCIe buses.)
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/addr-map.c |   20 +++++++++++++++-----
+ 1 files changed, 15 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/mach-orion5x/addr-map.c
++++ b/arch/arm/mach-orion5x/addr-map.c
+@@ -70,6 +70,7 @@
+ struct mbus_dram_target_info orion5x_mbus_dram_info;
++static int __initdata win_alloc_count;
+ static int __init orion5x_cpu_win_can_remap(int win)
+ {
+@@ -87,6 +88,9 @@
+ static void __init setup_cpu_win(int win, u32 base, u32 size,
+                                u8 target, u8 attr, int remap)
+ {
++      if (win >= 8)
++              panic("setup_cpu_win: trying to allocate window %d\n", win);
++
+       orion5x_write(CPU_WIN_BASE(win), base & 0xffff0000);
+       orion5x_write(CPU_WIN_CTRL(win),
+               ((size - 1) & 0xffff0000) | (attr << 8) | (target << 4) | 1);
+@@ -128,6 +132,7 @@
+               TARGET_PCIE, ATTR_PCIE_MEM, -1);
+       setup_cpu_win(3, ORION5X_PCI_MEM_PHYS_BASE, ORION5X_PCI_MEM_SIZE,
+               TARGET_PCI, ATTR_PCI_MEM, -1);
++      win_alloc_count = 4;
+       /*
+        * Setup MBUS dram target info.
+@@ -156,25 +161,30 @@
+ void __init orion5x_setup_dev_boot_win(u32 base, u32 size)
+ {
+-      setup_cpu_win(4, base, size, TARGET_DEV_BUS, ATTR_DEV_BOOT, -1);
++      setup_cpu_win(win_alloc_count++, base, size,
++                    TARGET_DEV_BUS, ATTR_DEV_BOOT, -1);
+ }
+ void __init orion5x_setup_dev0_win(u32 base, u32 size)
+ {
+-      setup_cpu_win(5, base, size, TARGET_DEV_BUS, ATTR_DEV_CS0, -1);
++      setup_cpu_win(win_alloc_count++, base, size,
++                    TARGET_DEV_BUS, ATTR_DEV_CS0, -1);
+ }
+ void __init orion5x_setup_dev1_win(u32 base, u32 size)
+ {
+-      setup_cpu_win(6, base, size, TARGET_DEV_BUS, ATTR_DEV_CS1, -1);
++      setup_cpu_win(win_alloc_count++, base, size,
++                    TARGET_DEV_BUS, ATTR_DEV_CS1, -1);
+ }
+ void __init orion5x_setup_dev2_win(u32 base, u32 size)
+ {
+-      setup_cpu_win(7, base, size, TARGET_DEV_BUS, ATTR_DEV_CS2, -1);
++      setup_cpu_win(win_alloc_count++, base, size,
++                    TARGET_DEV_BUS, ATTR_DEV_CS2, -1);
+ }
+ void __init orion5x_setup_pcie_wa_win(u32 base, u32 size)
+ {
+-      setup_cpu_win(7, base, size, TARGET_PCIE, ATTR_PCIE_WA, -1);
++      setup_cpu_win(win_alloc_count++, base, size,
++                    TARGET_PCIE, ATTR_PCIE_WA, -1);
+ }
diff --git a/target/linux/orion/patches/005-dram_mapping_granularity_is_64kib.patch b/target/linux/orion/patches/005-dram_mapping_granularity_is_64kib.patch
new file mode 100644 (file)
index 0000000..2e7815d
--- /dev/null
@@ -0,0 +1,26 @@
+The DRAM base address and size fields in the CPU's MBUS bridge have
+64KiB granularity, instead of the currently used 16MiB.  Since all
+of the currently supported MBUS peripherals support 64KiB granularity
+as well, this patch changes the Orion address map code to stop
+rounding base addresses down and sizes up to multiples of 16MiB.
+
+Found by Ke Wei <kewei@marvell.com>.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/addr-map.c |    4 ++--
+ 1 files changed, 2 insertions(+), 2 deletions(-)
+
+--- a/arch/arm/mach-orion5x/addr-map.c
++++ b/arch/arm/mach-orion5x/addr-map.c
+@@ -152,8 +152,8 @@
+                       w = &orion5x_mbus_dram_info.cs[cs++];
+                       w->cs_index = i;
+                       w->mbus_attr = 0xf & ~(1 << i);
+-                      w->base = base & 0xff000000;
+-                      w->size = (size | 0x00ffffff) + 1;
++                      w->base = base & 0xffff0000;
++                      w->size = (size | 0x0000ffff) + 1;
+               }
+       }
+       orion5x_mbus_dram_info.num_cs = cs;
diff --git a/target/linux/orion/patches/006-add_a_separate_BRIDGE_INT_TIMER1_CLR_define.patch b/target/linux/orion/patches/006-add_a_separate_BRIDGE_INT_TIMER1_CLR_define.patch
new file mode 100644 (file)
index 0000000..75daedd
--- /dev/null
@@ -0,0 +1,37 @@
+From: Ke Wei <kewei@marvell.com>
+
+Some Feroceon-based SoCs have an MBUS bridge interrupt controller
+that requires writing a one instead of a zero to clear edge
+interrupt sources such as timer expiry.
+
+This patch adds a new BRIDGE_INT_TIMER1_CLR define, which platform
+code can set to either ~BRIDGE_INT_TIMER1 (write-zero-to-clear) or
+BRIDGE_INT_TIMER1 (write-one-to-clear) depending on the platform.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/plat-orion/time.c             |    2 +-
+ include/asm-arm/arch-orion5x/orion5x.h |    1 +
+ 2 files changed, 2 insertions(+), 1 deletions(-)
+
+--- a/arch/arm/plat-orion/time.c
++++ b/arch/arm/plat-orion/time.c
+@@ -74,7 +74,7 @@
+       /*
+        * Clear and enable clockevent timer interrupt.
+        */
+-      writel(~BRIDGE_INT_TIMER1, BRIDGE_CAUSE);
++      writel(BRIDGE_INT_TIMER1_CLR, BRIDGE_CAUSE);
+       u = readl(BRIDGE_MASK);
+       u |= BRIDGE_INT_TIMER1;
+--- a/include/asm-arm/arch-orion5x/orion5x.h
++++ b/include/asm-arm/arch-orion5x/orion5x.h
+@@ -152,6 +152,7 @@
+ #define BRIDGE_MASK           ORION5X_BRIDGE_REG(0x114)
+ #define  BRIDGE_INT_TIMER0    0x0002
+ #define  BRIDGE_INT_TIMER1    0x0004
++#define  BRIDGE_INT_TIMER1_CLR        ~0x0004
+ #define MAIN_IRQ_CAUSE                ORION5X_BRIDGE_REG(0x200)
+ #define MAIN_IRQ_MASK         ORION5X_BRIDGE_REG(0x204)
diff --git a/target/linux/orion/patches/007-annotate_88fr531-vd_cpu_entries.patch b/target/linux/orion/patches/007-annotate_88fr531-vd_cpu_entries.patch
new file mode 100644 (file)
index 0000000..5aab94b
--- /dev/null
@@ -0,0 +1,58 @@
+Annotate the entries for the 88fr531-vd CPU core in
+arch/arm/boot/compressed/head.S and arch/arm/mm/proc-feroceon.S
+with the full name of the core.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/boot/compressed/head.S |    2 +-
+ arch/arm/mm/proc-feroceon.S     |   13 +++++++++----
+ 2 files changed, 10 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/boot/compressed/head.S
++++ b/arch/arm/boot/compressed/head.S
+@@ -623,7 +623,7 @@
+               b       __armv4_mmu_cache_off
+               b       __armv4_mmu_cache_flush
+-              .word   0x56055310              @ Feroceon
++              .word   0x56055310              @ Feroceon 88FR531-vd
+               .word   0xfffffff0
+               b       __armv4_mmu_cache_on
+               b       __armv4_mmu_cache_off
+--- a/arch/arm/mm/proc-feroceon.S
++++ b/arch/arm/mm/proc-feroceon.S
+@@ -445,6 +445,11 @@
+       .asciz  "Feroceon"
+       .size   cpu_feroceon_name, . - cpu_feroceon_name
++      .type   cpu_88fr531_name, #object
++cpu_88fr531_name:
++      .asciz  "Feroceon 88FR531-vd"
++      .size   cpu_88fr531_name, . - cpu_88fr531_name
++
+       .align
+       .section ".proc.info.init", #alloc, #execinstr
+@@ -476,8 +481,8 @@
+       .size   __feroceon_old_id_proc_info, . - __feroceon_old_id_proc_info
+ #endif
+-      .type   __feroceon_proc_info,#object
+-__feroceon_proc_info:
++      .type   __88fr531_proc_info,#object
++__88fr531_proc_info:
+       .long   0x56055310
+       .long   0xfffffff0
+       .long   PMD_TYPE_SECT | \
+@@ -494,9 +499,9 @@
+       .long   cpu_arch_name
+       .long   cpu_elf_name
+       .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP
+-      .long   cpu_feroceon_name
++      .long   cpu_88fr531_name
+       .long   feroceon_processor_functions
+       .long   v4wbi_tlb_fns
+       .long   feroceon_user_fns
+       .long   feroceon_cache_fns
+-      .size   __feroceon_proc_info, . - __feroceon_proc_info
++      .size   __88fr531_proc_info, . - __88fr531_proc_info
diff --git a/target/linux/orion/patches/008-top-level_irqs_are_level-triggered.patch b/target/linux/orion/patches/008-top-level_irqs_are_level-triggered.patch
new file mode 100644 (file)
index 0000000..add1590
--- /dev/null
@@ -0,0 +1,35 @@
+Make it clear that Orion top-level IRQs are level-triggered.  This
+means that we don't need an ->ack() handler, or at least, we don't
+need the ->ack() handler (or the acking part of the ->mask_ack()
+handler) to actually do anything.
+
+Given that, we might as well point our ->mask_ack() handler at the
+->mask() handler instead of providing a dummy ->ack() handler, since
+providing a ->mask_ack() handler on level IRQ sources will prevent
+->ack() from ever being called.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/plat-orion/irq.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+--- a/arch/arm/plat-orion/irq.c
++++ b/arch/arm/plat-orion/irq.c
+@@ -36,8 +36,8 @@
+ static struct irq_chip orion_irq_chip = {
+       .name           = "orion_irq",
+-      .ack            = orion_irq_mask,
+       .mask           = orion_irq_mask,
++      .mask_ack       = orion_irq_mask,
+       .unmask         = orion_irq_unmask,
+ };
+@@ -59,6 +59,7 @@
+               set_irq_chip(irq, &orion_irq_chip);
+               set_irq_chip_data(irq, maskaddr);
+               set_irq_handler(irq, handle_level_irq);
++              irq_desc[irq].status |= IRQ_LEVEL;
+               set_irq_flags(irq, IRQF_VALID);
+       }
+ }
diff --git a/target/linux/orion/patches/009-delete_unused_IO_SPACE_REMAP_define.patch b/target/linux/orion/patches/009-delete_unused_IO_SPACE_REMAP_define.patch
new file mode 100644 (file)
index 0000000..222a6da
--- /dev/null
@@ -0,0 +1,17 @@
+This define isn't used anywhere in the kernel tree -- nuke it.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ include/asm-arm/arch-orion5x/io.h |    1 -
+ 1 files changed, 0 insertions(+), 1 deletions(-)
+
+--- a/include/asm-arm/arch-orion5x/io.h
++++ b/include/asm-arm/arch-orion5x/io.h
+@@ -14,7 +14,6 @@
+ #include "orion5x.h"
+ #define IO_SPACE_LIMIT                0xffffffff
+-#define IO_SPACE_REMAP                ORION5X_PCI_SYS_IO_BASE
+ static inline void __iomem *
+ __arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype)
diff --git a/target/linux/orion/patches/010-move_EHCI_I2C_UART_peripheral_init.patch b/target/linux/orion/patches/010-move_EHCI_I2C_UART_peripheral_init.patch
new file mode 100644 (file)
index 0000000..6f11eef
--- /dev/null
@@ -0,0 +1,710 @@
+This patch moves initialisation of EHCI/I2C/UART platform devices
+from the common orion5x_init() into the board support code.
+
+The rationale behind this is that only the board support code knows
+whether certain peripherals have been brought out on the board, and
+not initialising peripherals that haven't been brought out is
+desirable for example:
+- to reduce user confusion (e.g. seeing both 'eth0' and 'eth1'
+  appear while there is only one ethernet port on the board); and
+- to allow for future power savings (peripherals that have not
+  been brought out can be clock gated off entirely.)
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/common.c            |  226 +++++++++++++++++------------
+ arch/arm/mach-orion5x/common.h            |   35 ++---
+ arch/arm/mach-orion5x/db88f5281-setup.c   |   39 +++---
+ arch/arm/mach-orion5x/dns323-setup.c      |   40 +++---
+ arch/arm/mach-orion5x/kurobox_pro-setup.c |   28 +++--
+ arch/arm/mach-orion5x/rd88f5182-setup.c   |   29 ++--
+ arch/arm/mach-orion5x/ts209-setup.c       |   38 ++---
+ 7 files changed, 240 insertions(+), 195 deletions(-)
+
+--- a/arch/arm/mach-orion5x/common.c
++++ b/arch/arm/mach-orion5x/common.c
+@@ -63,65 +63,20 @@
+       iotable_init(orion5x_io_desc, ARRAY_SIZE(orion5x_io_desc));
+ }
++
+ /*****************************************************************************
+- * UART
++ * EHCI
+  ****************************************************************************/
+-
+-static struct resource orion5x_uart_resources[] = {
+-      {
+-              .start          = UART0_PHYS_BASE,
+-              .end            = UART0_PHYS_BASE + 0xff,
+-              .flags          = IORESOURCE_MEM,
+-      }, {
+-              .start          = IRQ_ORION5X_UART0,
+-              .end            = IRQ_ORION5X_UART0,
+-              .flags          = IORESOURCE_IRQ,
+-      }, {
+-              .start          = UART1_PHYS_BASE,
+-              .end            = UART1_PHYS_BASE + 0xff,
+-              .flags          = IORESOURCE_MEM,
+-      }, {
+-              .start          = IRQ_ORION5X_UART1,
+-              .end            = IRQ_ORION5X_UART1,
+-              .flags          = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static struct plat_serial8250_port orion5x_uart_data[] = {
+-      {
+-              .mapbase        = UART0_PHYS_BASE,
+-              .membase        = (char *)UART0_VIRT_BASE,
+-              .irq            = IRQ_ORION5X_UART0,
+-              .flags          = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
+-              .iotype         = UPIO_MEM,
+-              .regshift       = 2,
+-              .uartclk        = ORION5X_TCLK,
+-      }, {
+-              .mapbase        = UART1_PHYS_BASE,
+-              .membase        = (char *)UART1_VIRT_BASE,
+-              .irq            = IRQ_ORION5X_UART1,
+-              .flags          = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
+-              .iotype         = UPIO_MEM,
+-              .regshift       = 2,
+-              .uartclk        = ORION5X_TCLK,
+-      }, {
+-      },
++static struct orion_ehci_data orion5x_ehci_data = {
++      .dram           = &orion5x_mbus_dram_info,
+ };
+-static struct platform_device orion5x_uart = {
+-      .name                   = "serial8250",
+-      .id                     = PLAT8250_DEV_PLATFORM,
+-      .dev                    = {
+-              .platform_data  = orion5x_uart_data,
+-      },
+-      .resource               = orion5x_uart_resources,
+-      .num_resources          = ARRAY_SIZE(orion5x_uart_resources),
+-};
++static u64 ehci_dmamask = 0xffffffffUL;
+-/*******************************************************************************
+- * USB Controller - 2 interfaces
+- ******************************************************************************/
++/*****************************************************************************
++ * EHCI0
++ ****************************************************************************/
+ static struct resource orion5x_ehci0_resources[] = {
+       {
+               .start  = ORION5X_USB0_PHYS_BASE,
+@@ -134,24 +89,6 @@
+       },
+ };
+-static struct resource orion5x_ehci1_resources[] = {
+-      {
+-              .start  = ORION5X_USB1_PHYS_BASE,
+-              .end    = ORION5X_USB1_PHYS_BASE + SZ_4K - 1,
+-              .flags  = IORESOURCE_MEM,
+-      }, {
+-              .start  = IRQ_ORION5X_USB1_CTRL,
+-              .end    = IRQ_ORION5X_USB1_CTRL,
+-              .flags  = IORESOURCE_IRQ,
+-      },
+-};
+-
+-static struct orion_ehci_data orion5x_ehci_data = {
+-      .dram           = &orion5x_mbus_dram_info,
+-};
+-
+-static u64 ehci_dmamask = 0xffffffffUL;
+-
+ static struct platform_device orion5x_ehci0 = {
+       .name           = "orion-ehci",
+       .id             = 0,
+@@ -164,6 +101,27 @@
+       .num_resources  = ARRAY_SIZE(orion5x_ehci0_resources),
+ };
++void __init orion5x_ehci0_init(void)
++{
++      platform_device_register(&orion5x_ehci0);
++}
++
++
++/*****************************************************************************
++ * EHCI1
++ ****************************************************************************/
++static struct resource orion5x_ehci1_resources[] = {
++      {
++              .start  = ORION5X_USB1_PHYS_BASE,
++              .end    = ORION5X_USB1_PHYS_BASE + SZ_4K - 1,
++              .flags  = IORESOURCE_MEM,
++      }, {
++              .start  = IRQ_ORION5X_USB1_CTRL,
++              .end    = IRQ_ORION5X_USB1_CTRL,
++              .flags  = IORESOURCE_IRQ,
++      },
++};
++
+ static struct platform_device orion5x_ehci1 = {
+       .name           = "orion-ehci",
+       .id             = 1,
+@@ -176,11 +134,15 @@
+       .num_resources  = ARRAY_SIZE(orion5x_ehci1_resources),
+ };
++void __init orion5x_ehci1_init(void)
++{
++      platform_device_register(&orion5x_ehci1);
++}
++
++
+ /*****************************************************************************
+- * Gigabit Ethernet port
+- * (The Orion and Discovery (MV643xx) families use the same Ethernet driver)
++ * GigE
+  ****************************************************************************/
+-
+ struct mv643xx_eth_shared_platform_data orion5x_eth_shared_data = {
+       .dram           = &orion5x_mbus_dram_info,
+       .t_clk          = ORION5X_TCLK,
+@@ -229,11 +191,10 @@
+       platform_device_register(&orion5x_eth);
+ }
++
+ /*****************************************************************************
+- * I2C controller
+- * (The Orion and Discovery (MV643xx) families share the same I2C controller)
++ * I2C
+  ****************************************************************************/
+-
+ static struct mv64xxx_i2c_pdata orion5x_i2c_pdata = {
+       .freq_m         = 8, /* assumes 166 MHz TCLK */
+       .freq_n         = 3,
+@@ -244,7 +205,7 @@
+       {
+               .name   = "i2c base",
+               .start  = I2C_PHYS_BASE,
+-              .end    = I2C_PHYS_BASE + 0x20 -1,
++              .end    = I2C_PHYS_BASE + 0x1f,
+               .flags  = IORESOURCE_MEM,
+       }, {
+               .name   = "i2c irq",
+@@ -264,8 +225,14 @@
+       },
+ };
++void __init orion5x_i2c_init(void)
++{
++      platform_device_register(&orion5x_i2c);
++}
++
++
+ /*****************************************************************************
+- * Sata port
++ * SATA
+  ****************************************************************************/
+ static struct resource orion5x_sata_resources[] = {
+       {
+@@ -298,10 +265,98 @@
+       platform_device_register(&orion5x_sata);
+ }
++
+ /*****************************************************************************
+- * Time handling
++ * UART0
++ ****************************************************************************/
++static struct plat_serial8250_port orion5x_uart0_data[] = {
++      {
++              .mapbase        = UART0_PHYS_BASE,
++              .membase        = (char *)UART0_VIRT_BASE,
++              .irq            = IRQ_ORION5X_UART0,
++              .flags          = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
++              .iotype         = UPIO_MEM,
++              .regshift       = 2,
++              .uartclk        = ORION5X_TCLK,
++      }, {
++      },
++};
++
++static struct resource orion5x_uart0_resources[] = {
++      {
++              .start          = UART0_PHYS_BASE,
++              .end            = UART0_PHYS_BASE + 0xff,
++              .flags          = IORESOURCE_MEM,
++      }, {
++              .start          = IRQ_ORION5X_UART0,
++              .end            = IRQ_ORION5X_UART0,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device orion5x_uart0 = {
++      .name                   = "serial8250",
++      .id                     = PLAT8250_DEV_PLATFORM,
++      .dev                    = {
++              .platform_data  = orion5x_uart0_data,
++      },
++      .resource               = orion5x_uart0_resources,
++      .num_resources          = ARRAY_SIZE(orion5x_uart0_resources),
++};
++
++void __init orion5x_uart0_init(void)
++{
++      platform_device_register(&orion5x_uart0);
++}
++
++
++/*****************************************************************************
++ * UART1
+  ****************************************************************************/
++static struct plat_serial8250_port orion5x_uart1_data[] = {
++      {
++              .mapbase        = UART1_PHYS_BASE,
++              .membase        = (char *)UART1_VIRT_BASE,
++              .irq            = IRQ_ORION5X_UART1,
++              .flags          = UPF_SKIP_TEST | UPF_BOOT_AUTOCONF,
++              .iotype         = UPIO_MEM,
++              .regshift       = 2,
++              .uartclk        = ORION5X_TCLK,
++      }, {
++      },
++};
++
++static struct resource orion5x_uart1_resources[] = {
++      {
++              .start          = UART1_PHYS_BASE,
++              .end            = UART1_PHYS_BASE + 0xff,
++              .flags          = IORESOURCE_MEM,
++      }, {
++              .start          = IRQ_ORION5X_UART1,
++              .end            = IRQ_ORION5X_UART1,
++              .flags          = IORESOURCE_IRQ,
++      },
++};
++
++static struct platform_device orion5x_uart1 = {
++      .name                   = "serial8250",
++      .id                     = PLAT8250_DEV_PLATFORM1,
++      .dev                    = {
++              .platform_data  = orion5x_uart1_data,
++      },
++      .resource               = orion5x_uart1_resources,
++      .num_resources          = ARRAY_SIZE(orion5x_uart1_resources),
++};
++
++void __init orion5x_uart1_init(void)
++{
++      platform_device_register(&orion5x_uart1);
++}
++
++/*****************************************************************************
++ * Time handling
++ ****************************************************************************/
+ static void orion5x_timer_init(void)
+ {
+       orion_time_init(IRQ_ORION5X_BRIDGE, ORION5X_TCLK);
+@@ -311,10 +366,10 @@
+       .init = orion5x_timer_init,
+ };
++
+ /*****************************************************************************
+  * General
+  ****************************************************************************/
+-
+ /*
+  * Identify device ID and rev from PCIe configuration header space '0'.
+  */
+@@ -359,15 +414,6 @@
+        * Setup Orion address map
+        */
+       orion5x_setup_cpu_mbus_bridge();
+-
+-      /*
+-       * Register devices.
+-       */
+-      platform_device_register(&orion5x_uart);
+-      platform_device_register(&orion5x_ehci0);
+-      if (dev == MV88F5182_DEV_ID)
+-              platform_device_register(&orion5x_ehci1);
+-      platform_device_register(&orion5x_i2c);
+ }
+ /*
+--- a/arch/arm/mach-orion5x/common.h
++++ b/arch/arm/mach-orion5x/common.h
+@@ -1,10 +1,12 @@
+ #ifndef __ARCH_ORION5X_COMMON_H
+ #define __ARCH_ORION5X_COMMON_H
++struct mv643xx_eth_platform_data;
++struct mv_sata_platform_data;
++
+ /*
+  * Basic Orion init functions used early by machine-setup.
+  */
+-
+ void orion5x_map_io(void);
+ void orion5x_init_irq(void);
+ void orion5x_init(void);
+@@ -23,13 +25,19 @@
+ void orion5x_setup_dev2_win(u32 base, u32 size);
+ void orion5x_setup_pcie_wa_win(u32 base, u32 size);
++void orion5x_ehci0_init(void);
++void orion5x_ehci1_init(void);
++void orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data);
++void orion5x_i2c_init(void);
++void orion5x_sata_init(struct mv_sata_platform_data *sata_data);
++void orion5x_uart0_init(void);
++void orion5x_uart1_init(void);
++
+ /*
+- * Shared code used internally by other Orion core functions.
+- * (/mach-orion/pci.c)
++ * PCIe/PCI functions.
+  */
+-
+-struct pci_sys_data;
+ struct pci_bus;
++struct pci_sys_data;
+ void orion5x_pcie_id(u32 *dev, u32 *rev);
+ int orion5x_pci_sys_setup(int nr, struct pci_sys_data *sys);
+@@ -40,26 +48,9 @@
+  * Valid GPIO pins according to MPP setup, used by machine-setup.
+  * (/mach-orion/gpio.c).
+  */
+-
+ void orion5x_gpio_set_valid_pins(u32 pins);
+ void gpio_display(void);      /* debug */
+-/*
+- * Pull in Orion Ethernet platform_data, used by machine-setup
+- */
+-
+-struct mv643xx_eth_platform_data;
+-
+-void orion5x_eth_init(struct mv643xx_eth_platform_data *eth_data);
+-
+-/*
+- * Orion Sata platform_data, used by machine-setup
+- */
+-
+-struct mv_sata_platform_data;
+-
+-void orion5x_sata_init(struct mv_sata_platform_data *sata_data);
+-
+ struct machine_desc;
+ struct meminfo;
+ struct tag;
+--- a/arch/arm/mach-orion5x/db88f5281-setup.c
++++ b/arch/arm/mach-orion5x/db88f5281-setup.c
+@@ -298,13 +298,6 @@
+ /*****************************************************************************
+  * General Setup
+  ****************************************************************************/
+-
+-static struct platform_device *db88f5281_devs[] __initdata = {
+-      &db88f5281_boot_flash,
+-      &db88f5281_nor_flash,
+-      &db88f5281_nand_flash,
+-};
+-
+ static void __init db88f5281_init(void)
+ {
+       /*
+@@ -313,15 +306,6 @@
+       orion5x_init();
+       /*
+-       * Setup the CPU address decode windows for our on-board devices
+-       */
+-      orion5x_setup_dev_boot_win(DB88F5281_NOR_BOOT_BASE,
+-                              DB88F5281_NOR_BOOT_SIZE);
+-      orion5x_setup_dev0_win(DB88F5281_7SEG_BASE, DB88F5281_7SEG_SIZE);
+-      orion5x_setup_dev1_win(DB88F5281_NOR_BASE, DB88F5281_NOR_SIZE);
+-      orion5x_setup_dev2_win(DB88F5281_NAND_BASE, DB88F5281_NAND_SIZE);
+-
+-      /*
+        * Setup Multiplexing Pins:
+        * MPP0: GPIO (USB Over Current)        MPP1: GPIO (USB Vbat input)
+        * MPP2: PCI_REQn[2]                    MPP3: PCI_GNTn[2]
+@@ -342,9 +326,28 @@
+       orion5x_gpio_set_valid_pins(0x00003fc3);
+-      platform_add_devices(db88f5281_devs, ARRAY_SIZE(db88f5281_devs));
+-      i2c_register_board_info(0, &db88f5281_i2c_rtc, 1);
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
+       orion5x_eth_init(&db88f5281_eth_data);
++      orion5x_i2c_init();
++      orion5x_uart0_init();
++      orion5x_uart1_init();
++
++      orion5x_setup_dev_boot_win(DB88F5281_NOR_BOOT_BASE,
++                              DB88F5281_NOR_BOOT_SIZE);
++      platform_device_register(&db88f5281_boot_flash);
++
++      orion5x_setup_dev0_win(DB88F5281_7SEG_BASE, DB88F5281_7SEG_SIZE);
++
++      orion5x_setup_dev1_win(DB88F5281_NOR_BASE, DB88F5281_NOR_SIZE);
++      platform_device_register(&db88f5281_nor_flash);
++
++      orion5x_setup_dev2_win(DB88F5281_NAND_BASE, DB88F5281_NAND_SIZE);
++      platform_device_register(&db88f5281_nand_flash);
++
++      i2c_register_board_info(0, &db88f5281_i2c_rtc, 1);
+ }
+ MACHINE_START(DB88F5281, "Marvell Orion-2 Development Board")
+--- a/arch/arm/mach-orion5x/dns323-setup.c
++++ b/arch/arm/mach-orion5x/dns323-setup.c
+@@ -213,12 +213,6 @@
+  * General Setup
+  */
+-static struct platform_device *dns323_plat_devices[] __initdata = {
+-      &dns323_nor_flash,
+-      &dns323_gpio_leds,
+-      &dns323_button_device,
+-};
+-
+ /*
+  * On the DNS-323 the following devices are attached via I2C:
+  *
+@@ -253,11 +247,6 @@
+       /* Setup basic Orion functions. Need to be called early. */
+       orion5x_init();
+-      /* setup flash mapping
+-       * CS3 holds a 8 MB Spansion S29GL064M90TFIR4
+-       */
+-      orion5x_setup_dev_boot_win(DNS323_NOR_BOOT_BASE, DNS323_NOR_BOOT_SIZE);
+-
+       /* DNS-323 has a Marvell 88X7042 SATA controller attached via PCIe
+        *
+        * Open a special address decode windows for the PCIe WA.
+@@ -294,21 +283,32 @@
+       */
+       orion5x_gpio_set_valid_pins(0x07f6);
+-      /* register dns323 specific power-off method */
+-      if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
+-          gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
+-              pr_err("DNS323: failed to setup power-off GPIO\n");
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      orion5x_eth_init(&dns323_eth_data);
++      orion5x_i2c_init();
++      orion5x_uart0_init();
+-      pm_power_off = dns323_power_off;
++      /* setup flash mapping
++       * CS3 holds a 8 MB Spansion S29GL064M90TFIR4
++       */
++      orion5x_setup_dev_boot_win(DNS323_NOR_BOOT_BASE, DNS323_NOR_BOOT_SIZE);
++      platform_device_register(&dns323_nor_flash);
++
++      platform_device_register(&dns323_gpio_leds);
+-      /* register flash and other platform devices */
+-      platform_add_devices(dns323_plat_devices,
+-                           ARRAY_SIZE(dns323_plat_devices));
++      platform_device_register(&dns323_button_device);
+       i2c_register_board_info(0, dns323_i2c_devices,
+                               ARRAY_SIZE(dns323_i2c_devices));
+-      orion5x_eth_init(&dns323_eth_data);
++      /* register dns323 specific power-off method */
++      if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
++          gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
++              pr_err("DNS323: failed to setup power-off GPIO\n");
++      pm_power_off = dns323_power_off;
+ }
+ /* Warning: D-Link uses a wrong mach-type (=526) in their bootloader */
+--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
++++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
+@@ -188,13 +188,6 @@
+       orion5x_init();
+       /*
+-       * Setup the CPU address decode windows for our devices
+-       */
+-      orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE,
+-                              KUROBOX_PRO_NOR_BOOT_SIZE);
+-      orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE, KUROBOX_PRO_NAND_SIZE);
+-
+-      /*
+        * Open a special address decode windows for the PCIe WA.
+        */
+       orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
+@@ -221,12 +214,27 @@
+       orion5x_gpio_set_valid_pins(0x0000000c);
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      orion5x_ehci1_init();
++      orion5x_eth_init(&kurobox_pro_eth_data);
++      orion5x_i2c_init();
++      orion5x_sata_init(&kurobox_pro_sata_data);
++      orion5x_uart0_init();
++
++      orion5x_setup_dev_boot_win(KUROBOX_PRO_NOR_BOOT_BASE,
++                                 KUROBOX_PRO_NOR_BOOT_SIZE);
+       platform_device_register(&kurobox_pro_nor_flash);
+-      if (machine_is_kurobox_pro())
++
++      if (machine_is_kurobox_pro()) {
++              orion5x_setup_dev0_win(KUROBOX_PRO_NAND_BASE,
++                                     KUROBOX_PRO_NAND_SIZE);
+               platform_device_register(&kurobox_pro_nand_flash);
++      }
++
+       i2c_register_board_info(0, &kurobox_pro_i2c_rtc, 1);
+-      orion5x_eth_init(&kurobox_pro_eth_data);
+-      orion5x_sata_init(&kurobox_pro_sata_data);
+ }
+ #ifdef CONFIG_MACH_KUROBOX_PRO
+--- a/arch/arm/mach-orion5x/rd88f5182-setup.c
++++ b/arch/arm/mach-orion5x/rd88f5182-setup.c
+@@ -241,11 +241,6 @@
+ /*****************************************************************************
+  * General Setup
+  ****************************************************************************/
+-
+-static struct platform_device *rd88f5182_devices[] __initdata = {
+-      &rd88f5182_nor_flash,
+-};
+-
+ static void __init rd88f5182_init(void)
+ {
+       /*
+@@ -254,13 +249,6 @@
+       orion5x_init();
+       /*
+-       * Setup the CPU address decode windows for our devices
+-       */
+-      orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE,
+-                              RD88F5182_NOR_BOOT_SIZE);
+-      orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
+-
+-      /*
+        * Open a special address decode windows for the PCIe WA.
+        */
+       orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
+@@ -296,10 +284,23 @@
+       orion5x_gpio_set_valid_pins(0x000000fb);
+-      platform_add_devices(rd88f5182_devices, ARRAY_SIZE(rd88f5182_devices));
+-      i2c_register_board_info(0, &rd88f5182_i2c_rtc, 1);
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      orion5x_ehci1_init();
+       orion5x_eth_init(&rd88f5182_eth_data);
++      orion5x_i2c_init();
+       orion5x_sata_init(&rd88f5182_sata_data);
++      orion5x_uart0_init();
++
++      orion5x_setup_dev_boot_win(RD88F5182_NOR_BOOT_BASE,
++                                 RD88F5182_NOR_BOOT_SIZE);
++
++      orion5x_setup_dev1_win(RD88F5182_NOR_BASE, RD88F5182_NOR_SIZE);
++      platform_device_register(&rd88f5182_nor_flash);
++
++      i2c_register_board_info(0, &rd88f5182_i2c_rtc, 1);
+ }
+ MACHINE_START(RD88F5182, "Marvell Orion-NAS Reference Design")
+--- a/arch/arm/mach-orion5x/ts209-setup.c
++++ b/arch/arm/mach-orion5x/ts209-setup.c
+@@ -332,16 +332,9 @@
+  * General Setup
+  ****************************************************************************/
+-
+-static struct platform_device *qnap_ts209_devices[] __initdata = {
+-      &qnap_ts209_nor_flash,
+-      &qnap_ts209_button_device,
+-};
+-
+ /*
+  * QNAP TS-[12]09 specific power off method via UART1-attached PIC
+  */
+-
+ #define UART1_REG(x)  (UART1_VIRT_BASE + ((UART_##x) << 2))
+ static void qnap_ts209_power_off(void)
+@@ -372,12 +365,6 @@
+       orion5x_init();
+       /*
+-       * Setup flash mapping
+-       */
+-      orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE,
+-                                 QNAP_TS209_NOR_BOOT_SIZE);
+-
+-      /*
+        * Open a special address decode windows for the PCIe WA.
+        */
+       orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
+@@ -411,11 +398,22 @@
+       orion5x_write(MPP_16_19_CTRL, 0x5500);
+       orion5x_gpio_set_valid_pins(0x3cc0fff);
+-      /* register ts209 specific power-off method */
+-      pm_power_off = qnap_ts209_power_off;
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      orion5x_ehci1_init();
++      ts209_find_mac_addr();
++      orion5x_eth_init(&qnap_ts209_eth_data);
++      orion5x_i2c_init();
++      orion5x_sata_init(&qnap_ts209_sata_data);
++      orion5x_uart0_init();
++
++      orion5x_setup_dev_boot_win(QNAP_TS209_NOR_BOOT_BASE,
++                                 QNAP_TS209_NOR_BOOT_SIZE);
++      platform_device_register(&qnap_ts209_nor_flash);
+-      platform_add_devices(qnap_ts209_devices,
+-                              ARRAY_SIZE(qnap_ts209_devices));
++      platform_device_register(&qnap_ts209_button_device);
+       /* Get RTC IRQ and register the chip */
+       if (gpio_request(TS209_RTC_GPIO, "rtc") == 0) {
+@@ -428,10 +426,8 @@
+               pr_warning("qnap_ts209_init: failed to get RTC IRQ\n");
+       i2c_register_board_info(0, &qnap_ts209_i2c_rtc, 1);
+-      ts209_find_mac_addr();
+-      orion5x_eth_init(&qnap_ts209_eth_data);
+-
+-      orion5x_sata_init(&qnap_ts209_sata_data);
++      /* register ts209 specific power-off method */
++      pm_power_off = qnap_ts209_power_off;
+ }
+ MACHINE_START(TS209, "QNAP TS-109/TS-209")
diff --git a/target/linux/orion/patches/011-move_setting_up_pcie_wa_window_into_pcie.patch b/target/linux/orion/patches/011-move_setting_up_pcie_wa_window_into_pcie.patch
new file mode 100644 (file)
index 0000000..f6e78d8
--- /dev/null
@@ -0,0 +1,90 @@
+It makes no sense to do PCIe WA window setup in the individual
+board support files while the decision whether or not to use the
+PCIe WA access method is made in a different place, in the PCIe
+support code.
+
+This patch moves the configuration of a PCIe WA window from the
+individual Orion board support files to the central Orion PCIe
+support code.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/dns323-setup.c      |    7 -------
+ arch/arm/mach-orion5x/kurobox_pro-setup.c |    6 ------
+ arch/arm/mach-orion5x/pci.c               |    2 ++
+ arch/arm/mach-orion5x/rd88f5182-setup.c   |    6 ------
+ arch/arm/mach-orion5x/ts209-setup.c       |    6 ------
+ 5 files changed, 2 insertions(+), 25 deletions(-)
+
+--- a/arch/arm/mach-orion5x/dns323-setup.c
++++ b/arch/arm/mach-orion5x/dns323-setup.c
+@@ -247,13 +247,6 @@
+       /* Setup basic Orion functions. Need to be called early. */
+       orion5x_init();
+-      /* DNS-323 has a Marvell 88X7042 SATA controller attached via PCIe
+-       *
+-       * Open a special address decode windows for the PCIe WA.
+-       */
+-      orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
+-                              ORION5X_PCIE_WA_SIZE);
+-
+       /* set MPP to 0 as D-Link's 2.6.12.6 kernel did */
+       orion5x_write(MPP_0_7_CTRL, 0);
+       orion5x_write(MPP_8_15_CTRL, 0);
+--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
++++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
+@@ -188,12 +188,6 @@
+       orion5x_init();
+       /*
+-       * Open a special address decode windows for the PCIe WA.
+-       */
+-      orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
+-                              ORION5X_PCIE_WA_SIZE);
+-
+-      /*
+        * Setup Multiplexing Pins --
+        * MPP[0-1] Not used
+        * MPP[2] GPIO Micon
+--- a/arch/arm/mach-orion5x/pci.c
++++ b/arch/arm/mach-orion5x/pci.c
+@@ -152,6 +152,8 @@
+       if (dev == MV88F5181_DEV_ID || dev == MV88F5182_DEV_ID) {
+               printk(KERN_NOTICE "Applying Orion-1/Orion-NAS PCIe config "
+                                  "read transaction workaround\n");
++              orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
++                                        ORION5X_PCIE_WA_SIZE);
+               pcie_ops.read = pcie_rd_conf_wa;
+       }
+--- a/arch/arm/mach-orion5x/rd88f5182-setup.c
++++ b/arch/arm/mach-orion5x/rd88f5182-setup.c
+@@ -249,12 +249,6 @@
+       orion5x_init();
+       /*
+-       * Open a special address decode windows for the PCIe WA.
+-       */
+-      orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
+-                              ORION5X_PCIE_WA_SIZE);
+-
+-      /*
+        * Setup Multiplexing Pins --
+        * MPP[0] Debug Led (GPIO - Out)
+        * MPP[1] Debug Led (GPIO - Out)
+--- a/arch/arm/mach-orion5x/ts209-setup.c
++++ b/arch/arm/mach-orion5x/ts209-setup.c
+@@ -365,12 +365,6 @@
+       orion5x_init();
+       /*
+-       * Open a special address decode windows for the PCIe WA.
+-       */
+-      orion5x_setup_pcie_wa_win(ORION5X_PCIE_WA_PHYS_BASE,
+-                              ORION5X_PCIE_WA_SIZE);
+-
+-      /*
+        * Setup Multiplexing Pins --
+        * MPP[0] Reserved
+        * MPP[1] USB copy button (0 active)
diff --git a/target/linux/orion/patches/012-rework_mpp_handling.patch b/target/linux/orion/patches/012-rework_mpp_handling.patch
new file mode 100644 (file)
index 0000000..05e1881
--- /dev/null
@@ -0,0 +1,583 @@
+Instead of having board code poke directly into the MPP configuration
+registers, and separately calling orion5x_gpio_set_valid_pins() to
+indicate which MPP pins can be used as GPIO pins, introduce a helper
+function for configuring the roles of each of the MPP pins, and have
+that helper function handle gpio validity internally.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+Acked-by: Sylver Bruneau <sylver.bruneau@googlemail.com>
+---
+ arch/arm/mach-orion5x/Makefile            |    2 +-
+ arch/arm/mach-orion5x/common.h            |    2 +-
+ arch/arm/mach-orion5x/db88f5281-setup.c   |   42 +++++----
+ arch/arm/mach-orion5x/dns323-setup.c      |   50 +++++------
+ arch/arm/mach-orion5x/gpio.c              |    7 +-
+ arch/arm/mach-orion5x/kurobox_pro-setup.c |   41 ++++----
+ arch/arm/mach-orion5x/mpp.c               |  142 +++++++++++++++++++++++++++++
+ arch/arm/mach-orion5x/mpp.h               |   63 +++++++++++++
+ arch/arm/mach-orion5x/rd88f5182-setup.c   |   43 +++++----
+ arch/arm/mach-orion5x/ts209-setup.c       |   43 +++++----
+ 10 files changed, 321 insertions(+), 114 deletions(-)
+ create mode 100644 arch/arm/mach-orion5x/mpp.c
+ create mode 100644 arch/arm/mach-orion5x/mpp.h
+
+--- a/arch/arm/mach-orion5x/Makefile
++++ b/arch/arm/mach-orion5x/Makefile
+@@ -1,4 +1,4 @@
+-obj-y                         += common.o addr-map.o pci.o gpio.o irq.o
++obj-y                         += common.o addr-map.o pci.o gpio.o irq.o mpp.o
+ obj-$(CONFIG_MACH_DB88F5281)  += db88f5281-setup.o
+ obj-$(CONFIG_MACH_RD88F5182)  += rd88f5182-setup.o
+ obj-$(CONFIG_MACH_KUROBOX_PRO)        += kurobox_pro-setup.o
+--- a/arch/arm/mach-orion5x/common.h
++++ b/arch/arm/mach-orion5x/common.h
+@@ -48,7 +48,7 @@
+  * Valid GPIO pins according to MPP setup, used by machine-setup.
+  * (/mach-orion/gpio.c).
+  */
+-void orion5x_gpio_set_valid_pins(u32 pins);
++void orion5x_gpio_set_valid(unsigned pin, int valid);
+ void gpio_display(void);      /* debug */
+ struct machine_desc;
+--- a/arch/arm/mach-orion5x/db88f5281-setup.c
++++ b/arch/arm/mach-orion5x/db88f5281-setup.c
+@@ -27,6 +27,7 @@
+ #include <asm/arch/orion5x.h>
+ #include <asm/plat-orion/orion_nand.h>
+ #include "common.h"
++#include "mpp.h"
+ /*****************************************************************************
+  * DB-88F5281 on board devices
+@@ -305,26 +306,27 @@
+        */
+       orion5x_init();
+-      /*
+-       * Setup Multiplexing Pins:
+-       * MPP0: GPIO (USB Over Current)        MPP1: GPIO (USB Vbat input)
+-       * MPP2: PCI_REQn[2]                    MPP3: PCI_GNTn[2]
+-       * MPP4: PCI_REQn[3]                    MPP5: PCI_GNTn[3]
+-       * MPP6: GPIO (JP0, CON17.2)            MPP7: GPIO (JP1, CON17.1)
+-       * MPP8: GPIO (JP2, CON11.2)            MPP9: GPIO (JP3, CON11.3)
+-       * MPP10: GPIO (RTC int)                MPP11: GPIO (Baud Rate Generator)
+-       * MPP12: GPIO (PCI int 1)              MPP13: GPIO (PCI int 2)
+-       * MPP14: NAND_REn[2]                   MPP15: NAND_WEn[2]
+-       * MPP16: UART1_RX                      MPP17: UART1_TX
+-       * MPP18: UART1_CTS                     MPP19: UART1_RTS
+-       * MPP-DEV: DEV_D[16:31]
+-       */
+-      orion5x_write(MPP_0_7_CTRL, 0x00222203);
+-      orion5x_write(MPP_8_15_CTRL, 0x44000000);
+-      orion5x_write(MPP_16_19_CTRL, 0);
+-      orion5x_write(MPP_DEV_CTRL, 0);
+-
+-      orion5x_gpio_set_valid_pins(0x00003fc3);
++      orion5x_mpp_conf(0, MPP_GPIO);          /* USB Over Current */
++      orion5x_mpp_conf(1, MPP_GPIO);          /* USB Vbat input */
++      orion5x_mpp_conf(2, MPP_PCI_ARB);       /* PCI_REQn[2] */
++      orion5x_mpp_conf(3, MPP_PCI_ARB);       /* PCI_GNTn[2] */
++      orion5x_mpp_conf(4, MPP_PCI_ARB);       /* PCI_REQn[3] */
++      orion5x_mpp_conf(5, MPP_PCI_ARB);       /* PCI_GNTn[3] */
++      orion5x_mpp_conf(6, MPP_GPIO);          /* JP0, CON17.2 */
++      orion5x_mpp_conf(7, MPP_GPIO);          /* JP1, CON17.1 */
++      orion5x_mpp_conf(8, MPP_GPIO);          /* JP2, CON11.2 */
++      orion5x_mpp_conf(9, MPP_GPIO);          /* JP3, CON11.3 */
++      orion5x_mpp_conf(10, MPP_GPIO);         /* RTC int */
++      orion5x_mpp_conf(11, MPP_GPIO);         /* Baud Rate Generator */
++      orion5x_mpp_conf(12, MPP_GPIO);         /* PCI int 1 */
++      orion5x_mpp_conf(13, MPP_GPIO);         /* PCI int 2 */
++      orion5x_mpp_conf(14, MPP_NAND);         /* NAND_REn[2] */
++      orion5x_mpp_conf(15, MPP_NAND);         /* NAND_WEn[2] */
++      orion5x_mpp_conf(16, MPP_UART);         /* UART1_RX */
++      orion5x_mpp_conf(17, MPP_UART);         /* UART1_TX */
++      orion5x_mpp_conf(18, MPP_UART);         /* UART1_CTSn */
++      orion5x_mpp_conf(19, MPP_UART);         /* UART1_RTSn */
++      orion5x_write(MPP_DEV_CTRL, 0);         /* DEV_D[31:16] */
+       /*
+        * Configure peripherals.
+--- a/arch/arm/mach-orion5x/dns323-setup.c
++++ b/arch/arm/mach-orion5x/dns323-setup.c
+@@ -27,6 +27,7 @@
+ #include <asm/mach/pci.h>
+ #include <asm/arch/orion5x.h>
+ #include "common.h"
++#include "mpp.h"
+ #define DNS323_GPIO_LED_RIGHT_AMBER   1
+ #define DNS323_GPIO_LED_LEFT_AMBER    2
+@@ -247,34 +248,27 @@
+       /* Setup basic Orion functions. Need to be called early. */
+       orion5x_init();
+-      /* set MPP to 0 as D-Link's 2.6.12.6 kernel did */
+-      orion5x_write(MPP_0_7_CTRL, 0);
+-      orion5x_write(MPP_8_15_CTRL, 0);
+-      orion5x_write(MPP_16_19_CTRL, 0);
+-      orion5x_write(MPP_DEV_CTRL, 0);
+-
+-      /* Define used GPIO pins
+-
+-        GPIO Map:
+-
+-        |  0 |     | PEX_RST_OUT (not controlled by GPIO)
+-        |  1 | Out | right amber LED (= sata ch0 LED)  (low-active)
+-        |  2 | Out | left  amber LED (= sata ch1 LED)  (low-active)
+-        |  3 | Out | //unknown//
+-        |  4 | Out | power button LED (low-active, together with pin #5)
+-        |  5 | Out | power button LED (low-active, together with pin #4)
+-        |  6 | In  | GMT G751-2f overtemp. shutdown signal (low-active)
+-        |  7 | In  | M41T80 nIRQ/OUT/SQW signal
+-        |  8 | Out | triggers power off (high-active)
+-        |  9 | In  | power button switch (low-active)
+-        | 10 | In  | reset button switch (low-active)
+-        | 11 | Out | //unknown//
+-        | 12 | Out | //unknown//
+-        | 13 | Out | //unknown//
+-        | 14 | Out | //unknown//
+-        | 15 | Out | //unknown//
+-      */
+-      orion5x_gpio_set_valid_pins(0x07f6);
++      orion5x_mpp_conf(0, MPP_PCIE_RST_OUTn);
++      orion5x_mpp_conf(1, MPP_GPIO);          /* right amber LED (sata ch0) */
++      orion5x_mpp_conf(2, MPP_GPIO);          /* left amber LED (sata ch1) */
++      orion5x_mpp_conf(3, MPP_UNUSED);
++      orion5x_mpp_conf(4, MPP_GPIO);          /* power button LED */
++      orion5x_mpp_conf(5, MPP_GPIO);          /* power button LED */
++      orion5x_mpp_conf(6, MPP_GPIO);          /* GMT G751-2f overtemp */
++      orion5x_mpp_conf(7, MPP_GPIO);          /* M41T80 nIRQ/OUT/SQW */
++      orion5x_mpp_conf(8, MPP_GPIO);          /* triggers power off */
++      orion5x_mpp_conf(9, MPP_GPIO);          /* power button switch */
++      orion5x_mpp_conf(10, MPP_GPIO);         /* reset button switch */
++      orion5x_mpp_conf(11, MPP_UNUSED);
++      orion5x_mpp_conf(12, MPP_UNUSED);
++      orion5x_mpp_conf(13, MPP_UNUSED);
++      orion5x_mpp_conf(14, MPP_UNUSED);
++      orion5x_mpp_conf(15, MPP_UNUSED);
++      orion5x_mpp_conf(16, MPP_UNUSED);
++      orion5x_mpp_conf(17, MPP_UNUSED);
++      orion5x_mpp_conf(18, MPP_UNUSED);
++      orion5x_mpp_conf(19, MPP_UNUSED);
++      orion5x_write(MPP_DEV_CTRL, 0);         /* DEV_D[31:16] */
+       /*
+        * Configure peripherals.
+--- a/arch/arm/mach-orion5x/gpio.c
++++ b/arch/arm/mach-orion5x/gpio.c
+@@ -24,9 +24,12 @@
+ static unsigned long gpio_valid[BITS_TO_LONGS(GPIO_MAX)];
+ static const char *gpio_label[GPIO_MAX];  /* non null for allocated GPIOs */
+-void __init orion5x_gpio_set_valid_pins(u32 pins)
++void __init orion5x_gpio_set_valid(unsigned pin, int valid)
+ {
+-      gpio_valid[0] = pins;
++      if (valid)
++              __set_bit(pin, gpio_valid);
++      else
++              __clear_bit(pin, gpio_valid);
+ }
+ /*
+--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
++++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
+@@ -25,6 +25,7 @@
+ #include <asm/arch/orion5x.h>
+ #include <asm/plat-orion/orion_nand.h>
+ #include "common.h"
++#include "mpp.h"
+ /*****************************************************************************
+  * KUROBOX-PRO Info
+@@ -187,26 +188,26 @@
+        */
+       orion5x_init();
+-      /*
+-       * Setup Multiplexing Pins --
+-       * MPP[0-1] Not used
+-       * MPP[2] GPIO Micon
+-       * MPP[3] GPIO RTC
+-       * MPP[4-5] Not used
+-       * MPP[6] Nand Flash REn
+-       * MPP[7] Nand Flash WEn
+-       * MPP[8-11] Not used
+-       * MPP[12] SATA 0 presence Indication
+-       * MPP[13] SATA 1 presence Indication
+-       * MPP[14] SATA 0 active Indication
+-       * MPP[15] SATA 1 active indication
+-       * MPP[16-19] Not used
+-       */
+-      orion5x_write(MPP_0_7_CTRL, 0x44220003);
+-      orion5x_write(MPP_8_15_CTRL, 0x55550000);
+-      orion5x_write(MPP_16_19_CTRL, 0x0);
+-
+-      orion5x_gpio_set_valid_pins(0x0000000c);
++      orion5x_mpp_conf(0, MPP_UNUSED);
++      orion5x_mpp_conf(1, MPP_UNUSED);
++      orion5x_mpp_conf(2, MPP_GPIO);          /* GPIO Micon */
++      orion5x_mpp_conf(3, MPP_GPIO);          /* GPIO Rtc */
++      orion5x_mpp_conf(4, MPP_UNUSED);
++      orion5x_mpp_conf(5, MPP_UNUSED);
++      orion5x_mpp_conf(6, MPP_NAND);          /* NAND Flash REn */
++      orion5x_mpp_conf(7, MPP_NAND);          /* NAND Flash WEn */
++      orion5x_mpp_conf(8, MPP_UNUSED);
++      orion5x_mpp_conf(9, MPP_UNUSED);
++      orion5x_mpp_conf(10, MPP_UNUSED);
++      orion5x_mpp_conf(11, MPP_UNUSED);
++      orion5x_mpp_conf(12, MPP_SATA_LED);     /* SATA 0 presence */
++      orion5x_mpp_conf(13, MPP_SATA_LED);     /* SATA 1 presence */
++      orion5x_mpp_conf(14, MPP_SATA_LED);     /* SATA 0 active */
++      orion5x_mpp_conf(15, MPP_SATA_LED);     /* SATA 1 active */
++      orion5x_mpp_conf(16, MPP_UNUSED);
++      orion5x_mpp_conf(17, MPP_UNUSED);
++      orion5x_mpp_conf(18, MPP_UNUSED);
++      orion5x_mpp_conf(19, MPP_UNUSED);
+       /*
+        * Configure peripherals.
+--- /dev/null
++++ b/arch/arm/mach-orion5x/mpp.c
+@@ -0,0 +1,142 @@
++/*
++ * arch/arm/mach-orion5x/mpp.c
++ *
++ * MPP functions for Marvell Orion 5x SoCs
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2.  This program is licensed "as is" without any
++ * warranty of any kind, whether express or implied.
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/mbus.h>
++#include <asm/hardware.h>
++#include <asm/io.h>
++#include "common.h"
++#include "mpp.h"
++
++static int is_5182(void)
++{
++      u32 dev;
++      u32 rev;
++
++      orion5x_pcie_id(&dev, &rev);
++
++      return !!(dev == MV88F5182_DEV_ID);
++}
++
++static int is_5281(void)
++{
++      u32 dev;
++      u32 rev;
++
++      orion5x_pcie_id(&dev, &rev);
++
++      return !!(dev == MV88F5281_DEV_ID);
++}
++
++static int __init determine_type_encoding(int mpp, enum orion5x_mpp_type type)
++{
++      switch (type) {
++      case MPP_UNUSED:
++      case MPP_GPIO:
++              if (mpp == 0)
++                      return 3;
++              if (mpp >= 1 && mpp <= 15)
++                      return 0;
++              if (mpp >= 16 && mpp <= 19) {
++                      if (is_5182())
++                              return 5;
++                      if (type == MPP_UNUSED)
++                              return 0;
++              }
++              return -1;
++
++      case MPP_PCIE_RST_OUTn:
++              if (mpp == 0)
++                      return 0;
++              return -1;
++
++      case MPP_PCI_ARB:
++              if (mpp >= 0 && mpp <= 7)
++                      return 2;
++              return -1;
++
++      case MPP_PCI_PMEn:
++              if (mpp == 2)
++                      return 3;
++              return -1;
++
++      case MPP_GIGE:
++              if (mpp >= 8 && mpp <= 15)
++                      return 1;
++              return -1;
++
++      case MPP_NAND:
++              if (is_5182() || is_5281()) {
++                      if (mpp >= 4 && mpp <= 7)
++                              return 4;
++                      if (mpp >= 12 && mpp <= 17)
++                              return 4;
++              }
++              return -1;
++
++
++      case MPP_SATA_LED:
++              if (is_5182()) {
++                      if (mpp >= 4 && mpp <= 7)
++                              return 5;
++                      if (mpp >= 12 && mpp <= 15)
++                              return 5;
++              }
++              return -1;
++
++      case MPP_UART:
++              if (mpp >= 16 && mpp <= 19)
++                      return 0;
++              return -1;
++      }
++
++      printk(KERN_INFO "unknown MPP type %d\n", type);
++
++      return -1;
++}
++
++static void __init set_mpp_type(int mpp, int num_type)
++{
++      unsigned long reg;
++      u32 value;
++
++      if (mpp >= 0 && mpp <= 7)
++              reg = MPP_0_7_CTRL;
++      else if (mpp >= 8 && mpp <= 15)
++              reg = MPP_8_15_CTRL;
++      else if (mpp >= 16 && mpp <= 19)
++              reg = MPP_16_19_CTRL;
++      else
++              return;
++
++      mpp &= 7;
++
++      value = readl(reg);
++      value &= ~(0xf << (mpp << 2));
++      value |= (num_type & 0xf) << (mpp << 2);
++      writel(value, reg);
++}
++
++void __init orion5x_mpp_conf(int mpp, enum orion5x_mpp_type type)
++{
++      int num_type;
++
++      num_type = determine_type_encoding(mpp, type);
++      if (num_type < 0) {
++              printk(KERN_ERR "orion5x_mpp_conf: invalid MPP "
++                              "combination (%d, %d)\n", mpp, type);
++              return;
++      }
++
++      set_mpp_type(mpp, num_type);
++
++      orion5x_gpio_set_valid(mpp, (type == MPP_GPIO) ? 1 : 0);
++}
+--- /dev/null
++++ b/arch/arm/mach-orion5x/mpp.h
+@@ -0,0 +1,63 @@
++#ifndef __ARCH_ORION5X_MPP_H
++#define __ARCH_ORION5X_MPP_H
++
++enum orion5x_mpp_type {
++      /*
++       * This MPP is unused.
++       */
++      MPP_UNUSED,
++
++      /*
++       * This MPP pin is used as a generic GPIO pin.  Valid for
++       * MPPs 0-15 and device bus data pins 16-31.  On 5182, also
++       * valid for MPPs 16-19.
++       */
++      MPP_GPIO,
++
++      /*
++       * This MPP is used as PCIe_RST_OUTn pin.  Valid for
++       * MPP 0 only.
++       */
++      MPP_PCIE_RST_OUTn,
++
++      /*
++       * This MPP is used as PCI arbiter pin (REQn/GNTn.)
++       * Valid for MPPs 0-7 only.
++       */
++      MPP_PCI_ARB,
++
++      /*
++       * This MPP is used as PCI_PMEn pin.  Valid for MPP 2 only.
++       */
++      MPP_PCI_PMEn,
++
++      /*
++       * This MPP is used as GigE half-duplex (COL, CRS) or GMII
++       * (RXERR, CRS, TXERR, TXD[7:4], RXD[7:4]) pin.  Valid for
++       * MPPs 8-19 only.
++       */
++      MPP_GIGE,
++
++      /*
++       * This MPP is used as NAND REn/WEn pin.  Valid for MPPs
++       * 4-7 and 12-17 only, and only on the 5181l/5182/5281.
++       */
++      MPP_NAND,
++
++      /*
++       * This MPP is used as a SATA presence/activity LED.
++       * Valid for MPPs 4-7 and 12-15 only, and only on the 5182.
++       */
++      MPP_SATA_LED,
++
++      /*
++       * This MPP is used as UART1 RXD/TXD/CTSn/RTSn pin.
++       * Valid for MPPs 16-19 only.
++       */
++      MPP_UART,
++};
++
++void orion5x_mpp_conf(int mpp, enum orion5x_mpp_type type);
++
++
++#endif
+--- a/arch/arm/mach-orion5x/rd88f5182-setup.c
++++ b/arch/arm/mach-orion5x/rd88f5182-setup.c
+@@ -26,6 +26,7 @@
+ #include <asm/mach/pci.h>
+ #include <asm/arch/orion5x.h>
+ #include "common.h"
++#include "mpp.h"
+ /*****************************************************************************
+  * RD-88F5182 Info
+@@ -248,22 +249,28 @@
+        */
+       orion5x_init();
++      orion5x_mpp_conf(0, MPP_GPIO);          /* Debug Led */
++      orion5x_mpp_conf(1, MPP_GPIO);          /* Reset Switch */
++      orion5x_mpp_conf(2, MPP_UNUSED);
++      orion5x_mpp_conf(3, MPP_GPIO);          /* RTC Int */
++      orion5x_mpp_conf(4, MPP_GPIO);
++      orion5x_mpp_conf(5, MPP_GPIO);
++      orion5x_mpp_conf(6, MPP_GPIO);          /* PCI_intA */
++      orion5x_mpp_conf(7, MPP_GPIO);          /* PCI_intB */
++      orion5x_mpp_conf(8, MPP_UNUSED);
++      orion5x_mpp_conf(9, MPP_UNUSED);
++      orion5x_mpp_conf(10, MPP_UNUSED);
++      orion5x_mpp_conf(11, MPP_UNUSED);
++      orion5x_mpp_conf(12, MPP_SATA_LED);     /* SATA 0 presence */
++      orion5x_mpp_conf(13, MPP_SATA_LED);     /* SATA 1 presence */
++      orion5x_mpp_conf(14, MPP_SATA_LED);     /* SATA 0 active */
++      orion5x_mpp_conf(15, MPP_SATA_LED);     /* SATA 1 active */
++      orion5x_mpp_conf(16, MPP_UNUSED);
++      orion5x_mpp_conf(17, MPP_UNUSED);
++      orion5x_mpp_conf(18, MPP_UNUSED);
++      orion5x_mpp_conf(19, MPP_UNUSED);
++
+       /*
+-       * Setup Multiplexing Pins --
+-       * MPP[0] Debug Led (GPIO - Out)
+-       * MPP[1] Debug Led (GPIO - Out)
+-       * MPP[2] N/A
+-       * MPP[3] RTC_Int (GPIO - In)
+-       * MPP[4] GPIO
+-       * MPP[5] GPIO
+-       * MPP[6] PCI_intA (GPIO - In)
+-       * MPP[7] PCI_intB (GPIO - In)
+-       * MPP[8-11] N/A
+-       * MPP[12] SATA 0 presence Indication
+-       * MPP[13] SATA 1 presence Indication
+-       * MPP[14] SATA 0 active Indication
+-       * MPP[15] SATA 1 active indication
+-       * MPP[16-19] Not used
+        * MPP[20] PCI Clock to MV88F5182
+        * MPP[21] PCI Clock to mini PCI CON11
+        * MPP[22] USB 0 over current indication
+@@ -272,12 +279,6 @@
+        * MPP[25] USB 0 over current enable
+        */
+-      orion5x_write(MPP_0_7_CTRL, 0x00000003);
+-      orion5x_write(MPP_8_15_CTRL, 0x55550000);
+-      orion5x_write(MPP_16_19_CTRL, 0x5555);
+-
+-      orion5x_gpio_set_valid_pins(0x000000fb);
+-
+       /*
+        * Configure peripherals.
+        */
+--- a/arch/arm/mach-orion5x/ts209-setup.c
++++ b/arch/arm/mach-orion5x/ts209-setup.c
+@@ -28,6 +28,7 @@
+ #include <asm/mach/pci.h>
+ #include <asm/arch/orion5x.h>
+ #include "common.h"
++#include "mpp.h"
+ #define QNAP_TS209_NOR_BOOT_BASE 0xf4000000
+ #define QNAP_TS209_NOR_BOOT_SIZE SZ_8M
+@@ -364,33 +365,33 @@
+        */
+       orion5x_init();
++      orion5x_mpp_conf(0, MPP_UNUSED);
++      orion5x_mpp_conf(1, MPP_GPIO);          /* USB copy button */
++      orion5x_mpp_conf(2, MPP_GPIO);          /* Load defaults button */
++      orion5x_mpp_conf(3, MPP_GPIO);          /* GPIO RTC */
++      orion5x_mpp_conf(4, MPP_UNUSED);
++      orion5x_mpp_conf(5, MPP_UNUSED);
++      orion5x_mpp_conf(6, MPP_GPIO);          /* PCI Int A */
++      orion5x_mpp_conf(7, MPP_GPIO);          /* PCI Int B */
++      orion5x_mpp_conf(8, MPP_UNUSED);
++      orion5x_mpp_conf(9, MPP_UNUSED);
++      orion5x_mpp_conf(10, MPP_UNUSED);
++      orion5x_mpp_conf(11, MPP_UNUSED);
++      orion5x_mpp_conf(12, MPP_SATA_LED);     /* SATA 0 presence */
++      orion5x_mpp_conf(13, MPP_SATA_LED);     /* SATA 1 presence */
++      orion5x_mpp_conf(14, MPP_SATA_LED);     /* SATA 0 active */
++      orion5x_mpp_conf(15, MPP_SATA_LED);     /* SATA 1 active */
++      orion5x_mpp_conf(16, MPP_UART);         /* UART1 RXD */
++      orion5x_mpp_conf(17, MPP_UART);         /* UART1 TXD */
++      orion5x_mpp_conf(18, MPP_GPIO);         /* SW_RST */
++      orion5x_mpp_conf(19, MPP_UNUSED);
++
+       /*
+-       * Setup Multiplexing Pins --
+-       * MPP[0] Reserved
+-       * MPP[1] USB copy button (0 active)
+-       * MPP[2] Load defaults button (0 active)
+-       * MPP[3] GPIO RTC
+-       * MPP[4-5] Reserved
+-       * MPP[6] PCI Int A
+-       * MPP[7] PCI Int B
+-       * MPP[8-11] Reserved
+-       * MPP[12] SATA 0 presence
+-       * MPP[13] SATA 1 presence
+-       * MPP[14] SATA 0 active
+-       * MPP[15] SATA 1 active
+-       * MPP[16] UART1 RXD
+-       * MPP[17] UART1 TXD
+-       * MPP[18] SW_RST (0 active)
+-       * MPP[19] Reserved
+        * MPP[20] PCI clock 0
+        * MPP[21] PCI clock 1
+        * MPP[22] USB 0 over current
+        * MPP[23-25] Reserved
+        */
+-      orion5x_write(MPP_0_7_CTRL, 0x3);
+-      orion5x_write(MPP_8_15_CTRL, 0x55550000);
+-      orion5x_write(MPP_16_19_CTRL, 0x5500);
+-      orion5x_gpio_set_valid_pins(0x3cc0fff);
+       /*
+        * Configure peripherals.
diff --git a/target/linux/orion/patches/013-add_88f5181l_support.patch b/target/linux/orion/patches/013-add_88f5181l_support.patch
new file mode 100644 (file)
index 0000000..b902777
--- /dev/null
@@ -0,0 +1,56 @@
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/Kconfig                       |    3 ++-
+ arch/arm/mach-orion5x/common.c         |    4 +++-
+ include/asm-arm/arch-orion5x/orion5x.h |    5 +++--
+ 3 files changed, 8 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -385,7 +385,8 @@
+       select PLAT_ORION
+       help
+         Support for the following Marvell Orion 5x series SoCs:
+-        Orion-1 (5181), Orion-NAS (5182), Orion-2 (5281.)
++        Orion-1 (5181), Orion-VoIP (5181L), Orion-NAS (5182),
++        Orion-2 (5281.)
+ config ARCH_PNX4008
+       bool "Philips Nexperia PNX4008 Mobile"
+--- a/arch/arm/mach-orion5x/common.c
++++ b/arch/arm/mach-orion5x/common.c
+@@ -394,8 +394,10 @@
+       } else if (*dev == MV88F5181_DEV_ID) {
+               if (*rev == MV88F5181_REV_B1) {
+                       *dev_name = "MV88F5181-Rev-B1";
++              } else if (*rev == MV88F5181L_REV_A1) {
++                      *dev_name = "MV88F5181L-Rev-A1";
+               } else {
+-                      *dev_name = "MV88F5181-Rev-Unsupported";
++                      *dev_name = "MV88F5181(L)-Rev-Unsupported";
+               }
+       } else {
+               *dev_name = "Device-Unknown";
+--- a/include/asm-arm/arch-orion5x/orion5x.h
++++ b/include/asm-arm/arch-orion5x/orion5x.h
+@@ -2,7 +2,7 @@
+  * include/asm-arm/arch-orion5x/orion5x.h
+  *
+  * Generic definitions of Orion SoC flavors:
+- *  Orion-1, Orion-NAS, Orion-VoIP, and Orion-2.
++ *  Orion-1, Orion-VoIP, Orion-NAS, and Orion-2.
+  *
+  * Maintainer: Tzachi Perelstein <tzachi@marvell.com>
+  *
+@@ -63,9 +63,10 @@
+ /*******************************************************************************
+  * Supported Devices & Revisions
+  ******************************************************************************/
+-/* Orion-1 (88F5181) */
++/* Orion-1 (88F5181) and Orion-VoIP (88F5181L) */
+ #define MV88F5181_DEV_ID      0x5181
+ #define MV88F5181_REV_B1      3
++#define MV88F5181L_REV_A1     9
+ /* Orion-NAS (88F5182) */
+ #define MV88F5182_DEV_ID      0x5182
+ #define MV88F5182_REV_A2      2
diff --git a/target/linux/orion/patches/014-avoid_setting_force_phy_addr.patch b/target/linux/orion/patches/014-avoid_setting_force_phy_addr.patch
new file mode 100644 (file)
index 0000000..d47e5dd
--- /dev/null
@@ -0,0 +1,71 @@
+The mv643xx_eth platform data field ->force_phy_addr only needs
+to be set if the passed-in ->phy_addr field is zero (to distinguish
+the case of not having specified a phy address
+(force_phy_addr = 0) from the case where a phy address of zero needs
+to be used (force_phy_addr = 1.))
+
+Also, the ->force_phy_addr field will hopefully disappear in a
+future mv643xx_eth reorganisation.
+
+Therefore, this patch deletes the ->force_phy_addr field initialiser
+from all Orion board code.
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/db88f5281-setup.c   |    1 -
+ arch/arm/mach-orion5x/dns323-setup.c      |    1 -
+ arch/arm/mach-orion5x/kurobox_pro-setup.c |    1 -
+ arch/arm/mach-orion5x/rd88f5182-setup.c   |    1 -
+ arch/arm/mach-orion5x/ts209-setup.c       |    1 -
+ 5 files changed, 0 insertions(+), 5 deletions(-)
+
+--- a/arch/arm/mach-orion5x/db88f5281-setup.c
++++ b/arch/arm/mach-orion5x/db88f5281-setup.c
+@@ -286,7 +286,6 @@
+  ****************************************************************************/
+ static struct mv643xx_eth_platform_data db88f5281_eth_data = {
+       .phy_addr       = 8,
+-      .force_phy_addr = 1,
+ };
+ /*****************************************************************************
+--- a/arch/arm/mach-orion5x/dns323-setup.c
++++ b/arch/arm/mach-orion5x/dns323-setup.c
+@@ -82,7 +82,6 @@
+ static struct mv643xx_eth_platform_data dns323_eth_data = {
+       .phy_addr = 8,
+-      .force_phy_addr = 1,
+ };
+ /****************************************************************************
+--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
++++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
+@@ -160,7 +160,6 @@
+ static struct mv643xx_eth_platform_data kurobox_pro_eth_data = {
+       .phy_addr       = 8,
+-      .force_phy_addr = 1,
+ };
+ /*****************************************************************************
+--- a/arch/arm/mach-orion5x/rd88f5182-setup.c
++++ b/arch/arm/mach-orion5x/rd88f5182-setup.c
+@@ -222,7 +222,6 @@
+ static struct mv643xx_eth_platform_data rd88f5182_eth_data = {
+       .phy_addr       = 8,
+-      .force_phy_addr = 1,
+ };
+ /*****************************************************************************
+--- a/arch/arm/mach-orion5x/ts209-setup.c
++++ b/arch/arm/mach-orion5x/ts209-setup.c
+@@ -191,7 +191,6 @@
+ static struct mv643xx_eth_platform_data qnap_ts209_eth_data = {
+       .phy_addr       = 8,
+-      .force_phy_addr = 1,
+ };
+ static int __init parse_hex_nibble(char n)
diff --git a/target/linux/orion/patches/015-implement_power-off_method_for_kurobox_pro.patch b/target/linux/orion/patches/015-implement_power-off_method_for_kurobox_pro.patch
new file mode 100644 (file)
index 0000000..5814852
--- /dev/null
@@ -0,0 +1,192 @@
+From: Sylver Bruneau <sylver.bruneau@googlemail.com>
+
+This patch implements the communication with the microcontroller on the
+Kurobox Pro and Linkstation Pro/Live boards.  This is allowing to send
+the commands needed to power-off the board correctly.
+
+Signed-off-by: Sylver Bruneau <sylver.bruneau@googlemail.com>
+---
+ arch/arm/mach-orion5x/kurobox_pro-setup.c |  147 ++++++++++++++++++++++++++++-
+ 1 files changed, 143 insertions(+), 4 deletions(-)
+
+--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
++++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
+@@ -13,10 +13,12 @@
+ #include <linux/platform_device.h>
+ #include <linux/pci.h>
+ #include <linux/irq.h>
++#include <linux/delay.h>
+ #include <linux/mtd/physmap.h>
+ #include <linux/mtd/nand.h>
+ #include <linux/mv643xx_eth.h>
+ #include <linux/i2c.h>
++#include <linux/serial_reg.h>
+ #include <linux/ata_platform.h>
+ #include <asm/mach-types.h>
+ #include <asm/gpio.h>
+@@ -177,6 +179,140 @@
+ };
+ /*****************************************************************************
++ * Kurobox Pro specific power off method via UART1-attached microcontroller
++ ****************************************************************************/
++
++#define UART1_REG(x)  (UART1_VIRT_BASE + ((UART_##x) << 2))
++
++static int kurobox_pro_miconread(unsigned char *buf, int count)
++{
++      int i;
++      int timeout;
++
++      for (i = 0; i < count; i++) {
++              timeout = 10;
++
++              while (!(readl(UART1_REG(LSR)) & UART_LSR_DR)) {
++                      if (--timeout == 0)
++                              break;
++                      udelay(1000);
++              }
++
++              if (timeout == 0)
++                      break;
++              buf[i] = readl(UART1_REG(RX));
++      }
++
++      /* return read bytes */
++      return i;
++}
++
++static int kurobox_pro_miconwrite(const unsigned char *buf, int count)
++{
++      int i = 0;
++
++      while (count--) {
++              while (!(readl(UART1_REG(LSR)) & UART_LSR_THRE))
++                      barrier();
++              writel(buf[i++], UART1_REG(TX));
++      }
++
++      return 0;
++}
++
++static int kurobox_pro_miconsend(const unsigned char *data, int count)
++{
++      int i;
++      unsigned char checksum = 0;
++      unsigned char recv_buf[40];
++      unsigned char send_buf[40];
++      unsigned char correct_ack[3];
++      int retry = 2;
++
++      /* Generate checksum */
++      for (i = 0; i < count; i++)
++              checksum -=  data[i];
++
++      do {
++              /* Send data */
++              kurobox_pro_miconwrite(data, count);
++
++              /* send checksum */
++              kurobox_pro_miconwrite(&checksum, 1);
++
++              if (kurobox_pro_miconread(recv_buf, sizeof(recv_buf)) <= 3) {
++                      printk(KERN_ERR ">%s: receive failed.\n", __func__);
++
++                      /* send preamble to clear the receive buffer */
++                      memset(&send_buf, 0xff, sizeof(send_buf));
++                      kurobox_pro_miconwrite(send_buf, sizeof(send_buf));
++
++                      /* make dummy reads */
++                      mdelay(100);
++                      kurobox_pro_miconread(recv_buf, sizeof(recv_buf));
++              } else {
++                      /* Generate expected ack */
++                      correct_ack[0] = 0x01;
++                      correct_ack[1] = data[1];
++                      correct_ack[2] = 0x00;
++
++                      /* checksum Check */
++                      if ((recv_buf[0] + recv_buf[1] + recv_buf[2] +
++                           recv_buf[3]) & 0xFF) {
++                              printk(KERN_ERR ">%s: Checksum Error : "
++                                      "Received data[%02x, %02x, %02x, %02x]"
++                                      "\n", __func__, recv_buf[0],
++                                      recv_buf[1], recv_buf[2], recv_buf[3]);
++                      } else {
++                              /* Check Received Data */
++                              if (correct_ack[0] == recv_buf[0] &&
++                                  correct_ack[1] == recv_buf[1] &&
++                                  correct_ack[2] == recv_buf[2]) {
++                                      /* Interval for next command */
++                                      mdelay(10);
++
++                                      /* Receive ACK */
++                                      return 0;
++                              }
++                      }
++                      /* Received NAK or illegal Data */
++                      printk(KERN_ERR ">%s: Error : NAK or Illegal Data "
++                                      "Received\n", __func__);
++              }
++      } while (retry--);
++
++      /* Interval for next command */
++      mdelay(10);
++
++      return -1;
++}
++
++static void kurobox_pro_power_off(void)
++{
++      const unsigned char watchdogkill[]      = {0x01, 0x35, 0x00};
++      const unsigned char shutdownwait[]      = {0x00, 0x0c};
++      const unsigned char poweroff[]          = {0x00, 0x06};
++      /* 38400 baud divisor */
++      const unsigned divisor = ((ORION5X_TCLK + (8 * 38400)) / (16 * 38400));
++
++      pr_info("%s: triggering power-off...\n", __func__);
++
++      /* hijack uart1 and reset into sane state (38400,8n1,even parity) */
++      writel(0x83, UART1_REG(LCR));
++      writel(divisor & 0xff, UART1_REG(DLL));
++      writel((divisor >> 8) & 0xff, UART1_REG(DLM));
++      writel(0x1b, UART1_REG(LCR));
++      writel(0x00, UART1_REG(IER));
++      writel(0x07, UART1_REG(FCR));
++      writel(0x00, UART1_REG(MCR));
++
++      /* Send the commands to shutdown the Kurobox Pro */
++      kurobox_pro_miconsend(watchdogkill, sizeof(watchdogkill)) ;
++      kurobox_pro_miconsend(shutdownwait, sizeof(shutdownwait)) ;
++      kurobox_pro_miconsend(poweroff, sizeof(poweroff));
++}
++
++/*****************************************************************************
+  * General Setup
+  ****************************************************************************/
+@@ -203,10 +339,10 @@
+       orion5x_mpp_conf(13, MPP_SATA_LED);     /* SATA 1 presence */
+       orion5x_mpp_conf(14, MPP_SATA_LED);     /* SATA 0 active */
+       orion5x_mpp_conf(15, MPP_SATA_LED);     /* SATA 1 active */
+-      orion5x_mpp_conf(16, MPP_UNUSED);
+-      orion5x_mpp_conf(17, MPP_UNUSED);
+-      orion5x_mpp_conf(18, MPP_UNUSED);
+-      orion5x_mpp_conf(19, MPP_UNUSED);
++      orion5x_mpp_conf(16, MPP_UART);         /* UART1 RXD */
++      orion5x_mpp_conf(17, MPP_UART);         /* UART1 TXD */
++      orion5x_mpp_conf(18, MPP_UART);         /* UART1 CTSn */
++      orion5x_mpp_conf(19, MPP_UART);         /* UART1 RTSn */
+       /*
+        * Configure peripherals.
+@@ -229,6 +365,9 @@
+       }
+       i2c_register_board_info(0, &kurobox_pro_i2c_rtc, 1);
++
++      /* register Kurobox Pro specific power-off method */
++      pm_power_off = kurobox_pro_power_off;
+ }
+ #ifdef CONFIG_MACH_KUROBOX_PRO
diff --git a/target/linux/orion/patches/016-add_qnap_ts-409_support.patch b/target/linux/orion/patches/016-add_qnap_ts-409_support.patch
new file mode 100644 (file)
index 0000000..a0d22f7
--- /dev/null
@@ -0,0 +1,418 @@
+From: Sylver Bruneau <sylver.bruneau@googlemail.com>
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/Kconfig       |    6 +
+ arch/arm/mach-orion5x/Makefile      |    1 +
+ arch/arm/mach-orion5x/ts409-setup.c |  383 +++++++++++++++++++++++++++++++++++
+ 3 files changed, 390 insertions(+), 0 deletions(-)
+ create mode 100644 arch/arm/mach-orion5x/ts409-setup.c
+
+--- a/arch/arm/mach-orion5x/Kconfig
++++ b/arch/arm/mach-orion5x/Kconfig
+@@ -44,6 +44,12 @@
+         Buffalo Linkstation Pro/Live platform. Both v1 and
+         v2 devices are supported.
++config MACH_TS409
++      bool "QNAP TS-409"
++      help
++        Say 'Y' here if you want your kernel to support the
++        QNAP TS-409 platform.
++
+ endmenu
+ endif
+--- a/arch/arm/mach-orion5x/Makefile
++++ b/arch/arm/mach-orion5x/Makefile
+@@ -5,3 +5,4 @@
+ obj-$(CONFIG_MACH_LINKSTATION_PRO) += kurobox_pro-setup.o
+ obj-$(CONFIG_MACH_DNS323)     += dns323-setup.o
+ obj-$(CONFIG_MACH_TS209)      += ts209-setup.o
++obj-$(CONFIG_MACH_TS409)      += ts409-setup.o
+--- /dev/null
++++ b/arch/arm/mach-orion5x/ts409-setup.c
+@@ -0,0 +1,383 @@
++/*
++ * QNAP TS-409 Board Setup
++ *
++ * Maintainer: Sylver Bruneau <sylver.bruneau@gmail.com>
++ *
++ * This program is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU General Public License
++ * as published by the Free Software Foundation; either version
++ * 2 of the License, or (at your option) any later version.
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/pci.h>
++#include <linux/irq.h>
++#include <linux/mtd/physmap.h>
++#include <linux/mv643xx_eth.h>
++#include <linux/gpio_keys.h>
++#include <linux/input.h>
++#include <linux/i2c.h>
++#include <linux/serial_reg.h>
++#include <asm/mach-types.h>
++#include <asm/gpio.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/pci.h>
++#include <asm/arch/orion5x.h>
++#include "common.h"
++#include "mpp.h"
++
++/*****************************************************************************
++ * QNAP TS-409 Info
++ ****************************************************************************/
++
++/*
++ * QNAP TS-409 hardware :
++ * - Marvell 88F5281-D0
++ * - Marvell 88SX7042 SATA controller (PCIe)
++ * - Marvell 88E1118 Gigabit Ethernet PHY
++ * - RTC S35390A (@0x30) on I2C bus
++ * - 8MB NOR flash
++ * - 256MB of DDR-2 RAM
++ */
++
++/*
++ * 8MB NOR flash Device bus boot chip select
++ */
++
++#define QNAP_TS409_NOR_BOOT_BASE 0xff800000
++#define QNAP_TS409_NOR_BOOT_SIZE SZ_8M
++
++/****************************************************************************
++ * 8MiB NOR flash. The struct mtd_partition is not in the same order as the
++ *     partitions on the device because we want to keep compatability with
++ *     existing QNAP firmware.
++ *
++ * Layout as used by QNAP:
++ *  [2] 0x00000000-0x00200000 : "Kernel"
++ *  [3] 0x00200000-0x00600000 : "RootFS1"
++ *  [4] 0x00600000-0x00700000 : "RootFS2"
++ *  [6] 0x00700000-0x00760000 : "NAS Config" (read-only)
++ *  [5] 0x00760000-0x00780000 : "U-Boot Config"
++ *  [1] 0x00780000-0x00800000 : "U-Boot" (read-only)
++ ***************************************************************************/
++static struct mtd_partition qnap_ts409_partitions[] = {
++      {
++              .name           = "U-Boot",
++              .size           = 0x00080000,
++              .offset         = 0x00780000,
++              .mask_flags     = MTD_WRITEABLE,
++      }, {
++              .name           = "Kernel",
++              .size           = 0x00200000,
++              .offset         = 0,
++      }, {
++              .name           = "RootFS1",
++              .size           = 0x00400000,
++              .offset         = 0x00200000,
++      }, {
++              .name           = "RootFS2",
++              .size           = 0x00100000,
++              .offset         = 0x00600000,
++      }, {
++              .name           = "U-Boot Config",
++              .size           = 0x00020000,
++              .offset         = 0x00760000,
++      }, {
++              .name           = "NAS Config",
++              .size           = 0x00060000,
++              .offset         = 0x00700000,
++              .mask_flags     = MTD_WRITEABLE,
++      },
++};
++
++static struct physmap_flash_data qnap_ts409_nor_flash_data = {
++      .width          = 1,
++      .parts          = qnap_ts409_partitions,
++      .nr_parts       = ARRAY_SIZE(qnap_ts409_partitions)
++};
++
++static struct resource qnap_ts409_nor_flash_resource = {
++      .flags  = IORESOURCE_MEM,
++      .start  = QNAP_TS409_NOR_BOOT_BASE,
++      .end    = QNAP_TS409_NOR_BOOT_BASE + QNAP_TS409_NOR_BOOT_SIZE - 1,
++};
++
++static struct platform_device qnap_ts409_nor_flash = {
++      .name           = "physmap-flash",
++      .id             = 0,
++      .dev            = { .platform_data = &qnap_ts409_nor_flash_data, },
++      .num_resources  = 1,
++      .resource       = &qnap_ts409_nor_flash_resource,
++};
++
++/*****************************************************************************
++ * PCI
++ ****************************************************************************/
++
++static int __init qnap_ts409_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
++{
++      int irq;
++
++      /*
++       * Check for devices with hard-wired IRQs.
++       */
++      irq = orion5x_pci_map_irq(dev, slot, pin);
++      if (irq != -1)
++              return irq;
++
++      /*
++       * PCI isn't used on the TS-409
++       */
++      printk(KERN_ERR "kurobox_pro_pci_map_irq failed, unknown bus\n");
++      return -1;
++}
++
++static struct hw_pci qnap_ts409_pci __initdata = {
++      .nr_controllers = 2,
++      .swizzle        = pci_std_swizzle,
++      .setup          = orion5x_pci_sys_setup,
++      .scan           = orion5x_pci_sys_scan_bus,
++      .map_irq        = qnap_ts409_pci_map_irq,
++};
++
++static int __init qnap_ts409_pci_init(void)
++{
++      if (machine_is_ts409())
++              pci_common_init(&qnap_ts409_pci);
++
++      return 0;
++}
++
++subsys_initcall(qnap_ts409_pci_init);
++
++/*****************************************************************************
++ * Ethernet
++ ****************************************************************************/
++
++static struct mv643xx_eth_platform_data qnap_ts409_eth_data = {
++      .phy_addr       = 8,
++};
++
++static int __init parse_hex_nibble(char n)
++{
++      if (n >= '0' && n <= '9')
++              return n - '0';
++
++      if (n >= 'A' && n <= 'F')
++              return n - 'A' + 10;
++
++      if (n >= 'a' && n <= 'f')
++              return n - 'a' + 10;
++
++      return -1;
++}
++
++static int __init parse_hex_byte(const char *b)
++{
++      int hi;
++      int lo;
++
++      hi = parse_hex_nibble(b[0]);
++      lo = parse_hex_nibble(b[1]);
++
++      if (hi < 0 || lo < 0)
++              return -1;
++
++      return (hi << 4) | lo;
++}
++
++static int __init check_mac_addr(const char *addr_str)
++{
++      u_int8_t addr[6];
++      int i;
++
++      for (i = 0; i < 6; i++) {
++              int byte;
++
++              /*
++               * Enforce "xx:xx:xx:xx:xx:xx\n" format.
++               */
++              if (addr_str[(i * 3) + 2] != ((i < 5) ? ':' : '\n'))
++                      return -1;
++
++              byte = parse_hex_byte(addr_str + (i * 3));
++              if (byte < 0)
++                      return -1;
++              addr[i] = byte;
++      }
++
++      printk(KERN_INFO "ts409: found ethernet mac address ");
++      for (i = 0; i < 6; i++)
++              printk("%.2x%s", addr[i], (i < 5) ? ":" : ".\n");
++
++      memcpy(qnap_ts409_eth_data.mac_addr, addr, 6);
++
++      return 0;
++}
++
++/*
++ * The 'NAS Config' flash partition has an ext2 filesystem which
++ * contains a file that has the ethernet MAC address in plain text
++ * (format "xx:xx:xx:xx:xx:xx\n".)
++ */
++static void __init ts409_find_mac_addr(void)
++{
++      unsigned long addr;
++
++      for (addr = 0x00700000; addr < 0x00760000; addr += 1024) {
++              char *nor_page;
++              int ret = 0;
++
++              nor_page = ioremap(QNAP_TS409_NOR_BOOT_BASE + addr, 1024);
++              if (nor_page != NULL) {
++                      ret = check_mac_addr(nor_page);
++                      iounmap(nor_page);
++              }
++
++              if (ret == 0)
++                      break;
++      }
++}
++
++/*****************************************************************************
++ * RTC S35390A on I2C bus
++ ****************************************************************************/
++
++#define TS409_RTC_GPIO        10
++
++static struct i2c_board_info __initdata qnap_ts409_i2c_rtc = {
++      I2C_BOARD_INFO("s35390a", 0x30),
++      .irq            = 0,
++};
++
++/****************************************************************************
++ * GPIO Attached Keys
++ *     Power button is attached to the PIC microcontroller
++ ****************************************************************************/
++
++#define QNAP_TS409_GPIO_KEY_MEDIA     15
++
++static struct gpio_keys_button qnap_ts409_buttons[] = {
++      {
++              .code           = KEY_RESTART,
++              .gpio           = QNAP_TS409_GPIO_KEY_MEDIA,
++              .desc           = "USB Copy Button",
++              .active_low     = 1,
++      },
++};
++
++static struct gpio_keys_platform_data qnap_ts409_button_data = {
++      .buttons        = qnap_ts409_buttons,
++      .nbuttons       = ARRAY_SIZE(qnap_ts409_buttons),
++};
++
++static struct platform_device qnap_ts409_button_device = {
++      .name           = "gpio-keys",
++      .id             = -1,
++      .num_resources  = 0,
++      .dev            = {
++              .platform_data  = &qnap_ts409_button_data,
++      },
++};
++
++/*****************************************************************************
++ * General Setup
++ ****************************************************************************/
++
++/*
++ * QNAP TS-409 specific power off method via UART1-attached PIC
++ */
++
++#define UART1_REG(x)  (UART1_VIRT_BASE + ((UART_##x) << 2))
++
++static void qnap_ts409_power_off(void)
++{
++      /* 19200 baud divisor */
++      const unsigned divisor = ((ORION5X_TCLK + (8 * 19200)) / (16 * 19200));
++
++      pr_info("%s: triggering power-off...\n", __func__);
++
++      /* hijack uart1 and reset into sane state (19200,8n1) */
++      writel(0x83, UART1_REG(LCR));
++      writel(divisor & 0xff, UART1_REG(DLL));
++      writel((divisor >> 8) & 0xff, UART1_REG(DLM));
++      writel(0x03, UART1_REG(LCR));
++      writel(0x00, UART1_REG(IER));
++      writel(0x00, UART1_REG(FCR));
++      writel(0x00, UART1_REG(MCR));
++
++      /* send the power-off command 'A' to PIC */
++      writel('A', UART1_REG(TX));
++}
++
++static void __init qnap_ts409_init(void)
++{
++      /*
++       * Setup basic Orion functions. Need to be called early.
++       */
++      orion5x_init();
++
++      orion5x_mpp_conf(0, MPP_UNUSED);
++      orion5x_mpp_conf(1, MPP_UNUSED);
++      orion5x_mpp_conf(2, MPP_UNUSED);
++      orion5x_mpp_conf(3, MPP_UNUSED);
++      orion5x_mpp_conf(4, MPP_GPIO);          /* HDD 1 status */
++      orion5x_mpp_conf(5, MPP_GPIO);          /* HDD 2 status */
++      orion5x_mpp_conf(6, MPP_GPIO);          /* HDD 3 status */
++      orion5x_mpp_conf(7, MPP_GPIO);          /* HDD 4 status */
++      orion5x_mpp_conf(8, MPP_UNUSED);
++      orion5x_mpp_conf(9, MPP_UNUSED);
++      orion5x_mpp_conf(10, MPP_GPIO);         /* RTC int */
++      orion5x_mpp_conf(11, MPP_UNUSED);
++      orion5x_mpp_conf(12, MPP_UNUSED);
++      orion5x_mpp_conf(13, MPP_UNUSED);
++      orion5x_mpp_conf(14, MPP_GPIO);         /* SW_RST */
++      orion5x_mpp_conf(15, MPP_GPIO);         /* USB copy button */
++      orion5x_mpp_conf(16, MPP_UART);         /* UART1 RXD */
++      orion5x_mpp_conf(17, MPP_UART);         /* UART1 TXD */
++      orion5x_mpp_conf(18, MPP_UNUSED);
++      orion5x_mpp_conf(19, MPP_UNUSED);
++
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      ts409_find_mac_addr();
++      orion5x_eth_init(&qnap_ts409_eth_data);
++      orion5x_i2c_init();
++      orion5x_uart0_init();
++
++      orion5x_setup_dev_boot_win(QNAP_TS409_NOR_BOOT_BASE,
++                                 QNAP_TS409_NOR_BOOT_SIZE);
++      platform_device_register(&qnap_ts409_nor_flash);
++
++      platform_device_register(&qnap_ts409_button_device);
++
++      /* Get RTC IRQ and register the chip */
++      if (gpio_request(TS409_RTC_GPIO, "rtc") == 0) {
++              if (gpio_direction_input(TS409_RTC_GPIO) == 0)
++                      qnap_ts409_i2c_rtc.irq = gpio_to_irq(TS409_RTC_GPIO);
++              else
++                      gpio_free(TS409_RTC_GPIO);
++      }
++      if (qnap_ts409_i2c_rtc.irq == 0)
++              pr_warning("qnap_ts409_init: failed to get RTC IRQ\n");
++      i2c_register_board_info(0, &qnap_ts409_i2c_rtc, 1);
++
++      /* register ts409 specific power-off method */
++      pm_power_off = qnap_ts409_power_off;
++}
++
++MACHINE_START(TS409, "QNAP TS-409")
++      /* Maintainer:  Sylver Bruneau <sylver.bruneau@gmail.com> */
++      .phys_io        = ORION5X_REGS_PHYS_BASE,
++      .io_pg_offst    = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
++      .boot_params    = 0x00000100,
++      .init_machine   = qnap_ts409_init,
++      .map_io         = orion5x_map_io,
++      .init_irq       = orion5x_init_irq,
++      .timer          = &orion5x_timer,
++      .fixup          = tag_fixup_mem32,
++MACHINE_END
diff --git a/target/linux/orion/patches/017-add_linksys_wrt350n_v2_support.patch b/target/linux/orion/patches/017-add_linksys_wrt350n_v2_support.patch
new file mode 100644 (file)
index 0000000..5faa959
--- /dev/null
@@ -0,0 +1,205 @@
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+Tested-by: Dirk Teurlings <dirk@upexia.nl>
+Tested-by: Peter van Valderen <p.v.valderen@gmail.com>
+---
+ arch/arm/mach-orion5x/Kconfig            |    6 +
+ arch/arm/mach-orion5x/Makefile           |    1 +
+ arch/arm/mach-orion5x/wrt350n-v2-setup.c |  170 ++++++++++++++++++++++++++++++
+ 3 files changed, 177 insertions(+), 0 deletions(-)
+ create mode 100644 arch/arm/mach-orion5x/wrt350n-v2-setup.c
+
+--- a/arch/arm/mach-orion5x/Kconfig
++++ b/arch/arm/mach-orion5x/Kconfig
+@@ -50,6 +50,12 @@
+         Say 'Y' here if you want your kernel to support the
+         QNAP TS-409 platform.
++config MACH_WRT350N_V2
++      bool "Linksys WRT350N v2"
++      help
++        Say 'Y' here if you want your kernel to support the
++        Linksys WRT350N v2 platform.
++
+ endmenu
+ endif
+--- a/arch/arm/mach-orion5x/Makefile
++++ b/arch/arm/mach-orion5x/Makefile
+@@ -6,3 +6,4 @@
+ obj-$(CONFIG_MACH_DNS323)     += dns323-setup.o
+ obj-$(CONFIG_MACH_TS209)      += ts209-setup.o
+ obj-$(CONFIG_MACH_TS409)      += ts409-setup.o
++obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o
+--- /dev/null
++++ b/arch/arm/mach-orion5x/wrt350n-v2-setup.c
+@@ -0,0 +1,170 @@
++/*
++ * arch/arm/mach-orion5x/wrt350n-v2-setup.c
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2.  This program is licensed "as is" without any
++ * warranty of any kind, whether express or implied.
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/pci.h>
++#include <linux/irq.h>
++#include <linux/delay.h>
++#include <linux/mtd/physmap.h>
++#include <linux/mv643xx_eth.h>
++#include <asm/mach-types.h>
++#include <asm/gpio.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/pci.h>
++#include <asm/arch/orion5x.h>
++#include "common.h"
++#include "mpp.h"
++
++/*
++ * 8M NOR flash Device bus boot chip select
++ */
++#define WRT350N_V2_NOR_BOOT_BASE      0xf4000000
++#define WRT350N_V2_NOR_BOOT_SIZE      SZ_8M
++
++static struct mtd_partition wrt350n_v2_nor_flash_partitions[] = {
++      {
++              .name           = "kernel",
++              .offset         = 0x00000000,
++              .size           = 0x00760000,
++      }, {
++              .name           = "rootfs",
++              .offset         = 0x001a0000,
++              .size           = 0x005c0000,
++      }, {
++              .name           = "lang",
++              .offset         = 0x00760000,
++              .size           = 0x00040000,
++      }, {
++              .name           = "nvram",
++              .offset         = 0x007a0000,
++              .size           = 0x00020000,
++      }, {
++              .name           = "u-boot",
++              .offset         = 0x007c0000,
++              .size           = 0x00040000,
++      },
++};
++
++static struct physmap_flash_data wrt350n_v2_nor_flash_data = {
++      .width          = 1,
++      .parts          = wrt350n_v2_nor_flash_partitions,
++      .nr_parts       = ARRAY_SIZE(wrt350n_v2_nor_flash_partitions),
++};
++
++static struct resource wrt350n_v2_nor_flash_resource = {
++      .flags          = IORESOURCE_MEM,
++      .start          = WRT350N_V2_NOR_BOOT_BASE,
++      .end            = WRT350N_V2_NOR_BOOT_BASE + WRT350N_V2_NOR_BOOT_SIZE - 1,
++};
++
++static struct platform_device wrt350n_v2_nor_flash = {
++      .name                   = "physmap-flash",
++      .id                     = 0,
++      .dev            = {
++              .platform_data  = &wrt350n_v2_nor_flash_data,
++      },
++      .num_resources          = 1,
++      .resource               = &wrt350n_v2_nor_flash_resource,
++};
++
++static struct mv643xx_eth_platform_data wrt350n_v2_eth_data = {
++      .phy_addr       = -1,
++};
++
++static void __init wrt350n_v2_init(void)
++{
++      /*
++       * Setup basic Orion functions. Need to be called early.
++       */
++      orion5x_init();
++
++      orion5x_mpp_conf(0, MPP_GPIO);          /* Power LED green (0=on) */
++      orion5x_mpp_conf(1, MPP_GPIO);          /* Security LED (0=on) */
++      orion5x_mpp_conf(2, MPP_GPIO);          /* Internal Button (0=on) */
++      orion5x_mpp_conf(3, MPP_GPIO);          /* Reset Button (0=on) */
++      orion5x_mpp_conf(4, MPP_GPIO);          /* PCI int */
++      orion5x_mpp_conf(5, MPP_GPIO);          /* Power LED orange (0=on) */
++      orion5x_mpp_conf(6, MPP_GPIO);          /* USB LED (0=on) */
++      orion5x_mpp_conf(7, MPP_GPIO);          /* Wireless LED (0=on) */
++      orion5x_mpp_conf(8, MPP_UNUSED);        /* ??? */
++      orion5x_mpp_conf(9, MPP_GIGE);          /* GE_RXERR */
++      orion5x_mpp_conf(10, MPP_UNUSED);       /* ??? */
++      orion5x_mpp_conf(11, MPP_UNUSED);       /* ??? */
++      orion5x_mpp_conf(12, MPP_GIGE);         /* GE_TXD[4] */
++      orion5x_mpp_conf(13, MPP_GIGE);         /* GE_TXD[5] */
++      orion5x_mpp_conf(14, MPP_GIGE);         /* GE_TXD[6] */
++      orion5x_mpp_conf(15, MPP_GIGE);         /* GE_TXD[7] */
++      orion5x_mpp_conf(16, MPP_GIGE);         /* GE_RXD[4] */
++      orion5x_mpp_conf(17, MPP_GIGE);         /* GE_RXD[5] */
++      orion5x_mpp_conf(18, MPP_GIGE);         /* GE_RXD[6] */
++      orion5x_mpp_conf(19, MPP_GIGE);         /* GE_RXD[7] */
++
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      orion5x_eth_init(&wrt350n_v2_eth_data);
++      orion5x_uart0_init();
++
++      orion5x_setup_dev_boot_win(WRT350N_V2_NOR_BOOT_BASE,
++                                 WRT350N_V2_NOR_BOOT_SIZE);
++      platform_device_register(&wrt350n_v2_nor_flash);
++}
++
++static int __init wrt350n_v2_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
++{
++      int irq;
++
++      /*
++       * Check for devices with hard-wired IRQs.
++       */
++      irq = orion5x_pci_map_irq(dev, slot, pin);
++      if (irq != -1)
++              return irq;
++
++      /*
++       * Mini-PCI slot.
++       */
++      if (slot == 7)
++              return gpio_to_irq(4);
++
++      printk(KERN_ERR "wrt350n_v2_pci_map_irq failed, unknown bus\n");
++
++      return -1;
++}
++
++static struct hw_pci wrt350n_v2_pci __initdata = {
++      .nr_controllers = 2,
++      .swizzle        = pci_std_swizzle,
++      .setup          = orion5x_pci_sys_setup,
++      .scan           = orion5x_pci_sys_scan_bus,
++      .map_irq        = wrt350n_v2_pci_map_irq,
++};
++
++static int __init wrt350n_v2_pci_init(void)
++{
++      if (machine_is_wrt350n_v2())
++              pci_common_init(&wrt350n_v2_pci);
++
++      return 0;
++}
++subsys_initcall(wrt350n_v2_pci_init);
++
++MACHINE_START(WRT350N_V2, "Linksys WRT350N v2")
++      /* Maintainer: Lennert Buytenhek <buytenh@marvell.com> */
++      .phys_io        = ORION5X_REGS_PHYS_BASE,
++      .io_pg_offst    = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
++      .boot_params    = 0x00000100,
++      .init_machine   = wrt350n_v2_init,
++      .map_io         = orion5x_map_io,
++      .init_irq       = orion5x_init_irq,
++      .timer          = &orion5x_timer,
++      .fixup          = tag_fixup_mem32,
++MACHINE_END
diff --git a/target/linux/orion/patches/018-add_hp_media_vault_mv2120_support.patch b/target/linux/orion/patches/018-add_hp_media_vault_mv2120_support.patch
new file mode 100644 (file)
index 0000000..02a93c9
--- /dev/null
@@ -0,0 +1,263 @@
+From: Martin Michlmayr <tbm@cyrius.com>
+
+Signed-off-by: Lennert Buytenhek <buytenh@marvell.com>
+---
+ arch/arm/mach-orion5x/Kconfig        |    6 +
+ arch/arm/mach-orion5x/Makefile       |    1 +
+ arch/arm/mach-orion5x/mv2120-setup.c |  228 ++++++++++++++++++++++++++++++++++
+ 3 files changed, 235 insertions(+), 0 deletions(-)
+ create mode 100644 arch/arm/mach-orion5x/mv2120-setup.c
+
+--- a/arch/arm/mach-orion5x/Kconfig
++++ b/arch/arm/mach-orion5x/Kconfig
+@@ -56,6 +56,12 @@
+         Say 'Y' here if you want your kernel to support the
+         Linksys WRT350N v2 platform.
++config MACH_MV2120
++      bool "HP Media Vault mv2120"
++      help
++        Say 'Y' here if you want your kernel to support the
++        HP Media Vault mv2120 or mv5100.
++
+ endmenu
+ endif
+--- a/arch/arm/mach-orion5x/Makefile
++++ b/arch/arm/mach-orion5x/Makefile
+@@ -7,3 +7,4 @@
+ obj-$(CONFIG_MACH_TS209)      += ts209-setup.o
+ obj-$(CONFIG_MACH_TS409)      += ts409-setup.o
+ obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o
++obj-$(CONFIG_MACH_MV2120)     += mv2120-setup.o
+--- /dev/null
++++ b/arch/arm/mach-orion5x/mv2120-setup.c
+@@ -0,0 +1,228 @@
++/*
++ * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
++ * Copyright (C) 2008 Martin Michlmayr <tbm@cyrius.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU Lesser General Public License as
++ * published by the Free Software Foundation; either version 2 of the
++ * License, or (at your option) any later version.
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/pci.h>
++#include <linux/irq.h>
++#include <linux/mtd/physmap.h>
++#include <linux/mv643xx_eth.h>
++#include <linux/leds.h>
++#include <linux/gpio_keys.h>
++#include <linux/input.h>
++#include <linux/i2c.h>
++#include <linux/ata_platform.h>
++#include <asm/mach-types.h>
++#include <asm/gpio.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/pci.h>
++#include <asm/arch/orion5x.h>
++#include "common.h"
++#include "mpp.h"
++
++#define MV2120_NOR_BOOT_BASE  0xf4000000
++#define MV2120_NOR_BOOT_SIZE  SZ_512K
++
++#define MV2120_GPIO_RTC_IRQ   3
++#define MV2120_GPIO_KEY_RESET 17
++#define MV2120_GPIO_KEY_POWER 18
++#define MV2120_GPIO_POWER_OFF 19
++
++
++/****************************************************************************
++ * PCI setup
++ ****************************************************************************/
++static int __init mv2120_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
++{
++      int irq;
++
++      /*
++       * Check for devices with hard-wired IRQs.
++       */
++      irq = orion5x_pci_map_irq(dev, slot, pin);
++      if (irq != -1)
++              return irq;
++
++      pr_err("%s: requested mapping for unknown bus\n", __func__);
++
++      return -1;
++}
++
++static struct hw_pci mv2120_pci __initdata = {
++      .nr_controllers = 2,
++      .swizzle        = pci_std_swizzle,
++      .setup          = orion5x_pci_sys_setup,
++      .scan           = orion5x_pci_sys_scan_bus,
++      .map_irq        = mv2120_pci_map_irq,
++};
++
++static int __init mv2120_pci_init(void)
++{
++      if (machine_is_mv2120())
++              pci_common_init(&mv2120_pci);
++
++      return 0;
++}
++subsys_initcall(mv2120_pci_init);
++
++
++/*****************************************************************************
++ * Ethernet
++ ****************************************************************************/
++static struct mv643xx_eth_platform_data mv2120_eth_data = {
++      .phy_addr       = 8,
++};
++
++static struct mv_sata_platform_data mv2120_sata_data = {
++      .n_ports        = 2,
++};
++
++static struct mtd_partition mv2120_partitions[] = {
++      {
++              .name   = "firmware",
++              .size   = 0x00080000,
++              .offset = 0,
++      },
++};
++
++static struct physmap_flash_data mv2120_nor_flash_data = {
++      .width          = 1,
++      .parts          = mv2120_partitions,
++      .nr_parts       = ARRAY_SIZE(mv2120_partitions)
++};
++
++static struct resource mv2120_nor_flash_resource = {
++      .flags          = IORESOURCE_MEM,
++      .start          = MV2120_NOR_BOOT_BASE,
++      .end            = MV2120_NOR_BOOT_BASE + MV2120_NOR_BOOT_SIZE - 1,
++};
++
++static struct platform_device mv2120_nor_flash = {
++      .name           = "physmap-flash",
++      .id             = 0,
++      .dev            = {
++              .platform_data  = &mv2120_nor_flash_data,
++      },
++      .resource       = &mv2120_nor_flash_resource,
++      .num_resources  = 1,
++};
++
++static struct gpio_keys_button mv2120_buttons[] = {
++      {
++              .code           = KEY_RESTART,
++              .gpio           = MV2120_GPIO_KEY_RESET,
++              .desc           = "Reset Button",
++              .active_low     = 1,
++      }, {
++              .code           = KEY_POWER,
++              .gpio           = MV2120_GPIO_KEY_POWER,
++              .desc           = "Power Button",
++              .active_low     = 1,
++      },
++};
++
++static struct gpio_keys_platform_data mv2120_button_data = {
++      .buttons        = mv2120_buttons,
++      .nbuttons       = ARRAY_SIZE(mv2120_buttons),
++};
++
++static struct platform_device mv2120_button_device = {
++      .name           = "gpio-keys",
++      .id             = -1,
++      .num_resources  = 0,
++      .dev            = {
++              .platform_data  = &mv2120_button_data,
++      },
++};
++
++
++/****************************************************************************
++ * General Setup
++ ****************************************************************************/
++static struct i2c_board_info __initdata mv2120_i2c_rtc = {
++      I2C_BOARD_INFO("rtc-pcf8563", 0x51),
++      .irq    = 0,
++};
++
++static void mv2120_power_off(void)
++{
++      pr_info("%s: triggering power-off...\n", __func__);
++      gpio_set_value(MV2120_GPIO_POWER_OFF, 0);
++}
++
++static void __init mv2120_init(void)
++{
++      /* Setup basic Orion functions. Need to be called early. */
++      orion5x_init();
++
++      orion5x_mpp_conf(0, MPP_GPIO);          /* Sys status LED */
++      orion5x_mpp_conf(1, MPP_GPIO);          /* Sys error LED */
++      orion5x_mpp_conf(2, MPP_GPIO);          /* OverTemp interrupt */
++      orion5x_mpp_conf(3, MPP_GPIO);          /* RTC interrupt */
++      orion5x_mpp_conf(4, MPP_GPIO);          /* V_LED 5V */
++      orion5x_mpp_conf(5, MPP_GPIO);          /* V_LED 3.3V */
++      orion5x_mpp_conf(6, MPP_UNUSED);
++      orion5x_mpp_conf(7, MPP_UNUSED);
++      orion5x_mpp_conf(8, MPP_GPIO);          /* SATA 0 fail LED */
++      orion5x_mpp_conf(9, MPP_GPIO);          /* SATA 1 fail LED */
++      orion5x_mpp_conf(10, MPP_UNUSED);
++      orion5x_mpp_conf(11, MPP_UNUSED);
++      orion5x_mpp_conf(12, MPP_SATA_LED);     /* SATA 0 presence */
++      orion5x_mpp_conf(13, MPP_SATA_LED);     /* SATA 1 presence */
++      orion5x_mpp_conf(14, MPP_SATA_LED);     /* SATA 0 active */
++      orion5x_mpp_conf(15, MPP_SATA_LED);     /* SATA 1 active */
++      orion5x_mpp_conf(16, MPP_UNUSED);
++      orion5x_mpp_conf(17, MPP_GPIO);         /* Reset button */
++      orion5x_mpp_conf(18, MPP_GPIO);         /* Power button */
++      orion5x_mpp_conf(19, MPP_GPIO);         /* Power off */
++
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      orion5x_ehci1_init();
++      orion5x_eth_init(&mv2120_eth_data);
++      orion5x_i2c_init();
++      orion5x_sata_init(&mv2120_sata_data);
++      orion5x_uart0_init();
++
++      orion5x_setup_dev_boot_win(MV2120_NOR_BOOT_BASE, MV2120_NOR_BOOT_SIZE);
++      platform_device_register(&mv2120_nor_flash);
++
++      platform_device_register(&mv2120_button_device);
++
++      if (gpio_request(MV2120_GPIO_RTC_IRQ, "rtc") == 0) {
++              if (gpio_direction_input(MV2120_GPIO_RTC_IRQ) == 0)
++                      mv2120_i2c_rtc.irq = gpio_to_irq(MV2120_GPIO_RTC_IRQ);
++              else
++                      gpio_free(MV2120_GPIO_RTC_IRQ);
++      }
++      i2c_register_board_info(0, &mv2120_i2c_rtc, 1);
++
++      /* register mv2120 specific power-off method */
++      if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 ||
++          gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0)
++              pr_err("mv2120: failed to setup power-off GPIO\n");
++      pm_power_off = mv2120_power_off;
++}
++
++/* Warning: HP uses a wrong mach-type (=526) in their bootloader */
++MACHINE_START(MV2120, "HP Media Vault mv2120")
++      /* Maintainer: Martin Michlmayr <tbm@cyrius.com> */
++      .phys_io        = ORION5X_REGS_PHYS_BASE,
++      .io_pg_offst    = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
++      .boot_params    = 0x00000100,
++      .init_machine   = mv2120_init,
++      .map_io         = orion5x_map_io,
++      .init_irq       = orion5x_init_irq,
++      .timer          = &orion5x_timer,
++      .fixup          = tag_fixup_mem32
++MACHINE_END
diff --git a/target/linux/orion/patches/019-add_technologic_systems_ts-78xx_support.patch b/target/linux/orion/patches/019-add_technologic_systems_ts-78xx_support.patch
new file mode 100644 (file)
index 0000000..a74464c
--- /dev/null
@@ -0,0 +1,305 @@
+Hi,
+
+The following patch series adds support for the Technologic Systems 
+TS-7800[1].  This is an updated driver to the one I posted before[2] which 
+takes on all the advice and fixes suggested here.
+
+Cheers
+
+Alex
+
+Signed-off-by: Alexander Clouter <alex@digriz.org.uk>
+
+[1] http://www.embeddedarm.com/products/board-detail.php?product=TS-7800
+[2] http://lists.arm.linux.org.uk/lurker/message/20080522.190133.54887e96.en.html
+
+---
+ arch/arm/mach-orion5x/Kconfig        |    7 +
+ arch/arm/mach-orion5x/Makefile       |    1 +
+ arch/arm/mach-orion5x/ts78xx-setup.c |  257 ++++++++++++++++++++++++++++++++++
+ 3 files changed, 265 insertions(+), 0 deletions(-)
+ create mode 100644 arch/arm/mach-orion5x/ts78xx-setup.c
+
+--- a/arch/arm/mach-orion5x/Kconfig
++++ b/arch/arm/mach-orion5x/Kconfig
+@@ -62,6 +62,13 @@
+         Say 'Y' here if you want your kernel to support the
+         HP Media Vault mv2120 or mv5100.
++config MACH_TS78XX
++      bool "Technologic Systems TS-78xx"
++      select CPU_FEROCEON_OLD_ID
++      help
++        Say 'Y' here if you want your kernel to support the
++        Technologic Systems TS-78xx platform.
++
+ endmenu
+ endif
+--- a/arch/arm/mach-orion5x/Makefile
++++ b/arch/arm/mach-orion5x/Makefile
+@@ -8,3 +8,4 @@
+ obj-$(CONFIG_MACH_TS409)      += ts409-setup.o
+ obj-$(CONFIG_MACH_WRT350N_V2) += wrt350n-v2-setup.o
+ obj-$(CONFIG_MACH_MV2120)     += mv2120-setup.o
++obj-$(CONFIG_MACH_TS78XX)     += ts78xx-setup.o
+--- /dev/null
++++ b/arch/arm/mach-orion5x/ts78xx-setup.c
+@@ -0,0 +1,257 @@
++/*
++ * arch/arm/mach-orion5x/ts78xx-setup.c
++ *
++ * Maintainer: Alexander Clouter <alex@digriz.org.uk>
++ *
++ * This file is licensed under the terms of the GNU General Public
++ * License version 2.  This program is licensed "as is" without any
++ * warranty of any kind, whether express or implied.
++ */
++
++#include <linux/kernel.h>
++#include <linux/init.h>
++#include <linux/platform_device.h>
++#include <linux/mtd/physmap.h>
++#include <linux/mv643xx_eth.h>
++#include <linux/ata_platform.h>
++#include <linux/m48t86.h>
++#include <asm/mach-types.h>
++#include <asm/mach/arch.h>
++#include <asm/mach/map.h>
++#include <asm/arch/orion5x.h>
++#include "common.h"
++#include "mpp.h"
++
++/*****************************************************************************
++ * TS-78xx Info
++ ****************************************************************************/
++
++/*
++ * FPGA - lives where the PCI bus would be at ORION5X_PCI_MEM_PHYS_BASE
++ */
++#define       TS78XX_FPGA_REGS_PHYS_BASE      0xe8000000
++#define       TS78XX_FPGA_REGS_VIRT_BASE      0xff900000
++#define       TS78XX_FPGA_REGS_SIZE           SZ_1M
++
++#define       TS78XX_FPGA_REGS_RTC_CTRL       TS78XX_FPGA_REGS_VIRT_BASE | 0x808
++#define       TS78XX_FPGA_REGS_RTC_DATA       TS78XX_FPGA_REGS_VIRT_BASE | 0x80c
++
++/*
++ * 512kB NOR flash Device
++ */
++#define       TS78XX_NOR_BOOT_BASE            0xff800000
++#define       TS78XX_NOR_BOOT_SIZE            SZ_512K
++
++/*****************************************************************************
++ * I/O Address Mapping
++ ****************************************************************************/
++static struct map_desc ts78xx_io_desc[] __initdata = {
++      {
++              .virtual        = TS78XX_FPGA_REGS_VIRT_BASE,
++              .pfn            = __phys_to_pfn(TS78XX_FPGA_REGS_PHYS_BASE),
++              .length         = TS78XX_FPGA_REGS_SIZE,
++              .type           = MT_DEVICE,
++      },
++};
++
++void __init ts78xx_map_io(void)
++{
++      orion5x_map_io();
++      iotable_init(ts78xx_io_desc, ARRAY_SIZE(ts78xx_io_desc));
++}
++
++/*****************************************************************************
++ * 512kB NOR Boot Flash - the chip is a M25P40
++ ****************************************************************************/
++static struct mtd_partition ts78xx_nor_boot_flash_resources[] = {
++      {
++              .name           = "ts-bootrom",
++              .offset         = 0,
++              /* only the first 256kB is used */
++              .size           = SZ_256K,
++              .mask_flags     = MTD_WRITEABLE,
++      },
++};
++
++static struct physmap_flash_data ts78xx_nor_boot_flash_data = {
++      .width          = 1,
++      .parts          = ts78xx_nor_boot_flash_resources,
++      .nr_parts       = ARRAY_SIZE(ts78xx_nor_boot_flash_resources),
++};
++
++static struct resource ts78xx_nor_boot_flash_resource = {
++      .flags          = IORESOURCE_MEM,
++      .start          = TS78XX_NOR_BOOT_BASE,
++      .end            = TS78XX_NOR_BOOT_BASE + TS78XX_NOR_BOOT_SIZE - 1,
++};
++
++static struct platform_device ts78xx_nor_boot_flash = {
++      .name           = "physmap-flash",
++      .id             = -1,
++      .dev            = {
++              .platform_data  = &ts78xx_nor_boot_flash_data,
++      },
++      .num_resources  = 1,
++      .resource       = &ts78xx_nor_boot_flash_resource,
++};
++
++/*****************************************************************************
++ * PCI
++ ****************************************************************************/
++
++/*
++ * WARNING: TS shunt the PCI IO via the FPGA so that you could build soft-PCI
++ *            devices for it and what-not.  There is nothing on the PCI or
++ *            PCIe buses so probably nothing really to do yet here, if ever
++ */
++
++/*****************************************************************************
++ * Ethernet
++ ****************************************************************************/
++static struct mv643xx_eth_platform_data ts78xx_eth_data = {
++      .phy_addr       = 0,
++      .force_phy_addr = 1,
++};
++
++/*****************************************************************************
++ * RTC M48T86 - nicked^Wborrowed from arch/arm/mach-ep93xx/ts72xx.c
++ ****************************************************************************/
++static unsigned char ts78xx_rtc_readbyte(unsigned long addr)
++{
++      writeb(addr, TS78XX_FPGA_REGS_RTC_CTRL);
++      return readb(TS78XX_FPGA_REGS_RTC_DATA);
++}
++
++static void ts78xx_rtc_writebyte(unsigned char value, unsigned long addr)
++{
++      writeb(addr, TS78XX_FPGA_REGS_RTC_CTRL);
++      writeb(value, TS78XX_FPGA_REGS_RTC_DATA);
++}
++
++static struct m48t86_ops ts78xx_rtc_ops = {
++      .readbyte       = ts78xx_rtc_readbyte,
++      .writebyte      = ts78xx_rtc_writebyte,
++};
++
++static struct platform_device ts78xx_rtc_device = {
++      .name           = "rtc-m48t86",
++      .id             = -1,
++      .dev            = {
++              .platform_data  = &ts78xx_rtc_ops,
++      },
++      .num_resources  = 0,
++};
++
++/*****************************************************************************
++ * SATA
++ ****************************************************************************/
++static struct mv_sata_platform_data ts78xx_sata_data = {
++      .n_ports        = 2,
++};
++
++/*****************************************************************************
++ * General Setup
++ ****************************************************************************/
++static void __init ts78xx_init(void)
++{
++#ifdef CONFIG_RTC_DRV_M48T86
++      unsigned char tmp_rtc0, tmp_rtc1;
++#endif
++
++      /*
++       * Setup basic Orion functions. Need to be called early.
++       */
++      orion5x_init();
++
++      orion5x_mpp_conf(0, MPP_UNUSED);
++
++      /*
++       * MPP[1] JTAG Clock
++       * MPP[2] JTAG Data In
++       * MPP[3] Lattice ECP2 256 FPGA - PB2B
++       * MPP[4] JTAG Data Out
++       * MPP[5] JTAG TMS
++       * MPP[6] Lattice ECP2 256 FPGA - PB31A_CLK4+
++       * MPP[7] Lattice ECP2 256 FPGA - PB22B
++       */
++
++      orion5x_mpp_conf(8, MPP_UNUSED);
++      orion5x_mpp_conf(9, MPP_UNUSED);
++      orion5x_mpp_conf(10, MPP_UNUSED);
++      orion5x_mpp_conf(11, MPP_UNUSED);
++      orion5x_mpp_conf(12, MPP_UNUSED);
++      orion5x_mpp_conf(13, MPP_UNUSED);
++      orion5x_mpp_conf(14, MPP_UNUSED);
++      orion5x_mpp_conf(15, MPP_UNUSED);
++      orion5x_mpp_conf(16, MPP_UART);
++      orion5x_mpp_conf(17, MPP_UART);
++      orion5x_mpp_conf(18, MPP_UART);
++      orion5x_mpp_conf(19, MPP_UART);
++
++      /*
++       * MPP[20] PCI Clock Out 1
++       * MPP[21] PCI Clock Out 0
++       * MPP[22] Unused
++       * MPP[23] Unused
++       * MPP[24] Unused
++       * MPP[25] Unused
++       */
++
++      /*
++       * Configure peripherals.
++       */
++      orion5x_ehci0_init();
++      orion5x_ehci1_init();
++      orion5x_eth_init(&ts78xx_eth_data);
++      orion5x_sata_init(&ts78xx_sata_data);
++      orion5x_uart0_init();
++      orion5x_uart1_init();
++
++      orion5x_setup_dev_boot_win(TS78XX_NOR_BOOT_BASE,
++                                 TS78XX_NOR_BOOT_SIZE);
++      platform_device_register(&ts78xx_nor_boot_flash);
++
++#ifdef CONFIG_RTC_DRV_M48T86
++      /*
++       * TS uses some of the user storage space on the RTC chip so see if it
++       * is present; as it's an optional feature at purchase time and not all
++       * boards will have it present
++       *
++       * I've used the method TS use in their rtc7800.c example for the
++       * detection logic; a little 'funky' but thats what floats my boat
++       *
++       * TODO: track down a guinea pig without an RTC to see if we can work
++       *              out a better RTC detection routine
++       */
++      tmp_rtc0 = ts78xx_rtc_readbyte(126);
++      tmp_rtc1 = ts78xx_rtc_readbyte(127);
++
++      ts78xx_rtc_writebyte(0x00, 126);
++      ts78xx_rtc_writebyte(0x55, 127);
++      if (ts78xx_rtc_readbyte(127) == 0x55) {
++              ts78xx_rtc_writebyte(0xaa, 127);
++              if (ts78xx_rtc_readbyte(127) == 0xaa
++                              && ts78xx_rtc_readbyte(126) == 0x00) {
++                      ts78xx_rtc_writebyte(tmp_rtc0, 126);
++                      ts78xx_rtc_writebyte(tmp_rtc1, 127);
++                      platform_device_register(&ts78xx_rtc_device);
++                      goto rtcok;
++              }
++      }
++      printk(KERN_INFO "TS-78xx RTC not detected\n");
++
++ rtcok:
++      ;
++#endif
++}
++
++MACHINE_START(TS78XX, "Technologic Systems TS-78xx SBC")
++      /* Maintainer: Alexander Clouter <alex@digriz.org.uk> */
++      .phys_io        = ORION5X_REGS_PHYS_BASE,
++      .io_pg_offst    = ((ORION5X_REGS_VIRT_BASE) >> 18) & 0xFFFC,
++      .boot_params    = 0x00000100,
++      .init_machine   = ts78xx_init,
++      .map_io         = ts78xx_map_io,
++      .init_irq       = orion5x_init_irq,
++      .timer          = &orion5x_timer,
++MACHINE_END
index 9e5320c..1a465f5 100644 (file)
@@ -84,7 +84,7 @@ config TARGET_OPTIMIZATION
        default "-O2 -pipe -march=i486 -funit-at-a-time" if TARGET_x86
        default "-Os -pipe -march=i486 -funit-at-a-time" if TARGET_rdc
        default "-Os -pipe -mips32 -mtune=mips32 -funit-at-a-time" if mipsel || mips
-       default "-Os -pipe -march=armv5te -mtune=xscale -funit-at-a-time" if TARGET_ixp4xx || TARGET_iop32x || TARGET_pxa
+       default "-Os -pipe -march=armv5te -mtune=xscale -funit-at-a-time" if TARGET_ixp4xx || TARGET_iop32x || TARGET_pxa || TARGET_orion
        default "-Os -pipe -march=armv4t -mtune=arm9tdmi -funit-at-a-time" if TARGET_storm
        default "-Os -pipe -funit-at-a-time"
        help