add support for the Simplemachines Sim.One board
SVN-Revision: 18540
This commit is contained in:
		
							
								
								
									
										21
									
								
								target/linux/ep93xx/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								target/linux/ep93xx/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | |||||||
|  | # | ||||||
|  | # Copyright (C) 2009 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:=ep93xx | ||||||
|  | BOARDNAME:=Cirrus Logic EP93xx SoC | ||||||
|  | FEATURES:=squashfs jffs2 ext2 tgz | ||||||
|  | CFLAGS:=-Os -pipe -march=armv4t -funit-at-a-time | ||||||
|  |  | ||||||
|  | LINUX_VERSION:=2.6.30.9 | ||||||
|  |  | ||||||
|  | include $(INCLUDE_DIR)/target.mk | ||||||
|  |  | ||||||
|  | KERNELNAME:="uImage" | ||||||
|  |  | ||||||
|  | $(eval $(call BuildTarget)) | ||||||
							
								
								
									
										5
									
								
								target/linux/ep93xx/base-files/etc/inittab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								target/linux/ep93xx/base-files/etc/inittab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | |||||||
|  | ::sysinit:/etc/init.d/rcS S boot | ||||||
|  | ::shutdown:/etc/init.d/rcS K stop | ||||||
|  | tts/0::askfirst:/bin/ash --login | ||||||
|  | ttyAM0::askfirst:/bin/ash --login | ||||||
|  | tty1::askfirst:/bin/ash --login | ||||||
							
								
								
									
										239
									
								
								target/linux/ep93xx/config-2.6.30
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								target/linux/ep93xx/config-2.6.30
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | |||||||
|  | CONFIG_AEABI=y | ||||||
|  | CONFIG_ALIGNMENT_TRAP=y | ||||||
|  | CONFIG_ARCH_EP93XX=y | ||||||
|  | CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y | ||||||
|  | # CONFIG_ARCH_HAS_ILOG2_U32 is not set | ||||||
|  | # CONFIG_ARCH_HAS_ILOG2_U64 is not set | ||||||
|  | CONFIG_ARCH_REQUIRE_GPIOLIB=y | ||||||
|  | # CONFIG_ARCH_SELECT_MEMORY_MODEL is not set | ||||||
|  | # CONFIG_ARCH_SPARSEMEM_DEFAULT is not set | ||||||
|  | # CONFIG_ARCH_SUPPORTS_MSI is not set | ||||||
|  | CONFIG_ARCH_SUSPEND_POSSIBLE=y | ||||||
|  | CONFIG_ARM=y | ||||||
|  | CONFIG_ARM_AMBA=y | ||||||
|  | CONFIG_ARM_THUMB=y | ||||||
|  | CONFIG_ARM_VIC=y | ||||||
|  | # CONFIG_ARPD is not set | ||||||
|  | # CONFIG_BINARY_PRINTF is not set | ||||||
|  | CONFIG_BITREVERSE=y | ||||||
|  | # CONFIG_BLK_DEV_INITRD is not set | ||||||
|  | # CONFIG_BSD_PROCESS_ACCT is not set | ||||||
|  | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||||||
|  | CONFIG_CFG80211=y | ||||||
|  | # CONFIG_CFG80211_REG_DEBUG is not set | ||||||
|  | CONFIG_CMDLINE="console=ttyAM0,57600 init=/etc/preinit" | ||||||
|  | CONFIG_COMMON_CLKDEV=y | ||||||
|  | CONFIG_CONSOLE_TRANSLATIONS=y | ||||||
|  | CONFIG_CPU_32=y | ||||||
|  | CONFIG_CPU_32v4T=y | ||||||
|  | CONFIG_CPU_ABRT_EV4T=y | ||||||
|  | CONFIG_CPU_ARM920T=y | ||||||
|  | CONFIG_CPU_CACHE_V4WT=y | ||||||
|  | CONFIG_CPU_CACHE_VIVT=y | ||||||
|  | CONFIG_CPU_COPY_V4WB=y | ||||||
|  | CONFIG_CPU_CP15=y | ||||||
|  | CONFIG_CPU_CP15_MMU=y | ||||||
|  | # CONFIG_CPU_DCACHE_WRITETHROUGH is not set | ||||||
|  | # CONFIG_CPU_ICACHE_DISABLE is not set | ||||||
|  | CONFIG_CPU_PABRT_NOIFAR=y | ||||||
|  | CONFIG_CPU_TLB_V4WBI=y | ||||||
|  | CONFIG_CRC7=y | ||||||
|  | CONFIG_CRC_ITU_T=y | ||||||
|  | CONFIG_CRUNCH=y | ||||||
|  | CONFIG_CRYPTO_AEAD2=y | ||||||
|  | CONFIG_CRYPTO_AES=y | ||||||
|  | CONFIG_CRYPTO_ARC4=y | ||||||
|  | CONFIG_CRYPTO_BLKCIPHER=y | ||||||
|  | CONFIG_CRYPTO_BLKCIPHER2=y | ||||||
|  | CONFIG_CRYPTO_CRC32C=y | ||||||
|  | CONFIG_CRYPTO_DES=y | ||||||
|  | CONFIG_CRYPTO_ECB=m | ||||||
|  | CONFIG_CRYPTO_HASH=y | ||||||
|  | CONFIG_CRYPTO_HASH2=y | ||||||
|  | CONFIG_CRYPTO_MANAGER=y | ||||||
|  | CONFIG_CRYPTO_MANAGER2=y | ||||||
|  | CONFIG_CRYPTO_MD5=y | ||||||
|  | CONFIG_CRYPTO_MICHAEL_MIC=y | ||||||
|  | CONFIG_CRYPTO_PCBC=y | ||||||
|  | CONFIG_CRYPTO_RNG2=y | ||||||
|  | CONFIG_CRYPTO_SHA1=y | ||||||
|  | CONFIG_CRYPTO_WORKQUEUE=y | ||||||
|  | CONFIG_DEBUG_USER=y | ||||||
|  | CONFIG_DECOMPRESS_LZMA=y | ||||||
|  | CONFIG_DEFAULT_TCP_CONG="cubic" | ||||||
|  | # CONFIG_DM9000 is not set | ||||||
|  | CONFIG_DNOTIFY=y | ||||||
|  | CONFIG_DUMMY_CONSOLE=y | ||||||
|  | CONFIG_ELF_CORE=y | ||||||
|  | # CONFIG_ENABLE_WARN_DEPRECATED is not set | ||||||
|  | CONFIG_EP93XX_EARLY_UART1=y | ||||||
|  | # CONFIG_EP93XX_EARLY_UART2 is not set | ||||||
|  | # CONFIG_EP93XX_EARLY_UART3 is not set | ||||||
|  | CONFIG_EP93XX_ETH=y | ||||||
|  | CONFIG_EP93XX_WATCHDOG=y | ||||||
|  | CONFIG_FB=y | ||||||
|  | # CONFIG_FB_ARMCLCD is not set | ||||||
|  | CONFIG_FB_CFB_COPYAREA=y | ||||||
|  | CONFIG_FB_CFB_FILLRECT=y | ||||||
|  | CONFIG_FB_CFB_IMAGEBLIT=y | ||||||
|  | CONFIG_FB_EP93XX=y | ||||||
|  | # CONFIG_FB_EP93XX_MONO is not set | ||||||
|  | # CONFIG_FIRMWARE_EDID is not set | ||||||
|  | CONFIG_FONTS=y | ||||||
|  | # CONFIG_FONT_10x18 is not set | ||||||
|  | # CONFIG_FONT_6x11 is not set | ||||||
|  | # CONFIG_FONT_7x14 is not set | ||||||
|  | CONFIG_FONT_8x16=y | ||||||
|  | CONFIG_FONT_8x8=y | ||||||
|  | # CONFIG_FONT_ACORN_8x8 is not set | ||||||
|  | # CONFIG_FONT_MINI_4x6 is not set | ||||||
|  | # CONFIG_FONT_PEARL_8x8 is not set | ||||||
|  | # CONFIG_FONT_SUN12x22 is not set | ||||||
|  | # CONFIG_FONT_SUN8x16 is not set | ||||||
|  | # CONFIG_FPE_FASTFPE is not set | ||||||
|  | CONFIG_FPE_NWFPE=y | ||||||
|  | CONFIG_FPE_NWFPE_XP=y | ||||||
|  | CONFIG_FRAMEBUFFER_CONSOLE=y | ||||||
|  | # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set | ||||||
|  | # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set | ||||||
|  | CONFIG_FRAME_POINTER=y | ||||||
|  | # CONFIG_FW_LOADER is not set | ||||||
|  | # CONFIG_GENERIC_CLOCKEVENTS is not set | ||||||
|  | CONFIG_GENERIC_FIND_LAST_BIT=y | ||||||
|  | CONFIG_GENERIC_GPIO=y | ||||||
|  | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | ||||||
|  | # CONFIG_GENERIC_TIME is not set | ||||||
|  | CONFIG_GPIOLIB=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_AOUT=y | ||||||
|  | CONFIG_HAVE_ARCH_KGDB=y | ||||||
|  | CONFIG_HAVE_CLK=y | ||||||
|  | CONFIG_HAVE_FUNCTION_TRACER=y | ||||||
|  | CONFIG_HAVE_GENERIC_DMA_COHERENT=y | ||||||
|  | CONFIG_HAVE_IDE=y | ||||||
|  | CONFIG_HAVE_KPROBES=y | ||||||
|  | CONFIG_HAVE_KRETPROBES=y | ||||||
|  | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | ||||||
|  | CONFIG_HAVE_MLOCK=y | ||||||
|  | CONFIG_HAVE_OPROFILE=y | ||||||
|  | CONFIG_HW_CONSOLE=y | ||||||
|  | # CONFIG_HW_RANDOM is not set | ||||||
|  | CONFIG_I2C=y | ||||||
|  | CONFIG_I2C_ALGOBIT=y | ||||||
|  | CONFIG_I2C_BOARDINFO=y | ||||||
|  | CONFIG_I2C_CHARDEV=y | ||||||
|  | CONFIG_I2C_EP93XX=y | ||||||
|  | CONFIG_IKCONFIG=y | ||||||
|  | CONFIG_IKCONFIG_PROC=y | ||||||
|  | CONFIG_INOTIFY=y | ||||||
|  | CONFIG_INOTIFY_USER=y | ||||||
|  | CONFIG_INPUT=y | ||||||
|  | # CONFIG_INPUT_MISC is not set | ||||||
|  | CONFIG_INPUT_TOUCHSCREEN=y | ||||||
|  | # CONFIG_IP_ADVANCED_ROUTER is not set | ||||||
|  | # CONFIG_IP_MULTICAST is not set | ||||||
|  | CONFIG_IP_PNP=y | ||||||
|  | CONFIG_IP_PNP_BOOTP=y | ||||||
|  | CONFIG_IP_PNP_DHCP=y | ||||||
|  | # CONFIG_IP_PNP_RARP is not set | ||||||
|  | # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set | ||||||
|  | # CONFIG_JFFS2_SUMMARY is not set | ||||||
|  | CONFIG_LCD_HD44780=m | ||||||
|  | CONFIG_LCD_LINUX=m | ||||||
|  | CONFIG_LIBCRC32C=y | ||||||
|  | CONFIG_LOCALVERSION_AUTO=y | ||||||
|  | CONFIG_LOCK_KERNEL=y | ||||||
|  | CONFIG_LOGO=y | ||||||
|  | CONFIG_LOGO_LINUX_CLUT224=y | ||||||
|  | CONFIG_LOGO_LINUX_MONO=y | ||||||
|  | CONFIG_LOGO_LINUX_VGA16=y | ||||||
|  | CONFIG_LOG_BUF_SHIFT=16 | ||||||
|  | CONFIG_MAC80211=m | ||||||
|  | # CONFIG_MAC80211_DEBUGFS is not set | ||||||
|  | # CONFIG_MAC80211_DEBUG_MENU is not set | ||||||
|  | # CONFIG_MAC80211_HWSIM is not set | ||||||
|  | # CONFIG_MAC80211_LEDS is not set | ||||||
|  | # CONFIG_MAC80211_MESH is not set | ||||||
|  | CONFIG_MAC80211_RC_DEFAULT="pid" | ||||||
|  | # CONFIG_MAC80211_RC_DEFAULT_MINSTREL is not set | ||||||
|  | CONFIG_MAC80211_RC_DEFAULT_PID=y | ||||||
|  | CONFIG_MAC80211_RC_MINSTREL=y | ||||||
|  | CONFIG_MAC80211_RC_PID=y | ||||||
|  | # CONFIG_MACH_ADSSPHERE is not set | ||||||
|  | # CONFIG_MACH_EDB9302 is not set | ||||||
|  | # CONFIG_MACH_EDB9302A is not set | ||||||
|  | # CONFIG_MACH_EDB9307 is not set | ||||||
|  | # CONFIG_MACH_EDB9307A is not set | ||||||
|  | # CONFIG_MACH_EDB9312 is not set | ||||||
|  | # CONFIG_MACH_EDB9315 is not set | ||||||
|  | # CONFIG_MACH_EDB9315A is not set | ||||||
|  | # CONFIG_MACH_GESBC9312 is not set | ||||||
|  | # CONFIG_MACH_MICRO9 is not set | ||||||
|  | # CONFIG_MACH_MICRO9H is not set | ||||||
|  | # CONFIG_MACH_MICRO9L is not set | ||||||
|  | # CONFIG_MACH_MICRO9M is not set | ||||||
|  | CONFIG_MACH_SIM_ONE=y | ||||||
|  | # CONFIG_MACH_TS72XX is not set | ||||||
|  | # CONFIG_MFD_T7L66XB is not set | ||||||
|  | # CONFIG_MISC_DEVICES is not set | ||||||
|  | CONFIG_MMC=y | ||||||
|  | CONFIG_MMC_BLOCK=y | ||||||
|  | CONFIG_MMC_SPI=y | ||||||
|  | CONFIG_MODULE_FORCE_UNLOAD=y | ||||||
|  | CONFIG_MTD_CFI_ADV_OPTIONS=y | ||||||
|  | # CONFIG_MTD_CFI_GEOMETRY is not set | ||||||
|  | CONFIG_MTD_CFI_STAA=y | ||||||
|  | # CONFIG_MTD_COMPLEX_MAPPINGS is not set | ||||||
|  | CONFIG_MTD_PHYSMAP=y | ||||||
|  | CONFIG_MTD_RAM=y | ||||||
|  | # CONFIG_NETDEV_1000 is not set | ||||||
|  | # CONFIG_NETFILTER is not set | ||||||
|  | CONFIG_NET_KEY=y | ||||||
|  | # CONFIG_NEW_LEDS is not set | ||||||
|  | CONFIG_NLS=y | ||||||
|  | # CONFIG_NO_IOPORT is not set | ||||||
|  | CONFIG_OABI_COMPAT=y | ||||||
|  | # CONFIG_OUTER_CACHE is not set | ||||||
|  | CONFIG_PAGEFLAGS_EXTENDED=y | ||||||
|  | CONFIG_PAGE_OFFSET=0xC0000000 | ||||||
|  | # CONFIG_PCI_SYSCALL is not set | ||||||
|  | CONFIG_PREEMPT=y | ||||||
|  | # CONFIG_ROMFS_BACKED_BY_BLOCK is not set | ||||||
|  | # CONFIG_ROMFS_BACKED_BY_BOTH is not set | ||||||
|  | # CONFIG_ROMFS_BACKED_BY_MTD is not set | ||||||
|  | # CONFIG_SCSI_DMA is not set | ||||||
|  | # CONFIG_SDIO_UART is not set | ||||||
|  | # CONFIG_SERIAL_8250 is not set | ||||||
|  | CONFIG_SERIAL_AMBA_PL010=y | ||||||
|  | CONFIG_SERIAL_AMBA_PL010_CONSOLE=y | ||||||
|  | # CONFIG_SERIAL_AMBA_PL011 is not set | ||||||
|  | # CONFIG_SLOW_WORK is not set | ||||||
|  | CONFIG_SPI=y | ||||||
|  | CONFIG_SPI_BITBANG=y | ||||||
|  | CONFIG_SPI_EP93XX=y | ||||||
|  | # CONFIG_SPI_GPIO is not set | ||||||
|  | CONFIG_SPI_MASTER=y | ||||||
|  | # CONFIG_SPI_SPIDEV is not set | ||||||
|  | CONFIG_SPLIT_PTLOCK_CPUS=4096 | ||||||
|  | CONFIG_SYS_SUPPORTS_APM_EMULATION=y | ||||||
|  | # CONFIG_TCP_CONG_ADVANCED is not set | ||||||
|  | CONFIG_TCP_CONG_CUBIC=y | ||||||
|  | CONFIG_TOUCHSCREEN_EP93XX=y | ||||||
|  | CONFIG_TRACING_SUPPORT=y | ||||||
|  | CONFIG_UID16=y | ||||||
|  | # CONFIG_USB_ARCH_HAS_EHCI is not set | ||||||
|  | CONFIG_USB_SUPPORT=y | ||||||
|  | CONFIG_VECTORS_BASE=0xffff0000 | ||||||
|  | # CONFIG_VGA_CONSOLE is not set | ||||||
|  | CONFIG_VIDEO_OUTPUT_CONTROL=y | ||||||
|  | CONFIG_VM_EVENT_COUNTERS=y | ||||||
|  | CONFIG_VT=y | ||||||
|  | CONFIG_VT_CONSOLE=y | ||||||
|  | # CONFIG_VT_HW_CONSOLE_BINDING is not set | ||||||
|  | CONFIG_ZBOOT_ROM_BSS=0x0 | ||||||
|  | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||||||
|  | CONFIG_ZONE_DMA_FLAG=0 | ||||||
							
								
								
									
										35
									
								
								target/linux/ep93xx/image/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								target/linux/ep93xx/image/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | # | ||||||
