diff options
24 files changed, 4441 insertions, 1 deletions
diff --git a/package/madwifi/Makefile b/package/madwifi/Makefile index 496e5e6d1..874438b29 100644 --- a/package/madwifi/Makefile +++ b/package/madwifi/Makefile @@ -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 index 000000000..4cc509ad2 --- /dev/null +++ b/target/linux/orion/Makefile @@ -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 index 000000000..4dc9ec58b --- /dev/null +++ b/target/linux/orion/config-default @@ -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 index 000000000..073c24f63 --- /dev/null +++ b/target/linux/orion/image/Makefile @@ -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 index 000000000..a1fbc17f5 --- /dev/null +++ b/target/linux/orion/patches/001-latencytop_support.patch @@ -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 index 000000000..c2efe5be2 --- /dev/null +++ b/target/linux/orion/patches/002-feroceon__speed_up_flushing_of_the_entire_cache.patch @@ -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 index 000000000..02126ca33 --- /dev/null +++ b/target/linux/orion/patches/003-fix_various_whitespace_and_coding_style.patch @@ -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 index 000000000..f5f1de4c2 --- /dev/null +++ b/target/linux/orion/patches/004-make_window_setup_a_little_more_safe.patch @@ -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 index 000000000..2e7815de2 --- /dev/null +++ b/target/linux/orion/patches/005-dram_mapping_granularity_is_64kib.patch @@ -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 index 000000000..75daedd84 --- /dev/null +++ b/target/linux/orion/patches/006-add_a_separate_BRIDGE_INT_TIMER1_CLR_define.patch @@ -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 index 000000000..5aab94bb8 --- /dev/null +++ b/target/linux/orion/patches/007-annotate_88fr531-vd_cpu_entries.patch @@ -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 index 000000000..add15900c --- /dev/null +++ b/target/linux/orion/patches/008-top-level_irqs_are_level-triggered.patch @@ -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 index 000000000..222a6dabc --- /dev/null +++ b/target/linux/orion/patches/009-delete_unused_IO_SPACE_REMAP_define.patch @@ -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 index 000000000..6f11eefad --- /dev/null +++ b/target/linux/orion/patches/010-move_EHCI_I2C_UART_peripheral_init.patch @@ -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 index 000000000..f6e78d84d --- /dev/null +++ b/target/linux/orion/patches/011-move_setting_up_pcie_wa_window_into_pcie.patch @@ -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 index 000000000..05e188125 --- /dev/null +++ b/target/linux/orion/patches/012-rework_mpp_handling.patch @@ -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 index 000000000..b90277770 --- /dev/null +++ b/target/linux/orion/patches/013-add_88f5181l_support.patch @@ -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 index 000000000..d47e5dd28 --- /dev/null +++ b/target/linux/orion/patches/014-avoid_setting_force_phy_addr.patch @@ -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 index 000000000..581485238 --- /dev/null +++ b/target/linux/orion/patches/015-implement_power-off_method_for_kurobox_pro.patch @@ -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 index 000000000..a0d22f75e --- /dev/null +++ b/target/linux/orion/patches/016-add_qnap_ts-409_support.patch @@ -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 index 000000000..5faa9597a --- /dev/null +++ b/target/linux/orion/patches/017-add_linksys_wrt350n_v2_support.patch @@ -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 index 000000000..02a93c95c --- /dev/null +++ b/target/linux/orion/patches/018-add_hp_media_vault_mv2120_support.patch @@ -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 index 000000000..a74464c7b --- /dev/null +++ b/target/linux/orion/patches/019-add_technologic_systems_ts-78xx_support.patch @@ -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 diff --git a/toolchain/Config.in b/toolchain/Config.in index 9e5320cb7..1a465f5e5 100644 --- a/toolchain/Config.in +++ b/toolchain/Config.in @@ -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  | 