|  | # Copyright (C) 2009 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 | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Image/Build/jffs2-64k | ||||||
|  | 	dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=64k conv=sync | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Image/Build/jffs2-128k | ||||||
|  | 	dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=128k conv=sync | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Image/Build/squashfs | ||||||
|  | 	$(call prepare_generic_squashfs,$(KDIR)/root.squashfs) | ||||||
|  | 	dd if=$(KDIR)/root.$(1) of=$(BIN_DIR)/openwrt-$(BOARD)-$(1).img bs=128k conv=sync | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Image/Build | ||||||
|  | 	cp $(KDIR)/uImage $(BIN_DIR)/uImage-$(board) | ||||||
|  | 	$(call Image/Build/$(1),$(1)) | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | $(eval $(call BuildImage)) | ||||||
							
								
								
									
										479
									
								
								target/linux/ep93xx/patches-2.6.30/001-ep93xx-regs.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								target/linux/ep93xx/patches-2.6.30/001-ep93xx-regs.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,479 @@ | |||||||
|  | --- a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h | ||||||
|  | +++ b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h | ||||||
|  | @@ -57,6 +57,33 @@ | ||||||
|  |  #define EP93XX_APB_SIZE			0x00200000 | ||||||
|  |   | ||||||
|  |   | ||||||
|  | +/* 8081_0000 - 8081_ffff: Timers */ | ||||||
|  | +#define TIMERS_OFFSET           0x010000 | ||||||
|  | +#define TIMERS_BASE             (EP93XX_APB_VIRT_BASE|TIMERS_OFFSET) | ||||||
|  | + | ||||||
|  | +#define TIMER1LOAD              (TIMERS_BASE+0x00) | ||||||
|  | +#define TIMER1VALUE             (TIMERS_BASE+0x04) | ||||||
|  | +#define TIMER1CONTROL           (TIMERS_BASE+0x08) | ||||||
|  | +#define TIMER1CLEAR             (TIMERS_BASE+0x0C) | ||||||
|  | +#define TIMER1TEST              (TIMERS_BASE+0x10) | ||||||
|  | + | ||||||
|  | +#define TIMER2LOAD              (TIMERS_BASE+0x20) | ||||||
|  | +#define TIMER2VALUE             (TIMERS_BASE+0x24) | ||||||
|  | +#define TIMER2CONTROL           (TIMERS_BASE+0x28) | ||||||
|  | +#define TIMER2CLEAR             (TIMERS_BASE+0x2C) | ||||||
|  | +#define TIMER2TEST              (TIMERS_BASE+0x30) | ||||||
|  | + | ||||||
|  | +#define TIMER3LOAD              (TIMERS_BASE+0x80) | ||||||
|  | +#define TIMER3VALUE             (TIMERS_BASE+0x84) | ||||||
|  | +#define TIMER3CONTROL           (TIMERS_BASE+0x88) | ||||||
|  | +#define TIMER3CLEAR             (TIMERS_BASE+0x8C) | ||||||
|  | +#define TIMER3TEST              (TIMERS_BASE+0x90) | ||||||
|  | + | ||||||
|  | +#define TTIMERBZCONT            (TIMERS_BASE+0x40) | ||||||
|  | + | ||||||
|  | +#define TIMER4VALUELOW          (TIMERS_BASE+0x60) | ||||||
|  | +#define TIMER4VALUEHIGH         (TIMERS_BASE+0x64) | ||||||
|  | + | ||||||
|  |  /* AHB peripherals */ | ||||||
|  |  #define EP93XX_DMA_BASE			((void __iomem *)		\ | ||||||
|  |  					 (EP93XX_AHB_VIRT_BASE + 0x00000000)) | ||||||
|  | @@ -105,6 +132,8 @@ | ||||||
|  |  #define EP93XX_I2S_BASE			(EP93XX_APB_VIRT_BASE + 0x00020000) | ||||||
|  |   | ||||||
|  |  #define EP93XX_SECURITY_BASE		(EP93XX_APB_VIRT_BASE + 0x00030000) | ||||||
|  | +#define EP93XX_SECURITY_REG(x)		(EP93XX_SECURITY_BASE + (x)) | ||||||
|  | +#define EP93XX_SECURITY_UNIQID		EP93XX_SECURITY_REG(0x2440) | ||||||
|  |   | ||||||
|  |  #define EP93XX_GPIO_BASE		(EP93XX_APB_VIRT_BASE + 0x00040000) | ||||||
|  |  #define EP93XX_GPIO_REG(x)		(EP93XX_GPIO_BASE + (x)) | ||||||
|  | @@ -127,6 +156,7 @@ | ||||||
|  |  #define EP93XX_AAC_BASE			(EP93XX_APB_VIRT_BASE + 0x00080000) | ||||||
|  |   | ||||||
|  |  #define EP93XX_SPI_BASE			(EP93XX_APB_VIRT_BASE + 0x000a0000) | ||||||
|  | +#define EP93XX_SPI_BASE_PHYS	(EP93XX_APB_PHYS_BASE + 0x000a0000) | ||||||
|  |   | ||||||
|  |  #define EP93XX_IRDA_BASE		(EP93XX_APB_VIRT_BASE + 0x000b0000) | ||||||
|  |   | ||||||
|  | @@ -164,8 +194,425 @@ | ||||||
|  |  #define EP93XX_SYSCON_DEVICE_CONFIG_U2EN		(1<<20) | ||||||
|  |  #define EP93XX_SYSCON_DEVICE_CONFIG_U1EN		(1<<18) | ||||||
|  |  #define EP93XX_SYSCON_SWLOCK		EP93XX_SYSCON_REG(0xc0) | ||||||
|  | +#define EP93XX_SYSCON_CHIP_ID		EP93XX_SYSCON_REG(0x94) | ||||||
|  | +#define EP93XX_SYSCON_BMAR              EP93XX_SYSCON_REG(0x54) | ||||||
|  | +#define EP93XX_SYSCON_I2SDIV            EP93XX_SYSCON_REG(0x8C) | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_CONFIG_Mong   	0x02000000 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_CONFIG_Tong   	0x04000000 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_CONFIG_I2SONSSP   	0x00000080 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_CONFIG_I2SONAC97  	0x00000040 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_RasOnP3            0x00000010 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_A1onG              0x00200000 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_A2onG              0x00400000 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_U1EN               0x00040000 | ||||||
|  | +#define EP93XX_SYSCON_DEVCFG_TIN                0x00020000 | ||||||
|  |   | ||||||
|  |  #define EP93XX_WATCHDOG_BASE		(EP93XX_APB_VIRT_BASE + 0x00140000) | ||||||
|  |   | ||||||
|  |   | ||||||
|  | +#define SYSCON_PWRCNT           (EP93XX_SYSCON_BASE+0x0004) | ||||||
|  | +#define SYSCON_VIDDIV           (EP93XX_SYSCON_BASE+0x0084) | ||||||
|  | +#define SYSCON_MIRDIV           (EP93XX_SYSCON_BASE+0x0088) | ||||||
|  | +#define SYSCON_KTDIV            (EP93XX_SYSCON_BASE+0x0090) | ||||||
|  | +#define SYSCON_KTDIV_TSEN       0x80000000 | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +// SYSCON_CLKSET1 | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_X2IPD_SHIFT     0 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_X2IPD_MASK      0x0000001f | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_X2FBD2_SHIFT    5 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_X2FBD2_MASK     0x000007e0 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_X1FBD1_SHIFT    11 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_X1FBD1_MASK     0x0000f800 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_PS_SHIFT        16 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_PS_MASK         0x00030000 | ||||||
|  | +#define SYSCON_CLKSET1_PCLKDIV_SHIFT        18 | ||||||
|  | +#define SYSCON_CLKSET1_PCLKDIV_MASK         0x000c0000 | ||||||
|  | +#define SYSCON_CLKSET1_HCLKDIV_SHIFT        20 | ||||||
|  | +#define SYSCON_CLKSET1_HCLKDIV_MASK         0x00700000 | ||||||
|  | +#define SYSCON_CLKSET1_nBYP1                0x00800000 | ||||||
|  | +#define SYSCON_CLKSET1_SMCROM               0x01000000 | ||||||
|  | +#define SYSCON_CLKSET1_FCLKDIV_SHIFT        25 | ||||||
|  | +#define SYSCON_CLKSET1_FCLKDIV_MASK         0x0e000000 | ||||||
|  | + | ||||||
|  | +#define SYSCON_CLKSET1_HSEL                 0x00000001 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_EXCLKSEL        0x00000002 | ||||||
|  | + | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_P_MASK          0x0000007C | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_P_SHIFT         2 | ||||||
|  | + | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_M1_MASK         0x00000780 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_M1_SHIFT        7 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_M2_MASK         0x0000F800 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_M2_SHIFT        11 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_PS_MASK         0x00030000 | ||||||
|  | +#define SYSCON_CLKSET1_PLL1_PS_SHIFT        16 | ||||||
|  | +#define SYSCON_CLKSET1_PCLK_DIV_MASK        0x000C0000 | ||||||
|  | +#define SYSCON_CLKSET1_PCLK_DIV_SHIFT       18 | ||||||
|  | +#define SYSCON_CLKSET1_HCLK_DIV_MASK        0x00700000 | ||||||
|  | +#define SYSCON_CLKSET1_HCLK_DIV_SHIFT       20 | ||||||
|  | +#define SYSCON_CLKSET1_SMCROM               0x01000000 | ||||||
|  | +#define SYSCON_CLKSET1_FCLK_DIV_MASK        0x0E000000 | ||||||
|  | +#define SYSCON_CLKSET1_FCLK_DIV_SHIFT       25 | ||||||
|  | + | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_EN              0x00000001 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2EXCLKSEL         0x00000002 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_P_MASK          0x0000007C | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_P_SHIFT         2 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_M2_MASK         0x00000F80 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_M2_SHIFT        7 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_M1_MASK         0x0001F000 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_M1              12 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_PS_MASK         0x000C0000 | ||||||
|  | +#define SYSCON_CLKSET2_PLL2_PS_SHIFT        18 | ||||||
|  | +#define SYSCON_CLKSET2_USBDIV_MASK          0xF0000000 | ||||||
|  | +#define SYSCON_CLKSET2_USBDIV_SHIFT         28 | ||||||
|  | + | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +// I2SDIV Register Defines | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +#define SYSCON_I2SDIV_MDIV_MASK         0x0000007f | ||||||
|  | +#define SYSCON_I2SDIV_MDIV_SHIFT        0 | ||||||
|  | +#define SYSCON_I2SDIV_PDIV_MASK         0x00000300 | ||||||
|  | +#define SYSCON_I2SDIV_PDIV_SHIFT        8 | ||||||
|  | +#define SYSCON_I2SDIV_PSEL              0x00002000 | ||||||
|  | +#define SYSCON_I2SDIV_ESEL              0x00004000 | ||||||
|  | +#define SYSCON_I2SDIV_MENA              0x00008000 | ||||||
|  | +#define SYSCON_I2SDIV_SDIV              0x00010000 | ||||||
|  | +#define SYSCON_I2SDIV_LRDIV_MASK        0x00060000 | ||||||
|  | +#define SYSCON_I2SDIV_LRDIV_SHIFT       17 | ||||||
|  | +#define SYSCON_I2SDIV_SPOL              0x00080000 | ||||||
|  | +#define SYSCON_I2SDIV_DROP              0x00100000 | ||||||
|  | +#define SYSCON_I2SDIV_ORIDE             0x20000000 | ||||||
|  | +#define SYSCON_I2SDIV_SLAVE             0x40000000 | ||||||
|  | +#define SYSCON_I2SDIV_SENA              0x80000000 | ||||||
|  | + | ||||||
|  | +#define SYSCON_I2SDIV_PDIV_OFF          0x00000000 | ||||||
|  | +#define SYSCON_I2SDIV_PDIV_2            0x00000100 | ||||||
|  | +#define SYSCON_I2SDIV_PDIV_25           0x00000200 | ||||||
|  | +#define SYSCON_I2SDIV_PDIV_3            0x00000300 | ||||||
|  | + | ||||||
|  | +#define SYSCON_I2SDIV_LRDIV_32          0x00000000 | ||||||
|  | +#define SYSCON_I2SDIV_LRDIV_64          0x00020000 | ||||||
|  | +#define SYSCON_I2SDIV_LRDIV_128         0x00040000 | ||||||
|  | + | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +// VIDDIV Register Defines | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +#define SYSCON_VIDDIV_VDIV_MASK         0x0000007f | ||||||
|  | +#define SYSCON_VIDDIV_VDIV_SHIFT        0 | ||||||
|  | +#define SYSCON_VIDDIV_PDIV_MASK         0x00000300 | ||||||
|  | +#define SYSCON_VIDDIV_PDIV_SHIFT        8 | ||||||
|  | +#define SYSCON_VIDDIV_PSEL              0x00002000 | ||||||
|  | +#define SYSCON_VIDDIV_ESEL              0x00004000 | ||||||
|  | +#define SYSCON_VIDDIV_VENA              0x00008000 | ||||||
|  | + | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +// MIRDIV Register Defines | ||||||
|  | +//----------------------------------------------------------------------------- | ||||||
|  | +#define SYSCON_MIRDIV_MDIV_MASK         0x0000003f | ||||||
|  | +#define SYSCON_MIRDIV_MDIV_SHIFT        0 | ||||||
|  | +#define SYSCON_MIRDIV_PDIV_MASK         0x00000300 | ||||||
|  | +#define SYSCON_MIRDIV_PDIV_SHIFT        8 | ||||||
|  | +#define SYSCON_MIRDIV_PSEL              0x00002000 | ||||||
|  | +#define SYSCON_MIRDIV_ESEL              0x00004000 | ||||||
|  | +#define SYSCON_MIRDIV_MENA              0x00008000 | ||||||
|  | + | ||||||
|  | +/* 8082_0000 - 8082_ffff: I2S */ | ||||||
|  | +#define I2S_OFFSET            0x020000 | ||||||
|  | +#define I2S_BASE              (EP93XX_APB_VIRT_BASE|I2S_OFFSET) | ||||||
|  | +#define I2S_PHYS_BASE         (EP93XX_APB_PHYS_BASE + I2S_OFFSET) | ||||||
|  | + | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +#define I2STxClkCfg           (I2S_BASE+0x00) /* 8082.0000 R/W Transmitter clock config register  */ | ||||||
|  | +#define I2SRxClkCfg           (I2S_BASE+0x04) /* 8082.0004 R/W Receiver clock config register     */ | ||||||
|  | +#define I2SGlSts              (I2S_BASE+0x08) /* 8082.0008 R/W SAI Global Status register.        */ | ||||||
|  | +#define I2SGlCtrl             (I2S_BASE+0x0C) /* 8082.000C R/W SAI Global Control register        */ | ||||||
|  | + | ||||||
|  | +#define I2STX0Lft             (I2S_BASE+0x10) /* 8082.0010 R/W Left  TX data reg for channel 0    */ | ||||||
|  | +#define I2STX0Rt              (I2S_BASE+0x14) /* 8082.0014 R/W Right TX data reg for channel 0    */ | ||||||
|  | +#define I2STX1Lft             (I2S_BASE+0x18) /* 8082.0018 R/W Left  TX data reg for channel 1    */ | ||||||
|  | +#define I2STX1Rt              (I2S_BASE+0x1C) /* 8082.001C R/W Right TX data reg for channel 1    */ | ||||||
|  | +#define I2STX2Lft             (I2S_BASE+0x20) /* 8082.0020 R/W Left  TX data reg for channel 2    */ | ||||||
|  | +#define I2STX2Rt              (I2S_BASE+0x24) /* 8082.0024 R/W Right TX data reg for channel 2    */ | ||||||
|  | + | ||||||
|  | +#define I2STXLinCtrlData      (I2S_BASE+0x28) /* 8082.0028 R/W TX Line Control data register      */ | ||||||
|  | +#define I2STXCtrl             (I2S_BASE+0x2C) /* 8082.002C R/W TX Control register                */ | ||||||
|  | +#define I2STXWrdLen           (I2S_BASE+0x30) /* 8082.0030 R/W TX Word Length                     */ | ||||||
|  | +#define I2STX0En              (I2S_BASE+0x34) /* 8082.0034 R/W TX0 Channel Enable                 */ | ||||||
|  | +#define I2STX1En              (I2S_BASE+0x38) /* 8082.0038 R/W TX1 Channel Enable                 */ | ||||||
|  | +#define I2STX2En              (I2S_BASE+0x3C) /* 8082.003C R/W TX2 Channel Enable                 */ | ||||||
|  | + | ||||||
|  | +#define I2SRX0Lft             (I2S_BASE+0x40) /* 8082.0040 R   Left  RX data reg for channel 0    */ | ||||||
|  | +#define I2SRX0Rt              (I2S_BASE+0x44) /* 8082.0044 R   Right RX data reg for channel 0    */ | ||||||
|  | +#define I2SRX1Lft             (I2S_BASE+0x48) /* 8082.0048 R   Left  RX data reg for channel 1    */ | ||||||
|  | +#define I2SRX1Rt              (I2S_BASE+0x4C) /* 8082.004c R   Right RX data reg for channel 1    */ | ||||||
|  | +#define I2SRX2Lft             (I2S_BASE+0x50) /* 8082.0050 R   Left  RX data reg for channel 2    */ | ||||||
|  | +#define I2SRX2Rt              (I2S_BASE+0x54) /* 8082.0054 R   Right RX data reg for channel 2    */ | ||||||
|  | + | ||||||
|  | +#define I2SRXLinCtrlData      (I2S_BASE+0x58) /* 8082.0058 R/W RX Line Control data register      */ | ||||||
|  | +#define I2SRXCtrl             (I2S_BASE+0x5C) /* 8082.005C R/W RX Control register                */ | ||||||
|  | +#define I2SRXWrdLen           (I2S_BASE+0x60) /* 8082.0060 R/W RX Word Length                     */ | ||||||
|  | +#define I2SRX0En              (I2S_BASE+0x64) /* 8082.0064 R/W RX0 Channel Enable                 */ | ||||||
|  | +#define I2SRX1En              (I2S_BASE+0x68) /* 8082.0068 R/W RX1 Channel Enable                 */ | ||||||
|  | +#define I2SRX2En              (I2S_BASE+0x6C) /* 8082.006C R/W RX2 Channel Enable                 */ | ||||||
|  | + | ||||||
|  | +/* 8084_0000 - 8084_ffff: GPIO */ | ||||||
|  | +#define GPIO_OFFSET              0x040000 | ||||||
|  | +#define GPIO_BASE                (EP93XX_APB_VIRT_BASE|GPIO_OFFSET) | ||||||
|  | +#define GPIO_PADR                (GPIO_BASE+0x00) | ||||||
|  | +#define GPIO_PBDR                (GPIO_BASE+0x04) | ||||||
|  | +#define GPIO_PCDR                (GPIO_BASE+0x08) | ||||||
|  | +#define GPIO_PDDR                (GPIO_BASE+0x0C) | ||||||
|  | +#define GPIO_PADDR               (GPIO_BASE+0x10) | ||||||
|  | +#define GPIO_PBDDR               (GPIO_BASE+0x14) | ||||||
|  | +#define GPIO_PCDDR               (GPIO_BASE+0x18) | ||||||
|  | +#define GPIO_PDDDR               (GPIO_BASE+0x1C) | ||||||
|  | +#define GPIO_PEDR                (GPIO_BASE+0x20) | ||||||
|  | +#define GPIO_PEDDR               (GPIO_BASE+0x24) | ||||||
|  | +// #define 0x8084.0028 Reserved | ||||||
|  | +// #define 0x8084.002C Reserved | ||||||
|  | +#define GPIO_PFDR                (GPIO_BASE+0x30) | ||||||
|  | +#define GPIO_PFDDR               (GPIO_BASE+0x34) | ||||||
|  | +#define GPIO_PGDR                (GPIO_BASE+0x38) | ||||||
|  | +#define GPIO_PGDDR               (GPIO_BASE+0x3C) | ||||||
|  | +#define GPIO_PHDR                (GPIO_BASE+0x40) | ||||||
|  | +#define GPIO_PHDDR               (GPIO_BASE+0x44) | ||||||
|  | +// #define 0x8084.0048 RAZ RAZ | ||||||
|  | +#define GPIO_FINTTYPE1           (GPIO_BASE+0x4C) | ||||||
|  | +#define GPIO_FINTTYPE2           (GPIO_BASE+0x50) | ||||||
|  | +#define GPIO_FEOI                (GPIO_BASE+0x54) /* WRITE ONLY - READ UNDEFINED */ | ||||||
|  | +#define GPIO_FINTEN              (GPIO_BASE+0x58) | ||||||
|  | +#define GPIO_INTSTATUSF          (GPIO_BASE+0x5C) | ||||||
|  | +#define GPIO_RAWINTSTASUSF       (GPIO_BASE+0x60) | ||||||
|  | +#define GPIO_FDB                 (GPIO_BASE+0x64) | ||||||
|  | +#define GPIO_PAPINDR             (GPIO_BASE+0x68) | ||||||
|  | +#define GPIO_PBPINDR             (GPIO_BASE+0x6C) | ||||||
|  | +#define GPIO_PCPINDR             (GPIO_BASE+0x70) | ||||||
|  | +#define GPIO_PDPINDR             (GPIO_BASE+0x74) | ||||||
|  | +#define GPIO_PEPINDR             (GPIO_BASE+0x78) | ||||||
|  | +#define GPIO_PFPINDR             (GPIO_BASE+0x7C) | ||||||
|  | +#define GPIO_PGPINDR             (GPIO_BASE+0x80) | ||||||
|  | +#define GPIO_PHPINDR             (GPIO_BASE+0x84) | ||||||
|  | +#define GPIO_AINTTYPE1           (GPIO_BASE+0x90) | ||||||
|  | +#define GPIO_AINTTYPE2           (GPIO_BASE+0x94) | ||||||
|  | +#define GPIO_AEOI                (GPIO_BASE+0x98) /* WRITE ONLY - READ UNDEFINED */ | ||||||
|  | +#define GPIO_AINTEN              (GPIO_BASE+0x9C) | ||||||
|  | +#define GPIO_INTSTATUSA          (GPIO_BASE+0xA0) | ||||||
|  | +#define GPIO_RAWINTSTSTISA       (GPIO_BASE+0xA4) | ||||||
|  | +#define GPIO_ADB                 (GPIO_BASE+0xA8) | ||||||
|  | +#define GPIO_BINTTYPE1           (GPIO_BASE+0xAC) | ||||||
|  | +#define GPIO_BINTTYPE2           (GPIO_BASE+0xB0) | ||||||
|  | +#define GPIO_BEOI                (GPIO_BASE+0xB4) /* WRITE ONLY - READ UNDEFINED */ | ||||||
|  | +#define GPIO_BINTEN              (GPIO_BASE+0xB8) | ||||||
|  | +#define GPIO_INTSTATUSB          (GPIO_BASE+0xBC) | ||||||
|  | +#define GPIO_RAWINTSTSTISB       (GPIO_BASE+0xC0) | ||||||
|  | +#define GPIO_BDB                 (GPIO_BASE+0xC4) | ||||||
|  | +#define GPIO_EEDRIVE             (GPIO_BASE+0xC8) | ||||||
|  | +//#define Reserved               (GPIO_BASE+0xCC) | ||||||
|  | +#define GPIO_TCR                 (GPIO_BASE+0xD0) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRA               (GPIO_BASE+0xD4) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRB               (GPIO_BASE+0xD8) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRC               (GPIO_BASE+0xDC) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRD               (GPIO_BASE+0xE0) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRE               (GPIO_BASE+0xE4) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRF               (GPIO_BASE+0xE8) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRG               (GPIO_BASE+0xEC) /* Test Registers */ | ||||||
|  | +#define GPIO_TISRH               (GPIO_BASE+0xF0) /* Test Registers */ | ||||||
|  | +#define GPIO_TCER                (GPIO_BASE+0xF4) /* Test Registers */ | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/* 8088_0000 - 8088_ffff: Ac97 Controller (AAC) */ | ||||||
|  | +#define AC97_OFFSET             0x080000 | ||||||
|  | +#define AC97_BASE               (EP93XX_APB_VIRT_BASE|AC97_OFFSET) | ||||||
|  | +#define EP93XX_AC97_PHY_BASE    (EP93XX_APB_PHYS_BASE|AC97_OFFSET) | ||||||
|  | +#define AC97DR1                 (AC97_BASE+0x00) /* 8088.0000 R/W Data read or written from/to FIFO1  */ | ||||||
|  | +#define AC97RXCR1               (AC97_BASE+0x04) /* 8088.0004 R/W Control register for receive        */ | ||||||
|  | +#define AC97TXCR1               (AC97_BASE+0x08) /* 8088.0008 R/W Control register for transmit       */ | ||||||
|  | +#define AC97SR1                 (AC97_BASE+0x0C) /* 8088.000C R   Status register                     */ | ||||||
|  | +#define AC97RISR1               (AC97_BASE+0x10) /* 8088.0010 R   Raw interrupt status register       */ | ||||||
|  | +#define AC97ISR1                (AC97_BASE+0x14) /* 8088.0014 R   Interrupt Status                    */ | ||||||
|  | +#define AC97IE1                 (AC97_BASE+0x18) /* 8088.0018 R/W Interrupt Enable                    */ | ||||||
|  | +                                                               /* 8088.001C Reserved - RAZ                          */ | ||||||
|  | +#define AC97DR2                 (AC97_BASE+0x20) /* 8088.0020 R/W Data read or written from/to FIFO2  */ | ||||||
|  | +#define AC97RXCR2               (AC97_BASE+0x24) /* 8088.0024 R/W Control register for receive        */ | ||||||
|  | +#define AC97TXCR2               (AC97_BASE+0x28) /* 8088.0028 R/W Control register for transmit       */ | ||||||
|  | +#define AC97SR2                 (AC97_BASE+0x2C) /* 8088.002C R   Status register                     */ | ||||||
|  | +#define AC97RISR2               (AC97_BASE+0x30) /* 8088.0030 R   Raw interrupt status register       */ | ||||||
|  | +#define AC97ISR2                (AC97_BASE+0x34) /* 8088.0034 R   Interrupt Status                    */ | ||||||
|  | +#define AC97IE2                 (AC97_BASE+0x38) /* 8088.0038 R/W Interrupt Enable                    */ | ||||||
|  | +                                                               /* 8088.003C Reserved - RAZ                          */ | ||||||
|  | +#define AC97DR3                 (AC97_BASE+0x40) /* 8088.0040 R/W Data read or written from/to FIFO3. */ | ||||||
|  | +#define AC97RXCR3               (AC97_BASE+0x44) /* 8088.0044 R/W Control register for receive        */ | ||||||
|  | +#define AC97TXCR3               (AC97_BASE+0x48) /* 8088.0048 R/W Control register for transmit       */ | ||||||
|  | +#define AC97SR3                 (AC97_BASE+0x4C) /* 8088.004C R   Status register                     */ | ||||||
|  | +#define AC97RISR3               (AC97_BASE+0x50) /* 8088.0050 R   Raw interrupt status register       */ | ||||||
|  | +#define AC97ISR3                (AC97_BASE+0x54) /* 8088.0054 R   Interrupt Status                    */ | ||||||
|  | +#define AC97IE3                 (AC97_BASE+0x58) /* 8088.0058 R/W Interrupt Enable                    */ | ||||||
|  | +                                                               /* 8088.005C Reserved - RAZ                          */ | ||||||
|  | +#define AC97DR2                 (AC97_BASE+0x20) /* 8088.0020 R/W Data read or written from/to FIFO2  */ | ||||||
|  | +#define AC97RXCR2               (AC97_BASE+0x24) /* 8088.0024 R/W Control register for receive        */ | ||||||
|  | +#define AC97TXCR2               (AC97_BASE+0x28) /* 8088.0028 R/W Control register for transmit       */ | ||||||
|  | +#define AC97SR2                 (AC97_BASE+0x2C) /* 8088.002C R   Status register                     */ | ||||||
|  | +#define AC97RISR2               (AC97_BASE+0x30) /* 8088.0030 R   Raw interrupt status register       */ | ||||||
|  | +#define AC97ISR2                (AC97_BASE+0x34) /* 8088.0034 R   Interrupt Status                    */ | ||||||
|  | +#define AC97IE2                 (AC97_BASE+0x38) /* 8088.0038 R/W Interrupt Enable                    */ | ||||||
|  | +                                                               /* 8088.003C Reserved - RAZ                          */ | ||||||
|  | +#define AC97DR3                 (AC97_BASE+0x40) /* 8088.0040 R/W Data read or written from/to FIFO3. */ | ||||||
|  | +#define AC97RXCR3               (AC97_BASE+0x44) /* 8088.0044 R/W Control register for receive        */ | ||||||
|  | +#define AC97TXCR3               (AC97_BASE+0x48) /* 8088.0048 R/W Control register for transmit       */ | ||||||
|  | +#define AC97SR3                 (AC97_BASE+0x4C) /* 8088.004C R   Status register                     */ | ||||||
|  | +#define AC97RISR3               (AC97_BASE+0x50) /* 8088.0050 R   Raw interrupt status register       */ | ||||||
|  | +#define AC97ISR3                (AC97_BASE+0x54) /* 8088.0054 R   Interrupt Status                    */ | ||||||
|  | +#define AC97IE3                 (AC97_BASE+0x58) /* 8088.0058 R/W Interrupt Enable                    */ | ||||||
|  | +                                                               /* 8088.005C Reserved - RAZ                          */ | ||||||
|  | +#define AC97DR4                 (AC97_BASE+0x60) /* 8088.0060 R/W Data read or written from/to FIFO4. */ | ||||||
|  | +#define AC97RXCR4               (AC97_BASE+0x64) /* 8088.0064 R/W Control register for receive        */ | ||||||
|  | +#define AC97TXCR4               (AC97_BASE+0x68) /* 8088.0068 R/W Control register for transmit       */ | ||||||
|  | +#define AC97SR4                 (AC97_BASE+0x6C) /* 8088.006C R   Status register                     */ | ||||||
|  | +#define AC97RISR4               (AC97_BASE+0x70) /* 8088.0070 R   Raw interrupt status register       */ | ||||||
|  | +#define AC97ISR4                (AC97_BASE+0x74) /* 8088.0074 R   Interrupt Status                    */ | ||||||
|  | +#define AC97IE4                 (AC97_BASE+0x78) /* 8088.0078 R/W Interrupt Enable                    */ | ||||||
|  | +                                                               /* 8088.007C Reserved - RAZ                          */ | ||||||
|  | +#define AC97S1DATA              (AC97_BASE+0x80) /* 8088.0080 R/W Data received/transmitted on SLOT1  */ | ||||||
|  | +#define AC97S2DATA              (AC97_BASE+0x84) /* 8088.0084 R/W Data received/transmitted on SLOT2  */ | ||||||
|  | +#define AC97S12DATA             (AC97_BASE+0x88) /* 8088.0088 R/W Data received/transmitted on SLOT12 */ | ||||||
|  | +#define AC97RGIS                (AC97_BASE+0x8C) /* 8088.008C R/W Raw Global interrupt status register*/ | ||||||
|  | +#define AC97GIS                 (AC97_BASE+0x90) /* 8088.0090 R   Global interrupt status register    */ | ||||||
|  | +#define AC97IM                  (AC97_BASE+0x94) /* 8088.0094 R/W Interrupt mask register             */ | ||||||
|  | +#define AC97EOI                 (AC97_BASE+0x98) /* 8088.0098 W   Interrupt clear register            */ | ||||||
|  | +#define AC97GCR                 (AC97_BASE+0x9C) /* 8088.009C R/W Main Control register               */ | ||||||
|  | +#define AC97RESET               (AC97_BASE+0xA0) /* 8088.00A0 R/W RESET control register.             */ | ||||||
|  | +#define AC97SYNC                (AC97_BASE+0xA4) /* 8088.00A4 R/W SYNC control register.              */ | ||||||
|  | +#define AC97GCIS                (AC97_BASE+0xA8) /* 8088.00A8 R  Global chan FIFO int status register */ | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/* 800B_0000 - 800B_FFFF: VIC 0 */ | ||||||
|  | +#define VIC0_OFFSET              0x0B0000 | ||||||
|  | +#define VIC0_BASE                (EP93XX_AHB_VIRT_BASE|VIC0_OFFSET) | ||||||
|  | +#define VIC0                     (VIC0_BASE+0x000) | ||||||
|  | +#define VIC0IRQSTATUS            (VIC0_BASE+0x000) /* R   IRQ status register               */ | ||||||
|  | +#define VIC0FIQSTATUS            (VIC0_BASE+0x004) /* R   FIQ status register               */ | ||||||
|  | +#define VIC0RAWINTR              (VIC0_BASE+0x008) /* R   Raw interrupt status register     */ | ||||||
|  | +#define VIC0INTSELECT            (VIC0_BASE+0x00C) /* R/W Interrupt select register         */ | ||||||
|  | +#define VIC0INTENABLE            (VIC0_BASE+0x010) /* R/W Interrupt enable register         */ | ||||||
|  | +#define VIC0INTENCLEAR           (VIC0_BASE+0x014) /* W   Interrupt enable clear register   */ | ||||||
|  | + | ||||||
|  | +/* 8003_0000 - 8003_ffff: Raster */ | ||||||
|  | +#define RASTER_OFFSET           0x030000 | ||||||
|  | +#define RASTER_BASE             (EP93XX_AHB_VIRT_BASE|RASTER_OFFSET) | ||||||
|  | +#define VLINESTOTAL             (RASTER_BASE+0x00) | ||||||
|  | +#define VSYNCSTRTSTOP           (RASTER_BASE+0x04) | ||||||
|  | +#define VACTIVESTRTSTOP         (RASTER_BASE+0x08) | ||||||
|  | +#define VCLKSTRTSTOP            (RASTER_BASE+0x0C) | ||||||
|  | +#define HCLKSTOTAL              (RASTER_BASE+0x10) | ||||||
|  | +#define HSYNCSTRTSTOP           (RASTER_BASE+0x14) | ||||||
|  | +#define HACTIVESTRTSTOP         (RASTER_BASE+0x18) | ||||||
|  | +#define HCLKSTRTSTOP            (RASTER_BASE+0x1C) | ||||||
|  | +#define BRIGHTNESS              (RASTER_BASE+0x20) | ||||||
|  | +#define VIDEOATTRIBS            (RASTER_BASE+0x24) | ||||||
|  | +#define VIDSCRNPAGE             (RASTER_BASE+0x28) | ||||||
|  | +#define VIDSCRNHPG              (RASTER_BASE+0x2C) | ||||||
|  | +#define SCRNLINES               (RASTER_BASE+0x30) | ||||||
|  | +#define LINELENGTH              (RASTER_BASE+0x34) | ||||||
|  | +#define VLINESTEP               (RASTER_BASE+0x38) | ||||||
|  | +#define LINECARRY               (RASTER_BASE+0x3C) | ||||||
|  | +#define BLINKRATE               (RASTER_BASE+0x40) | ||||||
|  | +#define BLINKMASK               (RASTER_BASE+0x44) | ||||||
|  | +#define BLINKPATTRN             (RASTER_BASE+0x48) | ||||||
|  | +#define PATTRNMASK              (RASTER_BASE+0x4C) | ||||||
|  | +#define BG_OFFSET               (RASTER_BASE+0x50) | ||||||
|  | +#define PIXELMODE               (RASTER_BASE+0x54) | ||||||
|  | +#define PARLLIFOUT              (RASTER_BASE+0x58) | ||||||
|  | +#define PARLLIFIN               (RASTER_BASE+0x5C) | ||||||
|  | +#define CURSOR_ADR_START        (RASTER_BASE+0x60) | ||||||
|  | +#define CURSOR_ADR_RESET        (RASTER_BASE+0x64) | ||||||
|  | +#define CURSORSIZE              (RASTER_BASE+0x68) | ||||||
|  | +#define CURSORCOLOR1            (RASTER_BASE+0x6C) | ||||||
|  | +#define CURSORCOLOR2            (RASTER_BASE+0x70) | ||||||
|  | +#define CURSORXYLOC             (RASTER_BASE+0x74) | ||||||
|  | +#define CURSOR_DHSCAN_LH_YLOC   (RASTER_BASE+0x78) | ||||||
|  | +#define RASTER_SWLOCK           (RASTER_BASE+0x7C) | ||||||
|  | +#define GS_LUT                  (RASTER_BASE+0x80) | ||||||
|  | +#define RASTER_TCR              (RASTER_BASE+0x100) | ||||||
|  | +#define RASTER_TISRA            (RASTER_BASE+0x104) | ||||||
|  | +#define RASTER_TISRB            (RASTER_BASE+0x108) | ||||||
|  | +#define CURSOR_TISR             (RASTER_BASE+0x10C) | ||||||
|  | +#define RASTER_TOCRA            (RASTER_BASE+0x110) | ||||||
|  | +#define RASTER_TOCRB            (RASTER_BASE+0x114) | ||||||
|  | +#define FIFO_TOCRA              (RASTER_BASE+0x118) | ||||||
|  | +#define FIFO_TOCRB              (RASTER_BASE+0x11C) | ||||||
|  | +#define BLINK_TISR              (RASTER_BASE+0x120) | ||||||
|  | +#define DAC_TISRA               (RASTER_BASE+0x124) | ||||||
|  | +#define DAC_TISRB               (RASTER_BASE+0x128) | ||||||
|  | +#define SHIFT_TISR              (RASTER_BASE+0x12C) | ||||||
|  | +#define DACMUX_TOCRA            (RASTER_BASE+0x130) | ||||||
|  | +#define DACMUX_TOCRB            (RASTER_BASE+0x134) | ||||||
|  | +#define PELMUX_TOCR             (RASTER_BASE+0x138) | ||||||
|  | +#define VIDEO_TOCRA             (RASTER_BASE+0x13C) | ||||||
|  | +#define VIDEO_TOCRB             (RASTER_BASE+0x140) | ||||||
|  | +#define YCRCB_TOCR              (RASTER_BASE+0x144) | ||||||
|  | +#define CURSOR_TOCR             (RASTER_BASE+0x148) | ||||||
|  | +#define VIDEO_TOCRC             (RASTER_BASE+0x14C) | ||||||
|  | +#define SHIFT_TOCR              (RASTER_BASE+0x150) | ||||||
|  | +#define BLINK_TOCR              (RASTER_BASE+0x154) | ||||||
|  | +#define RASTER_TCER             (RASTER_BASE+0x180) | ||||||
|  | +#define SIGVAL                  (RASTER_BASE+0x200) | ||||||
|  | +#define SIGCTL                  (RASTER_BASE+0x204) | ||||||
|  | +#define VSIGSTRTSTOP            (RASTER_BASE+0x208) | ||||||
|  | +#define HSIGSTRTSTOP            (RASTER_BASE+0x20C) | ||||||
|  | +#define SIGCLR                  (RASTER_BASE+0x210) | ||||||
|  | +#define ACRATE                  (RASTER_BASE+0x214) | ||||||
|  | +#define LUTCONT                 (RASTER_BASE+0x218) | ||||||
|  | +#define VBLANKSTRTSTOP          (RASTER_BASE+0x228) | ||||||
|  | +#define HBLANKSTRTSTOP          (RASTER_BASE+0x22C) | ||||||
|  | +#define LUT                     (RASTER_BASE+0x400) | ||||||
|  | +#define CURSORBLINK1            (RASTER_BASE+0x21C) | ||||||
|  | +#define CURSORBLINK2            (RASTER_BASE+0x220) | ||||||
|  | +#define CURSORBLINK             (RASTER_BASE+0x224) | ||||||
|  | +#define EOLOFFSET               (RASTER_BASE+0x230) | ||||||
|  | +#define FIFOLEVEL               (RASTER_BASE+0x234) | ||||||
|  | +#define GS_LUT2                 (RASTER_BASE+0x280) | ||||||
|  | +#define GS_LUT3                 (RASTER_BASE+0x300) | ||||||
|  | +#define COLOR_LUT               (RASTER_BASE+0x400) | ||||||
|  | + | ||||||
|  | +/* 8004_0000 - 8004_ffff: Graphics */ | ||||||
|  | +#define GRAPHICS_OFFSET         0x040000 | ||||||
|  | +#define GRAPHICS_BASE           (EP93XX_AHB_VIRT_BASE|GRAPHICS_OFFSET) | ||||||
|  | +#define SRCPIXELSTRT            (GRAPHICS_BASE+0x00) | ||||||
|  | +#define DESTPIXELSTRT           (GRAPHICS_BASE+0x04) | ||||||
|  | +#define BLKSRCSTRT              (GRAPHICS_BASE+0x08) | ||||||
|  | +#define BLKDSTSTRT              (GRAPHICS_BASE+0x0C) | ||||||
|  | +#define BLKSRCWIDTH             (GRAPHICS_BASE+0x10) | ||||||
|  | +#define SRCLINELENGTH           (GRAPHICS_BASE+0x14) | ||||||
|  | +#define BLKDESTWIDTH            (GRAPHICS_BASE+0x18) | ||||||
|  | +#define BLKDESTHEIGHT           (GRAPHICS_BASE+0x1C) | ||||||
|  | +#define DESTLINELENGTH          (GRAPHICS_BASE+0x20) | ||||||
|  | +#define BLOCKCTRL               (GRAPHICS_BASE+0x24) | ||||||
|  | +#define TRANSPATTRN             (GRAPHICS_BASE+0x28) | ||||||
|  | +#define BLOCKMASK               (GRAPHICS_BASE+0x2C) | ||||||
|  | +#define BACKGROUND              (GRAPHICS_BASE+0x30) | ||||||
|  | +#define LINEINC                 (GRAPHICS_BASE+0x34) | ||||||
|  | +#define LINEINIT                (GRAPHICS_BASE+0x38) | ||||||
|  | +#define LINEPATTRN              (GRAPHICS_BASE+0x3C) | ||||||
|  | + | ||||||
|  | +#define EP93XX_RASTER_BASE		(EP93XX_AHB_VIRT_BASE + 0x00030000) | ||||||
|  | +#define EP93XX_RASTER_PHYS_BASE         (EP93XX_AHB_PHYS_BASE + 0x00030000) | ||||||
|  | + | ||||||
|  | +#define EP93XX_GRAPHICS_ACCEL_BASE	(EP93XX_AHB_VIRT_BASE + 0x00040000) | ||||||
|  | +#define EP93XX_GRAPHICS_ACCEL_PHYS_BASE (EP93XX_AHB_PHYS_BASE + 0x00040000) | ||||||
|  | + | ||||||
|  | +#ifndef __ASSEMBLY__ | ||||||
|  | + | ||||||
|  | +#define SysconSetLocked(registername,value)     \ | ||||||
|  | +    {                                           \ | ||||||
|  | +        local_irq_disable();			\ | ||||||
|  | +	outl( 0xAA, EP93XX_SYSCON_SWLOCK);             \ | ||||||
|  | +        outl( value, registername);             \ | ||||||
|  | +	local_irq_enable();                    \ | ||||||
|  | +    } | ||||||
|  | + | ||||||
|  | +#endif /* Not __ASSEMBLY__ */ | ||||||
|  | + | ||||||
|  |  #endif | ||||||
							
								
								
									
										4342
									
								
								target/linux/ep93xx/patches-2.6.30/002-lcd-linux-hd44780.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4342
									
								
								target/linux/ep93xx/patches-2.6.30/002-lcd-linux-hd44780.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										225
									
								
								target/linux/ep93xx/patches-2.6.30/003-ep93xx-i2c.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										225
									
								
								target/linux/ep93xx/patches-2.6.30/003-ep93xx-i2c.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,225 @@ | |||||||
|  | Index: linux-2.6.30.9/drivers/i2c/busses/Kconfig | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.30.9.orig/drivers/i2c/busses/Kconfig	2009-11-24 21:00:21.000000000 +0100 | ||||||
|  | +++ linux-2.6.30.9/drivers/i2c/busses/Kconfig	2009-11-24 21:00:23.000000000 +0100 | ||||||
|  | @@ -326,6 +326,10 @@ | ||||||
|  |  	  devices such as DaVinci NIC. | ||||||
|  |  	  For details please see http://www.ti.com/davinci | ||||||
|  |   | ||||||
|  | +config I2C_EP93XX | ||||||
|  | +	tristate "EP93XX I2C" | ||||||
|  | +	depends on I2C && ARCH_EP93XX | ||||||
|  | + | ||||||
|  |  config I2C_GPIO | ||||||
|  |  	tristate "GPIO-based bitbanging I2C" | ||||||
|  |  	depends on GENERIC_GPIO | ||||||
|  | Index: linux-2.6.30.9/drivers/i2c/busses/Makefile | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.30.9.orig/drivers/i2c/busses/Makefile	2009-11-24 21:00:21.000000000 +0100 | ||||||
|  | +++ linux-2.6.30.9/drivers/i2c/busses/Makefile	2009-11-24 21:00:23.000000000 +0100 | ||||||
|  | @@ -30,6 +30,7 @@ | ||||||
|  |  obj-$(CONFIG_I2C_BLACKFIN_TWI)	+= i2c-bfin-twi.o | ||||||
|  |  obj-$(CONFIG_I2C_CPM)		+= i2c-cpm.o | ||||||
|  |  obj-$(CONFIG_I2C_DAVINCI)	+= i2c-davinci.o | ||||||
|  | +obj-$(CONFIG_I2C_EP93XX)	+= i2c-ep93xx.o | ||||||
|  |  obj-$(CONFIG_I2C_GPIO)		+= i2c-gpio.o | ||||||
|  |  obj-$(CONFIG_I2C_HIGHLANDER)	+= i2c-highlander.o | ||||||
|  |  obj-$(CONFIG_I2C_IBM_IIC)	+= i2c-ibm_iic.o | ||||||
|  | Index: linux-2.6.30.9/drivers/i2c/busses/i2c-ep93xx.c | ||||||
|  | =================================================================== | ||||||
|  | --- /dev/null	1970-01-01 00:00:00.000000000 +0000 | ||||||
|  | +++ linux-2.6.30.9/drivers/i2c/busses/i2c-ep93xx.c	2009-11-24 21:00:38.000000000 +0100 | ||||||
|  | @@ -0,0 +1,193 @@ | ||||||
|  | +/* ------------------------------------------------------------------------ * | ||||||
|  | + * i2c-ep933xx.c I2C bus glue for Cirrus EP93xx                             * | ||||||
|  | + * ------------------------------------------------------------------------ * | ||||||
|  | + | ||||||
|  | +   Copyright (C) 2004 Michael Burian | ||||||
|  | + | ||||||
|  | +   Based on i2c-parport-light.c | ||||||
|  | +   Copyright (C) 2003-2004 Jean Delvare <khali@linux-fr.org> | ||||||
|  | + | ||||||
|  | +   This program is free software; you can redistribute it and/or modify | ||||||
|  | +   it under the terms of the GNU General Public License as published by | ||||||
|  | +   the Free Software Foundation; either version 2 of the License, or | ||||||
|  | +   (at your option) any later version. | ||||||
|  | + | ||||||
|  | +   This program is distributed in the hope that it will be useful, | ||||||
|  | +   but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  | +   GNU General Public License for more details. | ||||||
|  | + | ||||||
|  | +   You should have received a copy of the GNU General Public License | ||||||
|  | +   along with this program; if not, write to the Free Software | ||||||
|  | +   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | + * ------------------------------------------------------------------------ */ | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +//#include <linux/config.h> | ||||||
|  | +#include <linux/kernel.h> | ||||||
|  | +#include <linux/module.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/ioport.h> | ||||||
|  | +#include <linux/delay.h> | ||||||
|  | +#include <linux/i2c.h> | ||||||
|  | +#include <linux/i2c-algo-bit.h> | ||||||
|  | +#include <asm/io.h> | ||||||
|  | +#include <mach/hardware.h> | ||||||
|  | + | ||||||
|  | +//1/(2*clockfrequency) | ||||||
|  | +#define EE_DELAY_USEC       50 | ||||||
|  | +#define GPIOG_EECLK 1 | ||||||
|  | +#define GPIOG_EEDAT 2 | ||||||
|  | + | ||||||
|  | +/* ----- I2C algorithm call-back functions and structures ----------------- */ | ||||||
|  | + | ||||||
|  | +// TODO: optimize | ||||||
|  | +static void ep93xx_setscl(void *data, int state) | ||||||
|  | +{ | ||||||
|  | +	unsigned int uiPGDR, uiPGDDR; | ||||||
|  | + | ||||||
|  | +	uiPGDR = inl(GPIO_PGDR); | ||||||
|  | +	uiPGDDR = inl(GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Configure the clock line as output. */ | ||||||
|  | +	uiPGDDR |= GPIOG_EECLK; | ||||||
|  | +	outl(uiPGDDR, GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Set clock line to state */ | ||||||
|  | +	if(state) | ||||||
|  | +		uiPGDR |= GPIOG_EECLK; | ||||||
|  | +	else | ||||||
|  | +		uiPGDR &= ~GPIOG_EECLK; | ||||||
|  | + | ||||||
|  | +	outl(uiPGDR, GPIO_PGDR); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void ep93xx_setsda(void *data, int state) | ||||||
|  | +{ | ||||||
|  | +	unsigned int uiPGDR, uiPGDDR; | ||||||
|  | + | ||||||
|  | +	uiPGDR = inl(GPIO_PGDR); | ||||||
|  | +	uiPGDDR = inl(GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Configure the data line as output. */ | ||||||
|  | +	uiPGDDR |= GPIOG_EEDAT; | ||||||
|  | +	outl(uiPGDDR, GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Set data line to state */ | ||||||
|  | +	if(state) | ||||||
|  | +		uiPGDR |= GPIOG_EEDAT; | ||||||
|  | +	else | ||||||
|  | +		uiPGDR &= ~GPIOG_EEDAT; | ||||||
|  | + | ||||||
|  | +	outl(uiPGDR, GPIO_PGDR); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int ep93xx_getscl(void *data) | ||||||
|  | +{ | ||||||
|  | +	unsigned int uiPGDR, uiPGDDR; | ||||||
|  | + | ||||||
|  | +	uiPGDR = inl(GPIO_PGDR); | ||||||
|  | +	uiPGDDR = inl(GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Configure the clock line as input */ | ||||||
|  | +	uiPGDDR &= ~GPIOG_EECLK; | ||||||
|  | +	outl(uiPGDDR, GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Return state of the clock line */ | ||||||
|  | +	return (inl(GPIO_PGDR) & GPIOG_EECLK) ? 1 : 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int ep93xx_getsda(void *data) | ||||||
|  | +{ | ||||||
|  | +	unsigned int uiPGDR, uiPGDDR; | ||||||
|  | +	uiPGDR = inl(GPIO_PGDR); | ||||||
|  | +	uiPGDDR = inl(GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Configure the data line as input */ | ||||||
|  | +	uiPGDDR &= ~GPIOG_EEDAT; | ||||||
|  | +	outl(uiPGDDR, GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Return state of the data line */ | ||||||
|  | +	return (inl(GPIO_PGDR) & GPIOG_EEDAT) ? 1 : 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +/* ------------------------------------------------------------------------ | ||||||
|  | + * Encapsulate the above functions in the correct operations structure. | ||||||
|  | + * This is only done when more than one hardware adapter is supported. | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +/* last line (us, ms, timeout) | ||||||
|  | + * us dominates the bit rate: 10us  means: 100Kbit/sec(25 means 40kbps) | ||||||
|  | + *                            10ms  not known | ||||||
|  | + *                            100ms timeout | ||||||
|  | + */ | ||||||
|  | +static struct i2c_algo_bit_data ep93xx_data = { | ||||||
|  | +	.setsda		= ep93xx_setsda, | ||||||
|  | +	.setscl		= ep93xx_setscl, | ||||||
|  | +	.getsda		= ep93xx_getsda, | ||||||
|  | +	.getscl		= ep93xx_getscl, | ||||||
|  | +	.udelay		= 10, | ||||||
|  | +	//.mdelay		= 10, | ||||||
|  | +	.timeout	= HZ, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +/* ----- I2c structure ---------------------------------------------------- */ | ||||||
|  | +static struct i2c_adapter ep93xx_adapter = { | ||||||
|  | +	.owner		= THIS_MODULE, | ||||||
|  | +	.class		= I2C_CLASS_HWMON, | ||||||
|  | +	.algo_data	= &ep93xx_data, | ||||||
|  | +	.name		= "EP93XX I2C bit-bang interface", | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +/* ----- Module loading, unloading and information ------------------------ */ | ||||||
|  | + | ||||||
|  | +static int __init i2c_ep93xx_init(void) | ||||||
|  | +{ | ||||||
|  | +	unsigned long uiPGDR, uiPGDDR; | ||||||
|  | + | ||||||
|  | +	/* Read the current value of the GPIO data and data direction registers. */ | ||||||
|  | +	uiPGDR = inl(GPIO_PGDR); | ||||||
|  | +	uiPGDDR = inl(GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* If the GPIO pins have not been configured since reset, the data | ||||||
|  | +	 * and clock lines will be set as inputs and with data value of 0. | ||||||
|  | +	 * External pullup resisters are pulling them high. | ||||||
|  | +	 * Set them both high before configuring them as outputs. */ | ||||||
|  | +	uiPGDR |= (GPIOG_EEDAT | GPIOG_EECLK); | ||||||
|  | +	outl(uiPGDR, GPIO_PGDR); | ||||||
|  | + | ||||||
|  | +	/* Delay to meet the EE Interface timing specification. */ | ||||||
|  | +	udelay(EE_DELAY_USEC); | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +	/* Configure the EE data and clock lines as outputs. */ | ||||||
|  | +	uiPGDDR |= (GPIOG_EEDAT | GPIOG_EECLK); | ||||||
|  | +	outl(uiPGDDR, GPIO_PGDDR); | ||||||
|  | + | ||||||
|  | +	/* Delay to meet the EE Interface timing specification. */ | ||||||
|  | +	udelay(EE_DELAY_USEC); | ||||||
|  | + | ||||||
|  | +	/* Reset hardware to a sane state (SCL and SDA high) */ | ||||||
|  | +	ep93xx_setsda(NULL, 1); | ||||||
|  | +	ep93xx_setscl(NULL, 1); | ||||||
|  | + | ||||||
|  | +	if (i2c_bit_add_bus(&ep93xx_adapter) > 0) { | ||||||
|  | +		printk(KERN_ERR "i2c-ep93xx: Unable to register with I2C\n"); | ||||||
|  | +		return -ENODEV; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void __exit i2c_ep93xx_exit(void) | ||||||
|  | +{ | ||||||
|  | +	//i2c_bit_del_bus(&ep93xx_adapter); | ||||||
|  | +	i2c_del_adapter(&ep93xx_adapter); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +MODULE_AUTHOR("Michael Burian"); | ||||||
|  | +MODULE_DESCRIPTION("I2C bus glue for Cirrus EP93xx processors"); | ||||||
|  | +MODULE_LICENSE("GPL"); | ||||||
|  | + | ||||||
|  | +module_init(i2c_ep93xx_init); | ||||||
|  | +module_exit(i2c_ep93xx_exit); | ||||||
							
								
								
									
										78
									
								
								target/linux/ep93xx/patches-2.6.30/004-simone-rtc.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								target/linux/ep93xx/patches-2.6.30/004-simone-rtc.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | |||||||
|  | --- a/drivers/rtc/rtc-ds1307.c | ||||||
|  | +++ b/drivers/rtc/rtc-ds1307.c | ||||||
|  | @@ -661,6 +661,13 @@ static int __devinit ds1307_probe(struct | ||||||
|  |  			goto exit_free; | ||||||
|  |  		} | ||||||
|  |   | ||||||
|  | +#if (defined(CONFIG_MACH_SIM_ONE)) | ||||||
|  | +		/* SIM.ONE board needs 32khz clock on SQW/INTB pin */ | ||||||
|  | +		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, | ||||||
|  | +					ds1307->regs[0] & ~DS1337_BIT_INTCN); | ||||||
|  | +		i2c_smbus_write_byte_data(client, DS1337_REG_CONTROL, | ||||||
|  | +					ds1307->regs[0] | (DS1337_BIT_RS1 | DS1337_BIT_RS2)); | ||||||
|  | +#endif | ||||||
|  |  		/* oscillator off?  turn it on, so clock can tick. */ | ||||||
|  |  		if (ds1307->regs[0] & DS1337_BIT_nEOSC) | ||||||
|  |  			ds1307->regs[0] &= ~DS1337_BIT_nEOSC; | ||||||
|  | --- a/drivers/rtc/Kconfig | ||||||
|  | +++ b/drivers/rtc/Kconfig | ||||||
|  | @@ -570,6 +570,14 @@ config RTC_DRV_EP93XX | ||||||
|  |  	  This driver can also be built as a module. If so, the module | ||||||
|  |  	  will be called rtc-ep93xx. | ||||||
|  |   | ||||||
|  | +config RTC_DRV_EP93XX_DS1337 | ||||||
|  | +	bool "Cirrus Logic EP93XX using DS1337 chip" | ||||||
|  | +	depends on RTC_DRV_EP93XX && I2C && MACH_SIM_ONE | ||||||
|  | +	help | ||||||
|  | +	  If you say yes here, the EP93XX driver will use the | ||||||
|  | +	  battery-backed-up DS1337 RTC chip on the SIM.ONE board. | ||||||
|  | +	  You almost certainly want this. | ||||||
|  | + | ||||||
|  |  config RTC_DRV_SA1100 | ||||||
|  |  	tristate "SA11x0/PXA2xx" | ||||||
|  |  	depends on ARCH_SA1100 || ARCH_PXA | ||||||
|  | --- a/drivers/rtc/rtc-ep93xx.c | ||||||
|  | +++ b/drivers/rtc/rtc-ep93xx.c | ||||||
|  | @@ -13,6 +13,13 @@ | ||||||
|  |  #include <linux/rtc.h> | ||||||
|  |  #include <linux/platform_device.h> | ||||||
|  |  #include <mach/hardware.h> | ||||||
|  | +#include <asm/io.h> | ||||||
|  | + | ||||||
|  | +#if defined(CONFIG_RTC_DRV_EP93XX_DS1337) | ||||||
|  | +extern int ds1337_do_command(int id, int cmd, void *arg); | ||||||
|  | +#define DS1337_GET_DATE         0 | ||||||
|  | +#define DS1337_SET_DATE         1 | ||||||
|  | +#endif | ||||||
|  |   | ||||||
|  |  #define EP93XX_RTC_REG(x)	(EP93XX_RTC_BASE + (x)) | ||||||
|  |  #define EP93XX_RTC_DATA		EP93XX_RTC_REG(0x0000) | ||||||
|  | @@ -37,16 +44,28 @@ static int ep93xx_get_swcomp(struct devi | ||||||
|  |   | ||||||
|  |  static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) | ||||||
|  |  { | ||||||
|  | +#if defined(CONFIG_RTC_DRV_EP93XX_DS1337) | ||||||
|  | +	/* Reroute the internal device to the DS1337 */ | ||||||
|  | +	return ds1337_do_command(0, DS1337_GET_DATE, (void *)tm); | ||||||
|  | +#else | ||||||
|  |  	unsigned long time = __raw_readl(EP93XX_RTC_DATA); | ||||||
|  |   | ||||||
|  |  	rtc_time_to_tm(time, tm); | ||||||
|  |  	return 0; | ||||||
|  | +#endif | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) | ||||||
|  |  { | ||||||
|  | +#if defined(CONFIG_RTC_DRV_EP93XX_DS1337) | ||||||
|  | +	struct rtc_time tm; | ||||||
|  | + | ||||||
|  | +	rtc_time_to_tm(secs, &tm); | ||||||
|  | +	return ds1337_do_command(0, DS1337_SET_DATE, (void *)&tm); | ||||||
|  | +#else | ||||||
|  |  	__raw_writel(secs + 1, EP93XX_RTC_LOAD); | ||||||
|  |  	return 0; | ||||||
|  | +#endif | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int ep93xx_rtc_proc(struct device *dev, struct seq_file *seq) | ||||||
							
								
								
									
										3622
									
								
								target/linux/ep93xx/patches-2.6.30/005-ep93xx-dma.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3622
									
								
								target/linux/ep93xx/patches-2.6.30/005-ep93xx-dma.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1319
									
								
								target/linux/ep93xx/patches-2.6.30/006-ep93xx-touchscreen.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1319
									
								
								target/linux/ep93xx/patches-2.6.30/006-ep93xx-touchscreen.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										405
									
								
								target/linux/ep93xx/patches-2.6.30/007-ep93xx-eth.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										405
									
								
								target/linux/ep93xx/patches-2.6.30/007-ep93xx-eth.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,405 @@ | |||||||
|  | --- /dev/null | ||||||
|  | +++ b/drivers/net/arm/ep93xx_eth.h | ||||||
|  | @@ -0,0 +1,402 @@ | ||||||
|  | +/*------------------------------------------------------------------------ | ||||||
|  | + * ep93xx_eth.h | ||||||
|  | + * : header file of Ethernet Device Driver for Cirrus Logic EP93xx. | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2003 by Cirrus Logic www.cirrus.com | ||||||
|  | + * This software may be used and distributed according to the terms | ||||||
|  | + * of the GNU Public License. | ||||||
|  | + * | ||||||
|  | + * This file contains device related information like register info | ||||||
|  | + * and register access method macros for the Ethernet device | ||||||
|  | + * embedded within Cirrus Logic's EP93xx SOC chip. | ||||||
|  | + * | ||||||
|  | + * Information contained in this file was obtained from | ||||||
|  | + * the EP9312 Manual Revision 0.12 and 0.14 from Cirrus Logic. | ||||||
|  | + * | ||||||
|  | + * History | ||||||
|  | + * 05/18/01  Sungwook Kim  Initial release | ||||||
|  | + * 03/25/2003  Melody Modified for EP92xx | ||||||
|  | + *--------------------------------------------------------------------------*/ | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +#ifndef _EP9213_ETH_H_ | ||||||
|  | +#define _EP9213_ETH_H_ | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/*--------------------------------------------------------------- | ||||||
|  | + *  Definition of H/W Defects and Their Workarounds | ||||||
|  | + *-------------------------------------------------------------*/ | ||||||
|  | + | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/*--------------------------------------------------------------- | ||||||
|  | + *  Data types used in this driver | ||||||
|  | + *-------------------------------------------------------------*/ | ||||||
|  | +typedef  unsigned char   U8; | ||||||
|  | +typedef  unsigned short  U16; | ||||||
|  | +typedef  unsigned long   U32; | ||||||
|  | +typedef  unsigned int    UINT; | ||||||
|  | + | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/*--------------------------------------------------------------- | ||||||
|  | + * Definition of the registers. | ||||||
|  | + * For details, refer to the datasheet  . | ||||||
|  | + * | ||||||
|  | + * Basically, most registers are 32 bits width register. | ||||||
|  | + * But some are 16 bits and some are 6 or 8 bytes long. | ||||||
|  | + *-------------------------------------------------------------*/ | ||||||
|  | + | ||||||
|  | +#define  REG_RxCTL  0x0000  /*offset to Receiver Control Reg*/ | ||||||
|  | +#define  RxCTL_PauseA  (1<<20) | ||||||
|  | +#define  RxCTL_RxFCE1  (1<<19) | ||||||
|  | +#define  RxCTL_RxFCE0  (1<<18) | ||||||
|  | +#define  RxCTL_BCRC    (1<<17) | ||||||
|  | +#define  RxCTL_SRxON   (1<<16) | ||||||
|  | +#define  RxCTL_RCRCA   (1<<13) | ||||||
|  | +#define  RxCTL_RA      (1<<12) | ||||||
|  | +#define  RxCTL_PA      (1<<11) | ||||||
|  | +#define  RxCTL_BA      (1<<10) | ||||||
|  | +#define  RxCTL_MA      (1<<9) | ||||||
|  | +#define  RxCTL_IAHA    (1<<8) | ||||||
|  | +#define  RxCTL_IA3     (1<<3) | ||||||
|  | +#define  RxCTL_IA2     (1<<2) | ||||||
|  | +#define  RxCTL_IA1     (1<<1) | ||||||
|  | +#define  RxCTL_IA0     (1<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_TxCTL  0x0004  /*offset to Transmit Control Reg*/ | ||||||
|  | +#define  TxCTL_DefDis  (1<<7) | ||||||
|  | +#define  TxCTL_MBE     (1<<6) | ||||||
|  | +#define  TxCTL_ICRC    (1<<5) | ||||||
|  | +#define  TxCTL_TxPD    (1<<5) | ||||||
|  | +#define  TxCTL_OColl   (1<<3) | ||||||
|  | +#define  TxCTL_SP      (1<<2) | ||||||
|  | +#define  TxCTL_PB      (1<<1) | ||||||
|  | +#define  TxCTL_STxON   (1<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_TestCTL   0x0008  /*Test Control Reg, R/W*/ | ||||||
|  | +#define  TestCTL_MACF  (1<<7) | ||||||
|  | +#define  TestCTL_MFDX  (1<<6) | ||||||
|  | +#define  TestCTL_DB    (1<<5) | ||||||
|  | +#define  TestCTL_MIIF  (1<<4) | ||||||
|  | + | ||||||
|  | +#define  REG_MIICmd  0x0010  /*offset to MII Command Reg, R/W*/ | ||||||
|  | +#define  MIICmd_OP     (0x03<<14) | ||||||
|  | +#define  MIICmd_OP_RD  (2<<14) | ||||||
|  | +#define  MIICmd_OP_WR  (1<<14) | ||||||
|  | +#define  MIICmd_PHYAD  (0x1f<<5) | ||||||
|  | +#define  MIICmd_REGAD  (0x1f<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_MIIData  0x0014  /*offset to MII Data Reg, R/W*/ | ||||||
|  | +#define  MIIData_MIIData  (0xffff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_MIISts  0x0018  /*offset to MII Status Reg, R*/ | ||||||
|  | +#define  MIISts_Busy  (1<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_SelfCTL  0x0020  /*offset to Self Control Reg*/ | ||||||
|  | +#define  SelfCTL_RWP    (1<<7)    /*Remote Wake Pin*/ | ||||||
|  | +#define  SelfCTL_GPO0   (1<<5) | ||||||
|  | +#define  SelfCTL_PUWE   (1<<4) | ||||||
|  | +#define  SelfCTL_PDWE   (1<<3) | ||||||
|  | +#define  SelfCTL_MIIL   (1<<2) | ||||||
|  | +#define  SelfCTL_RESET  (1<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_IntEn   0x0024  /*Interrupt Enable Reg, R/W*/ | ||||||
|  | +#define  IntEn_RWIE    (1<<30) | ||||||
|  | +#define  IntEn_RxMIE   (1<<29) | ||||||
|  | +#define  IntEn_RxBIE   (1<<28) | ||||||
|  | +#define  IntEn_RxSQIE  (1<<27) | ||||||
|  | +#define  IntEn_TxLEIE  (1<<26) | ||||||
|  | +#define  IntEn_ECIE    (1<<25) | ||||||
|  | +#define  IntEn_TxUHIE  (1<<24) | ||||||
|  | +#define  IntEn_MOIE    (1<<18) | ||||||
|  | +#define  IntEn_TxCOIE  (1<<17) | ||||||
|  | +#define  IntEn_RxROIE  (1<<16) | ||||||
|  | +#define  IntEn_MIIIE   (1<<12) | ||||||
|  | +#define  IntEn_PHYSIE  (1<<11) | ||||||
|  | +#define  IntEn_TIE     (1<<10) | ||||||
|  | +#define  IntEn_SWIE    (1<<8) | ||||||
|  | +#define  IntEn_TxSQIE   (1<<3) | ||||||
|  | +#define  IntEn_RxEOFIE  (1<<2) | ||||||
|  | +#define  IntEn_RxEOBIE  (1<<1) | ||||||
|  | +#define  IntEn_RxHDRIE  (1<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_IntStsP  0x0028  /*offset to Interrupt Status Preserve Reg, R/W*/ | ||||||
|  | +#define  REG_IntStsC  0x002c  /*offset to Interrupt Status Clear Reg, R*/ | ||||||
|  | +#define  IntSts_RWI    (1<<30) | ||||||
|  | +#define  IntSts_RxMI   (1<<29) | ||||||
|  | +#define  IntSts_RxBI   (1<<28) | ||||||
|  | +#define  IntSts_RxSQI  (1<<27) | ||||||
|  | +#define  IntSts_TxLEI  (1<<26) | ||||||
|  | +#define  IntSts_ECI    (1<<25) | ||||||
|  | +#define  IntSts_TxUHI  (1<<24) | ||||||
|  | +#define  IntSts_MOI    (1<<18) | ||||||
|  | +#define  IntSts_TxCOI  (1<<17) | ||||||
|  | +#define  IntSts_RxROI  (1<<16) | ||||||
|  | +#define  IntSts_MIII   (1<<12) | ||||||
|  | +#define  IntSts_PHYSI  (1<<11) | ||||||
|  | +#define  IntSts_TI     (1<<10) | ||||||
|  | +#define  IntSts_AHBE   (1<<9) | ||||||
|  | +#define  IntSts_SWI    (1<<8) | ||||||
|  | +#define  IntSts_OTHER  (1<<4) | ||||||
|  | +#define  IntSts_TxSQ   (1<<3) | ||||||
|  | +#define  IntSts_RxSQ   (1<<2) | ||||||
|  | + | ||||||
|  | +#define  REG_GT  0x0040  /*offset to General Timer Reg*/ | ||||||
|  | +#define  GT_GTC  (0xffff<<16) | ||||||
|  | +#define  GT_GTP  (0xffff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_FCT  0x0044  /*offset to Flow Control Timer Reg*/ | ||||||
|  | +#define  FCT_FCT  (0x00ffffff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_FCF  0x0048  /*offset to Flow Control Format Reg*/ | ||||||
|  | +#define  FCF_MACCT  (0xffff<<16) | ||||||
|  | +#define  FCF_TPT    (0xffff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_AFP  0x004c  /*offset to Address Filter Pointer Reg*/ | ||||||
|  | +#define  AFP_AFP  (0x07<<0)  /*Address Filter Pointer (bank control for REG_IndAD)*/ | ||||||
|  | +#define  AFP_AFP_IA0   0       /*Primary Individual Address (MAC Addr)*/ | ||||||
|  | +#define  AFP_AFP_IA1   1       /*Individual Address 1*/ | ||||||
|  | +#define  AFP_AFP_IA2   2       /*Individual Address 2*/ | ||||||
|  | +#define  AFP_AFP_IA3   3       /*Individual Address 3*/ | ||||||
|  | +#define  AFP_AFP_DTxP  6       /*Destination Address of Tx Pause Frame*/ | ||||||
|  | +#define  AFP_AFP_HASH  7       /*Hash Table*/ | ||||||
|  | + | ||||||
|  | +#define  REG_IndAD      0x0050  /*offset to Individual Address Reg, n bytes, R/W*/ | ||||||
|  | + | ||||||
|  | +#define  REG_GIntSts    0x0060  /*offset to Global Interrupt Status Reg (writing 1 will clear)*/ | ||||||
|  | +#define  REG_GIntROS    0x0068  /*offset to Global Interrupt Status Read Only Reg*/ | ||||||
|  | +#define  GIntSts_INT  (1<<15)     /*Global Interrupt Request Status*/ | ||||||
|  | + | ||||||
|  | +#define  REG_GIntMsk    0x0064  /*offset to Global Interrupt Mask Reg*/ | ||||||
|  | +#define  GIntMsk_IntEn  (1<<15)   /*Global Interrupt Enable*/ | ||||||
|  | + | ||||||
|  | +#define  REG_GIntFrc    0x006c  /*offset to Global Interrupt Force Reg*/ | ||||||
|  | +#define  GIntFrc_INT  (1<<15)     /*Force to set GIntSts*/ | ||||||
|  | + | ||||||
|  | +#define  REG_TxCollCnt  0x0070  /*Transmit Collision Count Reg, R*/ | ||||||
|  | +#define  REG_RxMissCnt  0x0074  /*Receive Miss Count Reg, R*/ | ||||||
|  | +#define  REG_RxRntCnt   0x0078  /*Receive Runt Count Reg, R*/ | ||||||
|  | + | ||||||
|  | +#define  REG_BMCtl  0x0080  /*offset to Bus Master Control Reg, R/W*/ | ||||||
|  | +#define  BMCtl_MT     (1<<13) | ||||||
|  | +#define  BMCtl_TT     (1<<12) | ||||||
|  | +#define  BMCtl_UnH    (1<<11) | ||||||
|  | +#define  BMCtl_TxChR  (1<<10) | ||||||
|  | +#define  BMCtl_TxDis  (1<<9) | ||||||
|  | +#define  BMCtl_TxEn   (1<<8) | ||||||
|  | +#define  BMCtl_EH2    (1<<6) | ||||||
|  | +#define  BMCtl_EH1    (1<<5) | ||||||
|  | +#define  BMCtl_EEOB   (1<<4) | ||||||
|  | +#define  BMCtl_RxChR  (1<<2) | ||||||
|  | +#define  BMCtl_RxDis  (1<<1) | ||||||
|  | +#define  BMCtl_RxEn   (1<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_BMSts  0x0084  /*offset to Bus Master Status Reg, R*/ | ||||||
|  | +#define  BMSts_TxAct  (1<<7) | ||||||
|  | +#define  BMSts_TP     (1<<4) | ||||||
|  | +#define  BMSts_RxAct  (1<<3) | ||||||
|  | +#define  BMSts_QID    (0x07<<0) | ||||||
|  | +#define  BMSts_QID_RxDt   (0<<0) | ||||||
|  | +#define  BMSts_QID_TxDt   (1<<0) | ||||||
|  | +#define  BMSts_QID_RxSts  (2<<0) | ||||||
|  | +#define  BMSts_QID_TxSts  (3<<0) | ||||||
|  | +#define  BMSts_QID_RxDesc (4<<0) | ||||||
|  | +#define  BMSts_QID_TxDesc (5<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_RBCA   0x0088  /*offset to Receive Buffer Current Address Reg, R*/ | ||||||
|  | +#define  REG_TBCA   0x008c  /*offset to Transmit Buffer Current Address Reg, R*/ | ||||||
|  | + | ||||||
|  | +#define  REG_RxDBA  0x0090  /*offset to Receive Descriptor Queue Base Address Reg, R/W*/ | ||||||
|  | +#define  REG_RxDBL  0x0094  /*offset to Receive Descriptor Queue Base Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_RxDCL  0x0096  /*offset to Receive Descriptor Queue Current Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_RxDCA  0x0098  /*offset to Receive Descriptor Queue Current Address Reg, R/W*/ | ||||||
|  | + | ||||||
|  | +#define  REG_RxDEQ  0x009c  /*offset to Receive Descriptor Enqueue Reg, R/W*/ | ||||||
|  | +#define  RxDEQ_RDV  (0xffff<<16)  /*R 16bit; Receive Descriptor Value*/ | ||||||
|  | +#define  RxDEQ_RDI  (0xff<<0)     /*W 8bit; Receive Descriptor Increment*/ | ||||||
|  | + | ||||||
|  | +#define  REG_RxSBA  0x00a0  /*offset to Receive Status Queue Base Address Reg, R/W*/ | ||||||
|  | +#define  REG_RxSBL  0x00a4  /*offset to Receive Status Queue Base Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_RxSCL  0x00a6  /*offset to Receive Status Queue Current Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_RxSCA  0x00a8  /*offset to Receive Status Queue Current Address Reg, R/W*/ | ||||||
|  | + | ||||||
|  | +#define  REG_RxSEQ  0x00ac  /*offset to Receive Status Queue Current Address Reg, R/W*/ | ||||||
|  | +#define  RxSEQ_RSV  (0xffff<<16) | ||||||
|  | +#define  RxSEQ_RSI  (0xff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_TxDBA  0x00b0  /*offset to Transmit Descriptor Queue Base Address Reg, R/W*/ | ||||||
|  | +#define  REG_TxDBL  0x00b4  /*offset to Transmit Descriptor Queue Base Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_TxDCL  0x00b6  /*offset to Transmit Descriptor Queue Current Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_TxDCA  0x00b8  /*offset to Transmit Descriptor Queue Current Address Reg, R/W*/ | ||||||
|  | + | ||||||
|  | +#define  REG_TxDEQ  0x00bc  /*offset to Transmit Descriptor Queue Current Address Reg, R/W*/ | ||||||
|  | +#define  TxDEQ_TDV  (0xffff<<16) | ||||||
|  | +#define  TxDEQ_TDI  (0xff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_TxSBA  0x00c0  /*offset to Transmit Status Queue Base Address Reg, R/W*/ | ||||||
|  | +#define  REG_TxSBL  0x00c4  /*offset to Transmit Status Queue Base Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_TxSCL  0x00c6  /*offset to Transmit Status Queue Current Length Reg, R/W, 16bits*/ | ||||||
|  | +#define  REG_TxSCA  0x00c8  /*offset to Transmit Status Queue Current Address Reg, R/W*/ | ||||||
|  | + | ||||||
|  | +#define  REG_RxBTH  0x00d0  /*offset to Receive Buffer Threshold Reg, R/W*/ | ||||||
|  | +#define  RxBTH_RDHT  (0x03ff<<16) | ||||||
|  | +#define  RxBTH_RDST  (0x03ff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_TxBTH  0x00d4  /*offset to Transmit Buffer Threshold Reg, R/W*/ | ||||||
|  | +#define  TxBTH_TDHT  (0x03ff<<16) | ||||||
|  | +#define  TxBTH_TDST  (0x03ff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_RxSTH  0x00d8  /*offset to Receive Status Threshold Reg, R/W*/ | ||||||
|  | +#define  RxSTH_RSHT  (0x003f<<16) | ||||||
|  | +#define  RxSTH_RSST  (0x003f<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_TxSTH  0x00dc  /*offset to Transmit Status Threshold Reg, R/W*/ | ||||||
|  | +#define  TxSTH_TSHT  (0x003f<<16) | ||||||
|  | +#define  TxSTH_TSST  (0x003f<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_RxDTH  0x00e0  /*offset to Receive Descriptor Threshold Reg, R/W*/ | ||||||
|  | +#define  RxDTH_RDHT  (0x003f<<16) | ||||||
|  | +#define  RxDTH_RDST  (0x003f<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_TxDTH  0x00e4  /*offset to Transmit Descriptor Threshold Reg, R/W*/ | ||||||
|  | +#define  TxDTH_TDHT  (0x003f<<16) | ||||||
|  | +#define  TxDTH_TDST  (0x003f<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_MaxFL  0x00e8  /*offset to Max Frame Length Reg, R/W*/ | ||||||
|  | +#define  MaxFL_MFL  (0x07ff<<16) | ||||||
|  | +#define  MaxFL_TST  (0x07ff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_RxHL  0x00ec  /*offset to Receive Header Length Reg, R/W*/ | ||||||
|  | +#define  RxHL_RHL2  (0x07ff<<16) | ||||||
|  | +#define  RxHL_RHL1  (0x03ff<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_MACCFG0  0x0100  /*offset to Test Reg #0, R/W*/ | ||||||
|  | +#define  MACCFG0_DbgSel  (1<<7) | ||||||
|  | +#define  MACCFG0_LCKEN   (1<<6) | ||||||
|  | +#define  MACCFG0_LRATE   (1<<5) | ||||||
|  | +#define  MACCFG0_RXERR   (1<<4) | ||||||
|  | +#define  MACCFG0_BIT33   (1<<2) | ||||||
|  | +#define  MACCFG0_PMEEN   (1<<1) | ||||||
|  | +#define  MACCFG0_PMEST   (1<<0) | ||||||
|  | + | ||||||
|  | +#define  REG_MACCFG1  0x0104  /*offset to Test Reg #1, R/W*/ | ||||||
|  | +#define  REG_MACCFG2  0x0108  /*offset to Test Reg #2, R*/ | ||||||
|  | +#define  REG_MACCFG3  0x010c  /*offset to Test Reg #3, R*/ | ||||||
|  | + | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/*--------------------------------------------------------------- | ||||||
|  | + * Definition of Descriptor/Status Queue Entry | ||||||
|  | + *-------------------------------------------------------------*/ | ||||||
|  | + | ||||||
|  | +typedef  union receiveDescriptor  {  /*data structure of Receive Descriptor Queue Entry*/ | ||||||
|  | +    struct {        /*whole value*/ | ||||||
|  | +        U32  e0,      /*1st dword entry*/ | ||||||
|  | +             e1;      /*2nd dword entry*/ | ||||||
|  | +    }  w; | ||||||
|  | +    struct {        /*bit field definitions*/ | ||||||
|  | +        U32  ba:32,   /*Buffer Address (keep in mind this is physical address)*/ | ||||||
|  | +             bl:16,   /*b15-0; Buffer Length*/ | ||||||
|  | +             bi:15,   /*b30-16; Buffer Index*/ | ||||||
|  | +             nsof:1;  /*b31; Not Start Of Frame*/ | ||||||
|  | +    }  f; | ||||||
|  | +}  receiveDescriptor; | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +typedef  union receiveStatus  {  /*data structure of Receive Status Queue Entry*/ | ||||||
|  | +    struct {         /*whole word*/ | ||||||
|  | +        U32  e0,       /*1st dword entry*/ | ||||||
|  | +             e1;       /*2nd dword entry*/ | ||||||
|  | +    }  w; | ||||||
|  | +    struct {         /*bit field*/ | ||||||
|  | +        U32  rsrv1:8,  /*b7-0: reserved*/ | ||||||
|  | +             hti:6,    /*b13-8: Hash Table Index*/ | ||||||
|  | +             rsrv2:1,  /*b14: reserved*/ | ||||||
|  | +             crci:1,   /*b15: CRC Included*/ | ||||||
|  | +             crce:1,   /*b16: CRC Error*/ | ||||||
|  | +             edata:1,  /*b17: Extra Data*/ | ||||||
|  | +             runt:1,   /*b18: Runt Frame*/ | ||||||
|  | +             fe:1,     /*b19: Framing Error*/ | ||||||
|  | +             oe:1,     /*b20: Overrun Error*/ | ||||||
|  | +             rxerr:1,  /*b21: Rx Error*/ | ||||||
|  | +             am:2,     /*b23-22: Address Match*/ | ||||||
|  | +             rsrv3:4,  /*b27-24: reserved*/ | ||||||
|  | +             eob:1,    /*b28: End Of Buffer*/ | ||||||
|  | +             eof:1,    /*b29: End Of Frame*/ | ||||||
|  | +             rwe:1,    /*b30: Received Without Error*/ | ||||||
|  | +             rfp:1,    /*b31: Receive Frame Processed*/ | ||||||
|  | +             fl:16,    /*b15-0: frame length*/ | ||||||
|  | +             bi:15,    /*b30-16: Buffer Index*/ | ||||||
|  | +             rfp2:1;   /*b31: Receive Frame Processed at 2nd word*/ | ||||||
|  | +    }  f; | ||||||
|  | +}  receiveStatus; | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +typedef  union transmitDescriptor  {  /*data structure of Transmit Descriptor Queue Entry*/ | ||||||
|  | +    struct {         /*whole value*/ | ||||||
|  | +        U32  e0,       /*1st dword entry*/ | ||||||
|  | +             e1;       /*2nd dword entry*/ | ||||||
|  | +    }  w; | ||||||
|  | +    struct {         /*bit field*/ | ||||||
|  | +        U32  ba:32,    /*b31-0: Buffer Address (keep in mind this is physical address)*/ | ||||||
|  | +             bl:12,    /*b11-0: Buffer Length*/ | ||||||
|  | +             rsrv1:3,  /*b14-12: reserved*/ | ||||||
|  | +             af:1,     /*b15: Abort Frame*/ | ||||||
|  | +             bi:15,    /*b30-16: Buffer Index*/ | ||||||
|  | +             eof:1;    /*b31: End Of Frame*/ | ||||||
|  | + | ||||||
|  | +    }  f; | ||||||
|  | +}  transmitDescriptor; | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +typedef  union transmitStatus  {  /*data structure of Transmit Status Queue Entry*/ | ||||||
|  | +    struct {         /*whole word*/ | ||||||
|  | +        U32  e0;       /*1st dword entry*/ | ||||||
|  | +    }  w; | ||||||
|  | +    struct {         /*bit field*/ | ||||||
|  | +        U32  bi:15,    /*b14-0: Buffer Index*/ | ||||||
|  | +             rsrv3:1,  /*b15: reserved*/ | ||||||
|  | +             ncoll:5,  /*b20-16: Number of Collisions*/ | ||||||
|  | +             rsrv2:3,  /*b23-21: reserved*/ | ||||||
|  | +             ecoll:1,  /*b24: Excess Collisions*/ | ||||||
|  | +             txu:1,    /*b25: Tx Underrun*/ | ||||||
|  | +             ow:1,     /*b26: Out of Window*/ | ||||||
|  | +             rsrv1:1,  /*b27: reserved*/ | ||||||
|  | +             lcrs:1,   /*b28: Loss of CRS*/ | ||||||
|  | +             fa:1,     /*b29: Frame Abort*/ | ||||||
|  | +             txwe:1,   /*b30: Transmitted Without Error*/ | ||||||
|  | +             txfp:1;   /*b31: Transmit Frame Processed*/ | ||||||
|  | +    }  f; | ||||||
|  | +}  transmitStatus; | ||||||
|  | + | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +/*--------------------------------------------------------------- | ||||||
|  | + *  Size of device registers occupied in memory/IO address map | ||||||
|  | + *-------------------------------------------------------------*/ | ||||||
|  | +#define  DEV_REG_SPACE  0x00010000 | ||||||
|  | + | ||||||
|  | +/* | ||||||
|  | +#define U8 unsigned char | ||||||
|  | +#define U16 unsigned short | ||||||
|  | +#define U32 unsigned long | ||||||
|  | +*/ | ||||||
|  | + | ||||||
|  | +/*--------------------------------------------------------------- | ||||||
|  | + * A definition of register access macros | ||||||
|  | + *-------------------------------------------------------------*/ | ||||||
|  | +#define  _RegRd(type,ofs)     (*(volatile type*)(ofs)) | ||||||
|  | +#define  _RegWr(type,ofs,dt)  *(volatile type*)(ofs)=((type)(dt)) | ||||||
|  | + | ||||||
|  | +#define  RegRd8(ofs)   _RegRd(U8,(char*)pD->base_addr+(ofs)) | ||||||
|  | +#define  RegRd16(ofs)  _RegRd(U16,(char*)pD->base_addr+(ofs)) | ||||||
|  | +#define  RegRd32(ofs)  _RegRd(U32,(char*)pD->base_addr+(ofs)) | ||||||
|  | +#define  RegWr8(ofs,dt)   _RegWr(U8,(char*)pD->base_addr+(ofs),(dt)) | ||||||
|  | +#define  RegWr16(ofs,dt)  _RegWr(U16,(char*)pD->base_addr+(ofs),(dt)) | ||||||
|  | +#define  RegWr32(ofs,dt)  _RegWr(U32,(char*)pD->base_addr+(ofs),(dt)) | ||||||
|  | + | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +#endif  /* _EP9213_ETH_H_ */ | ||||||
|  | + | ||||||
							
								
								
									
										714
									
								
								target/linux/ep93xx/patches-2.6.30/008-ep93xx-spi.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										714
									
								
								target/linux/ep93xx/patches-2.6.30/008-ep93xx-spi.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,714 @@ | |||||||
|  | Index: linux-2.6.30.9/drivers/spi/Kconfig | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.30.9.orig/drivers/spi/Kconfig	2009-11-24 21:09:23.000000000 +0100 | ||||||
|  | +++ linux-2.6.30.9/drivers/spi/Kconfig	2009-11-24 21:09:53.000000000 +0100 | ||||||
|  | @@ -125,6 +125,12 @@ | ||||||
|  |   | ||||||
|  |  	  If unsure, say N. | ||||||
|  |   | ||||||
|  | +config SPI_EP93XX | ||||||
|  | +	tristate "EP93xx SSP SPI master" | ||||||
|  | +	depends on SPI_MASTER && ARCH_EP93XX && EXPERIMENTAL | ||||||
|  | +	help | ||||||
|  | +	  This enables the EP93xx SPI master controller. | ||||||
|  | + | ||||||
|  |  config SPI_IMX | ||||||
|  |  	tristate "Freescale iMX SPI controller" | ||||||
|  |  	depends on ARCH_IMX && EXPERIMENTAL | ||||||
|  | Index: linux-2.6.30.9/drivers/spi/Makefile | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.30.9.orig/drivers/spi/Makefile	2009-11-24 21:09:23.000000000 +0100 | ||||||
|  | +++ linux-2.6.30.9/drivers/spi/Makefile	2009-11-24 21:09:53.000000000 +0100 | ||||||
|  | @@ -16,6 +16,7 @@ | ||||||
|  |  obj-$(CONFIG_SPI_BITBANG)		+= spi_bitbang.o | ||||||
|  |  obj-$(CONFIG_SPI_AU1550)		+= au1550_spi.o | ||||||
|  |  obj-$(CONFIG_SPI_BUTTERFLY)		+= spi_butterfly.o | ||||||
|  | +obj-$(CONFIG_SPI_EP93XX)		+= spi_ep93xx.o | ||||||
|  |  obj-$(CONFIG_SPI_GPIO)			+= spi_gpio.o | ||||||
|  |  obj-$(CONFIG_SPI_GPIO_OLD)		+= spi_gpio_old.o | ||||||
|  |  obj-$(CONFIG_SPI_IMX)			+= spi_imx.o | ||||||
|  | Index: linux-2.6.30.9/drivers/spi/spi_ep93xx.c | ||||||
|  | =================================================================== | ||||||
|  | --- /dev/null	1970-01-01 00:00:00.000000000 +0000 | ||||||
|  | +++ linux-2.6.30.9/drivers/spi/spi_ep93xx.c	2009-11-24 21:21:25.000000000 +0100 | ||||||
|  | @@ -0,0 +1,680 @@ | ||||||
|  | +/* | ||||||
|  | + * linux/drivers/spi/spi_ep93xx.c | ||||||
|  | + * | ||||||
|  | + * Copyright (C) 2007 Manfred Gruber <m.gruber@tirol.com> | ||||||
|  | + * Small changes by Peter Ivanov <ivanovp@gmail.com> to support MMC over SPI, 2008 | ||||||
|  | + * SIM.ONE changes by Nuccio Raciti Simplemachine <nuccio.raciti@gmail.com> | ||||||
|  | + * | ||||||
|  | + * Based on pxa2xx_spi.c/spi_imx.c and bitbang.c driver | ||||||
|  | + * | ||||||
|  | + * This program is free software; you can redistribute it and/or modify | ||||||
|  | + * it under the terms of the GNU General Public License version 2 as | ||||||
|  | + * published by the Free Software Foundation. | ||||||
|  | + * | ||||||
|  | + */ | ||||||
|  | + | ||||||
|  | +#include <linux/blkdev.h> | ||||||
|  | +#include <linux/clk.h> | ||||||
|  | +#include <linux/delay.h> | ||||||
|  | +#include <linux/dma-mapping.h> | ||||||
|  | +#include <linux/err.h> | ||||||
|  | +#include <linux/errno.h> | ||||||
|  | +#include <linux/init.h> | ||||||
|  | +#include <linux/io.h> | ||||||
|  | +#include <linux/interrupt.h> | ||||||
|  | +#include <linux/platform_device.h> | ||||||
|  | +#include <linux/spinlock.h> | ||||||
|  | +#include <linux/workqueue.h> | ||||||
|  | + | ||||||
|  | +#include <linux/spi/spi.h> | ||||||
|  | + | ||||||
|  | +#include <mach/hardware.h> | ||||||
|  | +#include <mach/ep93xx-regs.h> | ||||||
|  | +#include <asm/gpio.h> | ||||||
|  | + | ||||||
|  | +/* #define SPI_EP93XX_DEBUG */ | ||||||
|  | + | ||||||
|  | +#define DEFINE_SSP_REG(reg, off)			\ | ||||||
|  | +	static inline u32 read_##reg(void *p)		\ | ||||||
|  | +		{ return __raw_readl(p + (off)); }	\ | ||||||
|  | +	static inline void write_##reg(u32 v, void *p)	\ | ||||||
|  | +		{ __raw_writel(v, p + (off)); } | ||||||
|  | + | ||||||
|  | +DEFINE_SSP_REG(SSPCR0, 0x00) | ||||||
|  | +DEFINE_SSP_REG(SSPCR1, 0x04) | ||||||
|  | +DEFINE_SSP_REG(SSPDR, 0x08) | ||||||
|  | +DEFINE_SSP_REG(SSPSR, 0x0c) | ||||||
|  | +DEFINE_SSP_REG(SSPCPSR, 0x10) | ||||||
|  | +DEFINE_SSP_REG(SSPIIR, 0x14) | ||||||
|  | +DEFINE_SSP_REG(SSPICR, 0x14) | ||||||
|  | + | ||||||
|  | +/* Bits in SSPCR0 */ | ||||||
|  | +#define SSPCR0_DSS_MASK		0x0000000f | ||||||
|  | +#define SSPCR0_FRF_MASK		0x00000030 | ||||||
|  | +#define SSPCR0_FRF_SHIFT	4 | ||||||
|  | +#define SSPCR0_FRF_MOTOROLA	(0 << SSPCR0_FRF_SHIFT) | ||||||
|  | +#define SSPCR0_FRF_TI		(1 << SSPCR0_FRF_SHIFT) | ||||||
|  | +#define SSPCR0_FRF_NI		(2 << SSPCR0_FRF_SHIFT) | ||||||
|  | +#define SSPCR0_SPO		0x00000040 | ||||||
|  | +#define SSPCR0_SPH		0x00000080 | ||||||
|  | +#define SSPCR0_SCR_MASK		0x0000ff00 | ||||||
|  | +#define SSPCR0_SCR_SHIFT	8 | ||||||
|  | + | ||||||
|  | +/* Bits in SSPCR1 */ | ||||||
|  | +#define SSPC1_RIE		0x00000001 | ||||||
|  | +#define SSPC1_TIE		0x00000002 | ||||||
|  | +#define SSPC1_RORIE		0x00000004 | ||||||
|  | +#define SSPC1_LBM		0x00000008 | ||||||
|  | +#define SSPC1_SSE		0x00000010 | ||||||
|  | +#define SSPC1_MS		0x00000020 | ||||||
|  | +#define SSPC1_SOD		0x00000040 | ||||||
|  | + | ||||||
|  | +/* Bits in SSPSR */ | ||||||
|  | +#define SSPSR_TFE		0x00000001	/* TX FIFO is empty */ | ||||||
|  | +#define SSPSR_TNF		0x00000002	/* TX FIFO is not full */ | ||||||
|  | +#define SSPSR_RNE		0x00000004	/* RX FIFO is not empty */ | ||||||
|  | +#define SSPSR_RFF		0x00000008	/* RX FIFO is full */ | ||||||
|  | +#define SSPSR_BSY		0x00000010	/* SSP is busy */ | ||||||
|  | +#define SSPSR_MASK		0x0000001F	/* SSP is busy */ | ||||||
|  | + | ||||||
|  | +/* Bits in SSPCPSR */ | ||||||
|  | +#define SSPCPSR_SCR_MASK	0x000000ff | ||||||
|  | + | ||||||
|  | +/* Bits in SSPIIR */ | ||||||
|  | +#define SSPIIR_RIS		0x00000001	/* RX FIFO IRQ status */ | ||||||
|  | +#define SSPIIR_TIS		0x00000002	/* TX FIFO is not full */ | ||||||
|  | +#define SSPIIR_RORIS		0x00000004	/* RX FIFO is full */ | ||||||
|  | + | ||||||
|  | +#define SPI_SSPCLK		7.4e6 | ||||||
|  | +#define SPI_SSPCLK_REV_E2	14.8e6		/* only for chip Rev E2 */ | ||||||
|  | +#define SPI_MAX_SPEED		3.7e6 | ||||||
|  | +#define SPI_MAX_SPEED_REV_E2	7.4e6		/* only for chip Rev E2 */ | ||||||
|  | +#define SPI_CPSDVR_DIV_MIN	2 | ||||||
|  | +#define SPI_CPSDVR_DIV_MAX	254 | ||||||
|  | +#define SPI_SCR_DIV_MIN		0 | ||||||
|  | +#define SPI_SCR_DIV_MAX		255 | ||||||
|  | +#define SPI_DATARATE_OK		0 | ||||||
|  | +#define SPI_DATARATE_NOK	-1 | ||||||
|  | + | ||||||
|  | +struct driver_data { | ||||||
|  | +	/* Driver model hookup */ | ||||||
|  | +	struct platform_device *pdev; | ||||||
|  | + | ||||||
|  | +	/* SPI framework hookup */ | ||||||
|  | +	struct spi_master *master; | ||||||
|  | + | ||||||
|  | +	/* SSP register addresses */ | ||||||
|  | +	void *ioaddr; | ||||||
|  | + | ||||||
|  | +	/* SSP irq */ | ||||||
|  | +	int irq; | ||||||
|  | + | ||||||
|  | +	struct list_head queue; | ||||||
|  | + | ||||||
|  | +	/* SSP spinlock */ | ||||||
|  | +	spinlock_t lock; | ||||||
|  | + | ||||||
|  | +	struct workqueue_struct *workqueue; | ||||||
|  | +	struct work_struct      work; | ||||||
|  | + | ||||||
|  | +	u8 busy; | ||||||
|  | +	u8 use_dma; | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +static unsigned ep93xx_txrx_8(struct spi_device *spi, struct spi_transfer *t) | ||||||
|  | +{ | ||||||
|  | +	struct driver_data *drv_data; | ||||||
|  | +	const u8 *tx = t->tx_buf; | ||||||
|  | +	u8 *rx = t->rx_buf; | ||||||
|  | +	unsigned count = t->len; | ||||||
|  | +	u8 byte; | ||||||
|  | +	int busy; | ||||||
|  | + | ||||||
|  | +	drv_data = spi_master_get_devdata(spi->master); | ||||||
|  | + | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +	dev_info(&spi->dev, | ||||||
|  | +		"ep93xx_txrx_8: t->len %u \n", t->len); | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  | +	while (likely(count > 0)) { | ||||||
|  | +		byte = 0; | ||||||
|  | +		if (tx) { | ||||||
|  | +			byte = *tx++; | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +			dev_info(&spi->dev, | ||||||
|  | +				"ep93xx_txrx_8: write 0x%x \n", byte); | ||||||
|  | +#endif | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +		write_SSPDR(byte, drv_data->ioaddr); | ||||||
|  | +		busy = read_SSPSR(drv_data->ioaddr); | ||||||
|  | +		while (busy & SSPSR_BSY) { | ||||||
|  | +			cpu_relax(); | ||||||
|  | +			busy = read_SSPSR(drv_data->ioaddr); | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +			dev_info(&spi->dev, | ||||||
|  | +				"ep93xx_txrx_8: delay. SSPSR: 0x%X\n", busy); | ||||||
|  | +#endif | ||||||
|  | +		} | ||||||
|  | +		byte = read_SSPDR(drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +		if (rx) { | ||||||
|  | +			*rx++ = byte; | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +			dev_info(&spi->dev, | ||||||
|  | +				"ep93xx_txrx_8: read 0x%x \n", byte); | ||||||
|  | +#endif | ||||||
|  | +		} | ||||||
|  | +		count -= 1; | ||||||
|  | +	} | ||||||
|  | +	return t->len - count; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | + | ||||||
|  | +static unsigned ep93xx_txrx_16(struct spi_device *spi, struct spi_transfer *t) | ||||||
|  | +{ | ||||||
|  | + | ||||||
|  | +	struct driver_data *drv_data; | ||||||
|  | +	const u16 *tx = t->tx_buf; | ||||||
|  | +	u16 *rx = t->rx_buf; | ||||||
|  | +	unsigned count = t->len; | ||||||
|  | +	u16 word; | ||||||
|  | +	int busy; | ||||||
|  | + | ||||||
|  | +	drv_data = spi_master_get_devdata(spi->master); | ||||||
|  | + | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +	dev_info(&spi->dev, | ||||||
|  | +		"ep93xx_txrx_16: t->len %u \n", t->len); | ||||||
|  | +#endif | ||||||
|  | +	while (likely(count > 0)) { | ||||||
|  | +		word = 0; | ||||||
|  | +		if (tx) { | ||||||
|  | +			word = *tx++; | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +			dev_info(&spi->dev, | ||||||
|  | +				"ep93xx_txrx_16: write 0x%x \n", word); | ||||||
|  | +#endif | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +		write_SSPDR(word, drv_data->ioaddr); | ||||||
|  | +		busy = read_SSPSR(drv_data->ioaddr); | ||||||
|  | +		while (busy & SSPSR_BSY) { | ||||||
|  | +			cpu_relax(); | ||||||
|  | +			busy = read_SSPSR(drv_data->ioaddr); | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +			dev_info(&spi->dev, | ||||||
|  | +				"ep93xx_txrx_8: delay.\n"); | ||||||
|  | +#endif | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +		word = read_SSPDR(drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +		if (rx) { | ||||||
|  | +			*rx++ = word; | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +			dev_info(&spi->dev, | ||||||
|  | +				"ep93xx_txrx_16: read 0x%x \n", word); | ||||||
|  | +#endif | ||||||
|  | +		} | ||||||
|  | +		count -= 2; | ||||||
|  | +	} | ||||||
|  | +	return t->len - count; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static u32 spi_data_rate(u32 speed_hz, u32 *div_cpsdvr, u32 *div_scr, | ||||||
|  | +	struct driver_data *drv_data, struct spi_device *spi) | ||||||
|  | +{ | ||||||
|  | +	unsigned int spi_sspclk = SPI_SSPCLK; | ||||||
|  | +	unsigned int bus_speed_max = SPI_MAX_SPEED; | ||||||
|  | +	unsigned int bus_hz_tmp = 0; | ||||||
|  | +	u32 div_cpsdvr_tmp; | ||||||
|  | +	u32 div_scr_tmp; | ||||||
|  | +	u32 rv = SPI_DATARATE_NOK; | ||||||
|  | +	int chip_rev; | ||||||
|  | + | ||||||
|  | +	/* Checking CHIP_ID */ | ||||||
|  | +	chip_rev = (__raw_readl (EP93XX_SYSCON_CHIP_ID) >> 28) & 0xF; | ||||||
|  | +	if (chip_rev == 7) | ||||||
|  | +	{ | ||||||
|  | +		/* Chip version: Rev E2 */ | ||||||
|  | +		/* This device has double speed SSP clock */ | ||||||
|  | +		spi_sspclk = SPI_SSPCLK_REV_E2; | ||||||
|  | +		bus_speed_max = SPI_MAX_SPEED_REV_E2; | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +		dev_info(&spi->dev, | ||||||
|  | +				"Chip Rev E2 detected! This device has double speed SSP clock.\n"); | ||||||
|  | +#endif | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	*div_cpsdvr = SPI_CPSDVR_DIV_MAX; | ||||||
|  | +	*div_scr = SPI_SCR_DIV_MAX; | ||||||
|  | + | ||||||
|  | +	for (div_cpsdvr_tmp = SPI_CPSDVR_DIV_MIN; | ||||||
|  | +			div_cpsdvr_tmp <= SPI_CPSDVR_DIV_MAX && rv; div_cpsdvr_tmp++) { | ||||||
|  | +		for (div_scr_tmp = SPI_SCR_DIV_MIN; | ||||||
|  | +				div_scr_tmp <= SPI_SCR_DIV_MAX && rv; div_scr_tmp++) { | ||||||
|  | +			bus_hz_tmp = spi_sspclk / (div_cpsdvr_tmp * (1 + div_scr_tmp)); | ||||||
|  | +			if (bus_hz_tmp <= speed_hz && bus_hz_tmp <= bus_speed_max) { | ||||||
|  | +				*div_cpsdvr = div_cpsdvr_tmp; | ||||||
|  | +				*div_scr = div_scr_tmp; | ||||||
|  | +				rv = SPI_DATARATE_OK; | ||||||
|  | +			} | ||||||
|  | +		} | ||||||
|  | +	} | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +	dev_info(&spi->dev, | ||||||
|  | +			"Needed SPI bus frequency: %i Hz\n", speed_hz); | ||||||
|  | +	dev_info(&spi->dev, | ||||||
|  | +			"Actual SPI bus frequency: %i Hz\n", bus_hz_tmp); | ||||||
|  | +#endif | ||||||
|  | +	return rv; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +/* Supported modes (returns -EINVAL if not supported mode requested) */ | ||||||
|  | +#define MODEBITS (SPI_CPOL | SPI_CPHA | SPI_CS_HIGH) | ||||||
|  | + | ||||||
|  | +static int ep93xx_spi_setup(struct spi_device *spi) | ||||||
|  | +{ | ||||||
|  | +	struct driver_data *drv_data; | ||||||
|  | +	u16 val; | ||||||
|  | +	u32 div_scr; | ||||||
|  | +	u32 div_cpsdvr; | ||||||
|  | +	unsigned int bits = spi->bits_per_word; | ||||||
|  | +	unsigned long speed_hz = spi->max_speed_hz; | ||||||
|  | + | ||||||
|  | +	drv_data = spi_master_get_devdata(spi->master); | ||||||
|  | + | ||||||
|  | +	/* enable SSP */ | ||||||
|  | +	write_SSPCR1(SSPC1_SSE, drv_data->ioaddr); | ||||||
|  | +	/* Enable SSP and loopback mode (only for testing!) */ | ||||||
|  | +	/* write_SSPCR1(SSPC1_SSE | SSPC1_LBM, drv_data->ioaddr);  */ | ||||||
|  | + | ||||||
|  | +	if (bits == 0) | ||||||
|  | +		bits = 8; | ||||||
|  | +	if (bits < 4 || bits > 16) { | ||||||
|  | +		dev_err(&spi->dev, | ||||||
|  | +			"setup invalid bits_per_word %u (4 to 16)\n", bits); | ||||||
|  | +		return -EINVAL; | ||||||
|  | +	} else { | ||||||
|  | +		val = read_SSPCR0(drv_data->ioaddr); | ||||||
|  | +		val = val & ~SSPCR0_DSS_MASK ; | ||||||
|  | +		val = val | (bits-1); | ||||||
|  | +		write_SSPCR0(val, drv_data->ioaddr); | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +		dev_info (&spi->dev, "Bits per word: %i\n", bits); | ||||||
|  | +#endif | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	if (spi->mode & ~MODEBITS) { | ||||||
|  | +		dev_err(&spi->dev, "unsupported mode bits: %x\n", | ||||||
|  | +			spi->mode & ~MODEBITS); | ||||||
|  | +		return -EINVAL; | ||||||
|  | +	} else { | ||||||
|  | +		val = read_SSPCR0(drv_data->ioaddr); | ||||||
|  | +		val = val & ~SSPCR0_SPO; | ||||||
|  | +		val = val & ~SSPCR0_SPH; | ||||||
|  | +		if (spi->mode & SPI_CPOL) | ||||||
|  | +		{ | ||||||
|  | +			val = val | SSPCR0_SPO; | ||||||
|  | +		} | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +		dev_info (&spi->dev, "Clock polarity (CPOL): %s\n", (spi->mode & SPI_CPHA) ? "1" : "0"); | ||||||
|  | +#endif | ||||||
|  | +		if (spi->mode & SPI_CPHA) | ||||||
|  | +		{ | ||||||
|  | +			val = val | SSPCR0_SPH; | ||||||
|  | +		} | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +		dev_info (&spi->dev, "Clock phase (CPHA): %s\n", (spi->mode & SPI_CPHA) ? "1" : "0"); | ||||||
|  | +#endif | ||||||
|  | +		write_SSPCR0(val, drv_data->ioaddr); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	if (SPI_DATARATE_OK == (spi_data_rate(speed_hz, &div_cpsdvr, | ||||||
|  | +		&div_scr, drv_data, spi))) { | ||||||
|  | + | ||||||
|  | +		val = read_SSPCPSR(drv_data->ioaddr); | ||||||
|  | +		val = val & ~SSPCPSR_SCR_MASK; | ||||||
|  | +		val = val | div_cpsdvr; | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +		dev_info (&spi->dev, "SSPCPSR: 0x%X\n", val); | ||||||
|  | +#endif | ||||||
|  | +		write_SSPCPSR(val, drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +		val = read_SSPCR0(drv_data->ioaddr); | ||||||
|  | +		val = val & ~SSPCR0_SCR_MASK; | ||||||
|  | +		val = val | (div_scr << SSPCR0_SCR_SHIFT); | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +		dev_info (&spi->dev, "SSPCR0: 0x%X (div_scr: 0x%X)\n", val, div_scr); | ||||||
|  | +#endif | ||||||
|  | +		write_SSPCR0(val, drv_data->ioaddr); | ||||||
|  | +	} else | ||||||
|  | +		return -EINVAL; | ||||||
|  | + | ||||||
|  | +	/* reenable */ | ||||||
|  | +	val = read_SSPCR1(drv_data->ioaddr); | ||||||
|  | +	val = val & ~SSPC1_SSE; | ||||||
|  | +	write_SSPCR1(val, drv_data->ioaddr); | ||||||
|  | +	val = read_SSPCR1(drv_data->ioaddr); | ||||||
|  | +	val = val | SSPC1_SSE; | ||||||
|  | +	write_SSPCR1(val, drv_data->ioaddr); | ||||||
|  | +#ifdef SPI_EP93XX_DEBUG | ||||||
|  | +	dev_info (&spi->dev, "Loopback mode: %s\n", (val & SSPC1_LBM) ? "On" : "Off"); | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int ep93xx_spi_transfer(struct spi_device *spi, struct spi_message *m) | ||||||
|  | +{ | ||||||
|  | +	struct driver_data *drv_data; | ||||||
|  | +	unsigned long flags; | ||||||
|  | +	int status = 0; | ||||||
|  | + | ||||||
|  | +	m->actual_length = 0; | ||||||
|  | +	m->status = -EINPROGRESS; | ||||||
|  | + | ||||||
|  | +	drv_data = spi_master_get_devdata(spi->master); | ||||||
|  | + | ||||||
|  | +	spin_lock_irqsave(&drv_data->lock, flags); | ||||||
|  | +	if (!spi->max_speed_hz) | ||||||
|  | +		status = -ENETDOWN; | ||||||
|  | +	else { | ||||||
|  | +		list_add_tail(&m->queue, &drv_data->queue); | ||||||
|  | +		queue_work(drv_data->workqueue, &drv_data->work); | ||||||
|  | +	} | ||||||
|  | +	spin_unlock_irqrestore(&drv_data->lock, flags); | ||||||
|  | +	return status; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static void ep93xx_work(struct work_struct *work) | ||||||
|  | +{ | ||||||
|  | +	struct driver_data *drv_data = | ||||||
|  | +		container_of(work, struct driver_data, work); | ||||||
|  | +	unsigned long flags; | ||||||
|  | + | ||||||
|  | +	spin_lock_irqsave(&drv_data->lock, flags); | ||||||
|  | +	drv_data->busy = 1; | ||||||
|  | + | ||||||
|  | +	while (!list_empty(&drv_data->queue)) { | ||||||
|  | +		struct spi_message *m; | ||||||
|  | +		struct spi_device *spi; | ||||||
|  | +		struct spi_transfer *t = NULL; | ||||||
|  | +		int status; | ||||||
|  | + | ||||||
|  | +		m = container_of(drv_data->queue.next, struct spi_message, | ||||||
|  | +			queue); | ||||||
|  | +		list_del_init(&m->queue); | ||||||
|  | +		spin_unlock_irqrestore(&drv_data->lock, flags); | ||||||
|  | + | ||||||
|  | +		spi = m->spi; | ||||||
|  | +		status = 0; | ||||||
|  | + | ||||||
|  | +		list_for_each_entry(t, &m->transfers, transfer_list) { | ||||||
|  | + | ||||||
|  | +			if (!t->tx_buf && !t->rx_buf && t->len) { | ||||||
|  | +				status = -EINVAL; | ||||||
|  | +				break; | ||||||
|  | +			} | ||||||
|  | + | ||||||
|  | +			if (t->len) { | ||||||
|  | +				if (!m->is_dma_mapped) { | ||||||
|  | +					t->rx_dma = 0; | ||||||
|  | +					t->tx_dma = 0; | ||||||
|  | +				} | ||||||
|  | +				if (t->bits_per_word <= 8) | ||||||
|  | +					status = ep93xx_txrx_8(spi, t); | ||||||
|  | +				else | ||||||
|  | +					status = ep93xx_txrx_16(spi, t); | ||||||
|  | +			} | ||||||
|  | + | ||||||
|  | +			if (status != t->len) { | ||||||
|  | +				if (status > 0) | ||||||
|  | +					status = -EMSGSIZE; | ||||||
|  | +				break; | ||||||
|  | +			} | ||||||
|  | +			m->actual_length += status; | ||||||
|  | +			status = 0; | ||||||
|  | + | ||||||
|  | +			/* protocol tweaks before next transfer */ | ||||||
|  | +			if (t->delay_usecs) | ||||||
|  | +				udelay(t->delay_usecs); | ||||||
|  | + | ||||||
|  | +			if (t->transfer_list.next == &m->transfers) | ||||||
|  | +				break; | ||||||
|  | +		} | ||||||
|  | + | ||||||
|  | +		m->status = status; | ||||||
|  | +		m->complete(m->context); | ||||||
|  | + | ||||||
|  | +		spin_lock_irqsave(&drv_data->lock, flags); | ||||||
|  | +	} | ||||||
|  | +	drv_data->busy = 0; | ||||||
|  | +	spin_unlock_irqrestore(&drv_data->lock, flags); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static irqreturn_t ssp_int(int irq, void *dev_id) | ||||||
|  | +{ | ||||||
|  | +	struct driver_data *drv_data = dev_id; | ||||||
|  | +	u8 status; | ||||||
|  | +	status = read_SSPIIR(drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	if (status & SSPIIR_RORIS) { | ||||||
|  | +		dev_err(&drv_data->pdev->dev, "SPI rx overrun.\n"); | ||||||
|  | + | ||||||
|  | +		/* We clear the overrun here ! */ | ||||||
|  | +		write_SSPICR(0, drv_data->ioaddr); | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	/* RX interrupt */ | ||||||
|  | +	if (status & SSPIIR_RIS) | ||||||
|  | +		dev_info(&drv_data->pdev->dev, "SPI RX interrupt\n"); | ||||||
|  | + | ||||||
|  | +	/* TX interrupt */ | ||||||
|  | +	if (status & SSPIIR_TIS) | ||||||
|  | +		dev_info(&drv_data->pdev->dev, "SPI TX interrupt\n"); | ||||||
|  | + | ||||||
|  | +	write_SSPICR(0, drv_data->ioaddr); | ||||||
|  | +	return IRQ_HANDLED; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int __init ep93xx_spi_probe(struct platform_device *pdev) | ||||||
|  | +{ | ||||||
|  | +	struct device *dev = &pdev->dev; | ||||||
|  | +	struct spi_master *master; | ||||||
|  | +	struct driver_data *drv_data = 0; | ||||||
|  | +	struct resource *memory_resource; | ||||||
|  | +	int status = 0; | ||||||
|  | +	u16 val; | ||||||
|  | + | ||||||
|  | +	/* Allocate master with space for drv_data and null dma buffer */ | ||||||
|  | +	master = spi_alloc_master(dev, sizeof(struct driver_data)); | ||||||
|  | +	if (!master) { | ||||||
|  | +		dev_err(&pdev->dev, "cannot alloc spi_master\n"); | ||||||
|  | +		return -ENOMEM; | ||||||
|  | +	} | ||||||
|  | +	drv_data = spi_master_get_devdata(master); | ||||||
|  | +	drv_data->master = master; | ||||||
|  | +	drv_data->pdev = pdev; | ||||||
|  | + | ||||||
|  | +        master->num_chipselect = EP93XX_GPIO_LINE_H(7) + 1; | ||||||
|  | +	master->bus_num = pdev->id; | ||||||
|  | +	master->setup = ep93xx_spi_setup; | ||||||
|  | +	master->transfer = ep93xx_spi_transfer; | ||||||
|  | + | ||||||
|  | +	spin_lock_init(&drv_data->lock); | ||||||
|  | +	INIT_LIST_HEAD(&drv_data->queue); | ||||||
|  | + | ||||||
|  | +	/* Setup register addresses */ | ||||||
|  | +	memory_resource = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||||||
|  | +	if (!memory_resource) { | ||||||
|  | +	    dev_err(&pdev->dev, "memory resources not defined\n"); | ||||||
|  | +	    status = -EIO; | ||||||
|  | +	    goto out_error_master_alloc; | ||||||
|  | +	} else { | ||||||
|  | +	    drv_data->ioaddr = ioremap(memory_resource->start, | ||||||
|  | +				memory_resource->end - memory_resource->start); | ||||||
|  | +	    if (drv_data->ioaddr == NULL) { | ||||||
|  | +		    dev_err(&pdev->dev, "ioremap failed\n"); | ||||||
|  | +		    status = -EIO; | ||||||
|  | +		    goto out_error_master_alloc; | ||||||
|  | +	    } | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	/* Attach to IRQ */ | ||||||
|  | +	drv_data->irq = platform_get_irq(pdev, 0); | ||||||
|  | +	if (drv_data->irq < 0) | ||||||
|  | +		return drv_data->irq; | ||||||
|  | + | ||||||
|  | +	if (drv_data->irq <= 0) { | ||||||
|  | +		dev_err(&pdev->dev, "IRQ resource not defined\n"); | ||||||
|  | +		status = -ENODEV; | ||||||
|  | +		goto out_error_master_alloc; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	status = request_irq(drv_data->irq, ssp_int, 0, "ep93xx-spi", drv_data); | ||||||
|  | +	if (status < 0) { | ||||||
|  | +		dev_err(&pdev->dev, "cannot get SPI IRQ 0\n"); | ||||||
|  | +		goto out_error_master_alloc; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	/* SSP default configuration, enable */ | ||||||
|  | +	write_SSPCR1(SSPC1_SSE, drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	/* run as master */ | ||||||
|  | +	val = read_SSPCR1(drv_data->ioaddr); | ||||||
|  | +	val = val & ~SSPC1_MS; | ||||||
|  | +	write_SSPCR1(val, drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	/* frame format to Motorola SPI Format */ | ||||||
|  | +	val = read_SSPCR0(drv_data->ioaddr); | ||||||
|  | +	val = val & ~SSPCR0_FRF_MASK ; | ||||||
|  | +	val = val | SSPCR0_FRF_MOTOROLA; | ||||||
|  | +	write_SSPCR0(val, drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	/* enable interrupts */ | ||||||
|  | +	val = read_SSPCR1(drv_data->ioaddr); | ||||||
|  | +	/* for now only overrun is handled */ | ||||||
|  | +	/* val = val | SSPC1_RIE | SSPC1_TIE | SSPC1_RORIE; */ | ||||||
|  | +	val = val | SSPC1_RORIE; | ||||||
|  | +	write_SSPCR1(val, drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	/* SSP default configuration, re enable */ | ||||||
|  | +	val = read_SSPCR1(drv_data->ioaddr); | ||||||
|  | +	val = val & ~SSPC1_SSE; | ||||||
|  | +	write_SSPCR1(val, drv_data->ioaddr); | ||||||
|  | +	val = read_SSPCR1(drv_data->ioaddr); | ||||||
|  | +	val = val | SSPC1_SSE; | ||||||
|  | +	write_SSPCR1(val, drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	/* Register with the SPI framework */ | ||||||
|  | +	platform_set_drvdata(pdev, drv_data); | ||||||
|  | +	status = spi_register_master(master); | ||||||
|  | +	if (status != 0) { | ||||||
|  | +		dev_err(&pdev->dev, "cannot register SPI master\n"); | ||||||
|  | +		goto out_error_master_alloc; | ||||||
|  | +	} else | ||||||
|  | +		dev_info(&pdev->dev, "SPI Controller initalized\n"); | ||||||
|  | + | ||||||
|  | +	INIT_WORK(&drv_data->work, ep93xx_work); | ||||||
|  | +	spin_lock_init(&drv_data->lock); | ||||||
|  | +	INIT_LIST_HEAD(&drv_data->queue); | ||||||
|  | + | ||||||
|  | +	/* this task is the only thing to touch the SPI bits */ | ||||||
|  | +	drv_data->busy = 0; | ||||||
|  | +	drv_data->workqueue = create_singlethread_workqueue( | ||||||
|  | +		dev_name(drv_data->master->dev.parent)); | ||||||
|  | +/*              drv_data->master->cdev.dev->bus_id); */ | ||||||
|  | +	if (drv_data->workqueue == NULL) { | ||||||
|  | +		status = -EBUSY; | ||||||
|  | +		goto out_error_free_irq; | ||||||
|  | +	} | ||||||
|  | + | ||||||
|  | +	return status; | ||||||
|  | + | ||||||
|  | +out_error_free_irq: | ||||||
|  | +	free_irq(drv_data->irq, master); | ||||||
|  | +out_error_master_alloc: | ||||||
|  | +	if (drv_data->ioaddr != NULL) | ||||||
|  | +		iounmap(drv_data->ioaddr); | ||||||
|  | +	spi_master_put(master); | ||||||
|  | +	return status; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int __exit ep93xx_spi_remove(struct platform_device *pdev) | ||||||
|  | +{ | ||||||
|  | +	struct driver_data *drv_data = platform_get_drvdata(pdev); | ||||||
|  | +	u8 val; | ||||||
|  | + | ||||||
|  | +	WARN_ON(!list_empty(&drv_data->queue)); | ||||||
|  | + | ||||||
|  | +	destroy_workqueue(drv_data->workqueue); | ||||||
|  | + | ||||||
|  | +	/* switch off SSP*/ | ||||||
|  | +	val = read_SSPCR1(drv_data->ioaddr); | ||||||
|  | +	val = val & ~SSPC1_SSE; | ||||||
|  | +	write_SSPCR1(val, drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	/* release irqs */ | ||||||
|  | +	if (drv_data->irq > 0) | ||||||
|  | +		free_irq(drv_data->irq, drv_data); | ||||||
|  | + | ||||||
|  | +	/* Disconnect from the SPI framework */ | ||||||
|  | +	spi_unregister_master(drv_data->master); | ||||||
|  | +	spi_master_put(drv_data->master); | ||||||
|  | + | ||||||
|  | +	if (drv_data->ioaddr != NULL) | ||||||
|  | +		iounmap(drv_data->ioaddr); | ||||||
|  | + | ||||||
|  | +	/* Prevent double remove */ | ||||||
|  | +	platform_set_drvdata(pdev, NULL); | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +#ifdef CONFIG_PM | ||||||
|  | +static int ep93xx_spi_suspend(struct platform_device *pdev, pm_message_t msg) | ||||||
|  | +{ | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +static int ep93xx_spi_resume(struct platform_device *pdev) | ||||||
|  | +{ | ||||||
|  | +	return 0; | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +#else | ||||||
|  | +#define ep93xx_spi_suspend NULL | ||||||
|  | +#define ep93xx_spi_resume  NULL | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  | +struct platform_driver ep93xx_spi_device = { | ||||||
|  | +	.remove		= __exit_p(ep93xx_spi_remove), | ||||||
|  | +#ifdef CONFIG_PM | ||||||
|  | +	.suspend	= ep93xx_spi_suspend, | ||||||
|  | +	.resume		= ep93xx_spi_resume, | ||||||
|  | +#endif | ||||||
|  | +	.driver		= { | ||||||
|  | +		.name	= "ep93xx-spi", | ||||||
|  | +		.bus	= &spi_bus_type, | ||||||
|  | +		.owner	= THIS_MODULE, | ||||||
|  | +	}, | ||||||
|  | +}; | ||||||
|  | + | ||||||
|  | +int __init ep93xx_spi_init(void) | ||||||
|  | +{ | ||||||
|  | +	return platform_driver_probe(&ep93xx_spi_device, ep93xx_spi_probe); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +void __exit ep93xx_spi_exit(void) | ||||||
|  | +{ | ||||||
|  | +	platform_driver_unregister(&ep93xx_spi_device); | ||||||
|  | +} | ||||||
|  | + | ||||||
|  | +module_init(ep93xx_spi_init); | ||||||
|  | +module_exit(ep93xx_spi_exit); | ||||||
|  | + | ||||||
|  | +MODULE_DESCRIPTION("EP93XX SPI Driver"); | ||||||
|  | +MODULE_AUTHOR("Manfred Gruber, <m.gruber@tirol.com>"); | ||||||
|  | +MODULE_LICENSE("GPL"); | ||||||
							
								
								
									
										3565
									
								
								target/linux/ep93xx/patches-2.6.30/009-ep93xx-fb.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3565
									
								
								target/linux/ep93xx/patches-2.6.30/009-ep93xx-fb.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										3808
									
								
								target/linux/ep93xx/patches-2.6.30/010-ep93xx-snd-ac97.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3808
									
								
								target/linux/ep93xx/patches-2.6.30/010-ep93xx-snd-ac97.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1658
									
								
								target/linux/ep93xx/patches-2.6.30/011-simone-board-def.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1658
									
								
								target/linux/ep93xx/patches-2.6.30/011-simone-board-def.patch
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										32
									
								
								target/linux/ep93xx/patches-2.6.30/012-ep93xx-cpuinfo.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								target/linux/ep93xx/patches-2.6.30/012-ep93xx-cpuinfo.patch
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | Index: linux-2.6.30.9/arch/arm/kernel/setup.c | ||||||
|  | =================================================================== | ||||||
|  | --- linux-2.6.30.9.orig/arch/arm/kernel/setup.c	2009-11-24 21:00:10.000000000 +0100 | ||||||
|  | +++ linux-2.6.30.9/arch/arm/kernel/setup.c	2009-11-24 21:00:46.000000000 +0100 | ||||||
|  | @@ -42,6 +42,10 @@ | ||||||
|  |  #include <asm/traps.h> | ||||||
|  |  #include <asm/unwind.h> | ||||||
|  |   | ||||||
|  | +#if defined(CONFIG_ARCH_EP93XX) | ||||||
|  | +#include <mach/ep93xx-regs.h> | ||||||
|  | +#endif | ||||||
|  | + | ||||||
|  |  #include "compat.h" | ||||||
|  |  #include "atags.h" | ||||||
|  |   | ||||||
|  | @@ -844,9 +848,16 @@ | ||||||
|  |  	seq_puts(m, "\n"); | ||||||
|  |   | ||||||
|  |  	seq_printf(m, "Hardware\t: %s\n", machine_name); | ||||||
|  | +#if defined(CONFIG_ARCH_EP93XX) | ||||||
|  | +	seq_printf(m, "Revision\t: %04x\n", | ||||||
|  | +	     *((unsigned int *)EP93XX_SYSCON_CHIP_ID) >> 28); | ||||||
|  | +	seq_printf(m, "Serial\t\t: %016x\n", | ||||||
|  | +	     *((unsigned int *)EP93XX_SECURITY_UNIQID)); | ||||||
|  | +#else | ||||||
|  |  	seq_printf(m, "Revision\t: %04x\n", system_rev); | ||||||
|  |  	seq_printf(m, "Serial\t\t: %08x%08x\n", | ||||||
|  |  		   system_serial_high, system_serial_low); | ||||||
|  | +#endif | ||||||
|  |   | ||||||
|  |  	return 0; | ||||||
|  |  } | ||||||
		Reference in New Issue
	
	Block a user
	 Florian Fainelli
					Florian Fainelli